优化a10和小鸟的瞄准

This commit is contained in:
Atsuishio 2025-06-08 19:31:10 +08:00 committed by Light_Quanta
parent 6633cc7723
commit 74ead3d8b4
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
6 changed files with 63 additions and 54 deletions

View file

@ -93,7 +93,7 @@ public class AircraftOverlay implements LayeredDraw.Layer {
Vec3 pos = cameraPos.add(mobileVehicle.getViewVector(partialTick).scale(192)); Vec3 pos = cameraPos.add(mobileVehicle.getViewVector(partialTick).scale(192));
Vec3 lookAngle = lookVec.normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom)); Vec3 lookAngle = lookVec.normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom));
Vec3 posCross = cameraPos.add(aircraftEntity.shootVec(partialTick).scale(192)); Vec3 posCross = aircraftEntity.shootPos(partialTick).add(aircraftEntity.shootVec(partialTick).scale(192));
Vec3 lookAngle2 = lookVec.normalize().scale(posCross.distanceTo(cameraPos) * (1 - 1.0 / zoom)); Vec3 lookAngle2 = lookVec.normalize().scale(posCross.distanceTo(cameraPos) * (1 - 1.0 / zoom));
var cPos = cameraPos.add(lookAngle); var cPos = cameraPos.add(lookAngle);
@ -221,8 +221,8 @@ public class AircraftOverlay implements LayeredDraw.Layer {
// 准星 // 准星
if (pCross != null) { if (pCross != null) {
poseStack.pushPose(); poseStack.pushPose();
float x = (float) pCross.x + (zoomVehicle ? 8 * (float) (Minecraft.getInstance().options.fov().get() / 70) : 3); float x = (float) pCross.x;
float y = (float) pCross.y + (zoomVehicle ? 25 * (float) (Minecraft.getInstance().options.fov().get() / 70) : 5); float y = (float) pCross.y + (zoomVehicle ? 15 * (float) (Minecraft.getInstance().options.fov().get() / 70) : 5);
if (mc.options.getCameraType() == CameraType.FIRST_PERSON && !(mobileVehicle instanceof A10Entity a10Entity && a10Entity.getWeaponIndex(0) == 3)) { if (mc.options.getCameraType() == CameraType.FIRST_PERSON && !(mobileVehicle instanceof A10Entity a10Entity && a10Entity.getWeaponIndex(0) == 3)) {
RenderSystem.disableDepthTest(); RenderSystem.disableDepthTest();

View file

@ -6,7 +6,6 @@ import com.atsuishio.superbwarfare.client.RenderHelper;
import com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity; import com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity;
import com.atsuishio.superbwarfare.entity.vehicle.base.HelicopterEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.HelicopterEntity;
import com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity;
import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.FormatTool;
@ -32,8 +31,6 @@ import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIn;
import org.joml.Math; import org.joml.Math;
import org.joml.Matrix4f;
import org.joml.Vector4f;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
@ -154,22 +151,17 @@ public class HelicopterHudOverlay implements LayeredDraw.Layer {
} }
Matrix4f transform = getVehicleTransform(mobileVehicle, partialTick);
float x0 = 0f;
float y0 = 0.65f;
float z0 = 0.8f;
Vector4f worldPosition = transformPosition(transform, x0, y0, z0);
float fovAdjust2 = (float) (Minecraft.getInstance().options.fov().get() / 30) - 1; float fovAdjust2 = (float) (Minecraft.getInstance().options.fov().get() / 30) - 1;
double zoom = 0.96 * 3 + 0.06 * fovAdjust2; double zoom = 0.96 * 3 + 0.06 * fovAdjust2;
Vec3 pos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(partialTick).scale(192)); Vec3 lookVec = new Vec3(camera.getLookVector());
Vec3 lookAngle = mobileVehicle.getViewVector(partialTick).normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom)); Vec3 pos = iHelicopterEntity.shootPos(partialTick).add(iHelicopterEntity.shootVec(partialTick).scale(192));
Vec3 lookAngle = lookVec.normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom));
var cPos = cameraPos.add(lookAngle); var cPos = cameraPos.add(lookAngle);
Vec3 p = RenderHelper.worldToScreen(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(partialTick).scale(192)), ClientEventHandler.zoomVehicle ? cPos : cameraPos); Vec3 p = RenderHelper.worldToScreen(iHelicopterEntity.shootPos(partialTick).add(mobileVehicle.getViewVector(partialTick).scale(192)), ClientEventHandler.zoomVehicle ? cPos : cameraPos);
if (p != null) { if (p != null) {
poseStack.pushPose(); poseStack.pushPose();
@ -225,19 +217,6 @@ public class HelicopterHudOverlay implements LayeredDraw.Layer {
preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_driver_angle.png"), k + diffY, l + diffX, 0, 0.0F, i, j, i, j); preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_driver_angle.png"), k + diffY, l + diffX, 0, 0.0F, i, j, i, j);
} }
public static Matrix4f getVehicleTransform(VehicleEntity vehicle, float partialTicks) {
Matrix4f transform = new Matrix4f();
transform.translate((float) Mth.lerp(partialTicks, vehicle.xo, vehicle.getX()), (float) Mth.lerp(partialTicks, vehicle.yo + 1.45, vehicle.getY() + 1.45), (float) Mth.lerp(partialTicks, vehicle.zo, vehicle.getZ()));
transform.rotate(Axis.YP.rotationDegrees(-vehicle.getYRot()));
transform.rotate(Axis.XP.rotationDegrees(vehicle.getXRot()));
transform.rotate(Axis.ZP.rotationDegrees(vehicle.getRoll()));
return transform;
}
public static Vector4f transformPosition(Matrix4f transform, float x, float y, float z) {
return transform.transform(new Vector4f(x, y, z, 1));
}
public static double length(double x, double y, double z) { public static double length(double x, double y, double z) {
return Math.sqrt(x * x + y * y + z * z); return Math.sqrt(x * x + y * y + z * z);
} }

View file

@ -766,7 +766,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
if (getWeaponIndex(0) == 0) { if (getWeaponIndex(0) == 0) {
worldPosition = transformPosition(transform, 0.1321625f, -0.56446875f, 7.85210625f); worldPosition = transformPosition(transform, 0.1321625f, -0.56446875f, 7.85210625f);
} else if (getWeaponIndex(0) == 1) { } else if (getWeaponIndex(0) == 1) {
worldPosition = transformPosition(transform, 0f, -1.76f, 1.87f); worldPosition = transformPosition(transform, 0f, -1.443f, 0.13f);
} else { } else {
worldPosition = transformPosition(transform, 0f, -1.203125f, 0.0625f); worldPosition = transformPosition(transform, 0f, -1.203125f, 0.0625f);
} }
@ -783,7 +783,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
worldPosition2 = transformPosition(transform, 0, 0f, 1); worldPosition2 = transformPosition(transform, 0, 0f, 1);
} else { } else {
worldPosition = transformPosition(transform, 0, 0, 0); worldPosition = transformPosition(transform, 0, 0, 0);
worldPosition2 = transformPosition(transform, 0.007f, -0.03f, 1); worldPosition2 = transformPosition(transform, 0, -0.03f, 1);
} }
return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize(); return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize();
} }
@ -802,7 +802,12 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
boolean hasCreativeAmmo = getFirstPassenger() instanceof Player pPlayer && InventoryTool.hasCreativeAmmoBox(pPlayer); boolean hasCreativeAmmo = getFirstPassenger() instanceof Player pPlayer && InventoryTool.hasCreativeAmmoBox(pPlayer);
Vector4f worldPosition = transformPosition(transform, 0.1321625f, -0.56446875f, 7.85210625f); Vector4f worldPosition = transformPosition(transform, 0.1321625f, -0.56446875f, 7.85210625f);
Vector4f worldPosition2 = transformPosition(transform, 0.1321625f + 0.01f, -0.56446875f - 0.03f, 8.85210625f);
Vec3 shootVec = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize();
if (this.entityData.get(AMMO) > 0 || hasCreativeAmmo) { if (this.entityData.get(AMMO) > 0 || hasCreativeAmmo) {
entityData.set(FIRE_TIME, Math.min(entityData.get(FIRE_TIME) + 6, 6)); entityData.set(FIRE_TIME, Math.min(entityData.get(FIRE_TIME) + 6, 6));
@ -810,7 +815,7 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
var entityToSpawn = ((SmallCannonShellWeapon) getWeapon(0)).create(player); var entityToSpawn = ((SmallCannonShellWeapon) getWeapon(0)).create(player);
entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z); entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z);
entityToSpawn.shoot(shootVec(1).x, shootVec(1).y, shootVec(1).z, 30, 0.5f); entityToSpawn.shoot(shootVec.x, shootVec.y, shootVec.z, 30, 0.5f);
level().addFreshEntity(entityToSpawn); level().addFreshEntity(entityToSpawn);
sendParticle((ServerLevel) this.level(), ParticleTypes.LARGE_SMOKE, worldPosition.x, worldPosition.y, worldPosition.z, 1, 0.2, 0.2, 0.2, 0.001, true); sendParticle((ServerLevel) this.level(), ParticleTypes.LARGE_SMOKE, worldPosition.x, worldPosition.y, worldPosition.z, 1, 0.2, 0.2, 0.2, 0.001, true);
@ -836,23 +841,30 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
var heliRocketEntity = ((HeliRocketWeapon) getWeapon(0)).create(player); var heliRocketEntity = ((HeliRocketWeapon) getWeapon(0)).create(player);
Vector4f worldPosition; Vector4f worldPosition;
Vector4f worldPosition2;
if (fireIndex == 0) { if (fireIndex == 0) {
worldPosition = transformPosition(transform, -3.9321875f, -1.38680625f, 0.12965f); worldPosition = transformPosition(transform, -3.9321875f, -1.38680625f, 0.12965f);
worldPosition2 = transformPosition(transform, -3.9321875f + 0.01f + 0.005f, -1.38680625f - 0.03f, 1.12965f);
fireIndex = 1; fireIndex = 1;
} else if (fireIndex == 1) { } else if (fireIndex == 1) {
worldPosition = transformPosition(transform, -1.56875f, -1.443f, 0.1272f); worldPosition = transformPosition(transform, -1.56875f, -1.443f, 0.1272f);
worldPosition2 = transformPosition(transform, -1.56875f + 0.01f + 0.005f, -1.443f - 0.03f, 1.1272f);
fireIndex = 2; fireIndex = 2;
} else if (fireIndex == 2) { } else if (fireIndex == 2) {
worldPosition = transformPosition(transform, 1.56875f, -1.443f, 0.1272f); worldPosition = transformPosition(transform, 1.56875f, -1.443f, 0.1272f);
worldPosition2 = transformPosition(transform, 1.56875f + 0.01f - 0.002f, -1.443f - 0.03f, 1.1272f);
fireIndex = 3; fireIndex = 3;
} else { } else {
worldPosition = transformPosition(transform, 3.9321875f, -1.38680625f, 0.12965f); worldPosition = transformPosition(transform, 3.9321875f, -1.38680625f, 0.12965f);
worldPosition2 = transformPosition(transform, 3.9321875f + 0.01f - 0.002f, -1.38680625f - 0.03f, 1.12965f);
fireIndex = 0; fireIndex = 0;
} }
Vec3 shootVec = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize();
heliRocketEntity.setPos(worldPosition.x, worldPosition.y, worldPosition.z); heliRocketEntity.setPos(worldPosition.x, worldPosition.y, worldPosition.z);
heliRocketEntity.shoot(shootVec(1).x, shootVec(1).y, shootVec(1).z, 8, 0.5f); heliRocketEntity.shoot(shootVec.x, shootVec.y, shootVec.z, 8, 0.5f);
player.level().addFreshEntity(heliRocketEntity); player.level().addFreshEntity(heliRocketEntity);
BlockPos pos = BlockPos.containing(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z)); BlockPos pos = BlockPos.containing(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z));
@ -906,9 +918,9 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
} else if (this.getEntityData().get(LOADED_MISSILE) == 3) { } else if (this.getEntityData().get(LOADED_MISSILE) == 3) {
worldPosition = transformPosition(transform, -5.28f, -1.76f, 1.87f); worldPosition = transformPosition(transform, -5.28f, -1.76f, 1.87f);
} else if (this.getEntityData().get(LOADED_MISSILE) == 2) { } else if (this.getEntityData().get(LOADED_MISSILE) == 2) {
worldPosition = transformPosition(transform, 6.63f, -0.55f, 1.83f); worldPosition = transformPosition(transform, 6.63f, -1.55f, 1.83f);
} else { } else {
worldPosition = transformPosition(transform, -6.63f, -0.55f, 1.83f); worldPosition = transformPosition(transform, -6.63f, -1.55f, 1.83f);
} }
if (locked) { if (locked) {

View file

@ -507,6 +507,21 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity
return this.cache; return this.cache;
} }
@Override
public Vec3 shootPos(float tickDelta) {
Matrix4f transform = getVehicleTransform(tickDelta);
Vector4f worldPosition = transformPosition(transform, 0f, -0.83f, 0.8f);
return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z);
}
@Override
public Vec3 shootVec(float tickDelta) {
Matrix4f transform = getVehicleTransform(tickDelta);
Vector4f worldPosition = transformPosition(transform, 0, 0, 0);
Vector4f worldPosition2 = transformPosition(transform, 0, 0.01f, 1);
return new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize();
}
@Override @Override
public void vehicleShoot(Player player, int type) { public void vehicleShoot(Player player, int type) {
boolean hasCreativeAmmo = false; boolean hasCreativeAmmo = false;
@ -524,25 +539,26 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity
if (getWeaponIndex(0) == 0) { if (getWeaponIndex(0) == 0) {
if (this.cannotFire) return; if (this.cannotFire) return;
x = 1.15f;
y = 0.62f - 1.45f;
z = 0.8f;
Vector4f worldPosition; Vector4f worldPosition;
Vector4f worldPosition2;
if (fireIndex == 0) { if (fireIndex == 0) {
worldPosition = transformPosition(transform, -x, y, z); worldPosition = transformPosition(transform, 1.15f, -0.83f, 0.8f);
worldPosition2 = transformPosition(transform, 1.15f + 0.009f - 0.002f, -0.83f + 0.012f, 1.8f);
fireIndex = 1; fireIndex = 1;
} else { } else {
worldPosition = transformPosition(transform, x, y, z); worldPosition = transformPosition(transform, -1.15f, -0.83f, 0.8f);
worldPosition2 = transformPosition(transform, -1.15f + 0.009f + 0.002f, -0.83f + 0.012f, 1.8f);
fireIndex = 0; fireIndex = 0;
} }
Vec3 shootVec = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize();
if (this.entityData.get(AMMO) > 0 || hasCreativeAmmo) { if (this.entityData.get(AMMO) > 0 || hasCreativeAmmo) {
var entityToSpawn = ((SmallCannonShellWeapon) getWeapon(0)).create(player); var entityToSpawn = ((SmallCannonShellWeapon) getWeapon(0)).create(player);
entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z); entityToSpawn.setPos(worldPosition.x, worldPosition.y, worldPosition.z);
entityToSpawn.shoot(getLookAngle().x, getLookAngle().y + 0.008, getLookAngle().z, 20, 0.15f); entityToSpawn.shoot(shootVec.x, shootVec.y, shootVec.z, 20, 0.15f);
level().addFreshEntity(entityToSpawn); level().addFreshEntity(entityToSpawn);
sendParticle((ServerLevel) this.level(), ParticleTypes.LARGE_SMOKE, worldPosition.x, worldPosition.y, worldPosition.z, 1, 0, 0, 0, 0, false); sendParticle((ServerLevel) this.level(), ParticleTypes.LARGE_SMOKE, worldPosition.x, worldPosition.y, worldPosition.z, 1, 0, 0, 0, 0, false);
@ -571,24 +587,26 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity
} }
} else if (getWeaponIndex(0) == 1 && this.getEntityData().get(LOADED_ROCKET) > 0) { } else if (getWeaponIndex(0) == 1 && this.getEntityData().get(LOADED_ROCKET) > 0) {
x = 1.7f;
y = 0.62f - 1.45f;
z = 0.8f;
var heliRocketEntity = ((HeliRocketWeapon) getWeapon(0)).create(player); var heliRocketEntity = ((HeliRocketWeapon) getWeapon(0)).create(player);
Vector4f worldPosition; Vector4f worldPosition;
Vector4f worldPosition2;
if (fireIndex == 0) { if (fireIndex == 0) {
worldPosition = transformPosition(transform, -x, y, z); worldPosition = transformPosition(transform, 1.7f, -0.83f, 0.8f);
worldPosition2 = transformPosition(transform, 1.7f + 0.009f - 0.0025f, -0.83f + 0.012f, 1.8f);
fireIndex = 1; fireIndex = 1;
} else { } else {
worldPosition = transformPosition(transform, x, y, z); worldPosition = transformPosition(transform, -1.7f, -0.83f, 0.8f);
worldPosition2 = transformPosition(transform, -1.7f + 0.009f + 0.0025f, -0.83f + 0.012f, 1.8f);
fireIndex = 0; fireIndex = 0;
} }
Vec3 shootVec = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).vectorTo(new Vec3(worldPosition2.x, worldPosition2.y, worldPosition2.z)).normalize();
heliRocketEntity.setPos(worldPosition.x, worldPosition.y, worldPosition.z); heliRocketEntity.setPos(worldPosition.x, worldPosition.y, worldPosition.z);
heliRocketEntity.shoot(this.getLookAngle().x, this.getLookAngle().y + 0.008, this.getLookAngle().z, 7, 0.25f); heliRocketEntity.shoot(shootVec.x, shootVec.y, shootVec.z, 7, 0.25f);
player.level().addFreshEntity(heliRocketEntity); player.level().addFreshEntity(heliRocketEntity);
if (!player.level().isClientSide) { if (!player.level().isClientSide) {

View file

@ -1,5 +1,7 @@
package com.atsuishio.superbwarfare.entity.vehicle.base; package com.atsuishio.superbwarfare.entity.vehicle.base;
import net.minecraft.world.phys.Vec3;
public interface AirEntity extends ArmedVehicleEntity { public interface AirEntity extends ArmedVehicleEntity {
float getRotX(float tickDelta); float getRotX(float tickDelta);
@ -11,4 +13,9 @@ public interface AirEntity extends ArmedVehicleEntity {
float getPower(); float getPower();
int getDecoy(); int getDecoy();
Vec3 shootPos(float tickDelta);
Vec3 shootVec(float tickDelta);
} }

View file

@ -1,12 +1,5 @@
package com.atsuishio.superbwarfare.entity.vehicle.base; package com.atsuishio.superbwarfare.entity.vehicle.base;
import net.minecraft.world.phys.Vec3;
public interface AircraftEntity extends AirEntity { public interface AircraftEntity extends AirEntity {
Vec3 shootPos(float tickDelta);
Vec3 shootVec(float tickDelta);
Float gearRot(float tickDelta); Float gearRot(float tickDelta);
} }