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