From 4a8b7691ee2f8fb84bfde2dfce81d9779c39b878 Mon Sep 17 00:00:00 2001 From: Sakura Date: Mon, 18 May 2026 01:21:22 +0300 Subject: [PATCH 1/2] main code --- .../resources/assets/gtceu/lang/en_ud.json | 2 + .../resources/assets/gtceu/lang/en_us.json | 2 + .../gtceu/client/ClientEventListener.java | 41 ++++++++++--------- .../gtceu/common/CommonEventListener.java | 2 +- .../gtceu/config/ConfigHolder.java | 6 +++ 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 3ddc6bf4d2d..b9d55273755 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1765,6 +1765,8 @@ "config.gtceu.option.batchDuration": "uoıʇɐɹnᗡɥɔʇɐq", "config.gtceu.option.bedrockOreDistance": "ǝɔuɐʇsıᗡǝɹOʞɔoɹpǝq", "config.gtceu.option.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", + "config.gtceu.option.blockFovChange": "ǝbuɐɥƆʌoℲʞɔoןq", + "config.gtceu.option.blockSpeedChange": "ǝbuɐɥƆpǝǝdSʞɔoןq", "config.gtceu.option.borderColor": "ɹoןoƆɹǝpɹoq", "config.gtceu.option.bronzeBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺǝzuoɹq", "config.gtceu.option.bronzeBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺǝzuoɹq", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index ebc94364cf8..8efa3627960 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1765,6 +1765,8 @@ "config.gtceu.option.batchDuration": "batchDuration", "config.gtceu.option.bedrockOreDistance": "bedrockOreDistance", "config.gtceu.option.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", + "config.gtceu.option.blockFovChange": "blockFovChange", + "config.gtceu.option.blockSpeedChange": "blockSpeedChange", "config.gtceu.option.borderColor": "borderColor", "config.gtceu.option.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", "config.gtceu.option.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java index 9390dc563c3..2c94aee1798 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java @@ -15,6 +15,7 @@ import com.gregtechceu.gtceu.common.commands.GTClientCommands; import com.gregtechceu.gtceu.common.data.GTAttributeModifierIds; import com.gregtechceu.gtceu.common.data.GTMobEffects; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.AbstractClientPlayerAccessor; import com.gregtechceu.gtceu.core.mixins.client.PlayerSkinAccessor; import com.gregtechceu.gtceu.data.recipe.CustomTags; @@ -99,23 +100,21 @@ public static void updateFOV(ComputeFovModifierEvent event) { if (speedAttribute == null || !speedAttribute.hasModifier(GTAttributeModifierIds.BLOCK_SPEED_BOOST)) { return; } + boolean flying = player.getAbilities().flying; + float originalFov = flying ? 1.1F : 1.0F; + float walkSpeed = player.getAbilities().getWalkingSpeed(); - float multiplier = 1.0f; - BlockState state = player.level().getBlockState(player.getOnPos()); - - // inverse of the math done with the speed attribute in AbstractClientPlayer - if (state.is(CustomTags.VERY_FAST_WALKABLE_BLOCKS)) { - // base speed is 0.1, boost is 0.1*0.6 -> boosted speed = 0.16 - // the FOV modifier is `1 + (speed / base speed + 1) / 2`, so `1 + (0.16 / 0.1 + 1) / 2 = 1.3` - // thus, divide by 1.3 to get back to original FOV before the 'fast block boost' modifier - multiplier /= 1.3f; - } else if (state.is(CustomTags.FAST_WALKABLE_BLOCKS)) { - // same as above but the speed boost is 0.25 - multiplier /= 1.125f; + originalFov *= ((float) speedAttribute.getBaseValue() / walkSpeed + 1.0F) / 2.0F; + if (walkSpeed == 0.0F || Float.isNaN(originalFov) || + Float.isInfinite(originalFov)) { + return; } - multiplier = (float) Mth.lerp(Minecraft.getInstance().options.fovEffectScale().get(), 1.0, multiplier); - event.setNewFovModifier(event.getNewFovModifier() * multiplier); + float newFov = flying ? 1.1F : 1.0F; + newFov *= ((float) getValueWithoutWalkingBoost(speedAttribute) / walkSpeed + 1.0F) / + 2.0F; + + event.setNewFovModifier(newFov / originalFov); } private static double getValueWithoutWalkingBoost(AttributeInstance attribute) { @@ -123,18 +122,22 @@ private static double getValueWithoutWalkingBoost(AttributeInstance attribute) { Map> modifiers = attribute.getModifiers().stream() .collect(Collectors.groupingBy(AttributeModifier::operation)); - for (AttributeModifier mod : modifiers.get(AttributeModifier.Operation.ADD_VALUE)) { - base += mod.amount(); + if (modifiers.get(AttributeModifier.Operation.ADD_VALUE) != null) { + for (AttributeModifier mod : modifiers.get(AttributeModifier.Operation.ADD_VALUE)) { + base += mod.amount(); + } } double applied = base; for (AttributeModifier mod : modifiers.get(AttributeModifier.Operation.ADD_MULTIPLIED_BASE)) { - if (mod.id() == GTAttributeModifierIds.BLOCK_SPEED_BOOST) continue; + if (mod.id() == GTAttributeModifierIds.BLOCK_SPEED_BOOST || !ConfigHolder.INSTANCE.client.blockFovChange) continue; applied += base * mod.amount(); } - for (AttributeModifier mod : modifiers.get(AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)) { - applied *= 1 + mod.amount(); + if (modifiers.get(AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL) != null) { + for (AttributeModifier mod : modifiers.get(AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)) { + applied *= 1 + mod.amount(); + } } return attribute.getAttribute().value().sanitizeValue(applied); diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/common/CommonEventListener.java index 5f4f7c721b4..3cc6b19ccd1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonEventListener.java @@ -461,7 +461,7 @@ public static void breakSpeed(PlayerEvent.BreakSpeed event) { @SubscribeEvent public static void playerTickEvent(PlayerTickEvent.Pre event) { Player player = event.getEntity(); - if (!player.level().isClientSide) { + if (!player.level().isClientSide && ConfigHolder.INSTANCE.gameplay.blockSpeedChange) { var speedAttrib = player.getAttribute(Attributes.MOVEMENT_SPEED); if (speedAttrib == null) return; var speedMod = speedAttrib.getModifier(GTAttributeModifierIds.BLOCK_SPEED_BOOST); diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 59b5a388942..71679fbecae 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -744,6 +744,9 @@ public static class GameplayConfigs { @Configurable.Comment({ "List of domains that are allowed in the image module" }) public String[] allowedImageDomains = new String[] { "imgur.com", "discord.com", "github.com", "raw.githubusercontent.com" }; + @Configurable + @Configurable.Comment({ "Whether or not speed-modifying blocks should change player's speed." }) + public boolean blockSpeedChange = true; } public static class ClientConfigs { @@ -798,6 +801,9 @@ public static class ClientConfigs { public RendererOptions renderer = new RendererOptions(); @Configurable public TankItemFluidPreview tankItemFluidPreview = new TankItemFluidPreview(); + @Configurable + @Configurable.Comment({ "Whether or not speed-modifying blocks should change player's FOV." }) + public boolean blockFovChange = true; public int getDefaultPaintingColor() { // OR with full alpha to differentiate from a machine that's painted white (map color 0xffffff) From 28191010a1c4bd236047fb3ac7559a7d78d125fa Mon Sep 17 00:00:00 2001 From: Sakura Date: Mon, 18 May 2026 01:22:00 +0300 Subject: [PATCH 2/2] spotless --- .../com/gregtechceu/gtceu/client/ClientEventListener.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java index 2c94aee1798..cc302eeac08 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java @@ -18,7 +18,6 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.AbstractClientPlayerAccessor; import com.gregtechceu.gtceu.core.mixins.client.PlayerSkinAccessor; -import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.integration.map.ClientCacheManager; import net.minecraft.ChatFormatting; @@ -27,7 +26,6 @@ import net.minecraft.client.resources.PlayerSkin; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -35,7 +33,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.neoforged.api.distmarker.Dist; @@ -130,7 +127,8 @@ private static double getValueWithoutWalkingBoost(AttributeInstance attribute) { double applied = base; for (AttributeModifier mod : modifiers.get(AttributeModifier.Operation.ADD_MULTIPLIED_BASE)) { - if (mod.id() == GTAttributeModifierIds.BLOCK_SPEED_BOOST || !ConfigHolder.INSTANCE.client.blockFovChange) continue; + if (mod.id() == GTAttributeModifierIds.BLOCK_SPEED_BOOST || !ConfigHolder.INSTANCE.client.blockFovChange) + continue; applied += base * mod.amount(); }