ROTATION_MODE enum

Пакет: com.hypixel.hytale.server.core.modules.physics

Файл: com/hypixel/hytale/server/core/modules/physics/SimplePhysicsProvider.java

Поля (1)

МодификаторыТипИмя
None, Velocity, VelocityDamped

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.physics;

class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.function.consumer.QuadConsumer;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.NearestBlockUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.server.core.asset.type.projectile.config.Projectile;
class="kw">import com.hypixel.hytale.server.core.modules.collision.BlockCollisionProvider;
class="kw">import com.hypixel.hytale.server.core.modules.collision.BlockContactData;
class="kw">import com.hypixel.hytale.server.core.modules.collision.BlockData;
class="kw">import com.hypixel.hytale.server.core.modules.collision.BlockTracker;
class="kw">import com.hypixel.hytale.server.core.modules.collision.EntityCollisionProvider;
class="kw">import com.hypixel.hytale.server.core.modules.collision.EntityContactData;
class="kw">import com.hypixel.hytale.server.core.modules.collision.IBlockCollisionConsumer;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.ForceProvider;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.ForceProviderEntity;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.ForceProviderStandardState;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsBodyState;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsBodyStateUpdater;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsBodyStateUpdaterSymplecticEuler;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
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 java.util.UUID;
class="kw">import java.util.function.BiConsumer;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

@Deprecated
class="kw">public class SimplePhysicsProvider class="kw">implements IBlockCollisionConsumer {
   class="kw">protected class="kw">static class="kw">final double HIT_WATER_IMPULSE_LOSS = 0.2;
   class="kw">protected class="kw">static class="kw">final double ROTATION_FORCE = 3.0;
   class="kw">protected class="kw">static class="kw">final float SPEED_ROTATION_FACTOR = 2.0F;
   class="kw">protected class="kw">static class="kw">final double SWIMMING_DAMPING_FACTOR = 1.0;
   class="kw">protected class="kw">static class="kw">final double DEFAULT_MOVE_OUT_OF_SOLID_SPEED = 5.0;
   class="kw">protected class="kw">static class="kw">final int WATER_DETECTION_EXTREMA_COUNT = 2;
   class="kw">protected class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">protected class="kw">final BlockCollisionProvider blockCollisionProvider;
   @Nonnull
   class="kw">protected class="kw">final EntityCollisionProvider entityCollisionProvider;
   @Nonnull
   class="kw">protected class="kw">final BlockTracker triggerTracker;
   @Nonnull
   class="kw">protected class="kw">final RestingSupport restingSupport;
   @Nullable
   class="kw">protected World world;
   @Nonnull
   class="kw">protected class="kw">final Vector3d velocity;
   @Nonnull
   class="kw">protected class="kw">final Vector3d position;
   @Nonnull
   class="kw">protected class="kw">final Vector3d movement;
   class="kw">protected boolean bounced;
   class="kw">protected boolean onGround;
   class="kw">protected boolean provideCharacterCollisions;
   class="kw">protected double gravity;
   class="kw">protected double bounciness;
   class="kw">protected boolean sticksVertically;
   class="kw">protected boolean computeYaw = true;
   class="kw">protected boolean computePitch = true;
   class="kw">protected SimplePhysicsProvider.ROTATION_MODE rotationMode = SimplePhysicsProvider.ROTATION_MODE.VelocityDamped;
   class="kw">protected UUID creatorUuid;
   class="kw">protected class="kw">static class="kw">final double minBounceEpsilon = 0.4;
   class="kw">protected class="kw">static class="kw">final double minBounceEpsilonSquared = 0.16000000000000003;
   class="kw">protected class="kw">final Vector3d tempVector = new Vector3d();
   class="kw">protected BiConsumer<Vector3d, ComponentAccessor<EntityStore>> bounceConsumer;
   class="kw">protected QuadConsumer<Ref<EntityStore>, Vector3d, Ref<EntityStore>, ComponentAccessor<EntityStore>> impactConsumer;
   class="kw">protected double moveOutOfSolidSpeed;
   class="kw">protected boolean movedInsideSolid;
   class="kw">protected class="kw">final Vector3d moveOutOfSolidVelocity = new Vector3d();
   class="kw">protected class="kw">final Vector3i contactBlockPosition = new Vector3i();
   class="kw">protected class="kw">final Vector3d contactPosition = new Vector3d();
   class="kw">protected class="kw">final Vector3d contactNormal = new Vector3d();
   class="kw">protected double collisionStart;
   class="kw">protected boolean fallingAfterBreak;
   class="kw">protected class="kw">final PhysicsBodyStateUpdater stateUpdater = new PhysicsBodyStateUpdaterSymplecticEuler();
   class="kw">protected class="kw">final PhysicsBodyState stateBefore = new PhysicsBodyState();
   class="kw">protected class="kw">final PhysicsBodyState stateAfter = new PhysicsBodyState();
   class="kw">protected double displacedMass;
   class="kw">protected double subSurfaceVolume;
   class="kw">protected double enterFluid;
   class="kw">protected double leaveFluid;
   class="kw">protected boolean inFluid;
   class="kw">protected int velocityExtremaCount = Integer.MAX_VALUE;
   @Nonnull
   class="kw">protected SimplePhysicsProvider.STATE state = SimplePhysicsProvider.STATE.Active;
   class="kw">protected ForceProviderEntity forceProviderEntity;
   class="kw">protected ForceProvider[] forceProviders;
   class="kw">protected class="kw">final ForceProviderStandardState forceProviderStandardState = new ForceProviderStandardState();
   class="kw">protected double terminalVelocity1;
   class="kw">protected double density1;
   class="kw">protected double terminalVelocity2;
   class="kw">protected double density2;
   class="kw">protected double dragMultiplier;
   class="kw">protected double dragOffset;
   class="kw">protected class="kw">final BlockTracker fluidTracker = new BlockTracker();
   class="kw">protected double hitWaterImpulseLoss = 0.2;
   class="kw">protected double rotationForce = 3.0;
   class="kw">protected float speedRotationFactor = 2.0F;
   class="kw">protected double swimmingDampingFactor = 1.0;
   @Deprecated(forRemoval = true)
   class="kw">protected BoundingBox boundingBox;

   class="kw">public SimplePhysicsProvider() {
      this.blockCollisionProvider = new BlockCollisionProvider();
      this.blockCollisionProvider.setRequestedCollisionMaterials(6);
      this.blockCollisionProvider.setReportOverlaps(true);
      this.entityCollisionProvider = new EntityCollisionProvider();
      this.triggerTracker = new BlockTracker();
      this.restingSupport = new RestingSupport();
      this.velocity = new Vector3d();
      this.position = new Vector3d();
      this.movement = new Vector3d();
   }

   class="kw">public SimplePhysicsProvider(
      @Nonnull BiConsumer<Vector3d, ComponentAccessor<EntityStore>> var1,
      @Nonnull QuadConsumer<Ref<EntityStore>, Vector3d, Ref<EntityStore>, ComponentAccessor<EntityStore>> var2
   ) {
      this();
      this.bounceConsumer = var1;
      this.impactConsumer = var2;
   }

   class="kw">public void setImpacted(boolean var1) {
      this.state = var1 ? SimplePhysicsProvider.STATE.Inactive : SimplePhysicsProvider.STATE.Active;
   }

   class="kw">public boolean isImpacted() {
      class="kw">return this.state == SimplePhysicsProvider.STATE.Inactive;
   }

   class="kw">public void setResting(boolean var1) {
      if (this.state != SimplePhysicsProvider.STATE.Inactive) {
         this.state = var1 ? SimplePhysicsProvider.STATE.Resting : SimplePhysicsProvider.STATE.Active;
      }
   }

   class="kw">public boolean isResting() {
      class="kw">return this.state == SimplePhysicsProvider.STATE.Resting;
   }

   @Nonnull
   @Override
   class="kw">public IBlockCollisionConsumer.Result onCollision(
      int var1, int var2, int var3, @Nonnull Vector3d var4, @Nonnull BlockContactData var5, @Nonnull BlockData var6, @Nonnull Box var7
   ) {
      BlockMaterial var8 = var6.getBlockType().getMaterial();
      if (this.moveOutOfSolidSpeed > 0.0 && var5.isOverlapping() && var8 == BlockMaterial.Solid) {
         Vector3i var18 = NearestBlockUtil.findNearestBlock(this.position, (var0, var1x) -> {
            WorldChunk var2 = var1x.getChunkIfInMemory(ChunkUtil.indexChunkFromBlock(var0.x(), var0.z()));
            class="kw">return var2 != null && var2.getBlockType(var0).getMaterial() != BlockMaterial.Solid;
         }, this.world);
         boolean var10 = false;
         if (var18 != null) {
            this.tempVector.set(var18.x, var18.y, var18.z);
            this.tempVector.add(0.5, 0.5, 0.5);
            this.tempVector.sub(this.position);
            double var19 = this.tempVector.lengthSquared();
            if (var19 > 1.0E-8) {
               this.tempVector.mul(this.moveOutOfSolidSpeed / Math.sqrt(var19));
               var10 = true;
            }
         }

         if (!var10) {
            this.tempVector.set(0.0, this.moveOutOfSolidSpeed, 0.0);
         }

         this.moveOutOfSolidVelocity.add(this.tempVector);
         this.movedInsideSolid = true;
         class="kw">return IBlockCollisionConsumer.Result.CONTINUE;
      } else if (var6.getFluidId() != 0 && !this.fluidTracker.isTracked(var1, var2, var3)) {
         double var17 = var5.getCollisionStart();
         double var11 = var5.getCollisionEnd();
         if (var17 < this.enterFluid) {
            this.enterFluid = var17;
         }

         if (var11 > this.leaveFluid) {
            this.leaveFluid = var11;
         }

         if (var11 <= var17) {
            class="kw">return IBlockCollisionConsumer.Result.CONTINUE;
         }

         double var13 = 1000.0;
         double var15 = PhysicsMath.volumeOfIntersection(this.boundingBox.getBoundingBox(), this.contactPosition, var7, var1, var2, var3);
         this.subSurfaceVolume += var15;
         this.displacedMass += var15 * var13;
         this.fluidTracker.trackNew(var1, var2, var3);
         class="kw">return IBlockCollisionConsumer.Result.CONTINUE;
      } else {
         if (var5.isOverlapping()) {
            class="kw">return IBlockCollisionConsumer.Result.CONTINUE;
         }

         double var9 = var4.dot(var5.getCollisionNormal());
         if (var8 == BlockMaterial.Solid && var9 == 0.0) {
         }

         if (var9 >= 0.0) {
            class="kw">return IBlockCollisionConsumer.Result.CONTINUE;
         }

         this.contactBlockPosition.set(var1, var2, var3);
         this.contactPosition.set(var5.getCollisionPoint());
         this.contactNormal.set(var5.getCollisionNormal());
         this.collisionStart = var5.getCollisionStart();
         this.bounced = true;
         class="kw">return IBlockCollisionConsumer.Result.STOP;
      }
   }

   @Nonnull
   @Override
   class="kw">public IBlockCollisionConsumer.Result probeCollisionDamage(int var1, int var2, int var3, Vector3d var4, BlockContactData var5, BlockData var6) {
      class="kw">return IBlockCollisionConsumer.Result.CONTINUE;
   }

   @Override
   class="kw">public void onCollisionDamage(int var1, int var2, int var3, Vector3d var4, BlockContactData var5, BlockData var6) {
   }

   @Nonnull
   @Override
   class="kw">public IBlockCollisionConsumer.Result onCollisionSliceFinished() {
      class="kw">return IBlockCollisionConsumer.Result.CONTINUE;
   }

   @Override
   class="kw">public void onCollisionFinished() {
   }

   @Nullable
   class="kw">public Ref<EntityStore> tick(
      double var1,
      @Nonnull Velocity var3,
      @Nonnull World var4,
      @Nonnull TransformComponent var5,
      Ref<EntityStore> var6,
      @Nonnull ComponentAccessor<EntityStore> var7
   ) {
      if (this.state == SimplePhysicsProvider.STATE.Inactive) {
         var3.setZero();
         class="kw">return null;
      }

      if (this.state == SimplePhysicsProvider.STATE.Resting) {
         ChunkStore var8 = var4.getChunkStore();
         if (this.forceProviderStandardState.externalForce.lengthSquared() == 0.0 && !this.restingSupport.hasChanged(var8)) {
            class="kw">return null;
         }

         this.state = SimplePhysicsProvider.STATE.Active;
         this.fallingAfterBreak = true;
      }

      this.world = var4;
      this.position.set(var5.getPosition());
      var3.assignVelocityTo(this.velocity);
      double var22 = this.forceProviderEntity.getMass(this.boundingBox.getBoundingBox().getVolume());
      this.forceProviderStandardState.convertToForces(var1, var22);
      this.forceProviderStandardState.updateVelocity(this.velocity);
      if (!(this.velocity.lengthSquared() * var1 * var1 >= 1.0000000000000002E-10) && !(this.forceProviderStandardState.externalForce.lengthSquared() > 0.0)) {
         this.velocity.zero();
      } else {
         this.state = SimplePhysicsProvider.STATE.Active;
      }

      ChunkStore var10 = var4.getChunkStore();
      if (this.state == SimplePhysicsProvider.STATE.Resting && this.restingSupport.hasChanged(var10)) {
         this.state = SimplePhysicsProvider.STATE.Active;
         this.fallingAfterBreak = true;
      }

      this.stateBefore.position.set(this.position);
      this.stateBefore.velocity.set(this.velocity);
      this.forceProviderEntity.setForceProviderStandardState(this.forceProviderStandardState);
      this.stateUpdater.update(this.stateBefore, this.stateAfter, var22, var1, this.onGround, this.forceProviders);
      this.velocity.set(this.stateAfter.velocity);
      this.movement.set(this.velocity).mul(var1);
      if (Double.isFinite(this.movement.x) && Double.isFinite(this.movement.y) && Double.isFinite(this.movement.z)) {
         this.forceProviderStandardState.clear();
         if (this.velocity.lengthSquared() * var1 * var1 >= 1.0000000000000002E-10) {
            this.state = SimplePhysicsProvider.STATE.Active;
         } else {
            this.velocity.zero();
         }

         double var11 = 1.0;
         if (this.provideCharacterCollisions) {
            Ref var13 = null;
            if (this.creatorUuid != null) {
               var13 = var4.getEntityRef(this.creatorUuid);
            }

            var11 = this.entityCollisionProvider.computeNearest(this.boundingBox.getBoundingBox(), this.position, this.movement, var6, var13, var7);
            if (var11 < 0.0 || var11 > 1.0) {
               var11 = 1.0;
            }
         }

         this.bounced = false;
         this.onGround = false;
         this.moveOutOfSolidVelocity.zero();
         this.movedInsideSolid = false;
         this.displacedMass = 0.0;
         this.subSurfaceVolume = 0.0;
         this.enterFluid = Double.MAX_VALUE;
         this.leaveFluid = -Double.MAX_VALUE;
         this.collisionStart = var11;
         this.contactPosition.set(this.position).fma(this.collisionStart, this.movement);
         this.contactNormal.zero();
         this.blockCollisionProvider.cast(var4, this.boundingBox.getBoundingBox(), this.position, this.movement, this, this.triggerTracker, var11);
         this.fluidTracker.reset();
         double var23 = this.displacedMass > 0.0 ? this.displacedMass / this.subSurfaceVolume : 1.2;
         if (this.movedInsideSolid) {
            this.position.fma(var1, this.moveOutOfSolidVelocity);
            this.velocity.set(this.moveOutOfSolidVelocity);
            this.forceProviderStandardState.dragCoefficient = this.getDragCoefficient(var23);
            this.forceProviderStandardState.displacedMass = this.displacedMass;
            this.forceProviderStandardState.gravity = this.gravity;
            this.finishTick(var5, var3);
            class="kw">return null;
         }

         double var15 = this.bounced ? this.collisionStart : 1.0;
         boolean var17 = false;
         if (!this.inFluid && this.enterFluid < this.collisionStart) {
            this.inFluid = true;
            var15 = this.enterFluid;
            this.velocityExtremaCount = 2;
            var17 = true;
         } else if (this.inFluid && this.leaveFluid < this.collisionStart) {
            this.inFluid = false;
            var15 = this.leaveFluid;
            this.velocityExtremaCount = 2;
         }

         if (var15 > 0.0 && var15 < 1.0) {
            this.stateUpdater.update(this.stateBefore, this.stateAfter, var22, var1 * var15, this.onGround, this.forceProviders);
            this.velocity.set(this.stateAfter.velocity);
         }

         if (this.inFluid && this.subSurfaceVolume < this.boundingBox.getBoundingBox().getVolume() && this.velocityExtremaCount > 0) {
            double var18 = this.stateBefore.velocity.y;
            double var20 = this.stateAfter.velocity.y;
            if (var18 * var20 <= 0.0) {
               this.velocityExtremaCount--;
            }
         }

         if (this.isSwimming()) {
            this.forceProviderStandardState.externalForce.y = this.forceProviderStandardState.externalForce.y
               - this.stateAfter.velocity.y * (this.swimmingDampingFactor / var22);
         }

         if (var17) {
            this.forceProviderStandardState.externalImpulse.fma(-this.hitWaterImpulseLoss * var22, this.stateAfter.velocity);
         }

         this.forceProviderStandardState.displacedMass = this.displacedMass;
         this.forceProviderStandardState.dragCoefficient = this.getDragCoefficient(var23);
         this.forceProviderStandardState.gravity = this.gravity;
         if (this.bounced) {
            this.position.set(this.contactPosition);
            computeReflectedVector(this.velocity, this.contactNormal, this.velocity);
            this.velocity.mul(this.bounciness);
            if (this.velocity.lengthSquared() * var1 * var1 < 0.16000000000000003) {
               boolean var25 = this.contactNormal.equals(Vector3dUtil.UP);
               if (this.sticksVertically || var25) {
                  this.state = SimplePhysicsProvider.STATE.Resting;
                  this.restingSupport.rest(var10, this.contactBlockPosition);
                  this.onGround = var25;
                  this.fallingAfterBreak = false;
                  if (this.impactConsumer != null) {
                     this.impactConsumer.accept(var6, this.position, null, var7);
                  }
               }

               this.velocity.zero();
            } else if (this.bounceConsumer != null) {
               this.bounceConsumer.accept(this.position, var7);
            }

            this.rotateBody(var1, var5.getRotation());
            this.finishTick(var5, var3);
            class="kw">return null;
         } else if (this.entityCollisionProvider.getCount() > 0) {
            EntityContactData var24 = this.entityCollisionProvider.getContact(0);
            Ref var19 = var24.getEntityReference();
            this.position.set(var24.getCollisionPoint());
            this.state = SimplePhysicsProvider.STATE.Inactive;
            if (this.impactConsumer != null) {
               this.impactConsumer.accept(var6, this.position, var19, var7);
            }

            this.rotateBody(var1, var5.getRotation());
            this.finishTick(var5, var3);
            class="kw">return var19;
         } else {
            this.position.add(this.movement);
            this.rotateBody(var1, var5.getRotation());
            this.finishTick(var5, var3);
            class="kw">return null;
         }
      } else {
         this.velocity.zero();
         this.movement.zero();
         this.forceProviderStandardState.clear();
         this.finishTick(var5, var3);
         class="kw">return null;
      }
   }

   class="kw">protected void finishTick(@Nonnull TransformComponent var1, @Nonnull Velocity var2) {
      var1.setPosition(this.position);
      var2.set(this.velocity);
      this.world = null;
      this.entityCollisionProvider.clear();
   }

   class="kw">protected void rotateBody(double var1, @Nonnull Rotation3f var3) {
      if (this.isComputeYaw() || this.isComputePitch()) {
         double var4 = this.stateAfter.velocity.x;
         double var6 = this.stateAfter.velocity.z;
         if (var4 * var4 + var6 * var6 <= 1.0000000000000002E-10) {
            if (this.fallingAfterBreak && this.isComputePitch() && this.stateAfter.velocity.y * this.stateAfter.velocity.y > 1.0000000000000002E-10) {
               float var12 = PhysicsMath.pitchFromDirection(var4, this.stateAfter.velocity.y, var6);
               float var13 = var3.pitch();
               float var14 = PhysicsMath.normalizeTurnAngle(var12 - var13);
               float var15 = (float)(this.velocity.lengthSquared() * var1 * this.speedRotationFactor);
               if (var14 > var15) {
                  var14 = var15;
               } else if (var14 < -var15) {
                  var14 = -var15;
               }

               var3.setPitch(var13 + var14);
            }
         } else {
            class="kw">switch (this.rotationMode) {
               case None:
               class="kw">default:
                  break;
               case Velocity:
                  if (this.isComputeYaw()) {
                     var3.setYaw(PhysicsMath.normalizeTurnAngle(PhysicsMath.headingFromDirection(var4, var6)));
                  }

                  if (this.isComputePitch()) {
                     var3.setPitch(PhysicsMath.pitchFromDirection(var4, this.stateAfter.velocity.y, var6));
                  }
                  break;
               case VelocityDamped:
                  if (this.isComputeYaw()) {
                     var3.setYaw(PhysicsMath.normalizeTurnAngle(PhysicsMath.headingFromDirection(var4, var6)));
                  }

                  if (this.isComputePitch()) {
                     float var8 = var3.pitch();
                     float var9 = PhysicsMath.pitchFromDirection(var4, this.velocity.y, var6);
                     float var10 = PhysicsMath.normalizeTurnAngle(var9 - var8);
                     float var11 = (float)(this.velocity.lengthSquared() * var1 * this.speedRotationFactor);
                     if (var10 > var11) {
                        var9 = var8 + var11;
                        var10 = var11;
                     } else if (var10 < -var11) {
                        var9 = var8 - var11;
                        var10 = -var11;
                     }

                     var3.setPitch(var9);
                     this.forceProviderStandardState.externalForce.fma(var10 * -this.rotationForce, this.stateAfter.velocity);
                  }
            }
         }
      }
   }

   class="kw">public boolean isOnGround() {
      class="kw">return this.onGround;
   }

   class="kw">public boolean isSwimming() {
      class="kw">return this.velocityExtremaCount <= 0;
   }

   class="kw">public class="kw">static void computeReflectedVector(@Nonnull Vector3d var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2) {
      var2.set(var0);
      double var3 = var1.lengthSquared();
      if (var3 != 0.0) {
         double var5 = var0.dot(var1) / var3;
         var2.fma(-2.0 * var5, var1);
      }
   }

   class="kw">public boolean isProvidingCharacterCollisions() {
      class="kw">return this.provideCharacterCollisions;
   }

   class="kw">public void setProvideCharacterCollisions(boolean var1) {
      this.provideCharacterCollisions = var1;
   }

   class="kw">public void setGravity(double var1, @Nonnull BoundingBox var3) {
      this.gravity = var1;
      this.recomputeDragFactors(var3);
   }

   class="kw">public void setBounciness(double var1) {
      this.bounciness = var1;
   }

   class="kw">public void setTerminalVelocities(double var1, double var3, @Nonnull BoundingBox var5) {
      this.setTerminalVelocities(var1, 1.2, var3, 998.0, var5);
   }

   class="kw">public void setTerminalVelocities(double var1, double var3, double var5, double var7, @Nonnull BoundingBox var9) {
      this.terminalVelocity1 = var1;
      this.density1 = var3;
      this.terminalVelocity2 = var5;
      this.density2 = var7;
      this.recomputeDragFactors(var9);
   }

   @Nonnull
   @Deprecated
   class="kw">public SimplePhysicsProvider setImpactSlowdown(double var1) {
      class="kw">return this;
   }

   class="kw">public void setSticksVertically(boolean var1) {
      this.sticksVertically = var1;
   }

   class="kw">public boolean isComputeYaw() {
      class="kw">return this.computeYaw;
   }

   class="kw">public void setComputeYaw(boolean var1) {
      this.computeYaw = var1;
   }

   class="kw">public boolean isComputePitch() {
      class="kw">return this.computePitch;
   }

   class="kw">public void setComputePitch(boolean var1) {
      this.computePitch = var1;
   }

   class="kw">public void setCreatorId(UUID var1) {
      this.creatorUuid = var1;
   }

   class="kw">public void initialize(@Nullable Projectile var1, @Nonnull BoundingBox var2) {
      if (var1 != null) {
         this.boundingBox = var2;
         this.forceProviderEntity = new ForceProviderEntity(var2);
         this.forceProviders = new ForceProvider[]{this.forceProviderEntity};
         this.setGravity(var1.getGravity(), var2);
         double var3 = var1.getTerminalVelocity();
         this.setTerminalVelocities(var3, var3 * var1.getWaterTerminalVelocityMultiplier(), var2);
         this.hitWaterImpulseLoss = var1.getWaterHitImpulseLoss();
         this.rotationForce = var1.getDampingRotation();
         this.speedRotationFactor = (float)var1.getRotationSpeedVelocityRatio();
         this.swimmingDampingFactor = var1.getSwimmingDampingFactor();
         this.rotationMode = var1.getRotationMode();
         this.setBounciness(var1.getBounciness() * (1.0 - var1.getImpactSlowdown()));
         this.setImpactSlowdown(var1.getImpactSlowdown());
         this.setSticksVertically(var1.isSticksVertically());
         this.setComputeYaw(var1.isComputeYaw());
         this.setComputePitch(var1.isComputePitch());
         this.forceProviderEntity.setDensity(var1.getDensity());
      }
   }

   @Nonnull
   class="kw">public Vector3d getVelocity() {
      class="kw">return this.velocity;
   }

   class="kw">public void addVelocity(float var1, float var2, float var3) {
      this.forceProviderStandardState.externalVelocity.add(var1, var2, var3);
   }

   class="kw">public void setVelocity(@Nonnull Vector3d var1) {
      this.forceProviderStandardState.nextTickVelocity.set(var1);
   }

   class="kw">public void setMoveOutOfSolid(boolean var1) {
      this.setMoveOutOfSolid(var1 ? 5.0 : 0.0);
   }

   class="kw">public void setMoveOutOfSolid(double var1) {
      this.moveOutOfSolidSpeed = Math.max(0.0, var1);
   }

   class="kw">protected double getDragCoefficient(double var1) {
      class="kw">return this.dragMultiplier * var1 + this.dragOffset;
   }

   class="kw">protected void recomputeDragFactors(@Nonnull BoundingBox var1) {
      Box var2 = var1.getBoundingBox();
      double var3 = var2.width() * var2.depth();
      double var5 = this.forceProviderEntity.getMass(var2.getVolume());
      double var7 = PhysicsMath.computeDragCoefficient(this.terminalVelocity1, var3, var5, this.gravity);
      double var9 = PhysicsMath.computeDragCoefficient(this.terminalVelocity2, var3, var5, this.gravity);
      this.dragMultiplier = (var9 - var7) / (this.density2 - this.density1);
      this.dragOffset = var7 - this.dragMultiplier * this.density1;
   }

   class="kw">public enum ROTATION_MODE {
      None,
      Velocity,
      VelocityDamped;

      ROTATION_MODE() {
      }
   }

   class="kw">public enum STATE {
      Active,
      Resting,
      Inactive;

      STATE() {
      }
   }
}