From e10d60046b61231af4b5211d6c82845b62a58310 Mon Sep 17 00:00:00 2001 From: Wartich <46074580+Wartich@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:20:37 +0300 Subject: [PATCH 1/2] Missile_lockedonto, second attempt --- .../instances/AEntityVehicleE_Powered.java | 2 + .../instances/EntityVehicleF_Physics.java | 2 + .../entities/instances/PartGun.java | 47 +++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/AEntityVehicleE_Powered.java b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/AEntityVehicleE_Powered.java index 47f734966..30d56d63b 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/AEntityVehicleE_Powered.java +++ b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/AEntityVehicleE_Powered.java @@ -71,6 +71,7 @@ public abstract class AEntityVehicleE_Powered extends AEntityVehicleD_Moving { //Map containing incoming missiles and radar info, sorted by distance. public final List missilesIncoming = new ArrayList<>(); public final List> radarsTracking = new ArrayList<>(); + public final List gunsLockedOn = new ArrayList<>(); public AEntityVehicleE_Powered(AWrapperWorld world, IWrapperPlayer placingPlayer, ItemVehicle item, IWrapperNBT data) { super(world, placingPlayer, item, data); @@ -197,6 +198,7 @@ public void update() { //Check to make sure we are still being tracked. radarsTracking.removeIf(tracker -> !tracker.isValid || (!tracker.aircraftOnRadar.contains(this) && !tracker.groundersOnRadar.contains(this))); + gunsLockedOn.removeIf(gun -> !gun.isValid || (gun.engineTarget != null && gun.engineTarget.vehicleOn != this)); //If we are supposed to de-spawn, do so. if (outOfHealth && ConfigSystem.settings.general.vehicleDeathDespawnTime.value > 0) { diff --git a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/EntityVehicleF_Physics.java b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/EntityVehicleF_Physics.java index cffa54e91..938bfe075 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/EntityVehicleF_Physics.java +++ b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/EntityVehicleF_Physics.java @@ -837,6 +837,8 @@ public ComputedVariable createComputedVariable(String variable, boolean createDe return new ComputedVariable(this, variable, partialTicks -> radarsTracking.isEmpty() ? 0 : 1, false); case ("missile_incoming"): return new ComputedVariable(this, variable, partialTicks -> missilesIncoming.isEmpty() ? 0 : 1, false); + case ("missile_lockedonto"): + return new ComputedVariable(this, variable, partialTicks -> gunsLockedOn.isEmpty() ? 0 : 1, false); default: { //Missile incoming variables. //Variable is in the form of missile_X_variablename. diff --git a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/PartGun.java b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/PartGun.java index 7fc6931c0..9063a4a13 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/PartGun.java +++ b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/PartGun.java @@ -149,6 +149,10 @@ public class PartGun extends APart { private final Point3D normalizedConeVector = new Point3D(); private final Point3D normalizedEntityVector = new Point3D(); + //Track previous targets to detect changes for registration + private PartEngine prevEngineTarget = null; + private IWrapperEntity prevEntityTarget = null; + //Global data. private static final int RAYTRACE_DISTANCE = 750; private static final double DEFAULT_CONE_ANGLE = 2.0; @@ -333,6 +337,7 @@ public void update() { currentController = null; entityTarget = null; engineTarget = null; + updateTargetRegistration(); } } } @@ -390,6 +395,7 @@ public void update() { currentController = null; entityTarget = null; engineTarget = null; + updateTargetRegistration(); } } @@ -598,6 +604,7 @@ public void update() { state = GunState.INACTIVE; entityTarget = null; engineTarget = null; + updateTargetRegistration(); if (resetPosition) { handleMovement(defaultYaw - internalOrientation.angles.y, defaultPitch - internalOrientation.angles.x); } @@ -788,6 +795,7 @@ private void handleControl(IWrapperEntity controller) { } } else { entityTarget = null; + updateTargetRegistration(); state = state.demote(GunState.CONTROLLED); } } else { @@ -839,6 +847,7 @@ private void handleControl(IWrapperEntity controller) { //First set targets to null to clear any existing targets. engineTarget = null; entityTarget = null; + updateTargetRegistration(); //If we have a start point, it means we're a cone-based target system and need to find a target. if (startPoint != null) { @@ -900,6 +909,7 @@ private void handleControl(IWrapperEntity controller) { } } } + updateTargetRegistration(); } } @@ -1342,6 +1352,43 @@ public double getLeadAngleY() { return angle; } + /** + * Registers this gun with the target vehicle's gunsLockedOn list. + */ + private void registerWithTargetVehicle() { + // Only register if we're locking onto a vehicle (via engineTarget) + if (engineTarget != null && engineTarget.vehicleOn != null && engineTarget.vehicleOn != vehicleOn) { + AEntityVehicleE_Powered targetVehicle = engineTarget.vehicleOn; + if (!targetVehicle.gunsLockedOn.contains(this)) { + targetVehicle.gunsLockedOn.add(this); + } + } + } + + /** + * Unregisters this gun from the previous target vehicle's gunsLockedOn list. + */ + private void unregisterFromPreviousTargetVehicle() { + // Unregister from previous engine target vehicle + if (prevEngineTarget != null && prevEngineTarget.vehicleOn != null && prevEngineTarget.vehicleOn != vehicleOn) { + prevEngineTarget.vehicleOn.gunsLockedOn.remove(this); + } + } + + /** + * Updates target registration. Call this whenever entityTarget or engineTarget changes. + */ + private void updateTargetRegistration() { + // Check if engine target changed + if (engineTarget != prevEngineTarget) { + unregisterFromPreviousTargetVehicle(); + prevEngineTarget = engineTarget; + registerWithTargetVehicle(); + } + // Note: entityTarget targets are players/mobs, not vehicles, so we don't register for those + prevEntityTarget = entityTarget; + } + @Override public ComputedVariable createComputedVariable(String variable, boolean createDefaultIfNotPresent) { switch (variable) { From ba44970b6d6030ed9177e7048cfd025d9b1390ec Mon Sep 17 00:00:00 2001 From: Wartich <46074580+Wartich@users.noreply.github.com> Date: Tue, 10 Mar 2026 09:47:43 +0300 Subject: [PATCH 2/2] Le changes --- .../entities/instances/AEntityVehicleE_Powered.java | 2 +- .../entities/instances/PartGun.java | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/AEntityVehicleE_Powered.java b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/AEntityVehicleE_Powered.java index 30d56d63b..aafb790cd 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/AEntityVehicleE_Powered.java +++ b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/AEntityVehicleE_Powered.java @@ -198,7 +198,7 @@ public void update() { //Check to make sure we are still being tracked. radarsTracking.removeIf(tracker -> !tracker.isValid || (!tracker.aircraftOnRadar.contains(this) && !tracker.groundersOnRadar.contains(this))); - gunsLockedOn.removeIf(gun -> !gun.isValid || (gun.engineTarget != null && gun.engineTarget.vehicleOn != this)); + gunsLockedOn.removeIf(gun -> !gun.isValid || gun.engineTarget == null || gun.engineTarget.vehicleOn != this); //If we are supposed to de-spawn, do so. if (outOfHealth && ConfigSystem.settings.general.vehicleDeathDespawnTime.value > 0) { diff --git a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/PartGun.java b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/PartGun.java index 9063a4a13..2c56ccc55 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/entities/instances/PartGun.java +++ b/mccore/src/main/java/minecrafttransportsimulator/entities/instances/PartGun.java @@ -1365,23 +1365,12 @@ private void registerWithTargetVehicle() { } } - /** - * Unregisters this gun from the previous target vehicle's gunsLockedOn list. - */ - private void unregisterFromPreviousTargetVehicle() { - // Unregister from previous engine target vehicle - if (prevEngineTarget != null && prevEngineTarget.vehicleOn != null && prevEngineTarget.vehicleOn != vehicleOn) { - prevEngineTarget.vehicleOn.gunsLockedOn.remove(this); - } - } - /** * Updates target registration. Call this whenever entityTarget or engineTarget changes. */ private void updateTargetRegistration() { // Check if engine target changed if (engineTarget != prevEngineTarget) { - unregisterFromPreviousTargetVehicle(); prevEngineTarget = engineTarget; registerWithTargetVehicle(); }