1- package gregtech .common .items .armor ;
1+ package gregtech .common .items .armor . behavior ;
22
33import gregtech .api .capability .IFilter ;
44import gregtech .api .capability .impl .GTFluidHandlerItemStack ;
55import gregtech .api .items .armoritem .ArmorHelper ;
66import gregtech .api .items .armoritem .jetpack .IJetpackStats ;
77import gregtech .api .items .armoritem .jetpack .JetpackBehavior ;
88import gregtech .api .recipes .Recipe ;
9- import gregtech .api .recipes .RecipeMap ;
9+ import gregtech .api .recipes .RecipeMaps ;
1010
1111import net .minecraft .client .resources .I18n ;
1212import net .minecraft .item .ItemStack ;
1313import net .minecraft .nbt .NBTTagCompound ;
14+ import net .minecraft .world .World ;
1415import net .minecraftforge .common .capabilities .ICapabilityProvider ;
1516import net .minecraftforge .fluids .FluidStack ;
1617import net .minecraftforge .fluids .capability .CapabilityFluidHandler ;
2223
2324import java .util .Collections ;
2425import java .util .List ;
25- import java .util .Objects ;
26+ import java .util .function . Function ;
2627
2728/**
2829 * Creates a Jetpack which runs on any Fuel in a provided fuel RecipeMap.
2930 */
3031public class FueledJetpackBehavior extends JetpackBehavior {
3132
32- private final int maxCapacity ;
33- private final RecipeMap <?> fuelMap ;
33+ public static final Function <FluidStack , Integer > COMBUSTION_FUEL_BURN_TIME = fluidStack -> {
34+ Recipe recipe = RecipeMaps .COMBUSTION_GENERATOR_FUELS .findRecipe (
35+ Integer .MAX_VALUE ,
36+ Collections .emptyList (),
37+ Collections .singletonList (fluidStack ));
38+ return recipe != null ? recipe .getDuration () : 0 ;
39+ };
3440
35- private Recipe recipe ;
41+ private final int maxCapacity ;
42+ private final Function <FluidStack , Integer > fuelBurnTimeFunc ;
3643
37- public FueledJetpackBehavior (IJetpackStats jetpackStats , int maxCapacity , RecipeMap <?> fuelMap ) {
44+ public FueledJetpackBehavior (IJetpackStats jetpackStats , int maxCapacity ,
45+ Function <FluidStack , Integer > fuelBurnTimeFunc ) {
3846 super (jetpackStats );
3947 this .maxCapacity = maxCapacity ;
40- this .fuelMap = fuelMap ;
48+ this .fuelBurnTimeFunc = fuelBurnTimeFunc ;
4149 }
4250
4351 @ Override
@@ -47,46 +55,34 @@ protected int getFuelPerUse() {
4755
4856 @ Override
4957 protected boolean drainFuel (@ NotNull ItemStack stack , int amount , boolean simulate ) {
50- IFluidHandlerItem fluidHandler = getFluidHandler (stack );
51- if (fluidHandler != null ) {
52- // check that we have some amount of fuel here.
53- FluidStack currentFuel = fluidHandler .drain (amount , false );
54- if (currentFuel == null ) return false ;
55-
56- // grab the recipe if we haven't already.
57- // don't need to worry about resetting as our fluid handler does this for us.
58- if (recipe == null ) {
59- recipe = getRecipe (currentFuel );
60- }
61-
62- // do the "drain" if we are not simulating.
63- // either decrementing our timer, or draining new fuel and restarting the timer
58+ NBTTagCompound tag = ArmorHelper .getBehaviorsTag (stack );
59+ short burnTimer = tag .getShort (ArmorHelper .FUELED_JETPACK_BURN_TIMER );
60+ if (burnTimer > 0 ) {
6461 if (!simulate ) {
65- NBTTagCompound tag = ArmorHelper .getBehaviorsTag (stack );
66- short burnTimer = tag .getShort (ArmorHelper .FUELED_JETPACK_BURN_TIMER );
67- if (burnTimer == 0 ) {
68- // timer is zero, drain some fuel and restart it
69- fluidHandler .drain (amount , true );
70- burnTimer = (short ) recipe .getDuration ();
71- } else {
72- // timer is non-zero, just decrement the timer
73- burnTimer --;
74- }
75- tag .setShort (ArmorHelper .FUELED_JETPACK_BURN_TIMER , burnTimer );
62+ tag .setShort (ArmorHelper .FUELED_JETPACK_BURN_TIMER , (short ) (burnTimer - 1 ));
7663 }
7764 return true ;
7865 }
79- return false ;
66+
67+ IFluidHandlerItem fluidHandler = getFluidHandler (stack );
68+ if (fluidHandler == null ) return false ;
69+ FluidStack fuelStack = fluidHandler .drain (amount , false );
70+ if (fuelStack == null ) return false ;
71+
72+ int burnTime = fuelBurnTimeFunc .apply (fuelStack );
73+ if (burnTime <= 0 ) return false ;
74+
75+ if (!simulate ) {
76+ tag .setShort (ArmorHelper .FUELED_JETPACK_BURN_TIMER , (short ) burnTime );
77+ fluidHandler .drain (amount , true );
78+ }
79+ return true ;
8080 }
8181
8282 private IFluidHandlerItem getFluidHandler (ItemStack stack ) {
8383 return stack .getCapability (CapabilityFluidHandler .FLUID_HANDLER_ITEM_CAPABILITY , null );
8484 }
8585
86- private Recipe getRecipe (@ NotNull FluidStack fuel ) {
87- return fuelMap .find (Collections .emptyList (), Collections .singletonList (fuel ), Objects ::nonNull );
88- }
89-
9086 @ Override
9187 public void addHudInformation (@ NotNull ItemStack stack , @ NotNull List <String > hudText ) {
9288 IFluidHandlerItem fluidHandler = getFluidHandler (stack );
@@ -105,49 +101,36 @@ public void addHudInformation(@NotNull ItemStack stack, @NotNull List<String> hu
105101 super .addHudInformation (stack , hudText );
106102 }
107103
104+ // todo move this to ItemGTFueledArmor if that ends up staying around
105+ @ Override
106+ public void addInformation (@ NotNull ItemStack stack , @ Nullable World world , @ NotNull List <String > tooltip ) {
107+ IFluidHandlerItem fluidHandler = getFluidHandler (stack );
108+ if (fluidHandler != null ) {
109+ IFluidTankProperties prop = fluidHandler .getTankProperties ()[0 ];
110+ FluidStack fuel = prop .getContents ();
111+ tooltip .add (I18n .format ("metaitem.generic.fluid_container.tooltip" ,
112+ fuel != null ? fuel .amount : 0 ,
113+ prop .getCapacity (),
114+ fuel != null ? fuel .getLocalizedName () : "" ));
115+ }
116+ super .addInformation (stack , world , tooltip );
117+ }
118+
108119 @ Override
109120 public ICapabilityProvider createProvider (@ NotNull ItemStack stack , @ Nullable NBTTagCompound tag ) {
110- return new FueledJetpackItemStack (stack , maxCapacity )
111- .setFilter (new FueledJetpackFilter ())
112- .setCanDrain (false );
121+ return new GTFluidHandlerItemStack (stack , maxCapacity ).setFilter (new FueledJetpackFilter ());
113122 }
114123
115124 private final class FueledJetpackFilter implements IFilter <FluidStack > {
116125
117126 @ Override
118127 public boolean test (@ NotNull FluidStack fluidStack ) {
119- return getRecipe (fluidStack ) != null ;
128+ return fuelBurnTimeFunc . apply (fluidStack ) > 0 ;
120129 }
121130
122131 @ Override
123132 public int getPriority () {
124133 return IFilter .whitelistLikePriority ();
125134 }
126135 }
127-
128- /* Override class to automatically clear our cached state when the tank is fully emptied. */
129- private final class FueledJetpackItemStack extends GTFluidHandlerItemStack {
130-
131- public FueledJetpackItemStack (@ NotNull ItemStack container , int capacity ) {
132- super (container , capacity );
133- }
134-
135- @ Override
136- public FluidStack drain (FluidStack resource , boolean doDrain ) {
137- FluidStack drained = super .drain (resource , doDrain );
138- if (doDrain && this .getFluid () == null ) {
139- recipe = null ;
140- }
141- return drained ;
142- }
143-
144- @ Override
145- public FluidStack drain (int maxDrain , boolean doDrain ) {
146- FluidStack drained = super .drain (maxDrain , doDrain );
147- if (doDrain && this .getFluid () == null ) {
148- recipe = null ;
149- }
150- return drained ;
151- }
152- }
153136}
0 commit comments