DoorAction enum
Пакет: com.hypixel.hytale.builtin.triggervolumes.effect.builtin
Файл: com/hypixel/hytale/builtin/triggervolumes/effect/builtin/ControlDoorsEffect.java
Поля (1)
| Модификаторы | Тип | Имя |
|---|---|---|
|
OPEN, |
CLOSE |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.triggervolumes.effect.builtin;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerContext;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerEffect;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.VolumeEntry;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.shape.TriggerVolumeShape;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.EnumCodec;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.block.BlockUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
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.modules.interaction.DoorBlockUtils;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;
class="kw">public class ControlDoorsEffect class="kw">extends TriggerEffect {
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderCodec<ControlDoorsEffect> CODEC = BuilderCodec.builder(ControlDoorsEffect.class, ControlDoorsEffect::new, BASE_CODEC)
.append(new KeyedCodec<>("Action", new EnumCodec<>(ControlDoorsEffect.DoorAction.class)), (var0, var1) -> var0.action = var1, var0 -> var0.action)
.add()
.build();
@Nonnull
class="kw">private ControlDoorsEffect.DoorAction action = ControlDoorsEffect.DoorAction.CLOSE;
class="kw">public ControlDoorsEffect() {
}
@Override
class="kw">public void execute(@Nonnull TriggerContext var1) {
Store var2 = var1.getStore();
World var3 = var2.getExternalData().getWorld();
Vector3d var4 = var1.getActorPosition();
Vector3d var5 = var4 != null ? var4 : new Vector3d(var1.getVolume().getPosition());
ChunkStore var6 = var3.getChunkStore();
Store var7 = var6.getStore();
Vector3d var8 = new Vector3d();
Vector3d var9 = new Vector3d();
LongOpenHashSet var10 = new LongOpenHashSet();
for (VolumeEntry var12 : var1.getSpatialVolumes()) {
TriggerVolumeShape var13 = var12.getShape();
Vector3d var14 = var12.getPosition();
var13.getWorldAABB(var14, var8, var9);
int var15 = MathUtil.floor(var8.x());
int var16 = MathUtil.floor(var8.y());
int var17 = MathUtil.floor(var8.z());
int var18 = MathUtil.floor(var9.x());
int var19 = MathUtil.floor(var9.y());
int var20 = MathUtil.floor(var9.z());
for (int var21 = var15; var21 <= var18; var21++) {
for (int var22 = var16; var22 <= var19; var22++) {
for (int var23 = var17; var23 <= var20; var23++) {
Ref var24 = var6.getChunkSectionReferenceAtBlock(var21, var22, var23);
if (var24 != null && var24.isValid()) {
BlockSection var25 = var7.getComponent(var24, BlockSection.getComponentType());
if (var25 != null) {
BlockType var26 = BlockType.getAssetMap().getAsset(var25.get(var21, var22, var23));
if (var26 != null && var26.isDoor()) {
Vector3i var27 = doorAnchorForCell(var6, var21, var22, var23);
if (var10.add(BlockUtil.pack(var27.x, var27.y, var27.z))) {
Ref var28 = var6.getChunkSectionReferenceAtBlock(var27.x, var27.y, var27.z);
if (var28 != null && var28.isValid()) {
BlockSection var29 = var7.getComponent(var28, BlockSection.getComponentType());
if (var29 != null) {
BlockType var30 = BlockType.getAssetMap().getAsset(var29.get(var27.x, var27.y, var27.z));
if (var30 != null && var30.isDoor()) {
this.applyDoorState(var3, var6, var29, var30, var27.x, var27.y, var27.z, var5);
}
}
}
}
}
}
}
}
}
}
}
}
@Nonnull
class="kw">private class="kw">static Vector3i doorAnchorForCell(@Nonnull ChunkStore var0, int var1, int var2, int var3) {
Ref var4 = var0.getChunkSectionReferenceAtBlock(var1, var2, var3);
if (var4 != null && var4.isValid()) {
BlockSection var5 = var0.getStore().getComponent(var4, BlockSection.getComponentType());
if (var5 == null) {
class="kw">return new Vector3i(var1, var2, var3);
}
int var6 = var5.getFiller(var1, var2, var3);
class="kw">return var6 == 0
? new Vector3i(var1, var2, var3)
: new Vector3i(var1 - FillerBlockUtil.unpackX(var6), var2 - FillerBlockUtil.unpackY(var6), var3 - FillerBlockUtil.unpackZ(var6));
} else {
class="kw">return new Vector3i(var1, var2, var3);
}
}
class="kw">private void applyDoorState(
@Nonnull World var1, @Nonnull ChunkStore var2, @Nonnull BlockSection var3, @Nonnull BlockType var4, int var5, int var6, int var7, @Nonnull Vector3d var8
) {
Vector3i var9 = new Vector3i(var5, var6, var7);
String var10 = var4.getStateForBlock(var4);
DoorBlockUtils.DoorState var11 = DoorBlockUtils.DoorState.fromBlockState(var10);
if (this.action == ControlDoorsEffect.DoorAction.OPEN) {
if (var11 != DoorBlockUtils.DoorState.CLOSED) {
class="kw">return;
}
DoorBlockUtils.DoorState var12;
if (DoorBlockUtils.isHorizontalDoor(var4)) {
var12 = DoorBlockUtils.DoorState.OPENED_IN;
} else {
int var13 = var3.getRotationIndex(var5, var6, var7);
Rotation var14 = RotationTuple.get(var13).yaw();
var12 = DoorBlockUtils.isInFrontOfDoor(var9, var14, var8) ? DoorBlockUtils.DoorState.OPENED_OUT : DoorBlockUtils.DoorState.OPENED_IN;
}
DoorBlockUtils.DoorState var18 = DoorBlockUtils.getOppositeDoorState(var12);
tryOpen(var1, var2, var9, var4, var12);
Ref var19 = var2.getChunkSectionReferenceAtBlock(var5, var6, var7);
if (var19 == null || !var19.isValid()) {
class="kw">return;
}
BlockSection var15 = var2.getStore().getComponent(var19, BlockSection.getComponentType());
if (var15 == null) {
class="kw">return;
}
BlockType var16 = BlockType.getAssetMap().getAsset(var15.get(var5, var6, var7));
if (var16 == null) {
class="kw">return;
}
if (DoorBlockUtils.DoorState.fromBlockState(var16.getStateForBlock(var16)) == DoorBlockUtils.DoorState.CLOSED) {
tryOpen(var1, var2, var9, var16, var18);
}
} else {
if (var11 == DoorBlockUtils.DoorState.CLOSED) {
class="kw">return;
}
String var17 = DoorBlockUtils.getInteractionState(var11, DoorBlockUtils.DoorState.CLOSED);
var1.setBlockInteractionState(var9, var4, var17);
}
}
class="kw">private class="kw">static void tryOpen(
@Nonnull World var0, @Nonnull ChunkStore var1, @Nonnull Vector3i var2, @Nonnull BlockType var3, @Nonnull DoorBlockUtils.DoorState var4
) {
String var5 = DoorBlockUtils.getInteractionState(DoorBlockUtils.DoorState.CLOSED, var4);
if (DoorBlockUtils.canOpenDoor(var1, var2, var5)) {
var0.setBlockInteractionState(var2, var3, var5);
}
}
class="kw">private enum DoorAction {
OPEN,
CLOSE;
DoorAction() {
}
}
}