FluidSection class
Пакет: com.hypixel.hytale.server.core.universe.world.chunk.section
Файл: com/hypixel/hytale/server/core/universe/world/chunk/section/FluidSection.java
implements: Component<ChunkStore>
Поля (45)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
int |
LEVEL_DATA_SIZE |
|
long |
var1 |
|
long |
var1 |
|
SoftReference |
var1 |
|
int |
var13 |
|
byte |
var14 |
|
|
var2 |
|
long |
var2 |
|
|
var2 |
|
IndexedLookupTableAssetMap |
var2 |
|
|
var2 |
|
long |
var2 |
|
|
var2 |
|
byte[] |
var2 |
|
CompletableFuture |
var2 |
|
|
var2 |
|
SetFluids |
var2 |
|
AbstractSectionPalette.SetResult |
var3 |
|
|
var3 |
|
|
var3 |
|
|
var3 |
|
IndexedLookupTableAssetMap |
var3 |
|
int |
var3 |
|
IntOpenHashSet |
var3 |
|
byte[] |
var3 |
|
MemorySegment |
var3 |
|
MemorySegment |
var3 |
|
long |
var4 |
|
int |
var4 |
|
|
var4 |
|
byte |
var4 |
|
byte[] |
var4 |
|
MemorySegment |
var4 |
|
long |
var4 |
|
PaletteTypeEnum |
var4 |
|
int |
var5 |
|
byte |
var5 |
|
|
var5 |
|
int |
var5 |
|
int |
var5 |
|
boolean |
var6 |
|
int |
var6 |
|
int |
var6 |
|
byte |
var7 |
|
byte |
var7 |
Методы (41)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("Promoted fluid section failed to correctly add the new fluid") |
private |
void |
deserializevoid deserialize(@Nonnull byte[] var1, ExtraInfo var2) |
|
|
for for(int var6 = 0; var6 < 16384; var6++) |
static |
ComponentType<ChunkStore, FluidSection> |
getComponentTypeComponentType<ChunkStore, FluidSection> getComponentType() |
public |
int |
getFluidIdint getFluidId(int var1, int var2, int var3) |
public |
int |
getFluidIdint getFluidId(int var1) |
public |
byte |
getFluidLevelbyte getFluidLevel(int var1, int var2, int var3) |
public |
byte |
getFluidLevelbyte getFluidLevel(int var1) |
public |
int |
getXint getX() |
public |
int |
getYint getY() |
public |
int |
getZint getZ() |
|
|
if if(var3 == AbstractSectionPalette.SetResult.REQUIRES_PROMOTE) |
|
|
if if(var3 != AbstractSectionPalette.SetResult.ADDED_OR_REMOVED) |
|
|
if if(var3 == 0) |
|
|
if if(var2 == 0) |
|
|
if if(var6 && this.loaded) |
|
|
if if(this.levelData == null) |
|
|
if if(var2 == 0) |
|
|
if if(var5 == var2) |
|
|
if if(var5 == 0) |
|
|
if if(this.nonZeroLevels <= 0) |
|
|
if if(var4 != null) |
|
|
if if(this.levelData == null) |
|
|
if if(this.levelData != null) |
|
|
if if(this.levelData != null) |
|
|
if if(var2 != null) |
public |
boolean |
isEmptyboolean isEmpty() |
public |
void |
loadvoid load(int var1, int var2, int var3) |
public |
void |
preloadvoid preload(int var1, int var2, int var3) |
private |
byte[] |
serializebyte[] serialize(ExtraInfo var1) |
private |
byte[] |
serializeForPacketbyte[] serializeForPacket() |
public |
boolean |
setFluidboolean setFluid(int var1, int var2, int var3, @Nonnull Fluid var4, byte var5) |
public |
boolean |
setFluidboolean setFluid(int var1, int var2, int var3, int var4, byte var5) |
public |
boolean |
setFluidboolean setFluid(int var1, @Nonnull Fluid var2, byte var3) |
public |
boolean |
setFluidboolean setFluid(int var1, int var2, byte var3) |
private |
boolean |
setFluidLevelboolean setFluidLevel(int var1, int var2, int var3, byte var4) |
private |
boolean |
setFluidLevelboolean setFluidLevel(int var1, byte var2) |
private |
boolean |
setFluidRawboolean setFluidRaw(int var1, int var2, int var3, int var4) |
private |
boolean |
setFluidRawboolean setFluidRaw(int var1, int var2) |
private |
boolean |
setFluidRawboolean setFluidRaw(int var1, int var2, int var3, @Nonnull Fluid var4) |
private |
boolean |
setFluidRawboolean setFluidRaw(int var1, @Nonnull Fluid var2) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.chunk.section;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.protocol.CachedPacket;
class="kw">import com.hypixel.hytale.protocol.packets.world.SetFluids;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.modules.LegacyModule;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.palette.AbstractSectionPalette;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.palette.EmptySectionPalette;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.palette.PaletteTypeEnum;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import java.lang.foreign.MemorySegment;
class="kw">import java.lang.foreign.ValueLayout;
class="kw">import java.lang.ref.SoftReference;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.locks.StampedLock;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class FluidSection class="kw">implements Component<ChunkStore> {
class="kw">public class="kw">static class="kw">final int LEVEL_DATA_SIZE = 16384;
class="kw">public class="kw">static class="kw">final int VERSION = 0;
class="kw">public class="kw">static class="kw">final BuilderCodec<FluidSection> CODEC = BuilderCodec.builder(FluidSection.class, FluidSection::new)
.versioned()
.codecVersion(0)
.append(new KeyedCodec<>("Data", Codec.BYTE_ARRAY), FluidSection::deserialize, FluidSection::serialize)
.add()
.build();
class="kw">private class="kw">final StampedLock lock = new StampedLock();
class="kw">private int x;
class="kw">private int y;
class="kw">private int z;
class="kw">private boolean loaded = false;
class="kw">private AbstractSectionPalette typePalette = EmptySectionPalette.INSTANCE;
@Nullable
class="kw">private byte[] levelData = null;
class="kw">private int nonZeroLevels = 0;
@Nonnull
class="kw">private IntOpenHashSet changedPositions = new IntOpenHashSet(0);
@Nonnull
class="kw">private IntOpenHashSet swapChangedPositions = new IntOpenHashSet(0);
@Nullable
class="kw">private class="kw">transient SoftReference<CompletableFuture<CachedPacket<SetFluids>>> cachedPacket = null;
class="kw">public FluidSection() {
}
class="kw">public class="kw">static ComponentType<ChunkStore, FluidSection> getComponentType() {
class="kw">return LegacyModule.get().getFluidSectionComponentType();
}
class="kw">public void preload(int var1, int var2, int var3) {
this.x = var1;
this.y = var2;
this.z = var3;
}
class="kw">public void load(int var1, int var2, int var3) {
this.x = var1;
this.y = var2;
this.z = var3;
this.loaded = true;
}
class="kw">private boolean setFluidRaw(int var1, int var2, int var3, int var4) {
class="kw">return this.setFluidRaw(ChunkUtil.indexBlock(var1, var2, var3), var4);
}
class="kw">private boolean setFluidRaw(int var1, int var2) {
AbstractSectionPalette.SetResult var3 = this.typePalette.set(var1, var2);
if (var3 == AbstractSectionPalette.SetResult.REQUIRES_PROMOTE) {
this.typePalette = this.typePalette.promote();
var3 = this.typePalette.set(var1, var2);
if (var3 != AbstractSectionPalette.SetResult.ADDED_OR_REMOVED) {
throw new IllegalStateException("Promoted fluid section failed to correctly add the new fluid");
}
} else if (this.typePalette.shouldDemote()) {
this.typePalette = this.typePalette.demote();
}
class="kw">return var3 != AbstractSectionPalette.SetResult.UNCHANGED;
}
class="kw">public boolean setFluid(int var1, int var2, int var3, @Nonnull Fluid var4, byte var5) {
class="kw">return this.setFluid(ChunkUtil.indexBlock(var1, var2, var3), Fluid.getAssetMap().getIndex(var4.getId()), var5);
}
class="kw">public boolean setFluid(int var1, int var2, int var3, int var4, byte var5) {
class="kw">return this.setFluid(ChunkUtil.indexBlock(var1, var2, var3), var4, var5);
}
class="kw">public boolean setFluid(int var1, @Nonnull Fluid var2, byte var3) {
class="kw">return this.setFluid(var1, Fluid.getAssetMap().getIndex(var2.getId()), var3);
}
class="kw">public boolean setFluid(int var1, int var2, byte var3) {
var3 = (byte)(var3 & 15);
if (var3 == 0) {
var2 = 0;
}
if (var2 == 0) {
var3 = 0;
}
long var4 = this.lock.writeLock();
try {
boolean var6 = this.setFluidRaw(var1, var2);
var6 |= this.setFluidLevel(var1, var3);
if (var6 && this.loaded) {
this.cachedPacket = null;
this.changedPositions.add(var1);
}
class="kw">return var6;
} class="kw">finally {
this.lock.unlockWrite(var4);
}
}
class="kw">private boolean setFluidRaw(int var1, int var2, int var3, @Nonnull Fluid var4) {
class="kw">return this.setFluidRaw(ChunkUtil.indexBlock(var1, var2, var3), var4);
}
class="kw">private boolean setFluidRaw(int var1, @Nonnull Fluid var2) {
IndexedLookupTableAssetMap var3 = Fluid.getAssetMap();
class="kw">return this.setFluidRaw(var1, var3.getIndex(var2.getId()));
}
class="kw">public int getFluidId(int var1, int var2, int var3) {
class="kw">return this.getFluidId(ChunkUtil.indexBlock(var1, var2, var3));
}
class="kw">public int getFluidId(int var1) {
long var2 = this.lock.tryOptimisticRead();
int var4 = this.typePalette.get(var1);
if (!this.lock.validate(var2)) {
var2 = this.lock.readLock();
try {
var4 = this.typePalette.get(var1);
} class="kw">finally {
this.lock.unlockRead(var2);
}
}
class="kw">return var4;
}
@Nullable
class="kw">public Fluid getFluid(int var1, int var2, int var3) {
class="kw">return this.getFluid(ChunkUtil.indexBlock(var1, var2, var3));
}
@Nullable
class="kw">public Fluid getFluid(int var1) {
IndexedLookupTableAssetMap var2 = Fluid.getAssetMap();
class="kw">return var2.getAsset(this.getFluidId(var1));
}
class="kw">private boolean setFluidLevel(int var1, int var2, int var3, byte var4) {
class="kw">return this.setFluidLevel(ChunkUtil.indexBlock(var1, var2, var3), var4);
}
class="kw">private boolean setFluidLevel(int var1, byte var2) {
var2 = (byte)(var2 & 15);
if (this.levelData == null) {
if (var2 == 0) {
class="kw">return false;
}
this.levelData = new byte[16384];
}
int var3 = var1 >> 1;
byte var4 = this.levelData[var3];
int var5 = var4 >> (var1 & 1) * 4 & 15;
if (var5 == var2) {
class="kw">return false;
}
if (var5 == 0) {
this.nonZeroLevels++;
} else if (var2 == 0) {
this.nonZeroLevels--;
if (this.nonZeroLevels <= 0) {
this.levelData = null;
class="kw">return true;
}
}
if ((var1 & 1) == 0) {
this.levelData[var3] = (byte)(var4 & 240 | var2);
} else {
this.levelData[var3] = (byte)(var4 & 15 | var2 << 4);
}
class="kw">return true;
}
class="kw">public byte getFluidLevel(int var1, int var2, int var3) {
class="kw">return this.getFluidLevel(ChunkUtil.indexBlock(var1, var2, var3));
}
class="kw">public byte getFluidLevel(int var1) {
long var2 = this.lock.tryOptimisticRead();
byte[] var4 = this.levelData;
byte var5 = 0;
if (var4 != null) {
int var6 = var1 >> 1;
byte var7 = var4[var6];
var5 = (byte)(var7 >> (var1 & 1) * 4 & 15);
}
if (!this.lock.validate(var2)) {
var2 = this.lock.readLock();
try {
if (this.levelData == null) {
class="kw">return 0;
}
int var13 = var1 >> 1;
byte var14 = this.levelData[var13];
class="kw">return (byte)(var14 >> (var1 & 1) * 4 & 15);
} class="kw">finally {
this.lock.unlockRead(var2);
}
} else {
class="kw">return var5;
}
}
class="kw">public int getX() {
class="kw">return this.x;
}
class="kw">public int getY() {
class="kw">return this.y;
}
class="kw">public int getZ() {
class="kw">return this.z;
}
@Nonnull
class="kw">public IntOpenHashSet getAndClearChangedPositions() {
long var1 = this.lock.writeLock();
try {
this.swapChangedPositions.clear();
IntOpenHashSet var3 = this.changedPositions;
this.changedPositions = this.swapChangedPositions;
this.swapChangedPositions = var3;
class="kw">return var3;
} class="kw">finally {
this.lock.unlockWrite(var1);
}
}
@Nonnull
@Override
class="kw">public Component<ChunkStore> clone() {
class="kw">return this;
}
class="kw">private byte[] serializeForPacket() {
long var1 = this.lock.readLock();
try {
byte[] var3 = new byte[1 + this.typePalette.serializedPacketByteSize() + 1 + (this.levelData != null ? this.levelData.length : 0)];
MemorySegment var4 = MemorySegment.ofArray(var3);
var4.set(ValueLayout.JAVA_BYTE, 0L, (byte)this.typePalette.getPaletteType().ordinal());
int var5 = 1 + this.typePalette.serializeForPacket(var4, 1);
if (this.levelData != null) {
var4.set(ValueLayout.JAVA_BOOLEAN, var5, true);
MemorySegment.copy(this.levelData, 0, var4, ValueLayout.JAVA_BYTE, var5 + 1, this.levelData.length);
} else {
var4.set(ValueLayout.JAVA_BOOLEAN, var5, false);
}
class="kw">return var3;
} class="kw">finally {
this.lock.unlockRead(var1);
}
}
class="kw">private byte[] serialize(ExtraInfo var1) {
byte[] var2 = new byte[1 + this.typePalette.serializedByteSize(Fluid.KEY_MEMORY_SERIALIZER) + 1 + (this.levelData != null ? this.levelData.length : 0)];
MemorySegment var3 = MemorySegment.ofArray(var2);
long var4 = this.lock.readLock();
try {
var3.set(ValueLayout.JAVA_BYTE, 0L, (byte)this.typePalette.getPaletteType().ordinal());
int var6 = 1 + this.typePalette.serialize(Fluid.KEY_MEMORY_SERIALIZER, var3, 1);
if (this.levelData != null) {
var3.set(ValueLayout.JAVA_BOOLEAN, var6, true);
MemorySegment.copy(this.levelData, 0, var3, ValueLayout.JAVA_BYTE, var6 + 1, this.levelData.length);
} else {
var3.set(ValueLayout.JAVA_BOOLEAN, var6, false);
}
} class="kw">finally {
this.lock.unlockRead(var4);
}
class="kw">return var2;
}
class="kw">private void deserialize(@Nonnull byte[] var1, ExtraInfo var2) {
MemorySegment var3 = MemorySegment.ofArray(var1);
PaletteTypeEnum var4 = PaletteTypeEnum.get(var3.get(ValueLayout.JAVA_BYTE, 0L));
this.typePalette = var4.getConstructor().get();
int var5 = 1 + this.typePalette.deserialize(Fluid.KEY_MEMORY_DESERIALIZER, var3, 1);
if (var3.get(ValueLayout.JAVA_BOOLEAN, var5)) {
this.levelData = var3.asSlice(var5 + 1, 16384L).toArray(ValueLayout.JAVA_BYTE);
this.nonZeroLevels = 0;
for (int var6 = 0; var6 < 16384; var6++) {
byte var7 = this.levelData[var6];
if ((var7 & 15) != 0) {
this.nonZeroLevels++;
}
if ((var7 & 240) != 0) {
this.nonZeroLevels++;
}
}
} else {
this.levelData = null;
}
}
@Nonnull
class="kw">public CompletableFuture<CachedPacket<SetFluids>> getCachedPacket() {
SoftReference var1 = this.cachedPacket;
CompletableFuture var2 = var1 != null ? var1.get() : null;
if (var2 != null) {
class="kw">return var2;
}
var2 = CompletableFuture.supplyAsync(() -> {
byte[] var1 = this.serializeForPacket();
SetFluids var2 = new SetFluids(this.x, this.y, this.z, var1);
class="kw">return CachedPacket.cache(var2);
});
this.cachedPacket = new SoftReference<>(var2);
class="kw">return var2;
}
class="kw">public boolean isEmpty() {
class="kw">return this.typePalette.isSolid(0) && this.nonZeroLevels == 0;
}
}