Переглянути джерело

Add options for vertical flight speed boost in creative/spectator and default/sprinting modes

chylex 4 роки тому
батько
коміт
b511727be9

+ 4 - 0
src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java

@@ -27,6 +27,10 @@ public final class BetterControlsConfig{
 	public float flightSpeedMpCreativeSprinting = 2F;
 	public float flightSpeedMpSpectatorDefault = 1F;
 	public float flightSpeedMpSpectatorSprinting = 2F;
+	public float flightVerticalBoostCreativeDefault = 0F;
+	public float flightVerticalBoostCreativeSprinting = 0F;
+	public float flightVerticalBoostSpectatorDefault = 0F;
+	public float flightVerticalBoostSpectatorSprinting = 0F;
 	
 	public final KeyBindingWithModifier keyToggleWalkForward = new KeyBindingWithModifier("key.bettercontrols.toggle_forward");
 	public final KeyBindingWithModifier keyToggleJump = new KeyBindingWithModifier("key.bettercontrols.toggle_jump");

+ 8 - 0
src/main/java/chylex/bettercontrols/config/ConfigSerializer.java

@@ -48,6 +48,10 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		Json.setFloat(obj, "Flight.SpeedMp.Creative.Sprinting", cfg.flightSpeedMpCreativeSprinting);
 		Json.setFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault);
 		Json.setFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting);
+		Json.setFloat(obj, "Flight.VerticalBoost.Creative.Default", cfg.flightVerticalBoostCreativeDefault);
+		Json.setFloat(obj, "Flight.VerticalBoost.Creative.Sprinting", cfg.flightVerticalBoostCreativeSprinting);
+		Json.setFloat(obj, "Flight.VerticalBoost.Spectator.Default", cfg.flightVerticalBoostSpectatorDefault);
+		Json.setFloat(obj, "Flight.VerticalBoost.Spectator.Sprinting", cfg.flightVerticalBoostSpectatorSprinting);
 		
 		Json.writeKeyBinding(obj, "Misc.KeyToggleWalkForward", cfg.keyToggleWalkForward);
 		Json.writeKeyBinding(obj, "Misc.KeyToggleJump", cfg.keyToggleJump);
@@ -82,6 +86,10 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		cfg.flightSpeedMpCreativeSprinting = MathHelper.clamp(Json.getFloat(obj, "Flight.SpeedMp.Creative.Sprinting", cfg.flightSpeedMpCreativeSprinting), 0.25F, 8F);
 		cfg.flightSpeedMpSpectatorDefault = MathHelper.clamp(Json.getFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault), 0.25F, 8F);
 		cfg.flightSpeedMpSpectatorSprinting = MathHelper.clamp(Json.getFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting), 0.25F, 8F);
+		cfg.flightVerticalBoostCreativeDefault = MathHelper.clamp(Json.getFloat(obj, "Flight.VerticalBoost.Creative.Default", cfg.flightVerticalBoostCreativeDefault), 0F, 3F);
+		cfg.flightVerticalBoostCreativeSprinting = MathHelper.clamp(Json.getFloat(obj, "Flight.VerticalBoost.Creative.Sprinting", cfg.flightVerticalBoostCreativeSprinting), 0F, 3F);
+		cfg.flightVerticalBoostSpectatorDefault = MathHelper.clamp(Json.getFloat(obj, "Flight.VerticalBoost.Spectator.Default", cfg.flightVerticalBoostSpectatorDefault), 0F, 3F);
+		cfg.flightVerticalBoostSpectatorSprinting = MathHelper.clamp(Json.getFloat(obj, "Flight.VerticalBoost.Spectator.Sprinting", cfg.flightVerticalBoostSpectatorSprinting), 0F, 3F);
 		
 		Json.readKeyBinding(obj, "Misc.KeyToggleWalkForward", cfg.keyToggleWalkForward);
 		Json.readKeyBinding(obj, "Misc.KeyToggleJump", cfg.keyToggleJump);

+ 29 - 8
src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java

@@ -105,6 +105,18 @@ public class BetterControlsScreen extends GameOptionsScreen{
 			new Option<>(Float.valueOf(8.00F), Text.of("8x"))
 		);
 		
+		final List<Option<Float>> flightVerticalBoostOptions = Arrays.asList(
+			new Option<>(Float.valueOf(0.00F), Text.of("None")),
+			new Option<>(Float.valueOf(0.25F), Text.of("+25%")),
+			new Option<>(Float.valueOf(0.50F), Text.of("+50%")),
+			new Option<>(Float.valueOf(0.75F), Text.of("+75%")),
+			new Option<>(Float.valueOf(1.00F), Text.of("+100%")),
+			new Option<>(Float.valueOf(1.50F), Text.of("+150%")),
+			new Option<>(Float.valueOf(2.00F), Text.of("+200%")),
+			new Option<>(Float.valueOf(2.50F), Text.of("+250%")),
+			new Option<>(Float.valueOf(3.00F), Text.of("+300%"))
+		);
+		
 		generateKeyBindingWithModifierOption(y, elements, Text.of("Toggle Flight (Creative)"), cfg.keyToggleFlight);
 		
 		y += ROW_HEIGHT;
@@ -124,23 +136,32 @@ public class BetterControlsScreen extends GameOptionsScreen{
 		
 		y += ROW_HEIGHT * 4 / 3;
 		
-		generateLeftSideText(y, elements, Text.of("Speed Multiplier (Creative)"));
-		elements.add(new DiscreteValueSliderWidget<>(col2(1), y, COL2_W, flightSpeedOptions, cfg.flightSpeedMpCreativeDefault, value -> cfg.flightSpeedMpCreativeDefault = value));
+		elements.add(new TextWidget(col4(2), y, COL4_W - TEXT_PADDING_RIGHT, Text.of("Creative"), CENTER));
+		elements.add(new TextWidget(col4(3), y, COL4_W - TEXT_PADDING_RIGHT, Text.of("Spectator"), CENTER));
+		
+		y += ROW_HEIGHT * 7 / 8;
+		
+		generateLeftSideText(y, elements, Text.of("Speed Multiplier (Default)"));
+		elements.add(new DiscreteValueSliderWidget<>(col4(2), y, COL4_W, flightSpeedOptions, cfg.flightSpeedMpCreativeDefault, value -> cfg.flightSpeedMpCreativeDefault = value));
+		elements.add(new DiscreteValueSliderWidget<>(col4(3), y, COL4_W, flightSpeedOptions, cfg.flightSpeedMpSpectatorDefault, value -> cfg.flightSpeedMpSpectatorDefault = value));
 		
 		y += ROW_HEIGHT;
 		
-		generateLeftSideText(y, elements, Text.of("Speed Multiplier (Creative + Sprinting)"));
-		elements.add(new DiscreteValueSliderWidget<>(col2(1), y, COL2_W, flightSpeedOptions, cfg.flightSpeedMpCreativeSprinting, value -> cfg.flightSpeedMpCreativeSprinting = value));
+		generateLeftSideText(y, elements, Text.of("Speed Multiplier (Sprinting)"));
+		elements.add(new DiscreteValueSliderWidget<>(col4(2), y, COL4_W, flightSpeedOptions, cfg.flightSpeedMpCreativeSprinting, value -> cfg.flightSpeedMpCreativeSprinting = value));
+		elements.add(new DiscreteValueSliderWidget<>(col4(3), y, COL4_W, flightSpeedOptions, cfg.flightSpeedMpSpectatorSprinting, value -> cfg.flightSpeedMpSpectatorSprinting = value));
 		
 		y += ROW_HEIGHT;
 		
-		generateLeftSideText(y, elements, Text.of("Speed Multiplier (Spectator)"));
-		elements.add(new DiscreteValueSliderWidget<>(col2(1), y, COL2_W, flightSpeedOptions, cfg.flightSpeedMpSpectatorDefault, value -> cfg.flightSpeedMpSpectatorDefault = value));
+		generateLeftSideText(y, elements, Text.of("Vertical Speed Boost (Default)"));
+		elements.add(new DiscreteValueSliderWidget<>(col4(2), y, COL4_W, flightVerticalBoostOptions, cfg.flightVerticalBoostCreativeDefault, value -> cfg.flightVerticalBoostCreativeDefault = value));
+		elements.add(new DiscreteValueSliderWidget<>(col4(3), y, COL4_W, flightVerticalBoostOptions, cfg.flightVerticalBoostSpectatorDefault, value -> cfg.flightVerticalBoostSpectatorDefault = value));
 		
 		y += ROW_HEIGHT;
 		
-		generateLeftSideText(y, elements, Text.of("Speed Multiplier (Spectator + Sprinting)"));
-		elements.add(new DiscreteValueSliderWidget<>(col2(1), y, COL2_W, flightSpeedOptions, cfg.flightSpeedMpSpectatorSprinting, value -> cfg.flightSpeedMpSpectatorSprinting = value));
+		generateLeftSideText(y, elements, Text.of("Vertical Speed Boost (Sprinting)"));
+		elements.add(new DiscreteValueSliderWidget<>(col4(2), y, COL4_W, flightVerticalBoostOptions, cfg.flightVerticalBoostCreativeSprinting, value -> cfg.flightVerticalBoostCreativeSprinting = value));
+		elements.add(new DiscreteValueSliderWidget<>(col4(3), y, COL4_W, flightVerticalBoostOptions, cfg.flightVerticalBoostSpectatorSprinting, value -> cfg.flightVerticalBoostSpectatorSprinting = value));
 		
 		y += ROW_HEIGHT;
 		return y;

+ 23 - 0
src/main/java/chylex/bettercontrols/player/FlightHelper.java

@@ -8,6 +8,7 @@ final class FlightHelper{
 	
 	private static final float BASE_FLIGHT_SPEED = 0.05F;
 	private static final float BASE_FLIGHT_SPEED_SPRINT_MP_INV = 0.5F; // sprinting doubles speed in PlayerEntity.travel
+	private static final float BASE_VERTICAL_VELOCITY = 3F;
 	
 	private static BetterControlsConfig cfg(){
 		return BetterControlsMod.config;
@@ -42,4 +43,26 @@ final class FlightHelper{
 			return 0F;
 		}
 	}
+	
+	static float getExtraVerticalVelocity(final ClientPlayerEntity player){
+		if (player.isCreative()){
+			if (player.isSprinting()){
+				return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostCreativeSprinting;
+			}
+			else{
+				return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostCreativeDefault;
+			}
+		}
+		else if (player.isSpectator()){
+			if (player.isSprinting()){
+				return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostSpectatorSprinting;
+			}
+			else{
+				return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostSpectatorDefault;
+			}
+		}
+		else{
+			return 0F;
+		}
+	}
 }

+ 25 - 4
src/main/java/chylex/bettercontrols/player/PlayerTicker.java

@@ -13,6 +13,7 @@ import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.input.KeyboardInput;
 import net.minecraft.client.network.ClientPlayerEntity;
 import net.minecraft.client.options.GameOptions;
+import net.minecraft.util.math.MathHelper;
 import java.lang.ref.WeakReference;
 import java.util.function.BooleanSupplier;
 
@@ -157,10 +158,30 @@ public final class PlayerTicker{
 			player.input.jumping |= toggleJump.tick();
 		}
 		
-		final float flightSpeed = FlightHelper.getFlightSpeed(player);
-		
-		if (flightSpeed > 0F){
-			player.abilities.setFlySpeed(flightSpeed);
+		if (FlightHelper.isFlyingCreativeOrSpectator(player)){
+			final float flightSpeed = FlightHelper.getFlightSpeed(player);
+			
+			if (flightSpeed > 0F){
+				player.abilities.setFlySpeed(flightSpeed);
+			}
+			
+			final float verticalVelocity = FlightHelper.getExtraVerticalVelocity(player);
+			
+			if (!MathHelper.approximatelyEquals(verticalVelocity, 0F) && player == mc().getCameraEntity()){
+				int direction = 0;
+				
+				if (player.input.sneaking){
+					--direction;
+				}
+				
+				if (player.input.jumping){
+					++direction;
+				}
+				
+				if (direction != 0){
+					player.setVelocity(player.getVelocity().add(0D, flightSpeed * verticalVelocity * direction, 0D));
+				}
+			}
 		}
 		
 		if (cfg().resumeSprintingAfterHittingObstacle){