BlockBulkReplaceCommand class

Пакет: com.hypixel.hytale.server.core.universe.world.commands.block.bulk

Файл: com/hypixel/hytale/server/core/universe/world/commands/block/bulk/BlockBulkReplaceCommand.java

extends: AbstractPlayerCommand

Поля (33)

МодификаторыТипИмя
IntList var1
var1
int var10
AtomicInteger var10
int var10
IntList var11
SpiralIterator var11
IntList var12
long var12
int var13
Vector3d var14
BlockChunk var14
int var15
int var16
BlockSection var16
int var17
int var18
int var19
BlockType var2
RotationTuple[] var2
long var20
String var3
TransformComponent var6
String var7
long var7
int var7
String var8
int var8
int var8
String var8
int var9
ChunkStore var9
int var9

Методы (4)

МодификаторыВозвратСигнатура
for for(int var15 = 0; var15 < 10; var15++)
for for(RotationTuple var7 : var2)
if if(var8 >= 0)
abstract super super("replace", "server.commands.block.bulk.replace.desc")

Исходный код

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

class="kw">import com.hypixel.hytale.common.util.CompletableFutureUtil;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.iterator.SpiralIterator;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.server.core.Message;
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.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.VariantRotation;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandContext;
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.modules.entity.component.TransformComponent;
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.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
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.IntArrayList;
class="kw">import it.unimi.dsi.fastutil.ints.IntList;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.concurrent.atomic.AtomicInteger;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;

class="kw">public class BlockBulkReplaceCommand class="kw">extends AbstractPlayerCommand {
   @Nonnull
   class="kw">private class="kw">final RequiredArg<String> findArg = this.withRequiredArg("find", "server.commands.block.bulk.replace.find.desc", ArgTypes.BLOCK_TYPE_KEY);
   @Nonnull
   class="kw">private class="kw">final RequiredArg<String> replaceArg = this.withRequiredArg(
      "replaceWith", "server.commands.block.bulk.replace.replaceWith.desc", ArgTypes.BLOCK_TYPE_KEY
   );
   @Nonnull
   class="kw">private class="kw">final RequiredArg<Integer> radiusArg = this.withRequiredArg("radius", "server.commands.block.bulk.replace.radius.desc", ArgTypes.INTEGER);

   class="kw">public BlockBulkReplaceCommand() {
      super("replace", "server.commands.block.bulk.replace.desc");
   }

   @Override
   class="kw">protected void execute(
      @Nonnull CommandContext var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull PlayerRef var4, @Nonnull World var5
   ) {
      TransformComponent var6 = var2.getComponent(var3, TransformComponent.getComponentType());
      assert var6 != null;
      String var7 = this.findArg.get(var1);
      String var8 = this.replaceArg.get(var1);
      int var9 = BlockType.getAssetMap().getIndex(var7);
      int var10 = BlockType.getAssetMap().getIndex(var8);
      IntList var11 = getBlockIdList(var9);
      IntList var12 = getBlockIdList(var10);
      int var13 = this.radiusArg.get(var1);
      Vector3d var14 = var6.getPosition();
      int var15 = MathUtil.floor(var14.x()) >> 5;
      int var16 = MathUtil.floor(var14.z()) >> 5;
      CompletableFuture.runAsync(
         () -> {
            long var7 = System.nanoTime();
            ChunkStore var9 = var5.getChunkStore();
            AtomicInteger var10 = new AtomicInteger();
            SpiralIterator var11 = new SpiralIterator(var15, var16, var13);

            while (var11.hasNext()) {
               long var12 = var11.next();
               BlockChunk var14 = var9.getChunkReferenceAsync(var12)
                  .thenApplyAsync(var1x -> var9.getStore().getComponent((Ref<ChunkStore>)var1x, BlockChunk.getComponentType()), var5)
                  .join();

               for (int var15 = 0; var15 < 10; var15++) {
                  BlockSection var16 = var14.getSectionAtIndex(var15);
                  if (var16.containsAny(var11)) {
                     int var17 = ChunkUtil.xOfChunkIndex(var12);
                     int var18 = var15;
                     int var19 = ChunkUtil.zOfChunkIndex(var12);
                     var16.find(var11, var7x -> {
                        int var8 = var17 << 5 | ChunkUtil.xFromIndex(var7x);
                        int var9 = var18 << 5 | ChunkUtil.yFromIndex(var7x);
                        int var10 = var19 << 5 | ChunkUtil.zFromIndex(var7x);
                        CompletableFutureUtil._catch(var5.getChunkAsync(ChunkUtil.indexChunkFromBlock(var8, var10))).thenAccept(var6x -> {
                           int var7 = var6x.getBlock(var8, var9, var10);
                           int var8 = var11.indexOf(var7);
                           if (var8 >= 0) {
                              var6x.setBlock(var8, var9, var10, var12.getInt(var8 < var12.size() ? var8 : 0));
                              var10.getAndIncrement();
                           }
                        });
                     });
                  }
               }
            }

            long var20 = System.nanoTime() - var7;
            var4.sendMessage(
               Message.translation("server.commands.block.bulk.replace.result")
                  .param("count", var10.get())
                  .param("time", TimeUnit.NANOSECONDS.toSeconds(var20))
            );
         }
      );
   }

   @Nonnull
   class="kw">protected class="kw">static IntList getBlockIdList(int var0) {
      IntList var1 = new IntArrayList();
      BlockType var2 = BlockType.getAssetMap().getAsset(var0);
      if (var2.getVariantRotation().equals(VariantRotation.NESW)) {
         var1 = createNESWRotationLists(var2, var1);
      } else {
         var1.add(var0);
      }

      class="kw">return var1;
   }

   @Nonnull
   class="kw">private class="kw">static IntList createNESWRotationLists(@Nonnull BlockType var0, @Nonnull IntList var1) {
      RotationTuple[] var2 = var0.getVariantRotation().getRotations();
      String var3 = var0.getId();
      var1.add(BlockType.getAssetMap().getIndex(var3));

      for (RotationTuple var7 : var2) {
         String var8 = var3 + "|Yaw=" + var7.yaw().getDegrees();
         var1.add(BlockType.getAssetMap().getIndex(var8));
      }

      class="kw">return var1;
   }
}