ItemPrePhysicsSystem class
Пакет: com.hypixel.hytale.server.core.modules.entity.item
Файл: com/hypixel/hytale/server/core/modules/entity/item/ItemPrePhysicsSystem.java
extends: EntityTickingSystem<EntityStore>
Поля (27)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
NearestBlockUtil.IterationElement[] |
SEARCH_ELEMENTS |
|
|
break |
|
Box |
var10 |
|
boolean |
var10 |
|
|
var10 |
|
World |
var11 |
|
double |
var11 |
|
ChunkStore |
var12 |
|
BlockSection |
var13 |
|
|
var13 |
|
|
var13 |
|
Ref |
var14 |
|
Vector3i |
var15 |
|
int |
var4 |
|
int |
var5 |
|
double |
var5 |
|
|
var5 |
|
Velocity |
var6 |
|
int |
var6 |
|
TransformComponent |
var7 |
|
BlockType |
var7 |
|
double |
var7 |
|
PhysicsValues |
var8 |
|
int |
var8 |
|
BoundingBox |
var9 |
|
BlockBoundingBoxes.RotatedVariantBoxes |
var9 |
|
double |
var9 |
Методы (6)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
static |
void |
applyGravityvoid applyGravity(float var0, @Nullable Box var1, @Nonnull PhysicsValues var2, @Nonnull Vector3d var3, @Nonnull Velocity var4) |
|
|
if if(var0 != null) |
|
|
if if(var10) |
|
|
if if(var15 != null) |
|
|
if if(var1 != null) |
static |
void |
moveOutOfBlockvoid moveOutOfBlock(@Nullable BlockSection var0, @Nonnull Vector3d var1, @Nonnull Velocity var2, @Nonnull Box var3) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.entity.item;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.util.NearestBlockUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionMath;
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.PhysicsValues;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
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.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 javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;
class="kw">public class ItemPrePhysicsSystem class="kw">extends EntityTickingSystem<EntityStore> {
class="kw">public class="kw">static class="kw">final NearestBlockUtil.IterationElement[] SEARCH_ELEMENTS = new NearestBlockUtil.IterationElement[]{
new NearestBlockUtil.IterationElement(-1, 0, 0, var0 -> 0.0, var0 -> var0, var0 -> var0),
new NearestBlockUtil.IterationElement(1, 0, 0, var0 -> 1.0, var0 -> var0, var0 -> var0),
new NearestBlockUtil.IterationElement(0, 0, -1, var0 -> var0, var0 -> var0, var0 -> 0.0),
new NearestBlockUtil.IterationElement(0, 0, 1, var0 -> var0, var0 -> var0, var0 -> 1.0)
};
class="kw">public class="kw">static class="kw">final double VERTICAL_CLIMB_SCALE = 7.0;
@Nonnull
class="kw">private class="kw">final ComponentType<EntityStore, BoundingBox> boundingBoxComponentType;
@Nonnull
class="kw">private class="kw">final ComponentType<EntityStore, Velocity> velocityComponentType;
@Nonnull
class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType;
@Nonnull
class="kw">private class="kw">final ComponentType<EntityStore, PhysicsValues> physicsValuesComponentType;
@Nonnull
class="kw">private class="kw">final Query<EntityStore> query;
class="kw">public ItemPrePhysicsSystem(
@Nonnull ComponentType<EntityStore, ItemComponent> var1,
@Nonnull ComponentType<EntityStore, BoundingBox> var2,
@Nonnull ComponentType<EntityStore, Velocity> var3,
@Nonnull ComponentType<EntityStore, TransformComponent> var4,
@Nonnull ComponentType<EntityStore, PhysicsValues> var5
) {
this.physicsValuesComponentType = var5;
this.boundingBoxComponentType = var2;
this.transformComponentType = var4;
this.velocityComponentType = var3;
this.query = Query.and(var1, TransformComponent.getComponentType(), var2, var3, var5);
}
@Nonnull
@Override
class="kw">public Query<EntityStore> getQuery() {
class="kw">return this.query;
}
@Override
class="kw">public boolean isParallel(int var1, int var2) {
class="kw">return EntityTickingSystem.maybeUseParallel(var1, var2);
}
@Override
class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5) {
Velocity var6 = var3.getComponent(var2, this.velocityComponentType);
assert var6 != null;
TransformComponent var7 = var3.getComponent(var2, this.transformComponentType);
assert var7 != null;
PhysicsValues var8 = var3.getComponent(var2, this.physicsValuesComponentType);
assert var8 != null;
BoundingBox var9 = var3.getComponent(var2, this.boundingBoxComponentType);
assert var9 != null;
Box var10 = var9.getBoundingBox();
World var11 = var5.getExternalData().getWorld();
ChunkStore var12 = var11.getChunkStore();
Ref var14 = var7.getSectionRef();
BlockSection var13;
if (var14 != null && var14.isValid()) {
var13 = var12.getStore().getComponent(var14, BlockSection.getComponentType());
} else {
var13 = null;
}
moveOutOfBlock(var13, var7.getPosition(), var6, var10);
applyGravity(var1, var10, var8, var7.getPosition(), var6);
}
class="kw">public class="kw">static void moveOutOfBlock(@Nullable BlockSection var0, @Nonnull Vector3d var1, @Nonnull Velocity var2, @Nonnull Box var3) {
if (var0 != null) {
int var4 = MathUtil.floor(var1.x);
int var5 = MathUtil.floor(var1.y);
int var6 = MathUtil.floor(var1.z);
BlockType var7 = BlockType.getAssetMap().getAsset(var0.get(var4, var5, var6));
assert var7 != null;
if (var7.getMaterial() == BlockMaterial.Solid) {
int var8 = var0.getRotationIndex(var4, var5, var6);
BlockBoundingBoxes.RotatedVariantBoxes var9 = BlockBoundingBoxes.getAssetMap().getAsset(var7.getHitboxTypeIndex()).get(var8);
boolean var10 = false;
for (Box var14 : var9.getDetailBoxes()) {
if (CollisionMath.isOverlapping(CollisionMath.intersectAABBs(var4, var5, var6, var14, var1.x, var1.y, var1.z, var3))) {
var10 = true;
break;
}
}
if (var10) {
Vector3i var15 = NearestBlockUtil.findNearestBlock(SEARCH_ELEMENTS, var1, (var0x, var1x) -> {
BlockType var2 = BlockType.getAssetMap().getAsset(var1x.get(var0x.x, var0x.y, var0x.z));
class="kw">return var2.getMaterial() != BlockMaterial.Solid;
}, var0);
if (var15 != null) {
var1.set(var15.x + 0.5, var15.y, var15.z + 0.5);
} else {
var2.setY(7.0 * var9.getBoundingBox().height());
}
}
}
}
}
class="kw">public class="kw">static void applyGravity(float var0, @Nullable Box var1, @Nonnull PhysicsValues var2, @Nonnull Vector3d var3, @Nonnull Velocity var4) {
double var5 = 1.0;
if (var1 != null) {
var5 = Math.abs(var1.width() * var1.depth());
}
double var7 = PhysicsMath.getRelativeDensity(var3, var1);
double var9 = PhysicsMath.getTerminalVelocity(var2.getMass(), var7, var5, var2.getDragCoefficient());
if (!var2.isInvertedGravity()) {
var9 *= -1.0;
}
double var11 = PhysicsMath.getAcceleration(var4.getY(), var9) * var0;
if (var4.getY() < var9 && var11 > 0.0) {
var4.setY(Math.min(var4.getY() + var11, var9));
} else if (var4.getY() > var9 && var11 < 0.0) {
var4.setY(Math.max(var4.getY() + var11, var9));
}
}
}