PrefabSaver class
Пакет: com.hypixel.hytale.builtin.buildertools.prefabeditor.saving
Файл: com/hypixel/hytale/builtin/buildertools/prefabeditor/saving/PrefabSaver.java
Поля (79)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
String |
EDITOR_BLOCK |
|
|
break |
|
|
continue |
|
|
return |
|
int |
var10 |
|
Holder |
var10 |
|
LongIterator |
var10 |
|
int |
var11 |
|
long |
var11 |
|
int |
var12 |
|
ChunkStore |
var12 |
|
long |
var13 |
|
CompletableFuture |
var13 |
|
Long2ReferenceMap |
var14 |
|
int |
var15 |
|
List |
var15 |
|
int |
var16 |
|
int |
var17 |
|
int |
var18 |
|
int |
var19 |
|
int |
var20 |
|
BlockSelection |
var21 |
|
int |
var22 |
|
int |
var23 |
|
int |
var24 |
|
int |
var25 |
|
long |
var28 |
|
ComponentRegistry.Data |
var29 |
|
LongSet |
var3 |
|
Ref |
var30 |
|
WorldChunk |
var31 |
|
ChunkColumn |
var32 |
|
int |
var34 |
|
Ref |
var35 |
|
BlockSection |
var36 |
|
BlockPhysics |
var37 |
|
int |
var38 |
|
|
var38 |
|
int |
var39 |
|
int |
var4 |
|
long |
var4 |
|
Holder |
var40 |
|
|
var40 |
|
int |
var41 |
|
byte |
var42 |
|
UUIDComponent |
var44 |
|
TransformComponent |
var45 |
|
Vector3d |
var46 |
|
boolean |
var47 |
|
boolean |
var48 |
|
BlockEntity |
var49 |
|
int |
var5 |
|
String |
var50 |
|
TransformComponent |
var51 |
|
Store |
var52 |
|
long |
var54 |
|
ComponentType |
var55 |
|
Set |
var57 |
|
long |
var58 |
|
ComponentType |
var59 |
|
BlockEntity |
var6 |
|
int |
var6 |
|
Path |
var6 |
|
ComponentType |
var60 |
|
ObjectIterator |
var61 |
|
Ref |
var62 |
|
ChunkColumn |
var63 |
|
Ref[] |
var64 |
|
FluidSection |
var69 |
|
String |
var7 |
|
int |
var7 |
|
long |
var7 |
|
EntitySection |
var70 |
|
int |
var71 |
|
Holder |
var74 |
|
ChunkStore |
var8 |
|
UUIDComponent |
var8 |
|
BlockTypeAssetMap |
var9 |
|
TransformComponent |
var9 |
Методы (20)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
for for(int var26 = var3.x; var26 <= var4.x; var26++) |
|
|
for for(int var27 = var3.z; var27 <= var4.z; var27++) |
|
|
for for(int var33 = var24; var33 >= var25; var33--) |
|
|
for for(Ref var68 : var64) |
|
|
for for(int var8 = var4; var8 <= var5; var8++) |
|
|
for for(int var9 = var6; var9 <= var7; var9++) |
|
|
if if(var10 == Integer.MIN_VALUE) |
|
|
if if(var11 == Integer.MIN_VALUE) |
|
|
if if(var12 == Integer.MIN_VALUE) |
|
|
if if(var38 == var10) |
|
|
if if(var40 != null) |
|
|
if if(var6 != null) |
|
|
if if(var8 != null) |
|
|
if if(var63 != null) |
|
|
if if(var64 != null) |
|
|
if if(var70 != null) |
|
|
if if(var47 && var48) |
|
|
if if(var49 != null) |
|
|
if if(var44 != null) |
|
|
synchronized synchronized(var14) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.buildertools.prefabeditor.saving;
class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
class="kw">import com.hypixel.hytale.component.ComponentRegistry;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
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.vector.VectorBoxUtil;
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.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandSender;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabCopyableComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabSaveException;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
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.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.EntitySection;
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.longs.Long2ReferenceMap;
class="kw">import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.longs.LongIterator;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.longs.LongSet;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.nio.file.FileSystems;
class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.TimeUnit;
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">import org.joml.Vector3i;
class="kw">public class PrefabSaver {
class="kw">protected class="kw">static class="kw">final String EDITOR_BLOCK = "Editor_Block";
class="kw">protected class="kw">static class="kw">final String EDITOR_BLOCK_PREFAB_AIR = "Editor_Empty";
class="kw">protected class="kw">static class="kw">final String EDITOR_BLOCK_PREFAB_ANCHOR = "Editor_Anchor";
class="kw">public PrefabSaver() {
}
@Nonnull
class="kw">public class="kw">static CompletableFuture<Path> savePrefab(
@Nonnull CommandSender var0,
@Nonnull World var1,
@Nonnull Path var2,
@Nonnull Vector3i var3,
@Nonnull Vector3i var4,
@Nonnull Vector3i var5,
@Nonnull Vector3i var6,
@Nonnull Vector3i var7,
@Nonnull PrefabSaverSettings var8
) {
class="kw">return copyBlocksAsync(var0, var1, var3, var4, var5, var6, var7, var8)
.thenComposeAsync(
var4x -> var4x == null
? CompletableFuture.completedFuture(null)
: CompletableFuture.<Path>supplyAsync(() -> save(var0, var4x, var2, var8), BuilderToolsPlugin.get().getPrefabSaveExecutor())
.thenApplyAsync(var0x -> (Path)var0x, var1),
var1
);
}
@Nonnull
class="kw">private class="kw">static CompletableFuture<BlockSelection> copyBlocksAsync(
@Nonnull CommandSender var0,
@Nonnull World var1,
@Nonnull Vector3i var2,
@Nonnull Vector3i var3,
@Nonnull Vector3i var4,
@Nonnull Vector3i var5,
@Nonnull Vector3i var6,
@Nonnull PrefabSaverSettings var7
) {
ChunkStore var8 = var1.getChunkStore();
BlockTypeAssetMap var9 = BlockType.getAssetMap();
int var10 = var9.getIndex("Editor_Block");
if (var10 == Integer.MIN_VALUE) {
var0.sendMessage(Message.translation("server.commands.editprefab.save.error.unknownBlockIdKey").param("key", "Editor_Block".toString()));
class="kw">return CompletableFuture.completedFuture(null);
} else {
int var11 = var9.getIndex("Editor_Empty");
if (var11 == Integer.MIN_VALUE) {
var0.sendMessage(Message.translation("server.commands.editprefab.save.error.unknownBlockIdKey").param("key", "Editor_Empty".toString()));
class="kw">return CompletableFuture.completedFuture(null);
} else {
int var12 = var9.getIndex("Editor_Anchor");
if (var12 == Integer.MIN_VALUE) {
var0.sendMessage(Message.translation("server.commands.editprefab.save.error.unknownBlockIdKey").param("key", "Editor_Anchor".toString()));
class="kw">return CompletableFuture.completedFuture(null);
} else {
class="kw">return preloadChunksInSelectionAsync(var8, var3, var4)
.thenApplyAsync(
var11x -> copyBlocksWithLoadedChunks(
var0, var1, var2, var3, var4, var5, var6, var7, (Long2ReferenceMap<Ref<ChunkStore>>)var11x, var10, var11, var12
),
var1
);
}
}
}
}
@Nullable
class="kw">private class="kw">static BlockSelection copyBlocksWithLoadedChunks(
@Nonnull CommandSender var0,
@Nonnull World var1,
@Nonnull Vector3i var2,
@Nonnull Vector3i var3,
@Nonnull Vector3i var4,
@Nonnull Vector3i var5,
@Nonnull Vector3i var6,
@Nonnull PrefabSaverSettings var7,
@Nonnull Long2ReferenceMap<Ref<ChunkStore>> var8,
int var9,
int var10,
int var11
) {
ChunkStore var12 = var1.getChunkStore();
long var13 = System.nanoTime();
int var15 = var4.x - var3.x;
int var16 = var4.y - var3.y;
int var17 = var4.z - var3.z;
int var18 = var2.x - var5.x;
int var19 = var2.y - var5.y;
int var20 = var2.z - var5.z;
BlockSelection var21 = new BlockSelection();
var21.setPosition(var5.x - var6.x, var5.y - var6.y, var5.z - var6.z);
var21.setSelectionArea(var3, var4);
var21.setAnchor(var18, var19, var20);
int var22 = 0;
int var23 = 0;
int var24 = Math.max(var3.y, var4.y);
int var25 = Math.min(var3.y, var4.y);
for (int var26 = var3.x; var26 <= var4.x; var26++) {
for (int var27 = var3.z; var27 <= var4.z; var27++) {
long var28 = ChunkUtil.indexChunkFromBlock(var26, var27);
Ref var30 = (Ref<ChunkStore>)var8.get(var28);
if (var30 != null && var30.isValid()) {
WorldChunk var31 = var12.getStore().getComponent(var30, WorldChunk.getComponentType());
assert var31 != null;
ChunkColumn var32 = var12.getStore().getComponent(var30, ChunkColumn.getComponentType());
assert var32 != null;
for (int var33 = var24; var33 >= var25; var33--) {
int var34 = ChunkUtil.indexSection(var33);
Ref var35 = var32.getSection(var34);
if (var35 != null && var35.isValid()) {
BlockSection var36 = var12.getStore().getComponent(var35, BlockSection.getComponentType());
assert var36 != null;
BlockPhysics var37 = var12.getStore().getComponent(var35, BlockPhysics.getComponentType());
int var38 = var36.get(var26, var33, var27);
int var39 = var36.getFiller(var26, var33, var27);
if (var7.isBlocks() && (var38 != 0 || var7.isEmpty()) && var38 != var9) {
if (var38 == var10) {
var38 = 0;
}
Holder var40 = var31.getBlockComponentHolder(var26, var33, var27);
if (var40 != null) {
var40 = var40.clone();
}
int var41 = var7.getSupportMode() != SupportMode.KEEP_EXISTING ? 0 : (var37 != null ? var37.get(var26, var33, var27) : 0);
var21.addBlockAtWorldPos(var26, var33, var27, var38, var36.getRotationIndex(var26, var33, var27), var39, var41, var40);
var22++;
}
FluidSection var69 = var12.getStore().getComponent(var35, FluidSection.getComponentType());
assert var69 != null;
int var71 = var69.getFluidId(var26, var33, var27);
if (var7.isBlocks() && (var71 != 0 || var7.isEmpty())) {
byte var42 = var69.getFluidLevel(var26, var33, var27);
var21.addFluidAtWorldPos(var26, var33, var27, var71, var42);
var23++;
}
}
}
}
}
}
if (var7.isEntities()) {
Store var52 = var1.getEntityStore().getStore();
ComponentType var55 = BlockEntity.getComponentType();
Set var57 = new HashSet<>();
ComponentRegistry.Data var29 = EntityStore.REGISTRY.getData();
ComponentType var59 = PrefabCopyableComponent.getComponentType();
ComponentType var60 = TransformComponent.getComponentType();
BuilderToolsPlugin.forEachCopyableInSelection(var1, var3.x, var3.y, var3.z, var15, var16, var17, var5x -> {
BlockEntity var6 = var52.getComponent(var5x, var55);
if (var6 != null) {
String var7 = var6.getBlockTypeKey();
if (var7 != null && (var7.equals("Editor_Block") || var7.equals("Editor_Empty") || var7.equals("Editor_Anchor"))) {
class="kw">return;
}
}
Holder var10 = var52.copyEntity(var5x);
UUIDComponent var8 = var10.getComponent(UUIDComponent.getComponentType());
if (var8 != null) {
var57.add(var8.getUuid());
}
TransformComponent var9 = var10.getComponent(var60);
if (var9 != null && var9.getPosition() != null) {
var9.getPosition().sub(var21.getX(), var21.getY(), var21.getZ());
}
var21.addEntityHolderRaw(var10);
});
ObjectIterator var61 = var8.values().iterator();
while (var61.hasNext()) {
Ref var62 = (Ref<ChunkStore>)var61.next();
ChunkColumn var63 = var12.getStore().getComponent(var62, ChunkColumn.getComponentType());
if (var63 != null) {
Ref[] var64 = var63.getSections();
if (var64 != null) {
for (Ref var68 : var64) {
if (var68 != null && var68.isValid()) {
EntitySection var70 = var12.getStore().getComponent(var68, EntitySection.getComponentType());
if (var70 != null) {
for (Holder var43 : var70.getEntityHolders()) {
UUIDComponent var44 = var43.getComponent(UUIDComponent.getComponentType());
TransformComponent var45 = var43.getComponent(var60);
Vector3d var46 = var45 != null ? var45.getPosition() : null;
boolean var47 = var43.getArchetype().contains(var59);
boolean var48 = var43.hasSerializableComponents(var29);
if (var47 && var48) {
BlockEntity var49 = var43.getComponent(var55);
if (var49 != null) {
String var50 = var49.getBlockTypeKey();
if (var50 != null && (var50.equals("Editor_Block") || var50.equals("Editor_Empty") || var50.equals("Editor_Anchor"))) {
class="kw">continue;
}
}
if (var45 != null
&& var46 != null
&& VectorBoxUtil.isInside(var3.x, var3.y, var3.z, 0.0, 0.0, 0.0, var15 + 1, var16 + 1, var17 + 1, var46)
&& (var44 == null || !var57.contains(var44.getUuid()))) {
if (var44 != null) {
var57.add(var44.getUuid());
}
Holder var74 = var43.clone();
TransformComponent var51 = var74.getComponent(var60);
if (var51 != null && var51.getPosition() != null) {
var51.getPosition().sub(var21.getX(), var21.getY(), var21.getZ());
}
var21.addEntityHolderRaw(var74);
}
}
}
}
}
}
}
}
}
var21.sortEntitiesByPosition();
}
for (PrefabSaveContributor var56 : BuilderToolsPlugin.get().getPrefabSaveContributors()) {
var56.contribute(var21, var1, var3, var4);
}
long var54 = System.nanoTime();
long var58 = var54 - var13;
BuilderToolsPlugin.get()
.getLogger()
.at(Level.FINE)
.log("Took: %dns (%dms) to execute copy of %d blocks, %d fluids", var58, TimeUnit.NANOSECONDS.toMillis(var58), var22, var23);
class="kw">return var21;
}
@Nonnull
class="kw">private class="kw">static CompletableFuture<Long2ReferenceMap<Ref<ChunkStore>>> preloadChunksInSelectionAsync(
@Nonnull ChunkStore var0, @Nonnull Vector3i var1, @Nonnull Vector3i var2
) {
LongSet var3 = new LongOpenHashSet();
int var4 = var1.x >> 5;
int var5 = var2.x >> 5;
int var6 = var1.z >> 5;
int var7 = var2.z >> 5;
for (int var8 = var4; var8 <= var5; var8++) {
for (int var9 = var6; var9 <= var7; var9++) {
var3.add(ChunkUtil.indexChunk(var8, var9));
}
}
Long2ReferenceMap var14 = new Long2ReferenceOpenHashMap(var3.size());
List var15 = new ArrayList<>(var3.size());
LongIterator var10 = var3.iterator();
while (var10.hasNext()) {
long var11 = (Long)var10.next();
CompletableFuture var13 = var0.getChunkReferenceAsync(var11).thenAccept(var3x -> {
if (var3x != null && var3x.isValid()) {
class="kw">synchronized (var14) {
var14.put(var11, var3x);
}
}
});
var15.add(var13);
}
class="kw">return CompletableFuture.allOf(var15.toArray(CompletableFuture[]::new)).thenApply(var1x -> var14);
}
@Nullable
class="kw">private class="kw">static Path save(@Nonnull CommandSender var0, @Nonnull BlockSelection var1, @Nonnull Path var2, @Nonnull PrefabSaverSettings var3) {
if (var2.getFileSystem() != FileSystems.getDefault()) {
var0.sendMessage(Message.translation("server.builderTools.cannotSaveToReadOnlyPath").param("path", var2.toString()));
class="kw">return null;
}
try {
long var4 = System.nanoTime();
if (var3.isRelativize()) {
var1.relativizeInPlace();
}
PrefabSaveSupport.apply(var1, var3);
Path var6 = PrefabStore.get().savePrefab(var2, var1, var3.isOverwriteExisting(), var3.getPrefabFormat());
long var7 = System.nanoTime() - var4;
BuilderToolsPlugin.get()
.getLogger()
.at(Level.FINE)
.log("Took: %dns (%dms) to execute save of %d blocks", var7, TimeUnit.NANOSECONDS.toMillis(var7), var1.getBlockCount());
class="kw">return var6;
} catch (PrefabSaveException var9) {
class="kw">switch (var9.getType()) {
case ERROR:
((HytaleLogger.Api)BuilderToolsPlugin.get().getLogger().at(Level.WARNING).withCause(var9)).log("Exception saving prefab %s", var2);
var0.sendMessage(
Message.translation("server.builderTools.errorSavingPrefab").param("name", var2.toString()).param("message", var9.getCause().getMessage())
);
break;
case ALREADY_EXISTS:
BuilderToolsPlugin.get().getLogger().at(Level.WARNING).log("Prefab already exists %s", var2.toString());
var0.sendMessage(Message.translation("server.builderTools.prefabAlreadyExists"));
}
class="kw">return null;
}
}
}