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 {
      }
   }
}