- Add vectored afterburner nozzle block with AzureLib model, deflection, throttle and afterburner state - Drive nozzles from the vehicle control node and map pitch, roll and yaw to differential deflection - Add afterburner toggle key and packet, linked to the control node - Replace Warium exhaust effect entities with improved flames, particles and sounds when exhaustStyle is improved - Add /aero seedgen to measure the air ceiling for the air placeholder - Upgrade Warium VS to 1.1.7 and make the lift use horizontal speed
49 lines
2.2 KiB
Java
49 lines
2.2 KiB
Java
package dev.lumareth.improvedAerodynamics.exhaust;
|
|
|
|
import dev.lumareth.improvedAerodynamics.Config;
|
|
import dev.lumareth.improvedAerodynamics.flight.AutoTrimToggle;
|
|
import net.mcreator.valkyrienwarium.entity.SeatEntityEntity;
|
|
import net.minecraft.nbt.CompoundTag;
|
|
import net.minecraft.network.chat.Component;
|
|
import net.minecraft.server.level.ServerPlayer;
|
|
import net.minecraft.world.entity.Entity;
|
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
|
|
/**
|
|
* Server side of the afterburner key. The switch lives in the control node, like auto trim, so it stays with the
|
|
* craft and every nozzle linked to the node follows it. It only lights with enough throttle and goes out for good
|
|
* once the throttle falls below that, see {@link NozzleBlockEntity}.
|
|
*/
|
|
public final class AfterburnerToggle {
|
|
/** Tag on the control node that holds the switch. */
|
|
public static final String TAG = "improved_aerodynamics_afterburner";
|
|
|
|
private AfterburnerToggle() {
|
|
}
|
|
|
|
public static void toggle(ServerPlayer player) {
|
|
Entity vehicle = player.getVehicle();
|
|
if (!(vehicle instanceof SeatEntityEntity)) {
|
|
player.displayClientMessage(Component.translatable("message.improved_aerodynamics.afterburner.no_seat"), true);
|
|
return;
|
|
}
|
|
BlockEntity node = AutoTrimToggle.findNode(vehicle.level(), vehicle.blockPosition());
|
|
if (node == null) {
|
|
player.displayClientMessage(Component.translatable("message.improved_aerodynamics.afterburner.no_node"), true);
|
|
return;
|
|
}
|
|
|
|
CompoundTag tag = node.getPersistentData();
|
|
double minimum = Config.AFTERBURNER_MIN_THROTTLE.get();
|
|
if (!tag.getBoolean(TAG) && tag.getDouble("Throttle") < minimum) {
|
|
player.displayClientMessage(Component.translatable("message.improved_aerodynamics.afterburner.throttle", (int) Math.ceil(minimum)), true);
|
|
return;
|
|
}
|
|
boolean enabled = !tag.getBoolean(TAG);
|
|
tag.putBoolean(TAG, enabled);
|
|
node.setChanged();
|
|
player.displayClientMessage(Component.translatable(enabled
|
|
? "message.improved_aerodynamics.afterburner.on" : "message.improved_aerodynamics.afterburner.off"), true);
|
|
}
|
|
}
|