BlockBulkFindCommand class

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

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

extends: AbstractWorldCommand

Поля (33)

МодификаторыТипИмя
return
TransformComponent var10
int var10
Vector3d var11
int[] var11
int var12
ChunkStore var12
IntList var13
SpiralIterator var13
int var14
long var14
int var15
int var16
BlockChunk var16
int var17
String var18
BlockSection var18
int var19
int var20
int var21
long var22
CommandSender var4
IntCoord var5
IntCoord var6
int var7
var7
int var7
int var8
var8
long var8
int var8
Ref var9
int var9

Методы (6)

МодификаторыВозвратСигнатура
for for(int var17 = 0; var17 < 10; var17++)
if if(var9 != null)
if if(var11[0] < var14)
if if(var11[0] >= var14)
if if(++var10 % 100 == 0)
abstract super super("find", "server.commands.block.find.desc", true)

Исходный код

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

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.command.system.CommandContext;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandSender;
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.arguments.types.IntCoord;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractWorldCommand;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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.IntList;
class="kw">import it.unimi.dsi.fastutil.ints.IntLists;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;

class="kw">public class BlockBulkFindCommand class="kw">extends AbstractWorldCommand {
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_BLOCK_FIND_TIME_OUT = Message.translation("server.commands.block.find.timeout");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_BLOCK_FIND_DONE = Message.translation("server.commands.block.find.done");
   @Nonnull
   class="kw">private class="kw">final RequiredArg<IntCoord> chunkXArg = this.withRequiredArg("chunkX", "server.commands.block.find.chunkX.desc", ArgTypes.RELATIVE_INT_COORD);
   @Nonnull
   class="kw">private class="kw">final RequiredArg<IntCoord> chunkZArg = this.withRequiredArg("chunkZ", "server.commands.block.find.chunkZ.desc", ArgTypes.RELATIVE_INT_COORD);
   @Nonnull
   class="kw">private class="kw">final RequiredArg<String> blockTypeArg = this.withRequiredArg("block", "server.commands.block.find.block.desc", ArgTypes.BLOCK_TYPE_KEY);
   @Nonnull
   class="kw">private class="kw">final RequiredArg<Integer> countArg = this.withRequiredArg("count", "server.commands.block.find.count.desc", ArgTypes.INTEGER);
   @Nonnull
   class="kw">private class="kw">final RequiredArg<Integer> timeoutArg = this.withRequiredArg("timeout", "server.commands.block.find.timeout.desc", ArgTypes.INTEGER);

   class="kw">public BlockBulkFindCommand() {
      super("find", "server.commands.block.find.desc", true);
   }

   @Override
   class="kw">protected void execute(@Nonnull CommandContext var1, @Nonnull World var2, @Nonnull Store<EntityStore> var3) {
      CommandSender var4 = var1.sender();
      IntCoord var5 = this.chunkXArg.get(var1);
      IntCoord var6 = this.chunkZArg.get(var1);
      int var7 = 0;
      int var8 = 0;
      if (var1.isPlayer()) {
         Ref var9 = var1.senderAsPlayerRef();
         if (var9 != null) {
            TransformComponent var10 = var3.getComponent(var9, TransformComponent.getComponentType());
            assert var10 != null;
            Vector3d var11 = var10.getPosition();
            var7 = MathUtil.floor(var11.x()) >> 5;
            var8 = MathUtil.floor(var11.z()) >> 5;
         }
      }

      int var16 = var5.resolveXZ(var7);
      int var17 = var6.resolveXZ(var8);
      String var18 = this.blockTypeArg.get(var1);
      int var12 = BlockType.getAssetMap().getIndex(var18);
      IntList var13 = IntLists.singleton(var12);
      int var14 = this.countArg.get(var1);
      int var15 = this.timeoutArg.get(var1);
      CompletableFuture.runAsync(
         () -> {
            long var8 = System.nanoTime();
            int var10 = 0;
            int[] var11 = new int[]{0};
            ChunkStore var12 = var2.getChunkStore();
            SpiralIterator var13 = new SpiralIterator(var16, var17, SpiralIterator.MAX_RADIUS);

            label32:
            while (var13.hasNext()) {
               long var14 = var13.next();
               BlockChunk var16 = var12.getChunkReferenceAsync(var14)
                  .thenApplyAsync(var1x -> var12.getStore().getComponent((Ref<ChunkStore>)var1x, BlockChunk.getComponentType()), var2)
                  .join();

               for (int var17 = 0; var17 < 10; var17++) {
                  BlockSection var18 = var16.getSectionAtIndex(var17);
                  if (var18.contains(var12)) {
                     int var19 = ChunkUtil.xOfChunkIndex(var14);
                     int var20 = var17;
                     int var21 = ChunkUtil.zOfChunkIndex(var14);
                     var18.find(var13, var6x -> {
                        if (var11[0] < var14) {
                           var11[0]++;
                           int var7 = var19 << 5 | ChunkUtil.xFromIndex(var6x);
                           int var8 = var20 << 5 | ChunkUtil.yFromIndex(var6x);
                           int var9 = var21 << 5 | ChunkUtil.zFromIndex(var6x);
                           var4.sendMessage(Message.translation("server.commands.block.find.blockFound").param("x", var7).param("y", var8).param("z", var9));
                        }
                     });
                     if (var11[0] >= var14) {
                        break label32;
                     }
                  }
               }

               if (++var10 % 100 == 0) {
                  var4.sendMessage(Message.translation("server.commands.block.find.chunksTested").param("nb", var10));
               }

               long var22 = System.nanoTime() - var8;
               if (var22 > TimeUnit.SECONDS.toNanos(var15)) {
                  var4.sendMessage(MESSAGE_COMMANDS_BLOCK_FIND_TIME_OUT);
                  class="kw">return;
               }
            }

            var4.sendMessage(MESSAGE_COMMANDS_BLOCK_FIND_DONE);
         }
      );
   }
}