ConnectedBlocksUtil class
Пакет: com.hypixel.hytale.server.core.universe.world.connectedblocks
Файл: com/hypixel/hytale/server/core/universe/world/connectedblocks/ConnectedBlocksUtil.java
Поля (67)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
int |
MAX_UPDATE_DEPTH |
|
private final Map<Vector3i, ObjectIntPair<String>> |
additionalConnectedBlocks |
|
private final String |
blockTypeKey |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
continue |
|
|
return |
|
|
return |
|
private final int |
rotationIndex |
|
|
var1 |
|
int |
var10 |
|
int |
var10 |
|
ConnectedBlockRuleSet |
var11 |
|
Map |
var11 |
|
BlockSection |
var11 |
|
int |
var12 |
|
|
var12 |
|
Iterator |
var12 |
|
int |
var12 |
|
Optional |
var13 |
|
Entry |
var13 |
|
BlockType |
var13 |
|
ConnectedBlocksUtil.ConnectedBlockResult |
var14 |
|
Vector3i |
var14 |
|
|
var14 |
|
ConnectedBlockRuleSet |
var14 |
|
int |
var15 |
|
ConnectedBlocksUtil.ConnectedBlockResult |
var15 |
|
|
var15 |
|
int |
var15 |
|
int |
var16 |
|
Ref |
var16 |
|
|
var16 |
|
|
var16 |
|
int |
var16 |
|
Ref |
var17 |
|
int |
var17 |
|
BlockType |
var18 |
|
int |
var18 |
|
Vector3i |
var19 |
|
int |
var19 |
|
ConnectedBlocksUtil.ConnectedBlockResult |
var2 |
|
ObjectIntPair |
var20 |
|
Optional |
var20 |
|
Vector3i |
var21 |
|
Ref |
var22 |
|
|
var22 |
|
Ref |
var23 |
|
BlockType |
var24 |
|
int |
var25 |
|
int |
var28 |
|
Vector3i |
var4 |
|
Store |
var5 |
|
Queue |
var6 |
|
Vector3i |
var6 |
|
ConnectedBlockRuleSet |
var6 |
|
Vector3i |
var7 |
|
Set |
var7 |
|
Ref |
var7 |
|
|
var7 |
|
BlockType |
var8 |
|
|
var8 |
|
QueueEntry |
var8 |
|
int |
var9 |
|
Vector3i |
var9 |
Методы (32)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
ConnectedBlockResultpublic ConnectedBlockResult(@Nonnull String var1, int var2) |
|
record |
QueueEntryrecord QueueEntry(Vector3i coordinate, int depth) |
|
public void |
addAdditionalBlockpublic void addAdditionalBlock(@Nonnull Vector3i var1, @Nonnull String var2, int var3) |
|
public String |
blockTypeKeypublic String blockTypeKey() |
|
public boolean |
equalspublic boolean equals(@Nullable Object var1) |
|
|
for for(int var8 = -1; var8 <= 1; var8++) |
|
|
for for(int var9 = -1; var9 <= 1; var9++) |
|
|
for for(int var10 = -1; var10 <= 1; var10++) |
|
public Map<Vector3i, ObjectIntPair<String>> |
getAdditionalConnectedBlockspublic Map<Vector3i, ObjectIntPair<String>> getAdditionalConnectedBlocks() |
|
public int |
hashCodepublic int hashCode() |
|
|
if if(var8 != null) |
|
|
if if(var11 != null && var9 == 0) |
|
|
if if(var8 == null) |
|
|
if if(var18 != null) |
|
|
if if(var24 != null) |
|
|
if if(var10 + 1 < 3) |
|
|
if if(var8 != 0 || var10 != 0 || var9 != 0) |
|
|
if if(var11 != null) |
|
|
if if(var13 != null) |
|
|
if if(var15 != 0) |
|
|
if if(var1 == this) |
static |
void |
notifyNeighborsAndCollectChangesvoid notifyNeighborsAndCollectChanges(@Nonnull ChunkStore var0, @Nonnull Vector3ic var1, @Nonnull Map<Vector3i, ConnectedBlocksUtil.ConnectedBlockResult> var2, @Nonnull Vector3ic var3) |
abstract |
|
notifyNeighborsAndCollectChanges notifyNeighborsAndCollectChanges(var0, var9, var11, var3) |
|
public int |
rotationIndexpublic int rotationIndex() |
static |
void |
setConnectedBlockAndNotifyNeighborsvoid setConnectedBlockAndNotifyNeighbors(@Nonnull ChunkStore var0,
int var1,
@Nonnull RotationTuple var2,
@Nonnull Vector3ic var3,
@Nonnull Vector3ic var4,
@Nonnull Ref<ChunkStore> var5,
@Nonnull BlockSection var6) |
|
public String |
toStringpublic String toString() |
static |
void |
updateNeighborsWithDepthvoid updateNeighborsWithDepth(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, @Nonnull Vector3ic var2, @Nonnull Vector3ic var3, int var4, boolean var5) |
abstract |
|
updateNeighborsWithDepth updateNeighborsWithDepth(var0, var5, var7, var3, var10, true) |
abstract |
|
updateNeighborsWithDepth updateNeighborsWithDepth(var0, var5, var7, var3, var10, false) |
|
|
while while(true) |
|
|
while while(true) |
|
|
while while(true) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.connectedblocks;
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.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.universe.world.chunk.BlockOperations;
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.util.FillerBlockUtil;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIntPair;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
class="kw">import java.util.ArrayDeque;
class="kw">import java.util.Iterator;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.Optional;
class="kw">import java.util.Queue;
class="kw">import java.util.Set;
class="kw">import java.util.Map.Entry;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;
class="kw">import org.joml.Vector3ic;
class="kw">public class ConnectedBlocksUtil {
class="kw">private class="kw">static class="kw">final int MAX_UPDATE_DEPTH = 3;
class="kw">public ConnectedBlocksUtil() {
}
class="kw">public class="kw">static void setConnectedBlockAndNotifyNeighbors(
@Nonnull ChunkStore var0,
int var1,
@Nonnull RotationTuple var2,
@Nonnull Vector3ic var3,
@Nonnull Vector3ic var4,
@Nonnull Ref<ChunkStore> var5,
@Nonnull BlockSection var6
) {
Vector3i var7 = new Vector3i(var4);
BlockType var8 = BlockType.getAssetMap().getAsset(var1);
if (var8 != null) {
int var9 = var6.getFiller(var4.x(), var4.y(), var4.z());
int var10 = 132;
ConnectedBlockRuleSet var11 = var8.getConnectedBlockRuleSet();
if (var11 != null && var9 == 0) {
int var12 = var2.index();
if (var11.getUpdateMode() == ConnectedBlockUpdateMode.UpdatePlaceUpdate) {
updateNeighborsWithDepth(var0, var5, var7, var3, var10, true);
var1 = var6.get(var7.x, var7.y, var7.z);
var8 = BlockType.getAssetMap().getAsset(var1);
if (var8 == null) {
class="kw">return;
}
var12 = var6.getRotationIndex(var7.x, var7.y, var7.z);
}
Optional var13 = getDesiredConnectedBlockType(var0, var7, var8, var12, var3, true);
if (var13.isPresent() && (!var13.get().blockTypeKey().equals(var8.getId()) || var13.get().rotationIndex != var12)) {
ConnectedBlocksUtil.ConnectedBlockResult var14 = var13.get();
int var15 = BlockType.getAssetMap().getIndex(var14.blockTypeKey());
int var16 = var14.rotationIndex();
BlockOperations.setBlock(var0, var5, var7.x, var7.y, var7.z, var15, BlockType.getAssetMap().getAsset(var15), var16, 0, var10);
}
if (var11.getUpdateMode() == ConnectedBlockUpdateMode.IgnoreUpdates) {
class="kw">return;
}
}
updateNeighborsWithDepth(var0, var5, var7, var3, var10, false);
}
}
class="kw">private class="kw">static void updateNeighborsWithDepth(
@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, @Nonnull Vector3ic var2, @Nonnull Vector3ic var3, int var4, boolean var5
) {
record QueueEntry(Vector3i coordinate, int depth) {
QueueEntry {
}
}
Queue var6 = new ArrayDeque<>();
Set var7 = new ObjectOpenHashSet();
var6.add(new QueueEntry(new Vector3i(var2), 0));
label90:
while (!var6.isEmpty()) {
QueueEntry var8 = var6.poll();
Vector3i var9 = var8.coordinate;
int var10 = var8.depth;
Map var11 = new Object2ObjectOpenHashMap();
notifyNeighborsAndCollectChanges(var0, var9, var11, var3);
Iterator var12 = var11.entrySet().iterator();
while (true) {
Vector3i var14;
ConnectedBlocksUtil.ConnectedBlockResult var15;
Ref var16;
while (true) {
while (true) {
if (!var12.hasNext()) {
class="kw">continue label90;
}
Entry var13 = (Entry<Vector3i, ConnectedBlocksUtil.ConnectedBlockResult>)var12.next();
var14 = var13.getKey();
var15 = var13.getValue();
if (var7.add(new Vector3i(var14)) && (var14.x != var9.x || var14.y != var9.y || var14.z != var9.z)) {
var16 = var1;
if (ChunkUtil.isSameChunkSection(var2.x(), var2.y(), var2.z(), var14.x, var14.y, var14.z)) {
break;
}
Ref var17 = var0.getChunkSectionReferenceAtBlock(var14.x, var14.y, var14.z);
if (var17 != null && var17.isValid()) {
var16 = var17;
break;
}
}
}
if (var5 && var14.equals(var2)) {
break;
}
int var25 = BlockType.getAssetMap().getIndex(var15.blockTypeKey());
BlockType var18 = BlockType.getAssetMap().getAsset(var25);
if (var18 != null) {
BlockOperations.setBlock(var0, var16, var14.x, var14.y, var14.z, var25, var18, var15.rotationIndex(), 0, var4);
break;
}
}
for (Entry var27 : var15.getAdditionalConnectedBlocks().entrySet()) {
Vector3i var19 = var27.getKey();
ObjectIntPair var20 = var27.getValue();
Vector3i var21 = new Vector3i(var14).add(var19);
Ref var22 = var16;
if (!ChunkUtil.isSameChunkSection(var14.x, var14.y, var14.z, var21.x, var21.y, var21.z)) {
Ref var23 = var0.getChunkSectionReferenceAtBlock(var21.x, var21.y, var21.z);
if (var23 == null || !var23.isValid()) {
class="kw">continue;
}
var22 = var23;
}
int var28 = BlockType.getAssetMap().getIndex((String)var20.first());
BlockType var24 = BlockType.getAssetMap().getAsset(var28);
if (var24 != null) {
BlockOperations.setBlock(var0, var22, var21.x, var21.y, var21.z, var28, var24, var20.rightInt(), 0, var4);
}
}
if (var10 + 1 < 3) {
var6.add(new QueueEntry(new Vector3i(var14), var10 + 1));
}
}
}
}
class="kw">public class="kw">static void notifyNeighborsAndCollectChanges(
@Nonnull ChunkStore var0, @Nonnull Vector3ic var1, @Nonnull Map<Vector3i, ConnectedBlocksUtil.ConnectedBlockResult> var2, @Nonnull Vector3ic var3
) {
Vector3i var4 = new Vector3i(var1);
Store var5 = var0.getStore();
Vector3i var6 = new Vector3i(var1);
Ref var7 = var0.getChunkSectionReferenceAtBlock(var1.x(), var1.y(), var1.z());
for (int var8 = -1; var8 <= 1; var8++) {
for (int var9 = -1; var9 <= 1; var9++) {
for (int var10 = -1; var10 <= 1; var10++) {
if (var8 != 0 || var10 != 0 || var9 != 0) {
var4.set(var1).add(var8, var10, var9);
if (!var2.containsKey(var4)) {
if (!ChunkUtil.isSameChunkSection(var6.x, var6.y, var6.z, var4.x, var4.y, var4.z)) {
var7 = var0.getChunkSectionReferenceAtBlock(var4.x(), var4.y(), var4.z());
var6.set(var4);
}
if (var7 != null && var7.isValid()) {
BlockSection var11 = var5.getComponent(var7, BlockSection.getComponentType());
if (var11 != null) {
int var12 = var11.get(var4.x, var4.y, var4.z);
BlockType var13 = BlockType.getAssetMap().getAsset(var12);
if (var13 != null) {
ConnectedBlockRuleSet var14 = var13.getConnectedBlockRuleSet();
if (var14 != null && !var14.onlyUpdateOnPlacement()) {
int var15 = var11.getFiller(var4.x, var4.y, var4.z);
int var16 = var11.getRotationIndex(var4.x, var4.y, var4.z);
if (var15 != 0) {
int var17 = var4.x - FillerBlockUtil.unpackX(var15);
int var18 = var4.y - FillerBlockUtil.unpackY(var15);
int var19 = var4.z - FillerBlockUtil.unpackZ(var15);
var4.set(var17, var18, var19);
}
Optional var20 = getDesiredConnectedBlockType(var0, var4, var13, var16, var3, false);
if (var20.isPresent() && (!var13.getId().equals(var20.get().blockTypeKey()) || var20.get().rotationIndex != var16)) {
var2.put(new Vector3i(var4), var20.get());
}
}
}
}
}
}
}
}
}
}
}
@Nonnull
class="kw">public class="kw">static Optional<ConnectedBlocksUtil.ConnectedBlockResult> getDesiredConnectedBlockType(
@Nonnull ChunkStore var0, @Nonnull Vector3ic var1, @Nonnull BlockType var2, int var3, @Nonnull Vector3ic var4, boolean var5
) {
ConnectedBlockRuleSet var6 = var2.getConnectedBlockRuleSet();
class="kw">return var6 == null ? Optional.empty() : var6.getConnectedBlockType(var0, var1, var2, var3, var4, var5);
}
class="kw">public class="kw">static class="kw">final class ConnectedBlockResult {
@Nonnull
class="kw">private class="kw">final String blockTypeKey;
class="kw">private class="kw">final int rotationIndex;
@Nonnull
class="kw">private class="kw">final Map<Vector3i, ObjectIntPair<String>> additionalConnectedBlocks = new Object2ObjectOpenHashMap();
class="kw">public ConnectedBlockResult(@Nonnull String var1, int var2) {
this.blockTypeKey = var1;
this.rotationIndex = var2;
}
@Nonnull
class="kw">public String blockTypeKey() {
class="kw">return this.blockTypeKey;
}
class="kw">public int rotationIndex() {
class="kw">return this.rotationIndex;
}
@Nonnull
class="kw">public Map<Vector3i, ObjectIntPair<String>> getAdditionalConnectedBlocks() {
class="kw">return this.additionalConnectedBlocks;
}
class="kw">public void addAdditionalBlock(@Nonnull Vector3i var1, @Nonnull String var2, int var3) {
this.additionalConnectedBlocks.put(var1, ObjectIntPair.of(var2, var3));
}
@Override
class="kw">public boolean equals(@Nullable Object var1) {
if (var1 == this) {
class="kw">return true;
} else if (var1 != null && var1.getClass() == this.getClass()) {
ConnectedBlocksUtil.ConnectedBlockResult var2 = (ConnectedBlocksUtil.ConnectedBlockResult)var1;
class="kw">return Objects.equals(this.blockTypeKey, var2.blockTypeKey)
&& this.rotationIndex == var2.rotationIndex
&& Objects.equals(this.additionalConnectedBlocks, var2.additionalConnectedBlocks);
} else {
class="kw">return false;
}
}
@Override
class="kw">public int hashCode() {
class="kw">return Objects.hash(this.blockTypeKey, this.rotationIndex, this.additionalConnectedBlocks);
}
@Override
class="kw">public String toString() {
class="kw">return "ConnectedBlockResult[blockTypeKey="
+ this.blockTypeKey
+ ", rotationIndex="
+ this.rotationIndex
+ ", additionalConnectedBlocks="
+ this.additionalConnectedBlocks
+ "]";
}
}
}