diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/MelonBombEntityRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/MelonBombEntityRenderer.java new file mode 100644 index 000000000..dd9d94465 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/MelonBombEntityRenderer.java @@ -0,0 +1,41 @@ +package com.atsuishio.superbwarfare.client.renderer.entity; + +import com.atsuishio.superbwarfare.entity.projectile.MelonBombEntity; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.TntMinecartRenderer; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; + +public class MelonBombEntityRenderer extends EntityRenderer { + + private final BlockRenderDispatcher blockRenderer; + + public MelonBombEntityRenderer(EntityRendererProvider.Context context) { + super(context); + this.shadowRadius = 0.2f; + this.blockRenderer = context.getBlockRenderDispatcher(); + } + + @Override + public void render(MelonBombEntity entity, float entityYaw, float partialTicks, PoseStack matrixStack, MultiBufferSource buffer, int packedLight) { + matrixStack.pushPose(); + matrixStack.translate(0.0, 0.5, 0.0); + matrixStack.mulPose(Axis.YP.rotationDegrees(-90.0f)); + matrixStack.translate(-0.5, -0.5, 0.5); + matrixStack.mulPose(Axis.YP.rotationDegrees(90.0f)); + TntMinecartRenderer.renderWhiteSolidBlock(this.blockRenderer, Blocks.MELON.defaultBlockState(), matrixStack, buffer, packedLight, false); + matrixStack.popPose(); + super.render(entity, entityYaw, partialTicks, matrixStack, buffer, packedLight); + } + + @Override + public ResourceLocation getTextureLocation(MelonBombEntity entity) { + return TextureAtlas.LOCATION_BLOCKS; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Tom6Renderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Tom6Renderer.java index 65a4c03f1..93d110fbf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Tom6Renderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Tom6Renderer.java @@ -11,8 +11,11 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; +import static com.atsuishio.superbwarfare.entity.vehicle.Tom6Entity.MELON; + public class Tom6Renderer extends GeoEntityRenderer { public Tom6Renderer(EntityRendererProvider.Context renderManager) { @@ -43,4 +46,13 @@ public class Tom6Renderer extends GeoEntityRenderer { super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); poseStack.popPose(); } + + @Override + public void renderRecursively(PoseStack poseStack, Tom6Entity animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + String name = bone.getName(); + if (name.equals("melon")) { + bone.setHidden(!animatable.getEntityData().get(MELON)); + } + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/MelonBombEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/MelonBombEntity.java new file mode 100644 index 000000000..af1d9dd15 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/MelonBombEntity.java @@ -0,0 +1,81 @@ +package com.atsuishio.superbwarfare.entity.projectile; + +import com.atsuishio.superbwarfare.init.ModEntities; +import com.atsuishio.superbwarfare.tools.ProjectileTool; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.network.PlayMessages; + +public class MelonBombEntity extends ThrowableItemProjectile { + public MelonBombEntity(EntityType type, Level world) { + super(type, world); + this.noCulling = true; + } + + public MelonBombEntity(LivingEntity entity, Level level) { + super(ModEntities.MELON_BOMB.get(), entity, level); + } + + public MelonBombEntity(PlayMessages.SpawnEntity spawnEntity, Level level) { + this(ModEntities.MELON_BOMB.get(), level); + } + + @Override + public Packet getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected Item getDefaultItem() { + return Items.MELON; + } + + @Override + public boolean shouldRenderAtSqrDistance(double pDistance) { + return true; + } + + @Override + protected void onHit(HitResult result) { + switch (result.getType()) { + case BLOCK: + ProjectileTool.causeCustomExplode(this, 1200, 24, 1.5f); + break; + case ENTITY: + if (tickCount < 2) return; + ProjectileTool.causeCustomExplode(this, 1200, 24, 1.5f); + break; + default: + break; + } + } + + @Override + public void tick() { + super.tick(); + if (tickCount > 600) { + this.discard(); + if (!this.level().isClientSide) { + ProjectileTool.causeCustomExplode(this, 1200, 24, 1.2f); + } + } + +// if (!this.level().isClientSide() && this.level() instanceof ServerLevel serverLevel) { +// ParticleTool.sendParticle(serverLevel, ParticleTypes.SMOKE, this.xo, this.yo, this.zo, +// 1, 0, 0, 0, 0.01, true); +// } + } + + @Override + protected float getGravity() { + return 0.06F; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java index 6f5349736..33f935530 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -152,9 +152,10 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli @Override public void baseTick() { propellerRotO = this.getPropellerRot(); - setZRot(roll * 0.9f); super.baseTick(); + setZRot(getRoll() * 0.995f); + if (heat > 0) { heat--; } @@ -277,7 +278,7 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli this.setYRot(this.getYRot() + Mth.clamp((this.onGround() ? 0.1f : 2f) * diffY * this.entityData.get(PROPELLER_ROT) - 0.5f * this.entityData.get(DELTA_ROT), -8f, 8f)); this.setXRot(Mth.clamp(this.getXRot() + ((this.onGround()) ? 0 : 1.4f) * diffX * this.entityData.get(PROPELLER_ROT), -80, 80)); - this.setZRot(Mth.clamp(this.getRoll() - this.entityData.get(DELTA_ROT) + (this.onGround() ? 0 : 0.2f) * diffY * this.entityData.get(PROPELLER_ROT), -80, 80)); + this.setZRot(this.getRoll() - this.entityData.get(DELTA_ROT) + (this.onGround() ? 0 : 0.2f) * diffY * this.entityData.get(PROPELLER_ROT)); } if (this.level() instanceof ServerLevel) { diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java index 74a53e020..3232c51b7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.entity.vehicle; import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; +import com.atsuishio.superbwarfare.entity.projectile.MelonBombEntity; import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModEntities; import com.atsuishio.superbwarfare.init.ModSounds; @@ -15,12 +16,16 @@ import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraftforge.network.NetworkHooks; @@ -36,6 +41,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { public static final EntityDataAccessor DELTA_ROT = SynchedEntityData.defineId(Tom6Entity.class, EntityDataSerializers.FLOAT); + public static final EntityDataAccessor MELON = SynchedEntityData.defineId(Tom6Entity.class, EntityDataSerializers.BOOLEAN); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public static final float MAX_HEALTH = 50; public static final int MAX_ENERGY = 100000; @@ -53,16 +59,19 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DELTA_ROT, 0f); + this.entityData.define(MELON, false); } @Override public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); + compound.putBoolean("Melon", this.entityData.get(MELON)); } @Override public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); + this.entityData.set(MELON, compound.getBoolean("Melon")); } @Override @@ -78,19 +87,25 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { return true; } + @Override + public InteractionResult interact(Player player, InteractionHand hand) { + if (player.getMainHandItem().is(Items.MELON) && !entityData.get(MELON)) { + entityData.set(MELON, true); + player.getMainHandItem().shrink(1); + player.level().playSound(player, this.getOnPos(), SoundEvents.WOOD_PLACE, SoundSource.PLAYERS, 1, 1); + return InteractionResult.SUCCESS; + } + return super.interact(player, hand); + } + @Override public void baseTick() { - setZRot(roll * (onGround() ? 0.9f : 0.995f)); super.baseTick(); float f; - if (this.onGround()) { - f = (float) Mth.clamp(0.403f + 0.34f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99); - } else { - f = (float) Mth.clamp(0.683f + 0.06f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99); - } + f = (float) Mth.clamp(0.759f + 0.041f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99); - this.setDeltaMovement(this.getDeltaMovement().add(this.getViewVector(1).scale((0.33) * this.getDeltaMovement().length()))); + this.setDeltaMovement(this.getDeltaMovement().add(this.getViewVector(1).scale((0.24) * this.getDeltaMovement().length()))); this.setDeltaMovement(this.getDeltaMovement().multiply(f, f, f)); this.refreshDimensions(); } @@ -112,32 +127,63 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { this.setZRot(this.roll * 0.8f); this.setXRot(this.getXRot() * 0.7f); this.entityData.set(POWER, this.entityData.get(POWER) * 0.98f); - } else if (passenger instanceof Player) { + if (onGround()) { + this.setDeltaMovement(this.getDeltaMovement().multiply(0.8, 1, 0.8)); + } + } else if (passenger instanceof Player player) { + +// SoundTool.playLocalSound(player, SoundEvents.ELYTRA_FLYING); diffY = Math.clamp(-90f, 90f, Mth.wrapDegrees(passenger.getYHeadRot() - this.getYRot())); diffX = Math.clamp(-60f, 60f, Mth.wrapDegrees(passenger.getXRot() - this.getXRot())); if (!onGround()) { if (rightInputDown) { - this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) - 0.35f); + this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) - 0.4f); } else if (this.leftInputDown) { - this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) + 0.35f); + this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) + 0.4f); } } - this.setYRot(this.getYRot() + Mth.clamp(Math.min((this.onGround() ? 1.5f : 0.8f) * (float) Math.max(getDeltaMovement().length() - 0.06, 0), 0.9f) * diffY - 0.5f * this.entityData.get(DELTA_ROT), -3f, 3f)); - this.setXRot(Mth.clamp(this.getXRot() + Mth.clamp(Math.min(((this.onGround()) ? 0 : 0.3f) * (float) Math.max(getDeltaMovement().length() - 0.02, 0), 0.9f) * diffX, -2f, 2f), onGround() ? -10 : -120, onGround() ? 2 : 120)); - this.setZRot(this.getRoll() - this.entityData.get(DELTA_ROT) + (this.onGround() ? 0 : 0.004f) * diffY * (float) getDeltaMovement().length()); + float roll = Mth.abs(Mth.clamp(getRoll() / 60 , -1.5f , 1.5f)); + + float addY = Mth.clamp(Math.min((this.onGround() ? 1.5f : 0.9f) * (float) Math.max(getDeltaMovement().length() - 0.06, 0.1), 0.9f) * diffY - 0.5f * this.entityData.get(DELTA_ROT), (entityData.get(MELON) ? -2f : -3f) * (roll + 1), (entityData.get(MELON) ? 2f : 3f) * (roll + 1)); + float addX = Mth.clamp(Math.min((float) Math.max(getDeltaMovement().length() - 0.1, 0.01), 0.9f) * diffX, (entityData.get(MELON) ? -3f : -4f), (entityData.get(MELON) ? 3f : 4f)); + + this.setYRot(this.getYRot() + addY); + this.setXRot(Mth.clamp(this.getXRot() + addX, onGround() ? -10 : -120, onGround() ? 2 : 120)); + this.setZRot(this.getRoll() - this.entityData.get(DELTA_ROT) + (this.onGround() ? 0 : 0.01f) * diffY * (float) getDeltaMovement().length()); + + if (upInputDown && !onGround()) { + entityData.set(MELON, false); + + Matrix4f transform = getVehicleTransform(); + Vector4f worldPosition; + worldPosition = transformPosition(transform, 0, -0.2f, 0); + + MelonBombEntity melonBomb = new MelonBombEntity(player, player.level()); + melonBomb.setPos(worldPosition.x, worldPosition.y, worldPosition.z); + passenger.level().addFreshEntity(melonBomb); + + this.level().playSound(null, this.getOnPos(), SoundEvents.IRON_DOOR_OPEN, SoundSource.PLAYERS, 1, 1); + upInputDown = false; + } } if (forwardInputDown) { - this.entityData.set(POWER, Math.min(this.entityData.get(POWER) + 0.002f, 0.12f)); + this.entityData.set(POWER, Math.min(this.entityData.get(POWER) + (entityData.get(MELON) ? 0.003f : 0.0022f), entityData.get(MELON) ? 0.12f : 0.15f)); } - if (backInputDown) { - this.entityData.set(POWER, Math.max(this.entityData.get(POWER) - 0.004f, -0.08f)); + if (backInputDown || downInputDown) { + this.entityData.set(POWER, Math.max(this.entityData.get(POWER) - 0.006f, onGround() ? -0.12f : 0.04f)); } + if (onGround()) { + setXRot(getXRot() * 0.7f); + setZRot(getRoll() * 0.7f); + } else { + setZRot(getRoll() * 0.994f); + } // if (this.forwardInputDown || this.backInputDown) { // this.extraEnergy(VehicleConfig.SPEEDBOAT_ENERGY_COST.get()); @@ -146,11 +192,10 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { this.entityData.set(POWER, this.entityData.get(POWER) * 0.99f); this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) * 0.95f); - this.setDeltaMovement(this.getDeltaMovement().add( - Mth.sin(-this.getYRot() * 0.017453292F) * 0.16f * this.entityData.get(POWER), - Mth.clamp(Math.sin((onGround() ? 45 : -(getXRot() - 30)) * Mth.DEG_TO_RAD) * getDeltaMovement().horizontalDistance() * 0.092f, -0.04, 0.09), - Mth.cos(this.getYRot() * 0.017453292F) * 0.16f * this.entityData.get(POWER) + Mth.sin(-this.getYRot() * 0.017453292F) * (entityData.get(MELON) ? 0.14f : 0.16f) * this.entityData.get(POWER), + Mth.clamp(Math.sin((onGround() ? 45 : -(getXRot() - 30)) * Mth.DEG_TO_RAD) * getDeltaMovement().horizontalDistance() * (entityData.get(MELON) ? 0.047f : 0.067f), -0.04, 0.09), + Mth.cos(this.getYRot() * 0.017453292F) * (entityData.get(MELON) ? 0.14f : 0.16f) * this.entityData.get(POWER) )); } @@ -161,14 +206,14 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { } protected void clampRotation(Entity entity) { - float f = Mth.wrapDegrees(entity.getXRot()); - float f1 = Mth.clamp(f, -90.0F, 90F); + float f = Mth.wrapDegrees(entity.getXRot() - this.getXRot()); + float f1 = Mth.clamp(f, -85.0F, 60F); entity.xRotO += f1 - f; entity.setXRot(entity.getXRot() + f1 - f); entity.setYBodyRot(this.getYRot()); float f2 = Mth.wrapDegrees(entity.getYRot() - this.getYRot()); - float f3 = Mth.clamp(f2, -80.0F, 50.0F); + float f3 = Mth.clamp(f2, -45.0F, 45.0F); entity.yRotO += f3 - f2; entity.setYRot(entity.getYRot() + f3 - f2); entity.setYBodyRot(this.getYRot()); @@ -190,7 +235,7 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { float x = 0f; float y = 0.95f; - float z = -0.2f; + float z = -0.4f; y += (float) passenger.getMyRidingOffset(); int i = this.getPassengers().indexOf(passenger); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java b/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java index 1a0a03c07..fa269d51b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java @@ -77,7 +77,9 @@ public class ModEntities { public static final RegistryObject> LAV_150 = register("lav_150", EntityType.Builder.of(Lav150Entity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(Lav150Entity::new).fireImmune().sized(2.8f, 3.1f)); public static final RegistryObject> TOM_6 = register("tom_6", - EntityType.Builder.of(Tom6Entity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(Tom6Entity::new).fireImmune().sized(1.15f, 1.0f)); + EntityType.Builder.of(Tom6Entity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(Tom6Entity::new).fireImmune().sized(1.05f, 1.0f)); + public static final RegistryObject> MELON_BOMB = register("melon_bomb", + EntityType.Builder.of(MelonBombEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(MelonBombEntity::new).sized(1f, 1f)); private static RegistryObject> register(String name, EntityType.Builder entityTypeBuilder) { return REGISTRY.register(name, () -> entityTypeBuilder.build(name)); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java b/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java index 61c90823d..241a45001 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java @@ -37,5 +37,6 @@ public class ModEntityRenderers { event.registerEntityRenderer(ModEntities.LAV_150.get(), Lav150Renderer::new); event.registerEntityRenderer(ModEntities.SMALL_CANNON_SHELL.get(), SmallCannonShellRenderer::new); event.registerEntityRenderer(ModEntities.TOM_6.get(), Tom6Renderer::new); + event.registerEntityRenderer(ModEntities.MELON_BOMB.get(), MelonBombEntityRenderer::new); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java index a894e7192..c8509dff5 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.config.client.VehicleControlConfig; import com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity; import com.atsuishio.superbwarfare.entity.vehicle.ICannonEntity; import com.atsuishio.superbwarfare.entity.vehicle.Lav150Entity; +import com.atsuishio.superbwarfare.entity.vehicle.Tom6Entity; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModMobEffects; @@ -12,6 +13,7 @@ import com.atsuishio.superbwarfare.tools.GunsTool; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.client.MouseHandler; +import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import org.objectweb.asm.Opcodes; @@ -78,7 +80,11 @@ public class MouseHandlerMixin { if (player == null) return i; if (player.getVehicle() instanceof Ah6Entity ah6Entity && ah6Entity.getFirstPassenger() == player) { - return VehicleControlConfig.INVERT_AIRCRAFT_CONTROL.get() ? -i : i; + return VehicleControlConfig.INVERT_AIRCRAFT_CONTROL.get() ? (Mth.abs(ah6Entity.getRoll()) < 90 ? -i : i) : (Mth.abs(ah6Entity.getRoll()) < 90 ? i : -i); + } + + if (player.getVehicle() instanceof Tom6Entity tom6 && tom6.getFirstPassenger() == player) { + return VehicleControlConfig.INVERT_AIRCRAFT_CONTROL.get() ? (Mth.abs(tom6.getRoll()) < 90 ? -i : i) : (Mth.abs(tom6.getRoll()) < 90 ? i : -i); } return i; }