TintChunkPageEventData class

Пакет: com.hypixel.hytale.server.core.command.commands.world.chunk

Файл: com/hypixel/hytale/server/core/command/commands/world/chunk/ChunkTintCommand.java

Поля (13)

МодификаторыТипИмя
public static final BuilderCodec<ChunkTintCommand.TintChunkPage.TintChunkPageEventData> CODEC
public static final String KEY_ACTION
public static final String KEY_BLUR_ENABLED
public static final String KEY_COLOR
public static final String KEY_HEX_COLOR
public static final String KEY_RADIUS
public static final String KEY_SIGMA
private ChunkTintCommand.TintChunkPage.TintChunkPageAction action
private String color
private String hexColor
private boolean isBlurEnabled
private int radius
private int sigma

Методы (6)

МодификаторыВозвратСигнатура
public ChunkTintCommand.TintChunkPage.TintChunkPageAction getActionpublic ChunkTintCommand.TintChunkPage.TintChunkPageAction getAction()
public String getColorpublic String getColor()
public String getKeyHexColorpublic String getKeyHexColor()
public int getRadiuspublic int getRadius()
public int getSigmapublic int getSigma()
public boolean isBlurEnabledpublic boolean isBlurEnabled()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.command.commands.world.chunk;

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.codec.validation.Validators;
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.math.util.MathUtil;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandContext;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandManager;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.DefaultArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.FlagArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractPlayerCommand;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.ui.builder.EventData;
class="kw">import com.hypixel.hytale.server.core.ui.builder.UICommandBuilder;
class="kw">import com.hypixel.hytale.server.core.ui.builder.UIEventBuilder;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.AbstractCachedAccessor;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.CachedAccessor;
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.longs.Long2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.longs.Long2IntMap.Entry;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;

class="kw">public class ChunkTintCommand class="kw">extends AbstractPlayerCommand {
   class="kw">private class="kw">static class="kw">final int BLUR_RADIUS = 5;
   class="kw">private class="kw">static class="kw">final double BLUR_SIGMA = 1.5;
   class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Registry REGISTRY = new AbstractCachedAccessor.Registry();
   class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Key<BlockChunk> BLOCK_CHUNK = REGISTRY.forColumn(BlockChunk::getComponentType);
   class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.InitFunction ACCESSOR = REGISTRY.oneShot();
   @Nonnull
   class="kw">private class="kw">final RequiredArg<Integer> colorArg = this.withRequiredArg("color", "server.commands.chunk.tint.color.desc", ArgTypes.COLOR);
   @Nonnull
   class="kw">private class="kw">final DefaultArg<Integer> radiusArg = this.withDefaultArg(
         "radius", "server.commands.chunk.tint.radius.desc", ArgTypes.INTEGER, 5, "server.commands.chunk.tint.radius.class="kw">default"
      )
      .addValidator(Validators.greaterThan(0));
   @Nonnull
   class="kw">private class="kw">final DefaultArg<Double> sigmaArg = this.withDefaultArg(
         "sigma", "server.commands.chunk.tint.sigma.desc", ArgTypes.DOUBLE, 1.5, "server.commands.chunk.tint.sigma.class="kw">default"
      )
      .addValidator(Validators.greaterThan(0.0));
   @Nonnull
   class="kw">private class="kw">final FlagArg blurArg = this.withFlagArg("blur", "server.commands.chunk.tint.blur.desc");

   class="kw">public ChunkTintCommand() {
      super("tint", "server.commands.chunk.tint.desc");
      this.setPermissionGroups("hytale:WorldEditor");
      this.addUsageVariant(new ChunkTintCommand.TintChunkPageCommand());
   }

   @Override
   class="kw">protected void execute(
      @Nonnull CommandContext var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull PlayerRef var4, @Nonnull World var5
   ) {
      int var6 = this.colorArg.get(var1);
      TransformComponent var7 = var2.getComponent(var3, TransformComponent.getComponentType());
      assert var7 != null;
      Vector3d var8 = var7.getPosition();
      int var9 = MathUtil.floor(var8.x()) >> 5;
      int var10 = MathUtil.floor(var8.z()) >> 5;
      ChunkStore var11 = var5.getChunkStore();
      Store var12 = var11.getStore();
      LongOpenHashSet var13 = new LongOpenHashSet();
      int var14 = 0;
      double var15 = 0.0;
      long var17 = ChunkUtil.indexChunk(var9, var10);
      Ref var19 = var11.getChunkReference(var17);
      if (var19 != null && var19.isValid()) {
         BlockChunk var20 = var12.getComponent(var19, BlockChunk.getComponentType());
         if (var20 != null) {
            for (int var21 = 0; var21 < 32; var21++) {
               for (int var22 = 0; var22 < 32; var22++) {
                  var20.setTint(var21, var22, var6);
               }
            }

            var13.add(var17);
         }

         if (this.blurArg.provided(var1)) {
            var14 = this.radiusArg.get(var1);
            var15 = this.sigmaArg.get(var1);
            double[] var32 = gaussianMatrix(var15, var14);
            int var18 = var9 << 5;
            int var33 = var10 << 5;
            Long2IntOpenHashMap var34 = new Long2IntOpenHashMap();
            CachedAccessor var35 = ACCESSOR.get(var12, var9, 0, var10, 32 + var14 * 2, 1, 32 + var14 * 2);

            for (int var36 = -var14; var36 <= 32 + var14; var36++) {
               for (int var23 = -var14; var23 <= 32 + var14; var23++) {
                  int var24 = var18 + var36;
                  int var25 = var33 + var23;
                  int var26 = blur(var35, var14, var32, var24, var25);
                  var34.put(MathUtil.packLong(var24, var25), var26);
               }
            }

            ObjectIterator var37 = var34.long2IntEntrySet().iterator();

            while (var37.hasNext()) {
               Entry var38 = (Entry)var37.next();
               long var39 = var38.getLongKey();
               int var40 = MathUtil.unpackLeft(var39);
               int var27 = MathUtil.unpackRight(var39);
               Ref chunkRefx = var35.getColumnAtBlock(var40, var27);
               if (chunkRefx != null && chunkRefx.isValid()) {
                  BlockChunk blockChunkx = var35.getComponentColumnAtBlock(var40, var27, BLOCK_CHUNK);
                  if (blockChunkx != null) {
                     blockChunkx.setTint(var40, var27, var38.getIntValue());
                     long chunkIndexx = ChunkUtil.indexChunkFromBlock(var40, var27);
                     var13.add(chunkIndexx);
                  }
               }
            }
         }

         var13.forEach(var1x -> var5.getNotificationHandler().updateChunkTints(var1x));
         if (this.blurArg.provided(var1)) {
            var1.sendMessage(
               Message.translation("server.commands.chunk.tint.success.blur")
                  .param("chunkX", var9)
                  .param("chunkZ", var10)
                  .param("chunksAffected", var13.size())
                  .param("radius", var14)
                  .param("sigma", var15)
            );
         } else {
            var1.sendMessage(Message.translation("server.commands.chunk.tint.success").param("chunkX", var9).param("chunkZ", var10));
         }
      } else {
         var1.sendMessage(Message.translation("server.general.chunkNotLoaded").param("chunkX", var9).param("chunkZ", var10));
      }
   }

   class="kw">private class="kw">static int blur(@Nonnull CachedAccessor var0, int var1, double[] var2, int var3, int var4) {
      double var5 = 0.0;
      double var7 = 0.0;
      double var9 = 0.0;

      for (int var11 = -var1; var11 <= var1; var11++) {
         for (int var12 = -var1; var12 <= var1; var12++) {
            double var13 = var2[gaussianIndex(var1, var11, var12)];
            int var15 = var3 + var11;
            int var16 = var4 + var12;
            BlockChunk var17 = var0.getComponentColumnAtBlock(var15, var16, BLOCK_CHUNK);
            if (var17 != null) {
               int var18 = var17.getTint(var15, var16);
               var5 += (var18 >> 16 & 0xFF) * var13;
               var7 += (var18 >> 8 & 0xFF) * var13;
               var9 += (var18 & 0xFF) * var13;
            }
         }
      }

      class="kw">return 0xFF000000 | MathUtil.floor(var5) << 16 | MathUtil.floor(var7) << 8 | MathUtil.floor(var9);
   }

   class="kw">private class="kw">static double gaussian2d(double var0, double var2, double var4) {
      class="kw">return 1.0 / ((Math.PI * 2) * var0 * var0) * Math.pow(Math.E, -(var2 * var2 + var4 * var4) / (2.0 * var0 * var0));
   }

   class="kw">private class="kw">static double[] gaussianMatrix(double var0, int var2) {
      int var3 = 2 * var2 + 1;
      double[] var4 = new double[var3 * var3];

      for (int var5 = -var2; var5 <= var2; var5++) {
         for (int var6 = -var2; var6 <= var2; var6++) {
            double var7 = gaussian2d(var0, var5, var6);
            var4[gaussianIndex(var2, var5, var6)] = var7;
         }
      }

      double var12 = 0.0;

      for (double var10 : var4) {
         var12 += var10;
      }

      for (int var14 = 0; var14 < var4.length; var14++) {
         var4[var14] /= var12;
      }

      class="kw">return var4;
   }

   class="kw">private class="kw">static int gaussianIndex(int var0, int var1, int var2) {
      var1 += var0;
      var2 += var0;
      class="kw">return var1 * (2 * var0 + 1) + var2;
   }

   class="kw">public class="kw">static class TintChunkPage class="kw">extends InteractiveCustomUIPage<ChunkTintCommand.TintChunkPage.TintChunkPageEventData> {
      TintChunkPage(@Nonnull PlayerRef var1) {
         super(var1, CustomPageLifetime.CanDismiss, ChunkTintCommand.TintChunkPage.TintChunkPageEventData.CODEC);
      }

      @Override
      class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
         var2.append("Pages/TintChunkPage.ui");
         var3.addEventBinding(
            CustomUIEventBindingType.ValueChanged,
            "#ColorPicker",
            new EventData().append("@Color", "#ColorPicker.Value").append("Submit", ChunkTintCommand.TintChunkPage.TintChunkPageAction.ColorChanged.name()),
            false
         );
         var3.addEventBinding(
            CustomUIEventBindingType.Activating,
            "#ApplyButton",
            new EventData()
               .append("@Color", "#ColorPicker.Value")
               .append("@Radius", "#Radius.Value")
               .append("@BlurEnabled", "#BlurEnabledContainer #CheckBox.Value")
               .append("@Sigma", "#Sigma.Value")
               .append("@HexColor", "#HexColor.Value")
               .append("Submit", ChunkTintCommand.TintChunkPage.TintChunkPageAction.Submit.name()),
            false
         );
      }

      class="kw">public void handleDataEvent(
         @Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull ChunkTintCommand.TintChunkPage.TintChunkPageEventData var3
      ) {
         class="kw">switch (var3.getAction()) {
            case Submit: {
               String var7 = var3.getColor().substring(0, 7);
               int var8 = var3.getRadius();
               int var6 = var3.getSigma();
               if (!var3.getKeyHexColor().isEmpty()) {
                  var7 = var3.getKeyHexColor();
                  if (!var7.startsWith("#")) {
                     var7 = "#" + var7;
                  }
               }

               if (var3.isBlurEnabled()) {
                  CommandManager.get().handleCommand(this.playerRef, "chunk tint " + var7 + " --blur --radius=" + var8 + " --sigma=" + var6);
               } else {
                  CommandManager.get().handleCommand(this.playerRef, "chunk tint " + var7);
               }
               break;
            }
            case ColorChanged: {
               String var4 = var3.getColor().substring(0, 7);
               UICommandBuilder var5 = new UICommandBuilder();
               var5.set("#HexColor.Value", var4);
               this.sendUpdate(var5);
            }
         }
      }

      class="kw">public enum TintChunkPageAction {
         Submit,
         ColorChanged;

         TintChunkPageAction() {
         }
      }

      class="kw">public class="kw">static class TintChunkPageEventData {
         class="kw">public class="kw">static class="kw">final String KEY_COLOR = "@Color";
         class="kw">public class="kw">static class="kw">final String KEY_RADIUS = "@Radius";
         class="kw">public class="kw">static class="kw">final String KEY_SIGMA = "@Sigma";
         class="kw">public class="kw">static class="kw">final String KEY_BLUR_ENABLED = "@BlurEnabled";
         class="kw">public class="kw">static class="kw">final String KEY_HEX_COLOR = "@HexColor";
         class="kw">public class="kw">static class="kw">final String KEY_ACTION = "Submit";
         @Nonnull
         class="kw">public class="kw">static class="kw">final BuilderCodec<ChunkTintCommand.TintChunkPage.TintChunkPageEventData> CODEC = BuilderCodec.builder(
               ChunkTintCommand.TintChunkPage.TintChunkPageEventData.class, ChunkTintCommand.TintChunkPage.TintChunkPageEventData::new
            )
            .addField(new KeyedCodec<>("@Color", Codec.STRING), (var0, var1) -> var0.color = var1, var0 -> var0.color)
            .addField(new KeyedCodec<>("@Radius", Codec.INTEGER), (var0, var1) -> var0.radius = var1, var0 -> var0.radius)
            .addField(new KeyedCodec<>("@Sigma", Codec.INTEGER), (var0, var1) -> var0.sigma = var1, var0 -> var0.sigma)
            .addField(new KeyedCodec<>("@BlurEnabled", Codec.BOOLEAN), (var0, var1) -> var0.isBlurEnabled = var1, var0 -> var0.isBlurEnabled)
            .addField(new KeyedCodec<>("@HexColor", Codec.STRING), (var0, var1) -> var0.hexColor = var1, var0 -> var0.hexColor)
            .addField(
               new KeyedCodec<>("Submit", new EnumCodec<>(ChunkTintCommand.TintChunkPage.TintChunkPageAction.class)),
               (var0, var1) -> var0.action = var1,
               var0 -> var0.action
            )
            .build();
         class="kw">private String color;
         class="kw">private int radius;
         class="kw">private int sigma;
         class="kw">private String hexColor;
         class="kw">private boolean isBlurEnabled;
         class="kw">private ChunkTintCommand.TintChunkPage.TintChunkPageAction action;

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

         class="kw">public String getColor() {
            class="kw">return this.color;
         }

         class="kw">public int getRadius() {
            class="kw">return this.radius;
         }

         class="kw">public int getSigma() {
            class="kw">return this.sigma;
         }

         class="kw">public boolean isBlurEnabled() {
            class="kw">return this.isBlurEnabled;
         }

         class="kw">public String getKeyHexColor() {
            class="kw">return this.hexColor;
         }

         class="kw">public ChunkTintCommand.TintChunkPage.TintChunkPageAction getAction() {
            class="kw">return this.action;
         }
      }
   }

   class="kw">static class TintChunkPageCommand class="kw">extends AbstractPlayerCommand {
      TintChunkPageCommand() {
         super("server.commands.chunk.tint.get");
      }

      @Override
      class="kw">protected void execute(
         @Nonnull CommandContext var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull PlayerRef var4, @Nonnull World var5
      ) {
         Player var6 = var2.getComponent(var3, Player.getComponentType());
         assert var6 != null;
         var6.getPageManager().openCustomPage(var3, var2, new ChunkTintCommand.TintChunkPage(var4));
      }
   }
}