WaterGrowthModifierAsset class

Пакет: com.hypixel.hytale.builtin.adventure.farming.config.modifiers

Файл: com/hypixel/hytale/builtin/adventure/farming/config/modifiers/WaterGrowthModifierAsset.java

extends: GrowthModifierAsset

Поля (36)

МодификаторыТипИмя
break
boolean var10
int var10
WaterGrowthModifierAsset.Soil var11
Store var11
TilledSoilBlock var12
WeatherResource var12
BlockModule.BlockStateInfo var13
int var13
BlockSection var14
int var14
var14
var14
boolean var15
var15
int var17
Instant var2
Instant var3
ChunkSection var5
ChunkSection var5
Ref var6
var6
IntOpenHashSet var6
Ref var6
var6
ChunkSection var6
Ref var7
WaterGrowthModifierAsset.Soil var7
FluidSection var7
Ref var7
boolean var8
TilledSoilBlock var8
int[] var8
BlockChunk var8
boolean var9
int var9

Методы (31)

МодификаторыВозвратСигнатура
private record Soilrecord Soil(@Nonnull Ref<ChunkStore> blockRef, @Nonnull TilledSoilBlock block)
protected boolean checkIfRainingboolean checkIfRaining(@Nonnull CommandBuffer<ChunkStore> var1, @Nonnull Ref<ChunkStore> var2, int var3, int var4, int var5)
protected boolean checkIfWaterSourceboolean checkIfWaterSource(@Nonnull CommandBuffer<ChunkStore> var1, @Nonnull Ref<ChunkStore> var2, int var3, int var4, int var5)
for for(int var1 = 0; var1 < var0.fluids.length; var1++)
for for(int var2 = 0; var2 < var0.weathers.length; var2++)
for for(int var12 : var8)
for for(int var16 = var9 + 1; var16 < 320; var16++)
static int getFluidAtPosint getFluidAtPos(int var0, int var1, int var2, @Nonnull Ref<ChunkStore> var3, @Nonnull ChunkSection var4, @Nonnull CommandBuffer<ChunkStore> var5)
public IntOpenHashSet getFluidIdsIntOpenHashSet getFluidIds()
public String[] getFluidsString[] getFluids()
public int getRainDurationint getRainDuration()
public IntOpenHashSet getWeatherIdsIntOpenHashSet getWeatherIds()
public String[] getWeathersString[] getWeathers()
if if(var0.fluids != null)
if if(var0.weathers != null)
if if(var11 != null)
if if(var13 != null)
if if(var14 != null)
if if(var5 == null)
if if(var3 == 0)
if if(var7 == null)
if if(var6 == null)
if if(var7 == null)
if if(var8 == null)
if if(var0 < 0 || var0 >= 32 || var1 < 0 || var1 >= 32 || var2 < 0 || var2 >= 32)
if if(this.weatherIds == null)
if if(var6 == null)
if if(var8 == null)
if if(var17 != 0 && var17 != var10)
if if(var2 == null)
static boolean isSoilWaterExpiringboolean isSoilWaterExpiring(@Nonnull WorldTimeResource var0, @Nonnull TilledSoilBlock var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.farming.config.modifiers;

class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.TilledSoilBlock;
class="kw">import com.hypixel.hytale.builtin.weather.resources.WeatherResource;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.farming.GrowthModifierAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.asset.type.weather.config.Weather;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockModule;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.ChunkSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.FluidSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import java.time.Instant;
class="kw">import java.util.Arrays;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class WaterGrowthModifierAsset class="kw">extends GrowthModifierAsset {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<WaterGrowthModifierAsset> CODEC = BuilderCodec.builder(
         WaterGrowthModifierAsset.class, WaterGrowthModifierAsset::new, ABSTRACT_CODEC
      )
      .append(new KeyedCodec<>("Fluids", new ArrayCodec<>(Codec.STRING, String[]::new)), (var0, var1) -> var0.fluids = var1, var0 -> var0.fluids)
      .addValidator(Fluid.VALIDATOR_CACHE.getArrayValidator().late())
      .add()
      .<String[]>append(new KeyedCodec<>("Weathers", Codec.STRING_ARRAY), (var0, var1) -> var0.weathers = var1, var0 -> var0.weathers)
      .addValidator(Weather.VALIDATOR_CACHE.getArrayValidator())
      .add()
      .append(new KeyedCodec<>("RainDuration", Codec.INTEGER), (var0, var1) -> var0.rainDuration = var1, var0 -> var0.rainDuration)
      .add()
      .afterDecode(var0 -> {
         if (var0.fluids != null) {
            var0.fluidIds = new IntOpenHashSet();

            for (int var1 = 0; var1 < var0.fluids.length; var1++) {
               var0.fluidIds.add(Fluid.getAssetMap().getIndex(var0.fluids[var1]));
            }
         }

         if (var0.weathers != null) {
            var0.weatherIds = new IntOpenHashSet();

            for (int var2 = 0; var2 < var0.weathers.length; var2++) {
               var0.weatherIds.add(Weather.getAssetMap().getIndex(var0.weathers[var2]));
            }
         }
      })
      .build();
   class="kw">protected String[] fluids;
   class="kw">protected IntOpenHashSet fluidIds;
   class="kw">protected String[] weathers;
   class="kw">protected IntOpenHashSet weatherIds;
   class="kw">protected int rainDuration;

   class="kw">public WaterGrowthModifierAsset() {
   }

   class="kw">public String[] getFluids() {
      class="kw">return this.fluids;
   }

   class="kw">public IntOpenHashSet getFluidIds() {
      class="kw">return this.fluidIds;
   }

   class="kw">public String[] getWeathers() {
      class="kw">return this.weathers;
   }

   class="kw">public IntOpenHashSet getWeatherIds() {
      class="kw">return this.weatherIds;
   }

   class="kw">public int getRainDuration() {
      class="kw">return this.rainDuration;
   }

   @Override
   class="kw">public double getCurrentGrowthMultiplier(
      @Nonnull CommandBuffer<ChunkStore> var1, @Nonnull Ref<ChunkStore> var2, @Nonnull Ref<ChunkStore> var3, int var4, int var5, int var6, boolean var7
   ) {
      boolean var8 = this.checkIfWaterSource(var1, var2, var4, var5, var6);
      boolean var9 = this.checkIfRaining(var1, var2, var4, var5, var6);
      boolean var10 = var8 || var9;
      WaterGrowthModifierAsset.Soil var11 = getSoil(var1, var2, var4, var5, var6);
      if (var11 != null) {
         TilledSoilBlock var12 = var11.block();
         if (var12.hasExternalWater() != var10) {
            var12.setExternalWater(var10);
            BlockModule.BlockStateInfo var13 = var1.getComponent(var11.blockRef(), BlockModule.BlockStateInfo.getComponentType());
            if (var13 != null) {
               var13.markNeedsSaving();
            }

            BlockSection var14 = var1.getComponent(var2, BlockSection.getComponentType());
            if (var14 != null) {
               var14.setTicking(var4, var5, var6, true);
            }
         }

         var10 |= isSoilWaterExpiring(var1.getExternalData().getWorld().getEntityStore().getStore().getResource(WorldTimeResource.getResourceType()), var12);
      }

      class="kw">return !var10 ? 1.0 : super.getCurrentGrowthMultiplier(var1, var2, var3, var4, var5, var6, var7);
   }

   @Nullable
   class="kw">private class="kw">static WaterGrowthModifierAsset.Soil getSoil(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4) {
      ChunkSection var5 = var0.getComponent(var1, ChunkSection.getComponentType());
      if (var5 == null) {
         class="kw">return null;
      }

      Ref var6 = var1;
      if (var3 == 0) {
         var6 = var0.getExternalData().getChunkSectionReference(var5.getX(), var5.getY() - 1, var5.getZ());
         if (var6 == null || !var6.isValid()) {
            class="kw">return null;
         }
      }

      Ref var7 = BlockModule.getBlockEntity(
         var0,
         var6,
         ChunkUtil.worldCoordFromLocalCoord(var5.getX(), var2),
         ChunkUtil.worldCoordFromLocalCoord(var5.getY(), var3) - 1,
         ChunkUtil.worldCoordFromLocalCoord(var5.getZ(), var4)
      );
      if (var7 == null) {
         class="kw">return null;
      }

      TilledSoilBlock var8 = var0.getComponent(var7, TilledSoilBlock.getComponentType());
      class="kw">return var8 == null ? null : new WaterGrowthModifierAsset.Soil(var7, var8);
   }

   class="kw">protected boolean checkIfWaterSource(@Nonnull CommandBuffer<ChunkStore> var1, @Nonnull Ref<ChunkStore> var2, int var3, int var4, int var5) {
      IntOpenHashSet var6 = this.fluidIds;
      if (var6 == null) {
         class="kw">return false;
      }

      WaterGrowthModifierAsset.Soil var7 = getSoil(var1, var2, var3, var4, var5);
      if (var7 == null) {
         class="kw">return false;
      }

      int[] var8 = getNeighbourFluids(var1, var2, var3, var4 - 1, var5);
      if (var8 == null) {
         class="kw">return false;
      }

      for (int var12 : var8) {
         if (var6.contains(var12)) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   @Nullable
   class="kw">private class="kw">static int[] getNeighbourFluids(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4) {
      ChunkSection var5 = var0.getComponent(var1, ChunkSection.getComponentType());
      class="kw">return var5 == null
         ? null
         : new int[]{
            getFluidAtPos(var2 - 1, var3, var4, var1, var5, var0),
            getFluidAtPos(var2 + 1, var3, var4, var1, var5, var0),
            getFluidAtPos(var2, var3, var4 - 1, var1, var5, var0),
            getFluidAtPos(var2, var3, var4 + 1, var1, var5, var0)
         };
   }

   class="kw">private class="kw">static int getFluidAtPos(
      int var0, int var1, int var2, @Nonnull Ref<ChunkStore> var3, @Nonnull ChunkSection var4, @Nonnull CommandBuffer<ChunkStore> var5
   ) {
      Ref var6 = var3;
      if (var0 < 0 || var0 >= 32 || var1 < 0 || var1 >= 32 || var2 < 0 || var2 >= 32) {
         var6 = var5.getExternalData()
            .getChunkSectionReference(
               var4.getX() + ChunkUtil.chunkCoordinate(var0), var4.getY() + ChunkUtil.chunkCoordinate(var1), var4.getZ() + ChunkUtil.chunkCoordinate(var2)
            );
      }

      if (var6 != null && var6.isValid()) {
         FluidSection var7 = var5.getComponent(var6, FluidSection.getComponentType());
         class="kw">return var7 == null ? Integer.MIN_VALUE : var7.getFluidId(var0, var1, var2);
      } else {
         class="kw">return Integer.MIN_VALUE;
      }
   }

   class="kw">protected boolean checkIfRaining(@Nonnull CommandBuffer<ChunkStore> var1, @Nonnull Ref<ChunkStore> var2, int var3, int var4, int var5) {
      if (this.weatherIds == null) {
         class="kw">return false;
      }

      ChunkSection var6 = var1.getComponent(var2, ChunkSection.getComponentType());
      if (var6 == null) {
         class="kw">return false;
      }

      Ref var7 = var6.getChunkColumnReference();
      if (var7 != null && var7.isValid()) {
         BlockChunk var8 = var1.getComponent(var7, BlockChunk.getComponentType());
         if (var8 == null) {
            class="kw">return false;
         }

         int var9 = ChunkUtil.worldCoordFromLocalCoord(var6.getY(), var4);
         int var10 = var8.getBlock(var3, var9, var5);
         Store var11 = var1.getExternalData().getWorld().getEntityStore().getStore();
         WeatherResource var12 = var11.getResource(WeatherResource.getResourceType());
         int var13 = var8.getEnvironment(var3, var9, var5);
         int var14;
         if (var12.getForcedWeatherIndex() != 0) {
            var14 = var12.getForcedWeatherIndex();
         } else {
            var14 = var12.getWeatherIndexForEnvironment(var13);
         }

         if (!this.weatherIds.contains(var14)) {
            class="kw">return false;
         }

         boolean var15 = true;

         for (int var16 = var9 + 1; var16 < 320; var16++) {
            int var17 = var8.getBlock(var3, var16, var5);
            if (var17 != 0 && var17 != var10) {
               var15 = false;
               break;
            }
         }

         class="kw">return var15;
      } else {
         class="kw">return false;
      }
   }

   class="kw">private class="kw">static boolean isSoilWaterExpiring(@Nonnull WorldTimeResource var0, @Nonnull TilledSoilBlock var1) {
      Instant var2 = var1.getWateredUntil();
      if (var2 == null) {
         class="kw">return false;
      } else {
         Instant var3 = var0.getGameTime();
         if (var3.isAfter(var2)) {
            var1.setWateredUntil(null);
            class="kw">return false;
         } else {
            class="kw">return true;
         }
      }
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "WaterGrowthModifierAsset{fluids="
         + Arrays.toString(this.fluids)
         + ", fluidIds="
         + this.fluidIds
         + ", weathers="
         + Arrays.toString(this.weathers)
         + ", weatherIds="
         + this.weatherIds
         + ", rainDuration="
         + this.rainDuration
         + "} "
         + super.toString();
   }

   class="kw">private record Soil(@Nonnull Ref<ChunkStore> blockRef, @Nonnull TilledSoilBlock block) {
      class="kw">private Soil {
      }
   }
}