BlockHealthChunk class
Пакет: com.hypixel.hytale.server.core.modules.blockhealth
Файл: com/hypixel/hytale/server/core/modules/blockhealth/BlockHealthChunk.java
implements: Component<ChunkStore>
Поля (28)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
byte |
SERIALIZATION_VERSION |
|
BlockHealthChunk |
var1 |
|
byte[] |
var1 |
|
BlockHealth |
var10 |
|
FragileBlock |
var11 |
|
Vector3i |
var11 |
|
FragileBlock |
var12 |
|
int |
var13 |
|
int |
var15 |
|
int |
var16 |
|
int |
var17 |
|
MemorySegment |
var2 |
|
MemorySegment |
var2 |
|
|
var2x |
|
byte |
var3 |
|
int |
var3 |
|
BlockHealth |
var4 |
|
Vector3i |
var4 |
|
int |
var4 |
|
BlockHealth |
var5 |
|
BlockPosition |
var5 |
|
int |
var5 |
|
Predicate |
var6 |
|
Vector3i |
var6 |
|
int |
var7 |
|
BlockHealth |
var7 |
|
int |
var8 |
|
int |
var9 |
Методы (14)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
public |
void |
createBlockDamagePacketsvoid createBlockDamagePackets(@Nonnull List<ToClientPacket> var1) |
public |
void |
deserializevoid deserialize(@Nonnull byte[] var1) |
|
|
for for(int var6 = 0; var6 < var4; var6++) |
|
|
for for(int var14 = 0; var14 < var13; var14++) |
public |
float |
getBlockHealthfloat getBlockHealth(Vector3i var1) |
public |
Instant |
getLastRepairGameTimeInstant getLastRepairGameTime() |
|
|
if if(var3x == null) |
|
|
if if(var2x == null) |
|
|
if if(var3 > 1) |
public |
boolean |
isBlockFragileboolean isBlockFragile(Vector3i var1) |
public |
void |
makeBlockFragilevoid makeBlockFragile(Vector3i var1, float var2) |
public |
void |
removeBlockvoid removeBlock(@Nonnull World var1, @Nonnull Vector3i var2) |
public |
byte[] |
serializebyte[] serialize() |
public |
void |
setLastRepairGameTimevoid setLastRepairGameTime(Instant var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.blockhealth;
class="kw">import com.hypixel.hytale.codec.Codec;
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.protocol.BlockPosition;
class="kw">import com.hypixel.hytale.protocol.ToClientPacket;
class="kw">import com.hypixel.hytale.protocol.packets.world.UpdateBlockDamage;
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.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.util.io.MemorySegmentUtil;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import java.lang.foreign.MemorySegment;
class="kw">import java.lang.foreign.ValueLayout;
class="kw">import java.time.Instant;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.function.Predicate;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3i;
class="kw">public class BlockHealthChunk class="kw">implements Component<ChunkStore> {
class="kw">private class="kw">static class="kw">final byte SERIALIZATION_VERSION = 2;
class="kw">public class="kw">static class="kw">final BuilderCodec<BlockHealthChunk> CODEC = BuilderCodec.builder(BlockHealthChunk.class, BlockHealthChunk::new)
.append(new KeyedCodec<>("Data", Codec.BYTE_ARRAY), BlockHealthChunk::deserialize, BlockHealthChunk::serialize)
.documentation("Binary data representing the state of this BlockHealthChunk")
.add()
.<Instant>append(new KeyedCodec<>("LastRepairGameTime", Codec.INSTANT), (var0, var1) -> var0.lastRepairGameTime = var1, var0 -> var0.lastRepairGameTime)
.documentation("The last tick of the world this BlockHealthChunk processed.")
.add()
.build();
class="kw">private class="kw">final Map<Vector3i, BlockHealth> blockHealthMap = new Object2ObjectOpenHashMap(0);
class="kw">private class="kw">final Map<Vector3i, FragileBlock> blockFragilityMap = new Object2ObjectOpenHashMap(0);
class="kw">private Instant lastRepairGameTime;
class="kw">public BlockHealthChunk() {
}
class="kw">public Instant getLastRepairGameTime() {
class="kw">return this.lastRepairGameTime;
}
class="kw">public void setLastRepairGameTime(Instant var1) {
this.lastRepairGameTime = var1;
}
@Nonnull
class="kw">public Map<Vector3i, BlockHealth> getBlockHealthMap() {
class="kw">return this.blockHealthMap;
}
@Nonnull
class="kw">public Map<Vector3i, FragileBlock> getBlockFragilityMap() {
class="kw">return this.blockFragilityMap;
}
@Nonnull
class="kw">public BlockHealth damageBlock(Instant var1, @Nonnull World var2, @Nonnull Vector3i var3, float var4) {
BlockHealth var5 = this.blockHealthMap.compute(var3, (var2x, var3x) -> {
if (var3x == null) {
var3x = new BlockHealth();
}
var3x.setHealth(var3x.getHealth() - var4);
var3x.setLastDamageGameTime(var1);
class="kw">return (BlockHealth)(var3x.getHealth() < 1.0 ? var3x : null);
});
if (var5 != null && !var5.isDestroyed()) {
Predicate var6 = var0 -> true;
var2.getNotificationHandler().updateBlockDamage(var3.x(), var3.y(), var3.z(), var5.getHealth(), -var4, var6);
}
class="kw">return Objects.requireNonNullElse(var5, BlockHealth.NO_DAMAGE_INSTANCE);
}
@Nonnull
class="kw">public BlockHealth repairBlock(@Nonnull World var1, @Nonnull Vector3i var2, float var3) {
BlockHealth var4 = Objects.requireNonNullElse(this.blockHealthMap.computeIfPresent(var2, (var1x, var2x) -> {
var2x.setHealth(var2x.getHealth() + var3);
class="kw">return (BlockHealth)(var2x.getHealth() > 1.0 ? var2x : null);
}), BlockHealth.NO_DAMAGE_INSTANCE);
var1.getNotificationHandler().updateBlockDamage(var2.x(), var2.y(), var2.z(), var4.getHealth(), var3);
class="kw">return var4;
}
class="kw">public void removeBlock(@Nonnull World var1, @Nonnull Vector3i var2) {
if (this.blockHealthMap.remove(var2) != null) {
var1.getNotificationHandler().updateBlockDamage(var2.x(), var2.y(), var2.z(), BlockHealth.NO_DAMAGE_INSTANCE.getHealth(), 0.0F);
}
}
class="kw">public void makeBlockFragile(Vector3i var1, float var2) {
this.blockFragilityMap.compute(var1, (var1x, var2x) -> {
if (var2x == null) {
var2x = new FragileBlock(var2);
}
var2x.setDurationSeconds(var2);
class="kw">return (FragileBlock)(var2x.getDurationSeconds() <= 0.0 ? null : var2x);
});
}
class="kw">public boolean isBlockFragile(Vector3i var1) {
class="kw">return this.blockFragilityMap.get(var1) != null;
}
class="kw">public float getBlockHealth(Vector3i var1) {
class="kw">return this.blockHealthMap.getOrDefault(var1, BlockHealth.NO_DAMAGE_INSTANCE).getHealth();
}
class="kw">public void createBlockDamagePackets(@Nonnull List<ToClientPacket> var1) {
for (Entry var3 : this.blockHealthMap.entrySet()) {
Vector3i var4 = var3.getKey();
BlockPosition var5 = new BlockPosition(var4.x(), var4.y(), var4.z());
var1.add(new UpdateBlockDamage(var5, var3.getValue().getHealth(), 0.0F));
}
}
@Nonnull
class="kw">public BlockHealthChunk clone() {
BlockHealthChunk var1 = new BlockHealthChunk();
var1.lastRepairGameTime = this.lastRepairGameTime;
for (Entry var3 : this.blockHealthMap.entrySet()) {
var1.blockHealthMap.put(var3.getKey(), var3.getValue().clone());
}
for (Entry var5 : this.blockFragilityMap.entrySet()) {
var1.blockFragilityMap.put(var5.getKey(), var5.getValue().clone());
}
class="kw">return var1;
}
class="kw">public void deserialize(@Nonnull byte[] var1) {
this.blockHealthMap.clear();
this.blockFragilityMap.clear();
MemorySegment var2 = MemorySegment.ofArray(var1);
byte var3 = var2.get(ValueLayout.JAVA_BYTE, 0L);
int var4 = var2.get(MemorySegmentUtil.INT_BE, 1L);
int var5 = 5;
for (int var6 = 0; var6 < var4; var6++) {
int var7 = var2.get(MemorySegmentUtil.INT_BE, var5);
int var8 = var2.get(MemorySegmentUtil.INT_BE, var5 + 4);
int var9 = var2.get(MemorySegmentUtil.INT_BE, var5 + 8);
BlockHealth var10 = new BlockHealth();
var10.deserialize(var2, var5 + 12, var3);
this.blockHealthMap.put(new Vector3i(var7, var8, var9), var10);
var5 += 24;
}
if (var3 > 1) {
int var13 = var2.get(MemorySegmentUtil.INT_BE, var5);
var5 += 4;
for (int var14 = 0; var14 < var13; var14++) {
int var15 = var2.get(MemorySegmentUtil.INT_BE, var5);
int var16 = var2.get(MemorySegmentUtil.INT_BE, var5 + 4);
int var17 = var2.get(MemorySegmentUtil.INT_BE, var5 + 8);
FragileBlock var11 = new FragileBlock();
var11.deserialize(var2, var5 + 12, var3);
this.blockFragilityMap.put(new Vector3i(var15, var16, var17), var11);
var5 += 16;
}
}
}
class="kw">public byte[] serialize() {
byte[] var1 = new byte[5 + this.blockHealthMap.size() * 24 + 4 + this.blockFragilityMap.size() * 16];
MemorySegment var2 = MemorySegment.ofArray(var1);
var2.set(ValueLayout.JAVA_BYTE, 0L, (byte)2);
var2.set(MemorySegmentUtil.INT_BE, 1L, this.blockHealthMap.size());
int var3 = 5;
for (Entry var5 : this.blockHealthMap.entrySet()) {
Vector3i var6 = var5.getKey();
var2.set(MemorySegmentUtil.INT_BE, var3, var6.x);
var2.set(MemorySegmentUtil.INT_BE, var3 + 4, var6.y);
var2.set(MemorySegmentUtil.INT_BE, var3 + 8, var6.z);
BlockHealth var7 = var5.getValue();
var7.serialize(var2, var3 + 12);
var3 += 24;
}
var2.set(MemorySegmentUtil.INT_BE, var3, this.blockFragilityMap.size());
var3 += 4;
for (Entry var10 : this.blockFragilityMap.entrySet()) {
Vector3i var11 = var10.getKey();
var2.set(MemorySegmentUtil.INT_BE, var3, var11.x);
var2.set(MemorySegmentUtil.INT_BE, var3 + 4, var11.y);
var2.set(MemorySegmentUtil.INT_BE, var3 + 8, var11.z);
FragileBlock var12 = var10.getValue();
var12.serialize(var2, var3 + 12);
var3 += 16;
}
class="kw">return var1;
}
}