BlockStateInfoNeedRebuild class
Пакет: com.hypixel.hytale.server.core.modules.block
Файл: com/hypixel/hytale/server/core/modules/block/BlockModule.java
implements: Resource<ChunkStore>
Поля (1)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private boolean |
needRebuild |
Методы (5)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public Resource<ChunkStore> |
clonepublic Resource<ChunkStore> clone() |
|
public static ResourceType<ChunkStore, BlockModule.BlockStateInfoNeedRebuild> |
getResourceTypepublic static ResourceType<ChunkStore, BlockModule.BlockStateInfoNeedRebuild> getResourceType() |
|
|
if if(this.needRebuild) |
|
public boolean |
invalidateAndReturnIfNeedRebuildpublic boolean invalidateAndReturnIfNeedRebuild() |
|
public void |
markAsNeedRebuildpublic void markAsNeedRebuild() |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.block;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentRegistryProxy;
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.RemoveReason;
class="kw">import com.hypixel.hytale.component.Resource;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.SystemType;
class="kw">import com.hypixel.hytale.component.data.unknown.UnknownComponents;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.spatial.KDTree;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.component.system.HolderSystem;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.event.EventPriority;
class="kw">import com.hypixel.hytale.function.consumer.BiIntConsumer;
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.modules.LegacyModule;
class="kw">import com.hypixel.hytale.server.core.modules.block.components.ItemContainerBlock;
class="kw">import com.hypixel.hytale.server.core.modules.block.system.ItemContainerBlockSpatialSystem;
class="kw">import com.hypixel.hytale.server.core.modules.block.system.ItemContainerSystems;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
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.section.BlockComponentSection;
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.ChunkSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.events.AddWorldEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.events.ChunkPreLoadProcessEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.meta.state.BlockMapMarker;
class="kw">import com.hypixel.hytale.server.core.universe.world.meta.state.BlockMapMarkersResource;
class="kw">import com.hypixel.hytale.server.core.universe.world.meta.state.LaunchPad;
class="kw">import com.hypixel.hytale.server.core.universe.world.meta.state.RespawnBlock;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.ints.IntArrayList;
class="kw">import it.unimi.dsi.fastutil.ints.IntConsumer;
class="kw">import it.unimi.dsi.fastutil.ints.IntList;
class="kw">import java.util.Objects;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;
class="kw">public class BlockModule class="kw">extends JavaPlugin {
class="kw">public class="kw">static class="kw">final PluginManifest MANIFEST = PluginManifest.corePlugin(BlockModule.class).depends(LegacyModule.class).build();
class="kw">private class="kw">static BlockModule instance;
class="kw">private SystemType<ChunkStore, BlockModule.MigrationSystem> migrationSystemType;
class="kw">private ComponentType<ChunkStore, LaunchPad> launchPadComponentType;
class="kw">private ComponentType<ChunkStore, RespawnBlock> respawnBlockComponentType;
class="kw">private ComponentType<ChunkStore, BlockMapMarker> blockMapMarkerComponentType;
class="kw">private ResourceType<ChunkStore, BlockMapMarkersResource> blockMapMarkersResourceType;
class="kw">private ComponentType<ChunkStore, ItemContainerBlock> itemContainerBlockComponentType;
class="kw">private ComponentType<ChunkStore, BlockModule.BlockStateInfo> blockStateInfoComponentType;
class="kw">private ResourceType<ChunkStore, BlockModule.BlockStateInfoNeedRebuild> blockStateInfoNeedRebuildResourceType;
class="kw">private ResourceType<ChunkStore, SpatialResource<Ref<ChunkStore>, ChunkStore>> itemContainerSpatialResourceType;
class="kw">public class="kw">static BlockModule get() {
class="kw">return instance;
}
class="kw">public BlockModule(@Nonnull JavaPluginInit var1) {
super(var1);
instance = this;
}
@Override
class="kw">protected void setup() {
ComponentRegistryProxy var1 = this.getChunkStoreRegistry();
this.migrationSystemType = var1.registerSystemType(BlockModule.MigrationSystem.class);
this.blockStateInfoComponentType = var1.registerComponent(BlockModule.BlockStateInfo.class, () -> {
throw new UnsupportedOperationException();
});
var1.registerSystem(new BlockModule.BlockStateInfoRefSystem(this.blockStateInfoComponentType));
this.launchPadComponentType = var1.registerComponent(LaunchPad.class, "LaunchPad", LaunchPad.CODEC);
this.respawnBlockComponentType = var1.registerComponent(RespawnBlock.class, "RespawnBlock", RespawnBlock.CODEC);
var1.registerSystem(new RespawnBlock.OnRemove());
this.itemContainerBlockComponentType = var1.registerComponent(ItemContainerBlock.class, "ItemContainerBlock", ItemContainerBlock.CODEC);
var1.registerSystem(new BlockModule.MigrateItemContainer());
var1.registerSystem(new ItemContainerSystems.OnAddedOrRemoved());
var1.registerSystem(new ItemContainerSystems.OnReplaced());
var1.registerSystem(new ItemContainerSystems.OnReplacedHolder());
this.blockMapMarkerComponentType = var1.registerComponent(BlockMapMarker.class, "BlockMapMarker", BlockMapMarker.CODEC);
this.blockMapMarkersResourceType = var1.registerResource(BlockMapMarkersResource.class, "BlockMapMarkers", BlockMapMarkersResource.CODEC);
var1.registerSystem(new BlockMapMarker.OnAddRemove());
this.getEventRegistry()
.registerGlobal(
AddWorldEvent.class,
var0 -> var0.getWorld().getWorldMapManager().getMarkerProviders().put("blockMapMarkers", BlockMapMarker.MarkerProvider.INSTANCE)
);
this.blockStateInfoNeedRebuildResourceType = var1.registerResource(
BlockModule.BlockStateInfoNeedRebuild.class, BlockModule.BlockStateInfoNeedRebuild::new
);
this.itemContainerSpatialResourceType = this.getChunkStoreRegistry().registerSpatialResource(() -> new KDTree<>(Ref::isValid));
this.getChunkStoreRegistry().registerSystem(new ItemContainerBlockSpatialSystem(this.itemContainerSpatialResourceType));
this.getChunkStoreRegistry().registerSystem(new BlockModule.ItemContainerStateRefSystem());
this.getEventRegistry().registerGlobal(EventPriority.EARLY, ChunkPreLoadProcessEvent.class, BlockModule::onChunkPreLoadProcessEnsureBlockEntity);
}
class="kw">private class="kw">static void onChunkPreLoadProcessEnsureBlockEntity(@Nonnull ChunkPreLoadProcessEvent var0) {
if (var0.isNewlyGenerated()) {
Holder var1 = var0.getHolder();
ChunkColumn var2 = var1.getComponent(ChunkColumn.getComponentType());
if (var2 != null) {
Holder[] var3 = var2.getSectionHolders();
if (var3 != null) {
BlockModule.BlockEntityPreprocessor var4 = BlockModule.BlockEntityPreprocessor.LOCAL.get();
for (int var5 = 0; var5 < 10; var5++) {
BlockSection var6 = var3[var5].ensureAndGetComponent(BlockSection.getComponentType());
if (!var6.isSolidAir()) {
BlockComponentSection var7 = var3[var5].ensureAndGetComponent(BlockComponentSection.getComponentType());
var4.clear();
var6.forEachValue(var4.typeCollector);
if (!var4.ids.isEmpty()) {
var6.find(var4.ids, var4.blockCollector);
assert var4.indices.size() == var4.blockIds.size();
for (int var8 = 0; var8 < var4.indices.size(); var8++) {
int var9 = var4.indices.getInt(var8);
int var10 = var4.blockIds.getInt(var8);
Holder var11 = (Holder<ChunkStore>)var4.blockEntities.get(var10);
if (var11 != null && var6.getFiller(var9) == 0 && var7.getBlockHolder(var9) == null) {
var7.addBlockHolder(var9, var11.clone());
}
}
}
}
}
}
}
}
}
class="kw">public SystemType<ChunkStore, BlockModule.MigrationSystem> getMigrationSystemType() {
class="kw">return this.migrationSystemType;
}
class="kw">public ComponentType<ChunkStore, BlockModule.BlockStateInfo> getBlockStateInfoComponentType() {
class="kw">return this.blockStateInfoComponentType;
}
class="kw">public ComponentType<ChunkStore, LaunchPad> getLaunchPadComponentType() {
class="kw">return this.launchPadComponentType;
}
class="kw">public ComponentType<ChunkStore, RespawnBlock> getRespawnBlockComponentType() {
class="kw">return this.respawnBlockComponentType;
}
class="kw">public ComponentType<ChunkStore, BlockMapMarker> getBlockMapMarkerComponentType() {
class="kw">return this.blockMapMarkerComponentType;
}
class="kw">public ResourceType<ChunkStore, BlockMapMarkersResource> getBlockMapMarkersResourceType() {
class="kw">return this.blockMapMarkersResourceType;
}
class="kw">public ResourceType<ChunkStore, BlockModule.BlockStateInfoNeedRebuild> getBlockStateInfoNeedRebuildResourceType() {
class="kw">return this.blockStateInfoNeedRebuildResourceType;
}
class="kw">public ComponentType<ChunkStore, ItemContainerBlock> getItemContainerBlockComponentType() {
class="kw">return this.itemContainerBlockComponentType;
}
class="kw">public ResourceType<ChunkStore, SpatialResource<Ref<ChunkStore>, ChunkStore>> getItemContainerSpatialResourceType() {
class="kw">return this.itemContainerSpatialResourceType;
}
@Nullable
class="kw">public class="kw">static Ref<ChunkStore> getBlockEntity(@Nonnull World var0, int var1, int var2, int var3) {
ChunkStore var4 = var0.getChunkStore();
Ref var5 = var4.getChunkSectionReferenceAtBlock(var1, var2, var3);
class="kw">return var5 == null ? null : getBlockEntity(var4.getStore(), var5, var1, var2, var3);
}
@Nullable
class="kw">public class="kw">static Ref<ChunkStore> getBlockEntity(@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4) {
assert coordsInSection(var0, var1, var2, var3, var4) : "block (" + var2 + ", " + var3 + ", " + var4 + ") is outside the given section";
BlockComponentSection var5 = var0.getComponent(var1, BlockComponentSection.getComponentType());
if (var5 == null) {
class="kw">return null;
}
Ref var6 = var5.getBlockReference(ChunkUtil.indexBlock(var2, var3, var4));
class="kw">return var6 != null && var6.isValid() ? var6 : null;
}
class="kw">private class="kw">static boolean coordsInSection(@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4) {
ChunkSection var5 = var0.getComponent(var1, ChunkSection.getComponentType());
class="kw">return var5 == null
|| var5.getX() == ChunkUtil.chunkCoordinate(var2) && var5.getY() == ChunkUtil.chunkCoordinate(var3) && var5.getZ() == ChunkUtil.chunkCoordinate(var4);
}
@Nullable
class="kw">public class="kw">static <T class="kw">extends Component<ChunkStore>> T getComponent(ComponentType<ChunkStore, T> var0, World var1, int var2, int var3, int var4) {
Store var5 = var1.getChunkStore().getStore();
Ref var6 = getBlockEntity(var1, var2, var3, var4);
class="kw">return var6 == null ? null : var5.getComponent(var6, var0);
}
class="kw">public class="kw">static class="kw">final class BlockEntityPreprocessor {
class="kw">public class="kw">static class="kw">final ThreadLocal<BlockModule.BlockEntityPreprocessor> LOCAL = ThreadLocal.withInitial(BlockModule.BlockEntityPreprocessor::new);
class="kw">public class="kw">final IntList ids = new IntArrayList();
class="kw">public class="kw">final Int2ObjectMap<Holder<ChunkStore>> blockEntities = new Int2ObjectOpenHashMap();
class="kw">public class="kw">final IntList indices = new IntArrayList();
class="kw">public class="kw">final IntList blockIds = new IntArrayList();
class="kw">public class="kw">final IntConsumer typeCollector = this::collectType;
class="kw">public class="kw">final BiIntConsumer blockCollector = this::collectBlock;
class="kw">public BlockEntityPreprocessor() {
}
class="kw">public void clear() {
this.ids.clear();
this.blockEntities.clear();
this.indices.clear();
this.blockIds.clear();
}
class="kw">private void collectType(int var1) {
BlockType var2 = BlockType.getAssetMap().getAsset(var1);
if (var2 != null && !var2.isUnknown() && var2.getBlockEntity() != null) {
this.ids.add(var1);
this.blockEntities.put(var1, var2.getBlockEntity());
}
}
class="kw">private void collectBlock(int var1, int var2) {
this.indices.add(var1);
this.blockIds.add(var2);
}
}
class="kw">public class="kw">static class BlockStateInfo class="kw">implements Component<ChunkStore> {
class="kw">private class="kw">final int index;
@Nonnull
class="kw">private class="kw">final Ref<ChunkStore> sectionRef;
class="kw">public class="kw">static ComponentType<ChunkStore, BlockModule.BlockStateInfo> getComponentType() {
class="kw">return BlockModule.get().getBlockStateInfoComponentType();
}
class="kw">public BlockStateInfo(int var1, @Nonnull Ref<ChunkStore> var2) {
Objects.requireNonNull(var2);
this.index = var1;
this.sectionRef = var2;
}
class="kw">public int getIndex() {
class="kw">return this.index;
}
@Nonnull
class="kw">public Ref<ChunkStore> getSectionRef() {
class="kw">return this.sectionRef;
}
class="kw">public void markNeedsSaving() {
if (this.sectionRef.isValid()) {
this.markNeedsSaving(this.sectionRef.getStore());
}
}
class="kw">public void markNeedsSaving(ComponentAccessor<ChunkStore> var1) {
if (this.sectionRef.isValid()) {
BlockComponentSection var2 = var1.getComponent(this.sectionRef, BlockComponentSection.getComponentType());
if (var2 != null) {
var2.markBlockNeedsSaving(this.index);
}
}
}
class="kw">public boolean fillWorldPos(@Nonnull Vector3i var1) {
class="kw">return !this.sectionRef.isValid() ? false : this.fillWorldPos(this.sectionRef.getStore(), var1);
}
class="kw">public boolean fillWorldPos(@Nonnull ComponentAccessor<ChunkStore> var1, @Nonnull Vector3i var2) {
if (!this.sectionRef.isValid()) {
class="kw">return false;
}
ChunkSection var3 = var1.getComponent(this.sectionRef, ChunkSection.getComponentType());
if (var3 == null) {
class="kw">return false;
}
var2.set(
ChunkUtil.worldCoordFromLocalCoord(var3.getX(), ChunkUtil.xFromIndex(this.index)),
ChunkUtil.worldCoordFromLocalCoord(var3.getY(), ChunkUtil.yFromIndex(this.index)),
ChunkUtil.worldCoordFromLocalCoord(var3.getZ(), ChunkUtil.zFromIndex(this.index))
);
class="kw">return true;
}
@Nonnull
@Override
class="kw">public Component<ChunkStore> clone() {
class="kw">return new BlockModule.BlockStateInfo(this.index, this.sectionRef);
}
}
class="kw">public class="kw">static class BlockStateInfoNeedRebuild class="kw">implements Resource<ChunkStore> {
class="kw">private boolean needRebuild;
class="kw">public class="kw">static ResourceType<ChunkStore, BlockModule.BlockStateInfoNeedRebuild> getResourceType() {
class="kw">return BlockModule.get().getBlockStateInfoNeedRebuildResourceType();
}
class="kw">public BlockStateInfoNeedRebuild() {
this.needRebuild = false;
}
class="kw">public BlockStateInfoNeedRebuild(boolean var1) {
this.needRebuild = var1;
}
class="kw">public boolean invalidateAndReturnIfNeedRebuild() {
if (this.needRebuild) {
this.needRebuild = false;
class="kw">return true;
} else {
class="kw">return false;
}
}
class="kw">public void markAsNeedRebuild() {
this.needRebuild = true;
}
@Override
class="kw">public Resource<ChunkStore> clone() {
class="kw">return new BlockModule.BlockStateInfoNeedRebuild(this.needRebuild);
}
}
class="kw">public class="kw">static class BlockStateInfoRefSystem class="kw">extends RefSystem<ChunkStore> {
@Nonnull
class="kw">private class="kw">final ComponentType<ChunkStore, BlockModule.BlockStateInfo> blockStateInfoComponentType;
class="kw">public BlockStateInfoRefSystem(@Nonnull ComponentType<ChunkStore, BlockModule.BlockStateInfo> var1) {
this.blockStateInfoComponentType = var1;
}
@Override
class="kw">public Query<ChunkStore> getQuery() {
class="kw">return this.blockStateInfoComponentType;
}
@Override
class="kw">public void onEntityAdded(
@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
) {
BlockModule.BlockStateInfo var5 = var4.getComponent(var1, this.blockStateInfoComponentType);
assert var5 != null;
Ref var6 = var5.sectionRef;
if (var6.isValid()) {
BlockComponentSection var7 = var4.getComponent(var6, BlockComponentSection.getComponentType());
if (var7 != null) {
class="kw">switch (var2) {
case SPAWN:
var7.addBlockReference(var5.getIndex(), var1);
break;
case LOAD:
var7.loadBlockReference(var5.getIndex(), var1);
}
}
}
}
@Override
class="kw">public void onEntityRemove(
@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
) {
BlockModule.BlockStateInfo var5 = var4.getComponent(var1, this.blockStateInfoComponentType);
assert var5 != null;
Ref var6 = var5.sectionRef;
if (var6.isValid()) {
BlockComponentSection var7 = var4.getComponent(var6, BlockComponentSection.getComponentType());
if (var7 != null) {
class="kw">switch (var2) {
case REMOVE:
case BUILDER_TOOLS_UNDO:
var7.removeBlockReference(var5.getIndex(), var1);
break;
case UNLOAD:
var7.unloadBlockReference(var5.getIndex(), var1);
}
}
}
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "BlockStateInfoRefSystem{componentType=" + this.blockStateInfoComponentType + "}";
}
}
class="kw">public class="kw">static class ItemContainerStateRefSystem class="kw">extends RefSystem<ChunkStore> {
class="kw">private class="kw">static class="kw">final Query<ChunkStore> query = ItemContainerBlock.getComponentType();
class="kw">public ItemContainerStateRefSystem() {
}
@Override
class="kw">public Query<ChunkStore> getQuery() {
class="kw">return query;
}
@Override
class="kw">public void onEntityAdded(
@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
) {
var4.getExternalData().getWorld().getChunkStore().getStore().getResource(BlockModule.BlockStateInfoNeedRebuild.getResourceType()).markAsNeedRebuild();
}
@Override
class="kw">public void onEntityRemove(
@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
) {
var4.getExternalData().getWorld().getChunkStore().getStore().getResource(BlockModule.BlockStateInfoNeedRebuild.getResourceType()).markAsNeedRebuild();
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "ItemContainerStateRefSystem{}";
}
}
class="kw">public class="kw">static class MigrateItemContainer class="kw">extends BlockModule.MigrationSystem {
class="kw">public MigrateItemContainer() {
}
@Override
class="kw">public void onEntityAdd(@Nonnull Holder<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3) {
UnknownComponents var4 = var1.getComponent(ChunkStore.REGISTRY.getUnknownComponentType());
assert var4 != null;
ItemContainerBlock var5 = var4.removeComponent("container", ItemContainerBlock.CODEC);
if (var5 != null) {
var1.putComponent(ItemContainerBlock.getComponentType(), var5);
}
}
@Override
class="kw">public void onEntityRemoved(@Nonnull Holder<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3) {
}
@Nullable
@Override
class="kw">public Query<ChunkStore> getQuery() {
class="kw">return ChunkStore.REGISTRY.getUnknownComponentType();
}
}
class="kw">public class="kw">abstract class="kw">static class MigrationSystem class="kw">extends HolderSystem<ChunkStore> {
class="kw">public MigrationSystem() {
}
}
}