ReplaceMode enum
Пакет: com.hypixel.hytale.builtin.triggervolumes.effect.builtin
Файл: com/hypixel/hytale/builtin/triggervolumes/effect/builtin/PlaceBlockEffect.java
Поля (1)
| Модификаторы | Тип | Имя |
|---|---|---|
|
ALWAYS, |
ONLY_AIR |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.triggervolumes.effect.builtin;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.YawRotation;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.EffectOrigin;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerContext;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerEffect;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerEventType;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.TriggerVolumeManager;
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.EnumCodec;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
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.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.mask.BlockFilter;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
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.IntIterator;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">public class PlaceBlockEffect class="kw">extends TriggerEffect {
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderCodec<PlaceBlockEffect> CODEC = BuilderCodec.builder(PlaceBlockEffect.class, PlaceBlockEffect::new, BASE_CODEC)
.append(new KeyedCodec<>("BlockType", Codec.STRING), (var0, var1) -> var0.blockType = var1, var0 -> var0.blockType)
.add()
.append(new KeyedCodec<>("BlockState", Codec.STRING, false), (var0, var1) -> var0.blockState = var1, var0 -> var0.blockState)
.add()
.append(new KeyedCodec<>("Position", Vector3dUtil.CODEC, false), (var0, var1) -> var0.position = var1, var0 -> var0.position)
.add()
.append(new KeyedCodec<>("Origin", new EnumCodec<>(EffectOrigin.class), false), (var0, var1) -> var0.origin = var1, var0 -> var0.origin)
.add()
.append(
new KeyedCodec<>("ReplaceMode", new EnumCodec<>(PlaceBlockEffect.ReplaceMode.class), false),
(var0, var1) -> var0.replaceMode = var1,
var0 -> var0.replaceMode
)
.add()
.append(new KeyedCodec<>("Rotation", new EnumCodec<>(Rotation.class), false), (var0, var1) -> var0.rotation = var1, var0 -> var0.rotation)
.add()
.append(new KeyedCodec<>("Pitch", new EnumCodec<>(Rotation.class), false), (var0, var1) -> var0.pitch = var1, var0 -> var0.pitch)
.add()
.append(new KeyedCodec<>("Roll", new EnumCodec<>(Rotation.class), false), (var0, var1) -> var0.roll = var1, var0 -> var0.roll)
.add()
.build();
@Nullable
class="kw">private String blockType;
@Nonnull
class="kw">private Vector3d position = new Vector3d();
@Nonnull
class="kw">private EffectOrigin origin = EffectOrigin.VOLUME_ORIGIN;
@Nonnull
class="kw">private PlaceBlockEffect.ReplaceMode replaceMode = PlaceBlockEffect.ReplaceMode.ALWAYS;
@Nonnull
class="kw">private Rotation rotation = Rotation.None;
@Nonnull
class="kw">private Rotation pitch = Rotation.None;
@Nonnull
class="kw">private Rotation roll = Rotation.None;
@Nullable
class="kw">private String blockState;
class="kw">public PlaceBlockEffect() {
}
@Override
class="kw">public void execute(@Nonnull TriggerContext var1) {
if (this.blockType != null && !this.blockType.isBlank()) {
World var2 = var1.getStore().getExternalData().getWorld();
PlaceBlockEffect.TargetType var3 = resolveTargetType(this.blockType, this.blockState);
if (var3 != null) {
Vector3d var4 = this.resolveTargetPosition(var1);
int var5 = MathUtil.floor(var4.x());
int var6 = MathUtil.floor(var4.y());
int var7 = MathUtil.floor(var4.z());
ChunkStore var8 = var2.getChunkStore();
Store var9 = var8.getStore();
long var10 = ChunkUtil.indexChunkFromBlock(var5, var7);
Ref var12 = var8.getChunkReference(var10);
if (var12 != null && var12.isValid()) {
BlockChunk var13 = var9.getComponent(var12, BlockChunk.getComponentType());
if (var13 != null) {
if (this.replaceMode != PlaceBlockEffect.ReplaceMode.ONLY_AIR || var13.getBlock(var5, var6, var7) == 0) {
WorldChunk var14 = var9.getComponent(var12, WorldChunk.getComponentType());
if (var14 != null) {
if (var3.fluidId() != 0) {
var14.setBlock(var5, var6, var7, 0, BlockType.EMPTY, 0, 0, 256);
setFluid(var8, var12, var5, var6, var7, var3.fluidId());
} else {
clearFluid(var8, var12, var5, var6, var7);
BlockType var15 = BlockType.getAssetMap().getAsset(var3.blockId());
if (var15 != null) {
int var16 = RotationTuple.index(this.rotation, this.pitch, this.roll);
var14.setBlock(var5, var6, var7, var3.blockId(), var15, var16, 0, 256);
fireBlockPlacedEvent(var1, var5, var6, var7, var15.getId());
}
}
}
}
}
}
}
}
}
class="kw">private class="kw">static void fireBlockPlacedEvent(@Nonnull TriggerContext var0, int var1, int var2, int var3, @Nonnull String var4) {
TriggerVolumeManager var5 = TaggedVolumeEffectUtil.manager(var0);
if (var5 != null) {
Vector3d var6 = new Vector3d(var1 + 0.5, var2 + 0.5, var3 + 0.5);
Ref var7 = var0.getEntityRef();
UUIDComponent var8 = var7 != null ? var0.getStore().getComponent(var7, UUIDComponent.getComponentType()) : null;
if (var7 != null && var8 != null) {
var5.enqueueBlockEvent(TriggerEventType.BLOCK_PLACED, var7, var8.getUuid(), var6, var4);
} else {
var5.enqueueEnvironmentBlockEvent(TriggerEventType.BLOCK_PLACED, var6, var4);
}
}
}
@Nullable
class="kw">private class="kw">static PlaceBlockEffect.TargetType resolveTargetType(@Nonnull String var0, @Nullable String var1) {
BlockFilter.BlocksAndFluids var2 = BlockFilter.parseBlocksAndFluids(new String[]{var0});
if (var2.hasInvalidBlocks()) {
class="kw">return null;
}
int var3 = var2.blocks().size();
int var4 = var2.fluids() != null ? var2.fluids().size() : 0;
if (var3 + var4 != 1) {
LOGGER.at(Level.FINE).log("PlaceBlockEffect: target '%s' resolves to %d blocks and %d fluids", var0, var3, var4);
class="kw">return null;
}
if (var3 == 1) {
IntIterator var9 = var2.blocks().iterator();
int var6 = var9.nextInt();
if (var1 != null && !var1.isBlank()) {
BlockType var7 = BlockType.getAssetMap().getAsset(var6);
BlockType var8 = var7 != null ? var7.getBlockForState(var1) : null;
if (var8 == null) {
LOGGER.at(Level.FINE).log("PlaceBlockEffect: BlockType '%s' does not define BlockState '%s'", var0, var1);
class="kw">return null;
} else {
class="kw">return new PlaceBlockEffect.TargetType(BlockType.getAssetMap().getIndex(var8.getId()), 0);
}
} else {
class="kw">return new PlaceBlockEffect.TargetType(var6, 0);
}
} else {
IntIterator var5 = var2.fluids().iterator();
class="kw">return new PlaceBlockEffect.TargetType(0, var5.nextInt());
}
}
class="kw">private class="kw">static void setFluid(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4, int var5) {
Fluid var6 = Fluid.getAssetMap().getAsset(var5);
if (var6 != null) {
Store var7 = var0.getStore();
ChunkColumn var8 = var7.getComponent(var1, ChunkColumn.getComponentType());
if (var8 != null) {
Ref var9 = var8.getSection(ChunkUtil.chunkCoordinate(var3));
if (var9 != null && var9.isValid()) {
FluidSection var10 = var7.ensureAndGetComponent(var9, FluidSection.getComponentType());
var10.setFluid(var2, var3, var4, var5, (byte)var6.getMaxFluidLevel());
}
}
}
}
class="kw">private class="kw">static void clearFluid(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4) {
Store var5 = var0.getStore();
ChunkColumn var6 = var5.getComponent(var1, ChunkColumn.getComponentType());
if (var6 != null) {
Ref var7 = var6.getSection(ChunkUtil.chunkCoordinate(var3));
if (var7 != null && var7.isValid()) {
FluidSection var8 = var5.getComponent(var7, FluidSection.getComponentType());
if (var8 != null) {
if (var8.getFluidId(var2, var3, var4) != 0) {
var8.setFluid(var2, var3, var4, 0, (byte)0);
}
}
}
}
}
@Override
class="kw">public void rotateInPlace(float var1, @Nonnull Vector3d var2) {
if (this.origin == EffectOrigin.VOLUME_ORIGIN) {
if (this.position != null) {
YawRotation.rotateBlockOffset(this.position, var1, var2);
}
int var3 = YawRotation.quarterTurns(var1);
if (this.rotation != null && var3 > 0) {
this.rotation = YawRotation.rotate(this.rotation, var3);
}
}
}
@Nonnull
class="kw">private Vector3d resolveTargetPosition(@Nonnull TriggerContext var1) {
class="kw">return var1.resolveOrigin(this.origin, this.position, TriggerContext.MissingActor.FALLBACK_TO_VOLUME);
}
class="kw">public enum ReplaceMode {
ALWAYS,
ONLY_AIR;
ReplaceMode() {
}
}
class="kw">private record TargetType(int blockId, int fluidId) {
class="kw">private TargetType {
}
}
}