FarmingUtil class
Пакет: com.hypixel.hytale.builtin.adventure.farming
Файл: com/hypixel/hytale/builtin/adventure/farming/FarmingUtil.java
Поля (74)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
int |
MAX_SECONDS_BETWEEN_TICKS |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
return |
|
World |
var10 |
|
FarmingData |
var10 |
|
Store |
var11 |
|
boolean |
var11 |
|
WorldTimeResource |
var12 |
|
Ref |
var12 |
|
Instant |
var13 |
|
Map |
var13 |
|
BlockType |
var14 |
|
FarmingStageData[] |
var14 |
|
FarmingData |
var15 |
|
int |
var15 |
|
float |
var16 |
|
|
var16 |
|
|
var16 |
|
FarmingStageData |
var16 |
|
int |
var17 |
|
|
var17 |
|
|
var17 |
|
|
var17 |
|
String |
var17 |
|
String |
var18 |
|
|
var18 |
|
FarmingStageData[] |
var18 |
|
FarmingStageData[] |
var19 |
|
|
var19 |
|
FarmingBlock |
var19 |
|
|
var19 |
|
|
var19 |
|
long |
var20 |
|
|
var20 |
|
Instant |
var20 |
|
int |
var21 |
|
ChunkSection |
var22 |
|
Ref |
var22 |
|
|
var22 |
|
int |
var23 |
|
Holder |
var23 |
|
int |
var24 |
|
BlockSection |
var24 |
|
int |
var25 |
|
TickSuppressionRegistry |
var26 |
|
FarmingStageData |
var27 |
|
Rangef |
var28 |
|
double |
var29 |
|
PersistentModel |
var3 |
|
double |
var31 |
|
long |
var33 |
|
|
var33 |
|
double |
var35 |
|
Ref |
var4 |
|
ModelAsset |
var4 |
|
GrowthModifierAsset |
var41 |
|
int |
var45 |
|
long |
var46 |
|
long |
var47 |
|
BlockSection |
var5 |
|
CapturedNPCMetadata |
var5 |
|
String |
var5 |
|
BlockType |
var6 |
|
BlockGathering |
var6 |
|
String |
var6 |
|
long |
var7 |
|
int |
var7 |
|
HarvestingDropType |
var7 |
|
List |
var7 |
|
World |
var8 |
|
Vector3d |
var9 |
Методы (34)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
static |
long |
cappedTickNanoslong cappedTickNanos(long var0, @Nonnull World var2, @Nonnull FarmingBlock var3, int var4, int var5, int var6) |
|
|
for for(ItemStack var9 : var7) |
static |
void |
giveDropsvoid giveDrops(@Nonnull ComponentAccessor<EntityStore> var0,
@Nullable Ref<EntityStore> var1,
@Nonnull Vector3d var2,
@Nonnull BlockType var3,
@Nonnull HarvestingDropType var4) |
abstract |
|
giveDrops giveDrops(var1, var2, var9, var3, var7) |
static |
boolean |
harvestboolean harvest(@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nullable Ref<EntityStore> var2, @Nonnull Vector3i var3) |
static |
boolean |
harvestboolean harvest(@Nonnull ComponentAccessor<ChunkStore> var0,
@Nonnull ComponentAccessor<EntityStore> var1,
@Nullable Ref<EntityStore> var2,
@Nonnull BlockType var3,
int var4,
@Nonnull Vector3i var5) |
abstract |
return |
harvestreturn harvest(var0, var1, var2, var6, var7, var3) |
static |
boolean |
harvest0boolean harvest0(@Nonnull ComponentAccessor<ChunkStore> var0,
@Nonnull ComponentAccessor<EntityStore> var1,
@Nullable Ref<EntityStore> var2,
@Nonnull BlockType var3,
int var4,
@Nonnull Vector3i var5) |
|
|
if if(var14 != null) |
|
|
if if(var19 == null) |
|
|
if if(var18 == null) |
|
|
if if(var19 != null) |
|
|
if if(var17 < 0) |
|
|
if if(var17 >= var19.length) |
|
|
if if(var22 != null) |
|
|
if if(var28 == null) |
|
|
if if(var41 != null) |
|
|
if if(var20 < var33) |
|
|
if if(var17 >= var19.length) |
|
|
if if(var4 == null) |
|
|
if if(var5 == null) |
|
|
if if(var6 == null) |
|
|
if if(var3 == null) |
|
|
if if(var4 != null) |
|
|
if if(var6 == null) |
|
|
if if(var7 == null) |
|
|
if if(var14 == null) |
|
|
if if(var18 != null && var18.length != 0) |
|
|
if if(var22 == null) |
|
|
if if(var22 == null) |
|
|
if if(var24 != null) |
|
|
if if(var1 == null) |
static |
void |
tickFarmingvoid tickFarming(@Nonnull CommandBuffer<ChunkStore> var0,
@Nonnull BlockModule.BlockStateInfo var1,
@Nonnull BlockSection var2,
@Nonnull Ref<ChunkStore> var3,
@Nonnull Ref<ChunkStore> var4,
@Nonnull FarmingBlock var5,
int var6,
int var7,
int var8,
boolean var9) |
|
|
while while(var17 < var19.length) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.farming;
class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.FarmingBlock;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.Rangef;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockGathering;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.HarvestingDropType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.farming.FarmingData;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.farming.FarmingStageData;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.farming.GrowthModifierAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.ModelAsset;
class="kw">import com.hypixel.hytale.server.core.entity.ItemUtils;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.PersistentModel;
class="kw">import com.hypixel.hytale.server.core.modules.entity.item.ItemComponent;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.BlockHarvestUtils;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.world.TickSuppressionRegistry;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
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.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.npc.metadata.CapturedNPCMetadata;
class="kw">import java.time.Instant;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;
class="kw">public class FarmingUtil {
class="kw">private class="kw">static class="kw">final int MAX_SECONDS_BETWEEN_TICKS = 15;
class="kw">private class="kw">static class="kw">final int BETWEEN_RANDOM = 10;
class="kw">public FarmingUtil() {
}
class="kw">private class="kw">static long cappedTickNanos(long var0, @Nonnull World var2, @Nonnull FarmingBlock var3, int var4, int var5, int var6) {
long var7 = (long)(
(15.0 + 10.0 * HashUtil.random(var3.getGeneration() ^ 3405692655L, var4, var5, var6))
* var2.getTps()
* WorldTimeResource.getSecondsPerTick(var2)
* 1.0E9
);
class="kw">return Math.min(var0, var7);
}
class="kw">public class="kw">static void tickFarming(
@Nonnull CommandBuffer<ChunkStore> var0,
@Nonnull BlockModule.BlockStateInfo var1,
@Nonnull BlockSection var2,
@Nonnull Ref<ChunkStore> var3,
@Nonnull Ref<ChunkStore> var4,
@Nonnull FarmingBlock var5,
int var6,
int var7,
int var8,
boolean var9
) {
World var10 = var0.getExternalData().getWorld();
Store var11 = var10.getEntityStore().getStore();
WorldTimeResource var12 = var11.getResource(WorldTimeResource.getResourceType());
Instant var13 = var12.getGameTime();
BlockType var14 = var5.getPreviousBlockType() != null
? BlockType.getAssetMap().getAsset(var5.getPreviousBlockType())
: BlockType.getAssetMap().getAsset(var2.get(var6, var7, var8));
if (var14 != null) {
if (var14.getFarming() != null) {
FarmingData var15 = var14.getFarming();
if (var15.getStages() != null) {
float var16 = var5.getGrowthProgress();
int var17 = (int)var16;
String var18 = var5.getCurrentStageSet();
FarmingStageData[] var19 = var15.getStages().get(var18);
if (var19 == null) {
var18 = var15.getStartingStageSet();
if (var18 == null) {
class="kw">return;
}
var5.setCurrentStageSet(var18);
var19 = var15.getStages().get(var18);
var1.markNeedsSaving();
}
if (var19 != null) {
if (var17 < 0) {
var17 = 0;
var16 = 0.0F;
var5.setGrowthProgress(0.0F);
}
if (var17 >= var19.length) {
var0.removeEntity(var4, RemoveReason.REMOVE);
} else {
long var20 = var13.getEpochSecond() - var5.getLastTickGameTime().getEpochSecond();
ChunkSection var22 = var0.getComponent(var3, ChunkSection.getComponentType());
if (var22 != null) {
int var23 = ChunkUtil.worldCoordFromLocalCoord(var22.getX(), var6);
int var24 = ChunkUtil.worldCoordFromLocalCoord(var22.getY(), var7);
int var25 = ChunkUtil.worldCoordFromLocalCoord(var22.getZ(), var8);
TickSuppressionRegistry var26 = var11.getResource(TickSuppressionRegistry.RESOURCE);
if (var26 != null && var26.isBlockSuppressed(var23, var24, var25, 1)) {
var5.setLastTickGameTime(var13);
var1.markNeedsSaving();
var2.scheduleTick(
ChunkUtil.indexBlock(var6, var7, var8), var13.plusNanos(cappedTickNanos(Long.MAX_VALUE, var10, var5, var23, var24, var25))
);
} else {
while (var17 < var19.length) {
FarmingStageData var27 = var19[var17];
if (var27.shouldStop(var0, var3, var4, var6, var7, var8)) {
var1.markNeedsSaving();
var5.setGrowthProgress(var19.length);
var0.removeEntity(var4, RemoveReason.REMOVE);
break;
}
Rangef var28 = var27.getDuration();
if (var28 == null) {
var1.markNeedsSaving();
var0.removeEntity(var4, RemoveReason.REMOVE);
break;
}
double var29 = HashUtil.random(var5.getGeneration(), var23, var24, var25);
double var31 = var28.min + (var28.max - var28.min) * var29;
long var33 = Math.round(var31 * (1.0 - var16 % 1.0));
double var35 = 1.0;
if (var15.getGrowthModifiers() != null) {
for (String var40 : var15.getGrowthModifiers()) {
GrowthModifierAsset var41 = GrowthModifierAsset.getAssetMap().getAsset(var40);
if (var41 != null) {
var35 *= var41.getCurrentGrowthMultiplier(var0, var3, var4, var6, var7, var8, var9);
}
}
}
var33 = Math.round(var33 / var35);
if (var20 < var33) {
var16 += (float)(var20 / (var31 / var35));
var5.setGrowthProgress(var16);
var1.markNeedsSaving();
long var46 = (var33 - var20) * 1000000000L;
var2.scheduleTick(
ChunkUtil.indexBlock(var6, var7, var8), var13.plusNanos(cappedTickNanos(var46, var10, var5, var23, var24, var25))
);
break;
}
var20 -= var33;
int var45 = var17 + 1;
if (var45 < var19.length && !var19[var45].canApply(var0, var3, var4, var6, var7, var8)) {
var5.setGrowthProgress(var17);
var1.markNeedsSaving();
long var47 = Math.round(var31 / var35) * 1000000000L;
var2.scheduleTick(ChunkUtil.indexBlock(var6, var7, var8), var13.plusNanos(var47));
break;
}
var17 = var45;
var16 = var17;
var5.setGrowthProgress(var16);
var1.markNeedsSaving();
var5.setGeneration(var5.getGeneration() + 1);
if (var17 >= var19.length) {
if (var19[var17 - 1].implementsShouldStop()) {
var17 = var19.length - 1;
var5.setGrowthProgress(var17);
var19[var17].apply(var0, var3, var4, var6, var7, var8, var19[var17]);
} else {
var5.setGrowthProgress(var19.length);
var0.removeEntity(var4, RemoveReason.REMOVE);
}
} else {
var5.setExecutions(0);
var19[var17].apply(var0, var3, var4, var6, var7, var8, var19[var17 - 1]);
if (var19[var17].consumesRemainingTime()) {
var20 = 0L;
}
}
}
var5.setLastTickGameTime(var13);
}
}
}
}
}
}
}
}
class="kw">public class="kw">static boolean harvest(
@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nullable Ref<EntityStore> var2, @Nonnull Vector3i var3
) {
Ref var4 = var0.getExternalData().getWorld().getChunkStore().getChunkSectionReferenceAtBlock(var3.x, var3.y, var3.z);
if (var4 == null) {
class="kw">return false;
}
BlockSection var5 = var0.getComponent(var4, BlockSection.getComponentType());
if (var5 == null) {
class="kw">return false;
}
BlockType var6 = BlockType.getAssetMap().getAsset(var5.get(var3.x, var3.y, var3.z));
if (var6 == null) {
class="kw">return false;
}
int var7 = var5.getRotationIndex(var3.x, var3.y, var3.z);
class="kw">return harvest(var0, var1, var2, var6, var7, var3);
}
class="kw">public class="kw">static boolean harvest(
@Nonnull ComponentAccessor<ChunkStore> var0,
@Nonnull ComponentAccessor<EntityStore> var1,
@Nullable Ref<EntityStore> var2,
@Nonnull BlockType var3,
int var4,
@Nonnull Vector3i var5
) {
class="kw">return var0.getExternalData().getWorld().getGameplayConfig().getWorldConfig().isBlockGatheringAllowed()
? harvest0(var0, var1, var2, var3, var4, var5)
: false;
}
@Nullable
class="kw">public class="kw">static CapturedNPCMetadata generateCapturedNPCMetadata(@Nonnull ComponentAccessor<EntityStore> var0, @Nonnull Ref<EntityStore> var1, String var2) {
PersistentModel var3 = var0.getComponent(var1, PersistentModel.getComponentType());
if (var3 == null) {
class="kw">return null;
}
ModelAsset var4 = ModelAsset.getAssetMap().getAsset(var3.getModelReference().getModelAssetId());
CapturedNPCMetadata var5 = new CapturedNPCMetadata();
if (var4 != null) {
var5.setIconPath(var4.getIcon());
}
var5.setNpcNameKey(var2);
class="kw">return var5;
}
class="kw">protected class="kw">static boolean harvest0(
@Nonnull ComponentAccessor<ChunkStore> var0,
@Nonnull ComponentAccessor<EntityStore> var1,
@Nullable Ref<EntityStore> var2,
@Nonnull BlockType var3,
int var4,
@Nonnull Vector3i var5
) {
BlockGathering var6 = var3.getGathering();
if (var6 == null) {
class="kw">return false;
}
HarvestingDropType var7 = var6.getHarvest();
if (var7 == null) {
class="kw">return false;
}
World var8 = var0.getExternalData().getWorld();
Vector3d var9 = new Vector3d();
var3.getBlockCenter(var4, var9);
var9.add(var5.x, var5.y, var5.z);
FarmingData var10 = var3.getFarming();
boolean var11 = var10 != null && var10.getStages() != null;
Ref var12 = var8.getChunkStore().getChunkSectionReferenceAtBlock(var5.x, var5.y, var5.z);
if (var12 == null || !var12.isValid()) {
class="kw">return false;
}
if (var11 && var10.getStageSetAfterHarvest() != null) {
giveDrops(var1, var2, var9, var3, var7);
Map var13 = var10.getStages();
FarmingStageData[] var14 = var13.get(var10.getStartingStageSet());
if (var14 == null) {
class="kw">return false;
}
int var15 = var14.length - 1;
FarmingStageData var16 = var14[var15];
String var17 = var10.getStageSetAfterHarvest();
FarmingStageData[] var18 = var13.get(var17);
if (var18 != null && var18.length != 0) {
Instant var20 = var1.getResource(WorldTimeResource.getResourceType()).getGameTime();
int var21 = ChunkUtil.indexBlock(var5.x, var5.y, var5.z);
Ref var22 = BlockModule.getBlockEntity(var0, var12, var5.x, var5.y, var5.z);
FarmingBlock var19;
if (var22 == null) {
Holder var23 = ChunkStore.REGISTRY.newHolder();
var23.putComponent(BlockModule.BlockStateInfo.getComponentType(), new BlockModule.BlockStateInfo(var21, var12));
var19 = new FarmingBlock();
var19.setLastTickGameTime(var20);
var19.setCurrentStageSet(var17);
var23.addComponent(FarmingBlock.getComponentType(), var19);
var22 = var0.addEntity(var23, AddReason.SPAWN);
} else {
var19 = var0.ensureAndGetComponent(var22, FarmingBlock.getComponentType());
}
var19.setCurrentStageSet(var17);
var19.setGrowthProgress(0.0F);
var19.setExecutions(0);
var19.setGeneration(var19.getGeneration() + 1);
var19.setLastTickGameTime(var20);
if (var22 == null) {
class="kw">return false;
}
BlockSection var24 = var0.getComponent(var12, BlockSection.getComponentType());
if (var24 != null) {
var24.scheduleTick(var21, var20);
}
var18[0].apply(var0, var12, var22, ChunkUtil.localCoordinate(var5.x), ChunkUtil.localCoordinate(var5.y), ChunkUtil.localCoordinate(var5.z), var16);
class="kw">return true;
} else {
BlockOperations.setBlock(var8.getChunkStore(), var12, var5.x, var5.y, var5.z, 0, BlockType.EMPTY, 0, 0, 0);
class="kw">return false;
}
} else {
giveDrops(var1, var2, var9, var3, var7);
BlockOperations.setBlock(var8.getChunkStore(), var12, var5.x, var5.y, var5.z, 0, BlockType.EMPTY, 0, 0, 0);
class="kw">return true;
}
}
class="kw">protected class="kw">static void giveDrops(
@Nonnull ComponentAccessor<EntityStore> var0,
@Nullable Ref<EntityStore> var1,
@Nonnull Vector3d var2,
@Nonnull BlockType var3,
@Nonnull HarvestingDropType var4
) {
String var5 = var4.getItemId();
String var6 = var4.getDropListId();
List var7 = BlockHarvestUtils.getDrops(var3, 1, var5, var6);
if (var1 == null) {
var0.addEntities(ItemComponent.generateItemDrops(var0, var7, var2, Rotation3f.IDENTITY), AddReason.SPAWN);
} else {
for (ItemStack var9 : var7) {
ItemUtils.interactivelyPickupItem(var1, var9, var2, var0);
}
}
}
}