71 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| 	}
 | |
| }
 |