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
) {
}
}
}