继续魔改OBB判定
This commit is contained in:
parent
7736a780a8
commit
40dad236dd
3 changed files with 20 additions and 19 deletions
|
@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.entity.OBBEntity;
|
||||||
import com.atsuishio.superbwarfare.entity.mixin.OBBHitter;
|
import com.atsuishio.superbwarfare.entity.mixin.OBBHitter;
|
||||||
import com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity;
|
import com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity;
|
||||||
import com.atsuishio.superbwarfare.tools.OBB;
|
import com.atsuishio.superbwarfare.tools.OBB;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
|
@ -34,12 +35,6 @@ public abstract class EntityMixin implements OBBHitter {
|
||||||
@Shadow
|
@Shadow
|
||||||
public abstract AABB getBoundingBox();
|
public abstract AABB getBoundingBox();
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public abstract Vec3 position();
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public abstract Vec3 getEyePosition();
|
|
||||||
|
|
||||||
@Inject(method = "collide", at = @At("HEAD"))
|
@Inject(method = "collide", at = @At("HEAD"))
|
||||||
private void sbw$spoofGroundStart(Vec3 movement, CallbackInfoReturnable<Vec3> cir) {
|
private void sbw$spoofGroundStart(Vec3 movement, CallbackInfoReturnable<Vec3> cir) {
|
||||||
if (MobileVehicleEntity.IGNORE_ENTITY_GROUND_CHECK_STEPPING) {
|
if (MobileVehicleEntity.IGNORE_ENTITY_GROUND_CHECK_STEPPING) {
|
||||||
|
@ -74,19 +69,23 @@ public abstract class EntityMixin implements OBBHitter {
|
||||||
private void onHitOBB(Vec3 movement, CallbackInfoReturnable<Vec3> cir) {
|
private void onHitOBB(Vec3 movement, CallbackInfoReturnable<Vec3> cir) {
|
||||||
AABB boundingBox = this.getBoundingBox();
|
AABB boundingBox = this.getBoundingBox();
|
||||||
Entity self = (Entity) (Object) this;
|
Entity self = (Entity) (Object) this;
|
||||||
if (self instanceof Player player) {
|
var list = this.level().getEntities(self, boundingBox.expandTowards(movement).inflate(1), e -> true);
|
||||||
boundingBox = player.getLocalBoundsForPose(player.getPose());
|
var entity = list.stream().filter(e -> e instanceof OBBEntity).min((e1, e2) -> (int) (e1.position().distanceTo(self.position()) - e2.position().distanceTo(self.position()))).orElse(null);
|
||||||
}
|
|
||||||
var list = this.level().getEntities(self, boundingBox.expandTowards(movement));
|
|
||||||
var entity = list.stream().filter(e -> e instanceof OBBEntity).findFirst().orElse(null);
|
|
||||||
if (entity == null || entity == self) return;
|
if (entity == null || entity == self) return;
|
||||||
|
|
||||||
OBBEntity obbEntity = (OBBEntity) entity;
|
OBBEntity obbEntity = (OBBEntity) entity;
|
||||||
Vec3 feetPos = this.position().subtract(this.getEyePosition());
|
Vec3 position = self.position();
|
||||||
// 第一版实现
|
// 第一版实现
|
||||||
var faceInfo = OBB.findClosestFace(obbEntity.getOBBs(), feetPos);
|
var faceInfo = OBB.findClosestFace(obbEntity.getOBBs(), position);
|
||||||
if (faceInfo == null) return;
|
if (faceInfo == null) return;
|
||||||
double dot = movement.dot(new Vec3(faceInfo.faceNormal()));
|
double dot = movement.dot(new Vec3(faceInfo.faceNormal()));
|
||||||
var vec = new Vec3(faceInfo.faceNormal()).multiply(dot, dot, dot);
|
var vec = new Vec3(faceInfo.faceNormal()).multiply(dot, dot, dot);
|
||||||
|
|
||||||
|
if (self instanceof Player player) {
|
||||||
|
player.displayClientMessage(Component.literal("Vec: [" + vec.x + ", " + vec.y + ", " + vec.z + "]," +
|
||||||
|
" Face: [" + faceInfo.faceNormal().x + ", " + faceInfo.faceNormal().y + ", " + faceInfo.faceNormal().z + "]"), true);
|
||||||
|
}
|
||||||
|
|
||||||
cir.setReturnValue(movement.subtract(vec));
|
cir.setReturnValue(movement.subtract(vec));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,13 @@ public abstract class LevelMixin {
|
||||||
// TODO 研究OBB碰撞的时候把这个删了
|
// TODO 研究OBB碰撞的时候把这个删了
|
||||||
if (!(pEntity instanceof Projectile)) return;
|
if (!(pEntity instanceof Projectile)) return;
|
||||||
|
|
||||||
StreamSupport.stream(this.getEntities().getAll().spliterator(), false).filter(e -> e instanceof OBBEntity && pPredicate.test(e))
|
StreamSupport.stream(this.getEntities().getAll().spliterator(), false).filter(e -> pPredicate.test(e) && e != pEntity)
|
||||||
.forEach(entity -> {
|
.forEach(entity -> {
|
||||||
for (OBB obb : ((OBBEntity) entity).getOBBs()) {
|
if (entity instanceof OBBEntity obbEntity) {
|
||||||
if (OBB.isColliding(obb, pBoundingBox) && !cir.getReturnValue().contains(entity)) {
|
for (OBB obb : obbEntity.getOBBs()) {
|
||||||
cir.getReturnValue().add(entity);
|
if (OBB.isColliding(obb, pBoundingBox) && !cir.getReturnValue().contains(entity)) {
|
||||||
|
cir.getReturnValue().add(entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -397,7 +397,7 @@ public record OBB(Vector3f center, Vector3f extents, Quaternionf rotation, Part
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3f pos = new Vector3f((float) playerPos.x, (float) playerPos.y, (float) playerPos.z);
|
Vector3f pos = playerPos.toVector3f();
|
||||||
OBB closestOBB = null;
|
OBB closestOBB = null;
|
||||||
int closestFaceIndex = -1;
|
int closestFaceIndex = -1;
|
||||||
float minDistance = Float.MAX_VALUE;
|
float minDistance = Float.MAX_VALUE;
|
||||||
|
@ -410,7 +410,7 @@ public record OBB(Vector3f center, Vector3f extents, Quaternionf rotation, Part
|
||||||
float distToCenter = pos.distance(obb.center());
|
float distToCenter = pos.distance(obb.center());
|
||||||
|
|
||||||
// 如果距离大于包围球半径,不可能比当前最小值更近
|
// 如果距离大于包围球半径,不可能比当前最小值更近
|
||||||
if (distToCenter - obb.getBoundingSphereRadius() > minDistance) {
|
if (distToCenter > obb.getBoundingSphereRadius()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue