HyCodeYourTale
classpublicPriority 3

PositionProbeAir

com.hypixel.hytale.server.npc.util.PositionProbeAir

extends PositionProbeBase

3

Methods

3

Public Methods

3

Fields

1

Constructors

Constructors

public
PositionProbeAir()

Methods

Public Methods (3)

public
boolean isInAir()
public
boolean isOnSolid()
public
String toString()
@Nonnull@Override

Fields

Protected Fields (3)

protectedboolean collideWithFluid
protectedboolean inAir
protectedboolean onSolid

Inheritance

Parent
Current
Interface
Child

Use mouse wheel to zoom, drag to pan. Click nodes to navigate.

Related Classes

Source Code

package com.hypixel.hytale.server.npc.util;

import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.math.shape.Box;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.protocol.BlockMaterial;
import com.hypixel.hytale.server.core.modules.collision.BoxBlockIntersectionEvaluator;
import com.hypixel.hytale.server.core.modules.collision.CollisionConfig;
import com.hypixel.hytale.server.core.modules.collision.CollisionMath;
import com.hypixel.hytale.server.core.modules.collision.CollisionResult;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import javax.annotation.Nonnull;

public class PositionProbeAir extends PositionProbeBase {
   protected boolean inAir;
   protected boolean onSolid;
   protected boolean collideWithFluid;

   public PositionProbeAir() {
   }

   public boolean probePosition(
      @Nonnull Ref<EntityStore> ref,
      @Nonnull Box boundingBox,
      @Nonnull Vector3d position,
      @Nonnull CollisionResult collisionResult,
      @Nonnull ComponentAccessor<EntityStore> componentAccessor
   ) {
      this.collideWithFluid = (collisionResult.getConfig().getCollisionByMaterial() & 2) != 0;
      this.inAir = super.probePosition(ref, boundingBox, position, collisionResult, this, PositionProbeAir::blockTest, 6, componentAccessor);
      return this.inAir;
   }

   private boolean blockTest(int code, @Nonnull BoxBlockIntersectionEvaluator boxBlockIntersection, @Nonnull CollisionConfig config) {
      if (CollisionMath.isTouching(code)) {
         if (config.blockMaterial == BlockMaterial.Solid) {
            boolean isOnGround = boxBlockIntersection.isOnGround();
            this.onGround |= isOnGround;
            this.touchCeil = this.touchCeil | boxBlockIntersection.touchesCeil();
            this.onSolid |= isOnGround;
            if (isOnGround && config.blockY > this.groundLevel) {
               this.groundLevel = config.blockY;
            }
         }

         return false;
      } else if (CollisionMath.isOverlapping(code) && (config.blockMaterialMask & 2) != 0) {
         this.inWater = true;
         return this.collideWithFluid;
      } else {
         return true;
      }
   }

   public boolean isInAir() {
      return this.inAir;
   }

   public boolean isOnSolid() {
      return this.onSolid;
   }

   @Override
   protected void reset() {
      super.reset();
      this.inAir = false;
      this.onSolid = false;
   }

   @Nonnull
   @Override
   public String toString() {
      return "PositionProbeAir{inAir=" + this.inAir + ", onSolid=" + this.onSolid + "} " + super.toString();
   }
}