Skip to content

Commit

Permalink
Now the bottle can be filled with creosote
Browse files Browse the repository at this point in the history
  • Loading branch information
Edivad99 committed Sep 28, 2023
1 parent 64e4870 commit e9f069b
Show file tree
Hide file tree
Showing 18 changed files with 184 additions and 28 deletions.
10 changes: 10 additions & 0 deletions src/main/java/mods/railcraft/Railcraft.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import mods.railcraft.sounds.RailcraftSoundEvents;
import mods.railcraft.util.EntitySearcher;
import mods.railcraft.util.capability.CapabilityUtil;
import mods.railcraft.util.capability.FluidBottleWrapper;
import mods.railcraft.world.damagesource.RailcraftDamageSources;
import mods.railcraft.world.effect.RailcraftMobEffects;
import mods.railcraft.world.entity.RailcraftEntityTypes;
Expand Down Expand Up @@ -72,6 +73,7 @@
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.item.CreativeModeTabs;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.alchemy.Potions;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraftforge.common.MinecraftForge;
Expand Down Expand Up @@ -231,6 +233,14 @@ public void handleAttachEntityCapabilities(AttachCapabilitiesEvent<Entity> event
}
}

@SubscribeEvent
public void handleAttachItemStackCapabilities(AttachCapabilitiesEvent<ItemStack> event) {
var stack = event.getObject();
if (stack.is(Items.GLASS_BOTTLE)) {
event.addCapability(Railcraft.rl("bottle_container"), new FluidBottleWrapper(stack));
}
}

@SubscribeEvent
public void handleLevelTick(TickEvent.LevelTickEvent event) {
if (event.level instanceof ServerLevel level && event.phase == TickEvent.Phase.END) {
Expand Down
135 changes: 135 additions & 0 deletions src/main/java/mods/railcraft/util/capability/FluidBottleWrapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package mods.railcraft.util.capability;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import mods.railcraft.world.item.FluidBottleItem;
import mods.railcraft.world.item.RailcraftItems;
import mods.railcraft.world.level.material.RailcraftFluids;
import net.minecraft.core.Direction;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandlerItem;

public class FluidBottleWrapper implements IFluidHandlerItem, ICapabilityProvider {

private final LazyOptional<IFluidHandlerItem> holder = LazyOptional.of(() -> this);

@NotNull
protected ItemStack container;

public FluidBottleWrapper(@NotNull ItemStack container) {
this.container = container;
}

@NotNull
@Override
public ItemStack getContainer() {
return this.container;
}

public boolean canFillFluidType(FluidStack fluid) {
return fluid.getFluid().isSame(RailcraftFluids.CREOSOTE.get());
}

@NotNull
public FluidStack getFluid() {
if (this.container.getItem() instanceof FluidBottleItem bottle) {
return new FluidStack(bottle.getFluid(), FluidBottleItem.QUANTITY);
} else {
return FluidStack.EMPTY;
}
}

protected void setFluid(@NotNull FluidStack fluidStack) {
if (fluidStack.isEmpty()) {
this.container = new ItemStack(Items.GLASS_BOTTLE);
} else {
this.container = new ItemStack(RailcraftItems.CREOSOTE_BOTTLE.get());
}
}

@Override
public int getTanks() {
return 1;
}

@NotNull
@Override
public FluidStack getFluidInTank(int tank) {
return this.getFluid();
}

@Override
public int getTankCapacity(int tank) {
return FluidBottleItem.QUANTITY;
}

@Override
public boolean isFluidValid(int tank, @NotNull FluidStack stack) {
return true;
}

@Override
public int fill(FluidStack resource, FluidAction action) {
if (this.container.getCount() != 1 || resource.getAmount() < FluidBottleItem.QUANTITY
|| !this.getFluid().isEmpty()
|| !this.canFillFluidType(resource)) {
return 0;
}

if (action.execute()) {
this.setFluid(resource);
}

return FluidBottleItem.QUANTITY;
}

@NotNull
@Override
public FluidStack drain(FluidStack resource, FluidAction action) {
if (this.container.getCount() != 1 || resource.getAmount() < FluidBottleItem.QUANTITY) {
return FluidStack.EMPTY;
}

var fluidStack = this.getFluid();
if (!fluidStack.isEmpty() && fluidStack.isFluidEqual(resource)) {
if (action.execute()) {
this.setFluid(FluidStack.EMPTY);
}
return fluidStack;
}

return FluidStack.EMPTY;
}

@NotNull
@Override
public FluidStack drain(int maxDrain, FluidAction action) {
if (this.container.getCount() != 1 || maxDrain < FluidBottleItem.QUANTITY) {
return FluidStack.EMPTY;
}

var fluidStack = getFluid();
if (!fluidStack.isEmpty()) {
if (action.execute()) {
this.setFluid(FluidStack.EMPTY);
}
return fluidStack;
}

return FluidStack.EMPTY;
}

@Override
@NotNull
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> capability,
@Nullable Direction facing) {
return ForgeCapabilities.FLUID_HANDLER_ITEM.orEmpty(capability, this.holder);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
import mods.railcraft.RailcraftConfig;
import mods.railcraft.api.carts.FluidTransferHandler;
import mods.railcraft.api.carts.RollingStock;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.container.ContainerMapper;
import mods.railcraft.util.container.ContainerTools;
import mods.railcraft.world.entity.RailcraftEntityTypes;
import mods.railcraft.world.inventory.TankMinecartMenu;
import mods.railcraft.world.item.RailcraftItems;
import mods.railcraft.world.level.material.FluidItemHelper;
import mods.railcraft.util.FluidTools;
import mods.railcraft.world.level.material.StandardTank;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
import mods.railcraft.particle.RailcraftParticleTypes;
import mods.railcraft.season.Seasons;
import mods.railcraft.sounds.RailcraftSoundEvents;
import mods.railcraft.util.container.ContainerMapper;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.FluidTools.ProcessType;
import mods.railcraft.util.container.ContainerMapper;
import mods.railcraft.world.level.material.RailcraftFluids;
import mods.railcraft.world.level.material.StandardTank;
import mods.railcraft.world.level.material.TankManager;
Expand Down
13 changes: 12 additions & 1 deletion src/main/java/mods/railcraft/world/item/FluidBottleItem.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package mods.railcraft.world.item;

import java.util.function.Supplier;
import org.jetbrains.annotations.Nullable;
import mods.railcraft.util.capability.FluidBottleWrapper;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.material.Fluid;
import net.minecraftforge.common.capabilities.ICapabilityProvider;

public class FluidBottleItem extends Item {

public static final int QUANTITY = 250;
public static final int QUANTITY = 333;

private final Supplier<? extends Fluid> fluidSupplier;

Expand All @@ -18,4 +23,10 @@ public FluidBottleItem(Supplier<? extends Fluid> supplier, Properties properties
public Fluid getFluid() {
return fluidSupplier.get();
}

@Nullable
@Override
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) {
return new FluidBottleWrapper(stack);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import java.util.Set;
import org.jetbrains.annotations.Nullable;
import mods.railcraft.particle.FireSparkParticleOptions;
import mods.railcraft.world.item.RefinedFirestoneItem;
import mods.railcraft.util.FluidTools;
import mods.railcraft.world.item.RefinedFirestoneItem;
import net.minecraft.Util;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
import mods.railcraft.api.charge.Charge;
import mods.railcraft.api.charge.ChargeStorage;
import mods.railcraft.util.EnergyUtil;
import mods.railcraft.util.FluidTools;
import mods.railcraft.world.inventory.SteamTurbineMenu;
import mods.railcraft.world.level.block.RailcraftBlocks;
import mods.railcraft.world.level.block.SteamTurbineBlock;
import mods.railcraft.world.level.block.entity.multiblock.BlockPredicate;
import mods.railcraft.world.level.block.entity.multiblock.MultiblockBlockEntity;
import mods.railcraft.world.level.block.entity.multiblock.MultiblockPattern;
import mods.railcraft.util.FluidTools;
import mods.railcraft.world.module.SteamTurbineModule;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
import mods.railcraft.RailcraftConfig;
import mods.railcraft.api.carts.FluidTransferHandler;
import mods.railcraft.util.EntitySearcher;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.Predicates;
import mods.railcraft.world.entity.vehicle.locomotive.SteamLocomotive;
import mods.railcraft.world.level.block.entity.RailcraftBlockEntityTypes;
import mods.railcraft.util.FluidTools;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import java.util.Optional;
import org.jetbrains.annotations.Nullable;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.container.AdvancedContainer;
import mods.railcraft.util.container.ContainerTools;
import mods.railcraft.world.inventory.FluidManipulatorMenu;
import mods.railcraft.world.level.material.FluidItemHelper;
import mods.railcraft.util.FluidTools;
import mods.railcraft.world.level.material.StandardTank;
import mods.railcraft.world.level.material.TankManager;
import net.minecraft.core.BlockPos;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import java.util.stream.Stream;
import mods.railcraft.RailcraftConfig;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.Predicates;
import mods.railcraft.world.level.block.entity.RailcraftBlockEntityTypes;
import mods.railcraft.util.FluidTools;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@
import it.unimi.dsi.fastutil.chars.CharList;
import mods.railcraft.RailcraftConfig;
import mods.railcraft.Translations;
import mods.railcraft.util.FluidTools;
import mods.railcraft.world.inventory.TankMenu;
import mods.railcraft.world.level.block.AbstractStrengthenedGlassBlock;
import mods.railcraft.world.level.block.entity.multiblock.BlockPredicate;
import mods.railcraft.world.level.block.entity.multiblock.MultiblockBlockEntity;
import mods.railcraft.world.level.block.entity.multiblock.MultiblockPattern;
import mods.railcraft.world.level.block.tank.TankGaugeBlock;
import mods.railcraft.world.level.block.tank.TankValveBlock;
import mods.railcraft.util.FluidTools;
import mods.railcraft.world.level.material.StandardTank;
import mods.railcraft.world.module.TankModule;
import net.minecraft.core.BlockPos;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,7 @@ public static void register(IEventBus modEventBus) {
}

private static RegistryObject<GameEvent> register(String name) {
return register(name, GameEvent.DEFAULT_NOTIFICATION_RADIUS);
}

private static RegistryObject<GameEvent> register(String name, int notificationRadius) {
return deferredRegister.register(name, () -> new GameEvent(name, notificationRadius));
return deferredRegister.register(name,
() -> new GameEvent(name, GameEvent.DEFAULT_NOTIFICATION_RADIUS));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import org.jetbrains.annotations.NotNull;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
Expand Down Expand Up @@ -52,10 +53,11 @@ public ListTag serializeNBT() {

@Override
public void deserializeNBT(ListTag tanksTag) {
for (var tankTag : tanksTag) {
int index = ((CompoundTag) tankTag).getByte("index");
for (int i = 0; i < tanksTag.size(); i++) {
var tag = tanksTag.getCompound(i);
int index = tag.getByte("index");
if (index >= 0 && index < this.tanks.size()) {
this.tanks.get(index).readFromNBT(((CompoundTag) tankTag));
this.tanks.get(index).readFromNBT(tag);
}
}
}
Expand Down Expand Up @@ -94,6 +96,7 @@ public FluidStack drain(FluidStack resource, FluidAction doDrain) {
.orElse(FluidStack.EMPTY);
}

@NotNull
@Override
public FluidStack drain(int maxDrain, FluidAction doDrain) {
return this.tanks.stream()
Expand All @@ -116,10 +119,10 @@ public StandardTank get(int tankIndex) {
}

public void setCapacity(int tankIndex, int capacity) {
StandardTank tank = this.get(tankIndex);
var tank = this.get(tankIndex);
tank.setCapacity(capacity);
FluidStack fluidStack = tank.getFluid();
if (fluidStack != null && fluidStack.getAmount() > capacity) {
var fluidStack = tank.getFluid();
if (fluidStack.getAmount() > capacity) {
fluidStack.setAmount(capacity);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package mods.railcraft.world.module;

import org.jetbrains.annotations.NotNull;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.container.ContainerMapper;
import mods.railcraft.world.item.crafting.CokeOvenRecipe;
import mods.railcraft.world.item.crafting.RailcraftRecipeTypes;
import mods.railcraft.world.level.block.entity.CokeOvenBlockEntity;
import mods.railcraft.world.level.material.FluidItemHelper;
import mods.railcraft.util.FluidTools;
import mods.railcraft.world.level.material.RailcraftFluids;
import mods.railcraft.world.level.material.StandardTank;
import net.minecraft.nbt.CompoundTag;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package mods.railcraft.world.module;

import mods.railcraft.api.fuel.FuelUtil;
import mods.railcraft.world.level.block.entity.steamboiler.FluidFueledSteamBoilerBlockEntity;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.FluidTools.ProcessType;
import mods.railcraft.world.level.block.entity.steamboiler.FluidFueledSteamBoilerBlockEntity;
import mods.railcraft.world.level.material.StandardTank;
import mods.railcraft.world.level.material.steam.FluidFuelProvider;
import net.minecraft.tags.FluidTags;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import org.jetbrains.annotations.NotNull;
import mods.railcraft.tags.RailcraftTags;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.FluidTools.ProcessType;
import mods.railcraft.util.container.ContainerMapper;
import mods.railcraft.world.level.block.entity.steamboiler.SteamBoilerBlockEntity;
import mods.railcraft.world.level.block.steamboiler.FireboxBlock;
import mods.railcraft.util.FluidTools;
import mods.railcraft.util.FluidTools.ProcessType;
import mods.railcraft.world.level.material.StandardTank;
import mods.railcraft.world.level.material.TankManager;
import mods.railcraft.world.level.material.steam.SteamBoiler;
Expand Down

0 comments on commit e9f069b

Please sign in to comment.