BlockSpawnerSystem class

Пакет: com.hypixel.hytale.builtin.blockspawner

Файл: com/hypixel/hytale/builtin/blockspawner/BlockSpawnerPlugin.java

extends: RefSystem<ChunkStore>

Поля (31)

МодификаторыТипИмя
private static final ComponentType<ChunkStore, BlockModule.BlockStateInfo> BLOCK_INFO_COMPONENT_TYPE
private static final ComponentType<ChunkStore, BlockSpawner> COMPONENT_TYPE
private static final Query<ChunkStore> QUERY
Ref var10
BlockType var10
ChunkSection var11
int var12
int var13
int var14
long var15
double var17
BlockSpawnerEntry var19
String var20
RotationTuple var21
String var22
VariantRotation var23
BlockSection var24
RotationTuple var25
Rotation var26
String var27
Holder var28
VariantRotation var29
int var30
Rotation var31
WorldConfig var5
BlockSpawner var6
BlockModule.BlockStateInfo var7
String var8
int var8
BlockSpawnerTable var9
int var9

Методы (11)

МодификаторыВозвратСигнатура
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
if if(var8 != null)
if if(var9 == null)
if if(var11 != null)
if if(var19 != null)
if if(var29 == VariantRotation.None)
if if(var23 == VariantRotation.None)
if if(var28 != null)
if if(var28 != null)
public void onEntityAddedpublic void onEntityAdded(@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onEntityRemovepublic void onEntityRemove(@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.blockspawner;

class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
class="kw">import com.hypixel.hytale.builtin.blockphysics.PrefabBufferValidator;
class="kw">import com.hypixel.hytale.builtin.blockspawner.command.BlockSpawnerCommand;
class="kw">import com.hypixel.hytale.builtin.blockspawner.state.BlockSpawner;
class="kw">import com.hypixel.hytale.builtin.blockspawner.ui.BlockSpawnerSettingsPage;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
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.Store;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.Axis;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.HytaleAssetStore;
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.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.VariantRotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemDropList;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockModule;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.server.OpenCustomUIInteraction;
class="kw">import com.hypixel.hytale.server.core.permissions.HytalePermissions;
class="kw">import com.hypixel.hytale.server.core.permissions.PermissionsModule;
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.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockRotationUtil;
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.storage.ChunkStore;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

class="kw">public class BlockSpawnerPlugin class="kw">extends JavaPlugin {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private ComponentType<ChunkStore, BlockSpawner> blockSpawnerComponentType;
   class="kw">private class="kw">static BlockSpawnerPlugin INSTANCE;

   class="kw">public class="kw">static BlockSpawnerPlugin get() {
      class="kw">return INSTANCE;
   }

   class="kw">public BlockSpawnerPlugin(@Nonnull JavaPluginInit var1) {
      super(var1);
      INSTANCE = this;
   }

   @Override
   class="kw">protected void setup() {
      this.getCommandRegistry().registerCommand(new BlockSpawnerCommand());
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           BlockSpawnerTable.class, new DefaultAssetMap()
                        )
                        .setPath("Item/Block/Spawners"))
                     .setCodec(BlockSpawnerTable.CODEC))
                  .setKeyFunction(BlockSpawnerTable::getId))
               .loadsAfter(Item.class, BlockType.class, ItemDropList.class))
            .build()
      );
      this.blockSpawnerComponentType = this.getChunkStoreRegistry().registerComponent(BlockSpawner.class, "BlockSpawner", BlockSpawner.CODEC);
      this.getChunkStoreRegistry().registerSystem(new BlockSpawnerPlugin.BlockSpawnerSystem());
      OpenCustomUIInteraction.registerBlockEntityCustomPage(this, BlockSpawnerSettingsPage.class, "BlockSpawner", (var0, var1) -> {
         if (!PermissionsModule.get().hasPermission(var0.getUuid(), HytalePermissions.BLOCK_SPAWNER_EDIT)) {
            var0.sendMessage(Message.translation("server.customUI.blockSpawner.noPermission"));
            class="kw">return null;
         } else {
            Store var2 = var1.getStore();
            BlockModule.BlockStateInfo var3 = var2.getComponent(var1, BlockModule.BlockStateInfo.getComponentType());
            BlockSpawner var4 = var2.getComponent(var1, BlockSpawner.getComponentType());
            class="kw">return var3 != null && var4 != null ? new BlockSpawnerSettingsPage(var0, var3, var4, CustomPageLifetime.CanDismissOrCloseThroughInteraction) : null;
         }
      });
      this.getEventRegistry().registerGlobal(PrefabBufferValidator.ValidateBlockEvent.class, BlockSpawnerPlugin::validatePrefabBlock);
   }

   class="kw">private class="kw">static void validatePrefabBlock(@Nonnull PrefabBufferValidator.ValidateBlockEvent var0) {
      Holder var1 = var0.holder();
      if (var1 != null) {
         BlockSpawner var2 = var1.getComponent(BlockSpawner.getComponentType());
         if (var2 != null) {
            BlockType var3 = BlockType.getAssetMap().getAsset(var0.blockId());
            if (var3 != null) {
               if (var2.getBlockSpawnerId() == null) {
                  var0.reason()
                     .append("\t Block ")
                     .append(var3.getId())
                     .append(" at ")
                     .append(var0.x())
                     .append(", ")
                     .append(var0.y())
                     .append(", ")
                     .append(var0.z())
                     .append(" has no defined block spawner id")
                     .append('\n');
               } else {
                  BlockSpawnerTable var4 = BlockSpawnerTable.getAssetMap().getAsset(var2.getBlockSpawnerId());
                  if (var4 == null) {
                     var0.reason()
                        .append("\t Block ")
                        .append(var3.getId())
                        .append(" at ")
                        .append(var0.x())
                        .append(", ")
                        .append(var0.y())
                        .append(", ")
                        .append(var0.z())
                        .append(" has an invalid spawner id ")
                        .append(var2.getBlockSpawnerId())
                        .append('\n');
                  }
               }
            }
         }
      }
   }

   class="kw">public ComponentType<ChunkStore, BlockSpawner> getBlockSpawnerComponentType() {
      class="kw">return this.blockSpawnerComponentType;
   }

   class="kw">private class="kw">static class BlockSpawnerSystem class="kw">extends RefSystem<ChunkStore> {
      @Nonnull
      class="kw">private class="kw">static class="kw">final ComponentType<ChunkStore, BlockSpawner> COMPONENT_TYPE = BlockSpawner.getComponentType();
      @Nonnull
      class="kw">private class="kw">static class="kw">final ComponentType<ChunkStore, BlockModule.BlockStateInfo> BLOCK_INFO_COMPONENT_TYPE = BlockModule.BlockStateInfo.getComponentType();
      @Nonnull
      class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Query.and(COMPONENT_TYPE, BLOCK_INFO_COMPONENT_TYPE);

      class="kw">public BlockSpawnerSystem() {
      }

      @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
      ) {
         WorldConfig var5 = var3.getExternalData().getWorld().getWorldConfig();
         if (var5.isBlockSpawnersResolved()) {
            BlockSpawner var6 = var4.getComponent(var1, COMPONENT_TYPE);
            assert var6 != null;
            BlockModule.BlockStateInfo var7 = var4.getComponent(var1, BLOCK_INFO_COMPONENT_TYPE);
            assert var7 != null;
            String var8 = var6.getBlockSpawnerId();
            if (var8 != null) {
               BlockSpawnerTable var9 = BlockSpawnerTable.getAssetMap().getAsset(var8);
               if (var9 == null) {
                  BlockSpawnerPlugin.LOGGER.at(Level.WARNING).log("Failed to find BlockSpawner Asset by name: %s", var8);
               } else {
                  Ref var10 = var7.getSectionRef();
                  if (var10.isValid()) {
                     ChunkSection var11 = var4.getComponent(var10, ChunkSection.getComponentType());
                     if (var11 != null) {
                        int var12 = ChunkUtil.worldCoordFromLocalCoord(var11.getX(), ChunkUtil.xFromIndex(var7.getIndex()));
                        int var13 = ChunkUtil.worldCoordFromLocalCoord(var11.getY(), ChunkUtil.yFromIndex(var7.getIndex()));
                        int var14 = ChunkUtil.worldCoordFromLocalCoord(var11.getZ(), ChunkUtil.zFromIndex(var7.getIndex()));
                        long var15 = var5.getSeed();
                        double var17 = HashUtil.random(var12, var13, var14, var15 + -1699164769L);
                        BlockSpawnerEntry var19 = var9.getEntries().get(var17);
                        if (var19 != null) {
                           String var20 = var19.getBlockName();

                           RotationTuple var21 = class="kw">switch (var19.getRotationMode()) {
                              case NONE -> RotationTuple.NONE;
                              case RANDOM -> {
                                 String var27 = var19.getBlockName();
                                 VariantRotation var29 = BlockType.getAssetMap().getAsset(var27).getVariantRotation();
                                 if (var29 == VariantRotation.None) {
                                    yield RotationTuple.NONE;
                                 } else {
                                    int var30 = (int)HashUtil.rehash(var12, var13, var14, var15 + -1699164769L);
                                    Rotation var31 = Rotation.NORMAL[(var30 & 65535) % Rotation.NORMAL.length];
                                    yield BlockRotationUtil.getRotated(RotationTuple.NONE, Axis.Y, var31, var29);
                                 }
                              }
                              case INHERIT -> {
                                 String var22 = var19.getBlockName();
                                 VariantRotation var23 = BlockType.getAssetMap().getAsset(var22).getVariantRotation();
                                 if (var23 == VariantRotation.None) {
                                    yield RotationTuple.NONE;
                                 } else {
                                    BlockSection var24 = var4.getComponent(var10, BlockSection.getComponentType());
                                    RotationTuple var25 = RotationTuple.get(var24.getRotationIndex(var12, var13, var14));
                                    Rotation var26 = var25.yaw();
                                    yield BlockRotationUtil.getRotated(RotationTuple.NONE, Axis.Y, var26, var23);
                                 }
                              }
                           };
                           Holder var28 = var19.getBlockComponents();
                           var4.removeEntity(var1, RemoveReason.REMOVE);
                           var4.run(
                              var7x -> {
                                 if (var10.isValid()) {
                                    int var8 = 4;
                                    if (var28 != null) {
                                       var8 |= 2;
                                    }

                                    int var9 = BlockType.getAssetMap().getIndex(var20);
                                    BlockType var10 = BlockType.getAssetMap().getAsset(var9);
                                    BlockOperations.setBlock(var7x.getExternalData(), var10, var12, var13, var14, var9, var10, var21.index(), 0, var8);
                                    if (var28 != null) {
                                       BlockEntity.setBlockEntity(
                                          var7x,
                                          var10,
                                          var7x.getComponent(var10, BlockComponentSection.getComponentType()),
                                          var12,
                                          var13,
                                          var14,
                                          var10,
                                          var21.index(),
                                          var28.clone()
                                       );
                                    }
                                 }
                              }
                           );
                        }
                     }
                  }
               }
            }
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
      }
   }
}