简化炮塔角度算法,移除快艇前后俯仰特性

This commit is contained in:
Atsuihsio 2024-12-14 02:50:08 +08:00
parent 3695b8fa07
commit a7c206a95b
3 changed files with 20 additions and 24 deletions

View file

@ -92,7 +92,7 @@ public class ClickHandler {
if (player.getMainHandItem().is(ModTags.Items.GUN) if (player.getMainHandItem().is(ModTags.Items.GUN)
|| stack.is(ModItems.MONITOR.get()) || stack.is(ModItems.MONITOR.get())
|| player.hasEffect(ModMobEffects.SHOCK.get()) || player.hasEffect(ModMobEffects.SHOCK.get())
|| (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) { || (player.getVehicle() != null && (player.getVehicle() instanceof ICannonEntity || player.getVehicle() instanceof IVehicleEntity))) {
if (button == GLFW.GLFW_MOUSE_BUTTON_LEFT) { if (button == GLFW.GLFW_MOUSE_BUTTON_LEFT) {
event.setCanceled(true); event.setCanceled(true);
} }

View file

@ -37,7 +37,6 @@ public class SpeedboatRenderer extends GeoEntityRenderer<SpeedboatEntity> {
public void render(SpeedboatEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { public void render(SpeedboatEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) {
poseStack.pushPose(); poseStack.pushPose();
poseStack.mulPose(Axis.YP.rotationDegrees(-Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()))); poseStack.mulPose(Axis.YP.rotationDegrees(-Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot())));
poseStack.mulPose(Axis.XP.rotationDegrees(Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot())));
super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn);
poseStack.popPose(); poseStack.popPose();
} }

View file

@ -43,6 +43,7 @@ import net.minecraftforge.fluids.FluidType;
import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.NetworkHooks;
import net.minecraftforge.network.PlayMessages; import net.minecraftforge.network.PlayMessages;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import org.joml.Math;
import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.GeoEntity;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.core.animation.AnimatableManager; import software.bernie.geckolib.core.animation.AnimatableManager;
@ -319,13 +320,9 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
this.entityData.set(ROTOR, this.entityData.get(ROTOR) + this.entityData.get(POWER)); this.entityData.set(ROTOR, this.entityData.get(ROTOR) + this.entityData.get(POWER));
this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) * 0.8f); this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) * 0.8f);
double movementZ = Math.cos(calculateAngle(new Vec3(this.getDeltaMovement().x, 0, this.getDeltaMovement().z), new Vec3(this.getLookAngle().x, 0, this.getLookAngle().z))) * this.getDeltaMovement().horizontalDistance();
this.setXRot((float) Mth.lerp(0.1, this.getXRot(), -4f * movementZ));
if (this.isInWater() || this.isUnderWater()) { if (this.isInWater() || this.isUnderWater()) {
this.setYRot(this.entityData.get(ROT_Y) - this.entityData.get(DELTA_ROT)); this.setYRot(this.entityData.get(ROT_Y) - this.entityData.get(DELTA_ROT));
this.setDeltaMovement(this.getDeltaMovement().add(this.getViewVector(1).scale(this.entityData.get(POWER)))); this.setDeltaMovement(this.getDeltaMovement().add(new Vec3(this.getLookAngle().x, 0, this.getLookAngle().z).scale(this.entityData.get(POWER))));
} }
} }
@ -333,25 +330,25 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
Entity driver = this.getFirstPassenger(); Entity driver = this.getFirstPassenger();
if (driver == null) return; if (driver == null) return;
var boatAngle = this.getLookAngle(); // var boatAngle = this.getLookAngle();
Vec3 rightVec = boatAngle.yRot(90 * Mth.DEG_TO_RAD).normalize(); // Vec3 rightVec = boatAngle.yRot(90 * Mth.DEG_TO_RAD).normalize();
Vec3 driverAngleVec = driver.getLookAngle().normalize(); // Vec3 driverAngleVec = driver.getLookAngle().normalize();
double lookAngle = calculateAngle(driverAngleVec, rightVec); // double lookAngle = calculateAngle(driverAngleVec, rightVec);
double gunAngle; double gunAngle = -Math.clamp(-105f, 105f, Mth.wrapDegrees(driver.getYHeadRot() - this.getYRot()));
if (lookAngle < 90) { // if (lookAngle < 90) {
gunAngle = calculateAngle(driver.getLookAngle(), this.getLookAngle()); // gunAngle = calculateAngle(driver.getLookAngle(), this.getLookAngle());
} else { // } else {
gunAngle = -calculateAngle(driver.getLookAngle(), this.getLookAngle()); // gunAngle = -calculateAngle(driver.getLookAngle(), this.getLookAngle());
} // }
//
// if (gunAngle > 180) {
// gunAngle -= 360;
// } else if (gunAngle < -180) {
// gunAngle += 360;
// }
if (gunAngle > 180) { this.entityData.set(GUN_YAW, (float) Mth.lerp(0.2, this.entityData.get(GUN_YAW), gunAngle));
gunAngle -= 360;
} else if (gunAngle < -180) {
gunAngle += 360;
}
this.entityData.set(GUN_YAW, (float) Mth.lerp(0.1, this.entityData.get(GUN_YAW), gunAngle));
float diffX = driver.getXRot() - this.getXRot(); float diffX = driver.getXRot() - this.getXRot();
this.entityData.set(GUN_PITCH, (float) Mth.lerp(0.1, this.entityData.get(GUN_PITCH), diffX)); this.entityData.set(GUN_PITCH, (float) Mth.lerp(0.1, this.entityData.get(GUN_PITCH), diffX));