minecraft-src/net/minecraft/world/entity/PortalProcessor.java
2025-07-04 02:49:36 +03:00

71 lines
1.9 KiB
Java

package net.minecraft.world.entity;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.Portal;
import net.minecraft.world.level.portal.TeleportTransition;
import org.jetbrains.annotations.Nullable;
public class PortalProcessor {
private final Portal portal;
private BlockPos entryPosition;
private int portalTime;
private boolean insidePortalThisTick;
public PortalProcessor(Portal portal, BlockPos entryPosition) {
this.portal = portal;
this.entryPosition = entryPosition;
this.insidePortalThisTick = true;
}
public boolean processPortalTeleportation(ServerLevel level, Entity entity, boolean canChangeDimensions) {
if (!this.insidePortalThisTick) {
this.decayTick();
return false;
} else {
this.insidePortalThisTick = false;
return canChangeDimensions && this.portalTime++ >= this.portal.getPortalTransitionTime(level, entity);
}
}
@Nullable
public TeleportTransition getPortalDestination(ServerLevel level, Entity entity) {
return this.portal.getPortalDestination(level, entity, this.entryPosition);
}
public Portal.Transition getPortalLocalTransition() {
return this.portal.getLocalTransition();
}
private void decayTick() {
this.portalTime = Math.max(this.portalTime - 4, 0);
}
public boolean hasExpired() {
return this.portalTime <= 0;
}
public BlockPos getEntryPosition() {
return this.entryPosition;
}
public void updateEntryPosition(BlockPos entryPosition) {
this.entryPosition = entryPosition;
}
public int getPortalTime() {
return this.portalTime;
}
public boolean isInsidePortalThisTick() {
return this.insidePortalThisTick;
}
public void setAsInsidePortalThisTick(boolean insidePortalThisTick) {
this.insidePortalThisTick = insidePortalThisTick;
}
public boolean isSamePortal(Portal portal) {
return this.portal == portal;
}
}