PlaceBlockEffect class

Пакет: com.hypixel.hytale.builtin.triggervolumes.effect.builtin

Файл: com/hypixel/hytale/builtin/triggervolumes/effect/builtin/PlaceBlockEffect.java

extends: TriggerEffect

Поля (37)

МодификаторыТипИмя
ALWAYS, ONLY_AIR
long var10
FluidSection var10
Ref var12
BlockChunk var13
WorldChunk var14
BlockType var15
int var16
World var2
BlockFilter.BlocksAndFluids var2
PlaceBlockEffect.TargetType var3
int var3
int var3
Vector3d var4
int var4
int var5
TriggerVolumeManager var5
IntIterator var5
Store var5
int var6
Vector3d var6
int var6
Fluid var6
ChunkColumn var6
int var7
Ref var7
BlockType var7
Store var7
Ref var7
ChunkStore var8
UUIDComponent var8
BlockType var8
ChunkColumn var8
FluidSection var8
Store var9
IntIterator var9
Ref var9

Методы (22)

МодификаторыВозвратСигнатура
ReplaceMode ReplaceMode()
private record TargetTyperecord TargetType(int blockId, int fluidId)
static void clearFluidvoid clearFluid(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4)
abstract clearFluid clearFluid(var8, var12, var5, var6, var7)
static void fireBlockPlacedEventvoid fireBlockPlacedEvent(@Nonnull TriggerContext var0, int var1, int var2, int var3, @Nonnull String var4)
if if(var3 != null)
if if(var13 != null)
if if(var14 != null)
if if(var15 != null)
if if(var5 != null)
if if(var7 != null && var8 != null)
if if(var3 + var4 != 1)
if if(var3 == 1)
if if(var8 == null)
if if(var6 != null)
if if(var8 != null)
if if(var6 != null)
if if(var8 != null)
if if(this.origin == EffectOrigin.VOLUME_ORIGIN)
if if(this.position != null)
if if(this.rotation != null && var3 > 0)
static void setFluidvoid setFluid(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4, int var5)

Исходный код

Показать/скрыть
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 {
      }
   }
}