diff --git a/src/main/java/com/lukasabbe/simplehud/Constants.java b/src/main/java/com/lukasabbe/simplehud/Constants.java index 5d049ea..2ce34ca 100644 --- a/src/main/java/com/lukasabbe/simplehud/Constants.java +++ b/src/main/java/com/lukasabbe/simplehud/Constants.java @@ -12,6 +12,7 @@ public class Constants { //Hud:s public final static Identifier ElytraHudIdentifier = Identifier.fromNamespaceAndPath(MOD_ID, "elytra_hud"); public final static Identifier BoatHudIdentifier = Identifier.fromNamespaceAndPath(MOD_ID, "boat_hud"); + public final static Identifier MinecartHudIdentifier = Identifier.fromNamespaceAndPath(MOD_ID, "minecart_hud"); - public final static List HudIdentifiers = Arrays.asList(ElytraHudIdentifier, BoatHudIdentifier); + public final static List HudIdentifiers = Arrays.asList(ElytraHudIdentifier, BoatHudIdentifier, MinecartHudIdentifier); } diff --git a/src/main/java/com/lukasabbe/simplehud/SimpleHudMod.java b/src/main/java/com/lukasabbe/simplehud/SimpleHudMod.java index ec3fb97..814028e 100644 --- a/src/main/java/com/lukasabbe/simplehud/SimpleHudMod.java +++ b/src/main/java/com/lukasabbe/simplehud/SimpleHudMod.java @@ -3,11 +3,14 @@ package com.lukasabbe.simplehud; import com.lukasabbe.simplehud.config.Config; import com.lukasabbe.simplehud.huds.BoatHud; import com.lukasabbe.simplehud.huds.ElytraHud; +import com.lukasabbe.simplehud.huds.MinecartHud; import com.lukasabbe.simplehud.huds.SimpleHud; import com.lukasabbe.simplehud.tools.ElytraTools; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.gui.GuiGraphics; import java.util.Arrays; import java.util.List; @@ -16,14 +19,31 @@ public class SimpleHudMod implements ClientModInitializer { public static List HUD_LIST = Arrays.asList( new ElytraHud(), - new BoatHud() + new BoatHud(), + new MinecartHud() ); @Override public void onInitializeClient() { Config.HANDLER.load(); Config.HANDLER.load(); - HUD_LIST.forEach(simpleHud -> HudElementRegistry.addFirst(simpleHud.getIdentifier(), simpleHud::render)); + HUD_LIST.forEach(simpleHud -> HudElementRegistry.addFirst( + simpleHud.getIdentifier(), + (guiGraphics, deltaTracker) -> renderScaled(guiGraphics, deltaTracker, simpleHud)) + ); ClientTickEvents.END_CLIENT_TICK.register(client -> ElytraTools.tickElytraTools()); } + + public static void renderScaled(GuiGraphics graphics, DeltaTracker tracker, SimpleHud simpleHud){ + var stack = graphics.pose(); + final float scale = (float) Config.HANDLER.instance().hudScale / 10; + int width = graphics.guiWidth(); + int height = graphics.guiHeight(); + stack.pushMatrix(); + stack.translate(width / 2f, height / 2f); + stack.scale(scale, scale); + stack.translate(-width / 2f, -height / 2f); + simpleHud.render(graphics, tracker); + stack.popMatrix(); + } } diff --git a/src/main/java/com/lukasabbe/simplehud/config/Config.java b/src/main/java/com/lukasabbe/simplehud/config/Config.java index 10095c3..a6beaee 100644 --- a/src/main/java/com/lukasabbe/simplehud/config/Config.java +++ b/src/main/java/com/lukasabbe/simplehud/config/Config.java @@ -19,20 +19,33 @@ public class Config { .build()) .build(); + //Global + @SerialEntry public Map HudActivatedList = getActiveHuds(); @SerialEntry - public HudPosition hudPositionElytra = HudPosition.CENTER; + public boolean ignoreSafeArea = false; + @SerialEntry + public int hudScale = 10; + + //Hud positions + @SerialEntry + public HudPosition hudPositionElytra = HudPosition.CENTER; + @SerialEntry + public HudPosition hudPositionBoat = HudPosition.CENTER; + @SerialEntry + public HudPosition hudPositionMinecart = HudPosition.CENTER; + + + //Hud speed unit @SerialEntry public SpeedEnum speedEnumElytra = SpeedEnum.kmh; - @SerialEntry public SpeedEnum speedEnumBoat = SpeedEnum.kmh; - @SerialEntry - public boolean ignoreSafeArea = false; + public SpeedEnum speedEnumMinecart = SpeedEnum.kmh; private Map getActiveHuds() { Map activatedHuds = new IdentityHashMap<>(); diff --git a/src/main/java/com/lukasabbe/simplehud/config/ModMenu.java b/src/main/java/com/lukasabbe/simplehud/config/ModMenu.java index 9928f7b..8ca2a1a 100644 --- a/src/main/java/com/lukasabbe/simplehud/config/ModMenu.java +++ b/src/main/java/com/lukasabbe/simplehud/config/ModMenu.java @@ -3,9 +3,10 @@ package com.lukasabbe.simplehud.config; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; import dev.isxander.yacl3.api.*; +import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder; import dev.isxander.yacl3.api.controller.TickBoxControllerBuilder; -import dev.isxander.yacl3.gui.controllers.TickBoxController; import dev.isxander.yacl3.gui.controllers.cycling.EnumController; +import dev.isxander.yacl3.gui.controllers.slider.IntegerSliderController; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; @@ -26,6 +27,12 @@ public class ModMenu implements ModMenuApi { .name(Component.translatable("simple_hud.config.category.general.name")) .tooltip(Component.translatable("simple_hud.config.category.general.tooltip")) .group(toggleOptions()) + .option(Option.createBuilder() + .name(Component.translatable("simple_hud.config.category.general.option.scale.name")) + .description(OptionDescription.of(Component.translatable("simple_hud.config.category.general.option.scale.description"))) + .binding(10, () -> instance.hudScale, newVal -> instance.hudScale = newVal) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0,20).step(1)) + .build()) .build() ) .category(ConfigCategory diff --git a/src/main/java/com/lukasabbe/simplehud/huds/BoatHud.java b/src/main/java/com/lukasabbe/simplehud/huds/BoatHud.java index a52c99c..6a7dd78 100644 --- a/src/main/java/com/lukasabbe/simplehud/huds/BoatHud.java +++ b/src/main/java/com/lukasabbe/simplehud/huds/BoatHud.java @@ -2,31 +2,21 @@ package com.lukasabbe.simplehud.huds; import com.lukasabbe.simplehud.Constants; import com.lukasabbe.simplehud.config.Config; -import com.lukasabbe.simplehud.tools.BoatTools; +import com.lukasabbe.simplehud.tools.EntityTools; import net.minecraft.client.DeltaTracker; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; +import net.minecraft.world.entity.vehicle.boat.Boat; public class BoatHud implements SimpleHud { - Identifier compass = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/compass.png"); - Identifier compass_pointer = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/compass_pointer.png"); - Identifier left_green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/left_green_arrow.png"); - Identifier right_red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/right_red_arrow.png"); - Identifier left_off_green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_left_green_arrow.png"); - Identifier right_off_red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_left_red_arrow.png"); - Identifier green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/green_arrow.png"); - Identifier red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/red_arrow.png"); - Identifier off_green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_green_arrow.png"); - Identifier off_red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_red_arrow.png"); - @Override public void render(GuiGraphics graphics, DeltaTracker tracker) { if(!isHudActivated()) return; if(client.noRender) return; - if(!BoatTools.isRidingBoat()) return; + if(!EntityTools.isRidingEntity(Boat.class)) return; if(client.player == null) return; int[] pos = getCornerPos(); @@ -41,7 +31,7 @@ public class BoatHud implements SimpleHud { //Draw boat angle int pitchTextY = 5; - double angle = BoatTools.getAngle(); + double angle = EntityTools.getAngle(); renderCenteredScaledText(graphics, String.format("%3.0f °", angle), x + textX, y + pitchTextY, whiteColor, textScale); //Draw speed @@ -195,7 +185,7 @@ public class BoatHud implements SimpleHud { compassWidth, compassHeight ); - double radians = BoatTools.getRadians(tracker.getGameTimeDeltaPartialTick(true)); + double radians = EntityTools.getRadians(tracker.getGameTimeDeltaPartialTick(true)); double radius = 5; float centerX = compassX + 14; diff --git a/src/main/java/com/lukasabbe/simplehud/huds/ElytraHud.java b/src/main/java/com/lukasabbe/simplehud/huds/ElytraHud.java index df557de..59f173f 100644 --- a/src/main/java/com/lukasabbe/simplehud/huds/ElytraHud.java +++ b/src/main/java/com/lukasabbe/simplehud/huds/ElytraHud.java @@ -13,13 +13,6 @@ import net.minecraft.world.item.Items; public class ElytraHud implements SimpleHud { - Identifier compass = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/compass.png"); - Identifier compass_pointer = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/compass_pointer.png"); - Identifier green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/green_arrow.png"); - Identifier red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/red_arrow.png"); - Identifier off_green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_green_arrow.png"); - Identifier off_red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_red_arrow.png"); - @Override public void render(GuiGraphics graphics, DeltaTracker tracker) { if(!isHudActivated()) return; diff --git a/src/main/java/com/lukasabbe/simplehud/huds/HappyGhastHud.java b/src/main/java/com/lukasabbe/simplehud/huds/HappyGhastHud.java new file mode 100644 index 0000000..053e2d7 --- /dev/null +++ b/src/main/java/com/lukasabbe/simplehud/huds/HappyGhastHud.java @@ -0,0 +1,10 @@ +package com.lukasabbe.simplehud.huds; + +import net.minecraft.resources.Identifier; + +public class HappyGhastHud extends RideableHud{ + @Override + public Identifier getIdentifier() { + return null; + } +} diff --git a/src/main/java/com/lukasabbe/simplehud/huds/HorseHud.java b/src/main/java/com/lukasabbe/simplehud/huds/HorseHud.java new file mode 100644 index 0000000..ffe296c --- /dev/null +++ b/src/main/java/com/lukasabbe/simplehud/huds/HorseHud.java @@ -0,0 +1,10 @@ +package com.lukasabbe.simplehud.huds; + +import net.minecraft.resources.Identifier; + +public class HorseHud extends RideableHud { + @Override + public Identifier getIdentifier() { + return null; + } +} diff --git a/src/main/java/com/lukasabbe/simplehud/huds/MinecartHud.java b/src/main/java/com/lukasabbe/simplehud/huds/MinecartHud.java new file mode 100644 index 0000000..e77ae3e --- /dev/null +++ b/src/main/java/com/lukasabbe/simplehud/huds/MinecartHud.java @@ -0,0 +1,137 @@ +package com.lukasabbe.simplehud.huds; + +import com.lukasabbe.simplehud.Constants; +import com.lukasabbe.simplehud.config.Config; +import com.lukasabbe.simplehud.tools.EntityTools; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.resources.Identifier; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.vehicle.minecart.Minecart; + +public class MinecartHud implements SimpleHud { + @Override + public void render(GuiGraphics graphics, DeltaTracker tracker) { + if(!isHudActivated()) return; + if(client.noRender) return; + if(!EntityTools.isRidingEntity(Minecart.class)) return; + if(client.player == null) return; + + int[] pos = getCornerPos(); + int x = pos[0]; + int y = pos[1]; + + renderBackPlate(graphics); + + int textX = 5; + float textScale = 0.6f; + int whiteColor = 0xFFFFFFFF; + + //Draw speed + int speedTextY = 10; + renderCenteredScaledText(graphics, getSpeed(Config.HANDLER.instance().speedEnumBoat), x + textX, y + speedTextY, whiteColor, textScale); + + //Draw coordinates + int coordinatesTextY = 20; + int maxAvailableWidth = 40; + String coordinatesText = String.format("%.0f:%.0f:%.0f", client.player.getX(), client.player.getY(), client.player.getZ()); + int textWidth = client.font.width(coordinatesText); + float maxScale = (float) maxAvailableWidth / textWidth; + float finalScale = Math.min(textScale, maxScale); + renderCenteredScaledText(graphics, coordinatesText, x + textX, y + coordinatesTextY, whiteColor, finalScale); + + int textureCornerX = 0; + int textureCornerY = 0; + + int arrowWidth = 6; + int arrowHeight = 8; + + int greenAndRedArrowX = x + 46; + int greenArrowY = y + 8; + int redArrowY = y + 18; + + if(client.options.keyUp.isDown()){ + graphics.blit( + RenderPipelines.GUI_TEXTURED, + green_arrow, + greenAndRedArrowX, greenArrowY, + textureCornerX, textureCornerY, + arrowWidth, arrowHeight, + arrowWidth, arrowHeight + ); + graphics.blit( + RenderPipelines.GUI_TEXTURED, + off_red_arrow, + greenAndRedArrowX, redArrowY, + textureCornerX, textureCornerY, + arrowWidth, arrowHeight, + arrowWidth, arrowHeight + ); + } else if(client.options.keyDown.isDown()) { + graphics.blit( + RenderPipelines.GUI_TEXTURED, + off_green_arrow, + greenAndRedArrowX, greenArrowY, + textureCornerX, textureCornerY, + arrowWidth, arrowHeight, + arrowWidth, arrowHeight + ); + graphics.blit( + RenderPipelines.GUI_TEXTURED, + red_arrow, + greenAndRedArrowX, redArrowY, + textureCornerX, textureCornerY, + arrowWidth, arrowHeight, + arrowWidth, arrowHeight + ); + } else { + graphics.blit( + RenderPipelines.GUI_TEXTURED, + off_green_arrow, + greenAndRedArrowX, greenArrowY, + textureCornerX, textureCornerY, + arrowWidth, arrowHeight, + arrowWidth, arrowHeight + ); + graphics.blit( + RenderPipelines.GUI_TEXTURED, + off_red_arrow, + greenAndRedArrowX, redArrowY, + textureCornerX, textureCornerY, + arrowWidth, arrowHeight, + arrowWidth, arrowHeight + ); + } + + //Compas background + + int compassWidth = 29; + int compassHeight = 29; + int compassX = x + 67; + int compassY = y + 3; + graphics.blit( + RenderPipelines.GUI_TEXTURED, + compass, + compassX, compassY, + textureCornerX, textureCornerY, + compassWidth, compassHeight, + compassWidth, compassHeight + ); + + double radians = EntityTools.getRadians(tracker.getGameTimeDeltaPartialTick(true)); + + double radius = 5; + float centerX = compassX + 14; + float centerY = compassY + 14; + float endX = Math.round(centerX + (radius * -Mth.sin(radians))); + float endY = Math.round(centerY + (radius * Mth.cos(radians))); + + drawLine(graphics, centerX, centerY, endX, endY, (int) radius, compass_pointer); + } + + @Override + public Identifier getIdentifier() { + return Constants.MinecartHudIdentifier; + } +} diff --git a/src/main/java/com/lukasabbe/simplehud/huds/NautilusHud.java b/src/main/java/com/lukasabbe/simplehud/huds/NautilusHud.java new file mode 100644 index 0000000..9515f92 --- /dev/null +++ b/src/main/java/com/lukasabbe/simplehud/huds/NautilusHud.java @@ -0,0 +1,10 @@ +package com.lukasabbe.simplehud.huds; + +import net.minecraft.resources.Identifier; + +public class NautilusHud extends RideableHud { + @Override + public Identifier getIdentifier() { + return null; + } +} diff --git a/src/main/java/com/lukasabbe/simplehud/huds/RideableHud.java b/src/main/java/com/lukasabbe/simplehud/huds/RideableHud.java new file mode 100644 index 0000000..1a29e8e --- /dev/null +++ b/src/main/java/com/lukasabbe/simplehud/huds/RideableHud.java @@ -0,0 +1,11 @@ +package com.lukasabbe.simplehud.huds; + +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.gui.GuiGraphics; + +public abstract class RideableHud implements SimpleHud { + @Override + public void render(GuiGraphics graphics, DeltaTracker tracker) { + + } +} diff --git a/src/main/java/com/lukasabbe/simplehud/huds/SimpleHud.java b/src/main/java/com/lukasabbe/simplehud/huds/SimpleHud.java index 792f7ed..60cc5c5 100644 --- a/src/main/java/com/lukasabbe/simplehud/huds/SimpleHud.java +++ b/src/main/java/com/lukasabbe/simplehud/huds/SimpleHud.java @@ -17,6 +17,16 @@ import net.minecraft.world.item.Item; public interface SimpleHud { Minecraft client = Minecraft.getInstance(); Identifier backPlateAsset = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/backplate.png"); + Identifier compass = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/compass.png"); + Identifier compass_pointer = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/compass_pointer.png"); + Identifier left_green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/left_green_arrow.png"); + Identifier right_red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/right_red_arrow.png"); + Identifier left_off_green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_left_green_arrow.png"); + Identifier right_off_red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_left_red_arrow.png"); + Identifier green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/green_arrow.png"); + Identifier red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/red_arrow.png"); + Identifier off_green_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_green_arrow.png"); + Identifier off_red_arrow = Identifier.fromNamespaceAndPath(Constants.MOD_ID, "textures/off_red_arrow.png"); void render(GuiGraphics graphics, DeltaTracker tracker); diff --git a/src/main/java/com/lukasabbe/simplehud/huds/StriderHud.java b/src/main/java/com/lukasabbe/simplehud/huds/StriderHud.java new file mode 100644 index 0000000..611af35 --- /dev/null +++ b/src/main/java/com/lukasabbe/simplehud/huds/StriderHud.java @@ -0,0 +1,10 @@ +package com.lukasabbe.simplehud.huds; + +import net.minecraft.resources.Identifier; + +public class StriderHud extends RideableHud{ + @Override + public Identifier getIdentifier() { + return null; + } +} diff --git a/src/main/java/com/lukasabbe/simplehud/tools/BoatTools.java b/src/main/java/com/lukasabbe/simplehud/tools/EntityTools.java similarity index 75% rename from src/main/java/com/lukasabbe/simplehud/tools/BoatTools.java rename to src/main/java/com/lukasabbe/simplehud/tools/EntityTools.java index dbce0f3..1b4480a 100644 --- a/src/main/java/com/lukasabbe/simplehud/tools/BoatTools.java +++ b/src/main/java/com/lukasabbe/simplehud/tools/EntityTools.java @@ -5,8 +5,13 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.util.Mth; import org.jspecify.annotations.Nullable; -public class BoatTools { - public static boolean isRidingBoat(){ +public class EntityTools { + public static boolean isRidingEntity(Class entityType){ + var player = getLocalPlayer(); + if(player == null) return false; + return getLocalPlayer().getVehicle() != null && entityType.isInstance(getLocalPlayer().getVehicle()); + } + public static boolean isRidingEntity(){ var player = getLocalPlayer(); if(player == null) return false; return getLocalPlayer().getVehicle() != null; @@ -15,7 +20,7 @@ public class BoatTools { public static double getAngle(){ var player = getLocalPlayer(); if(player == null) return 0; - if(!isRidingBoat()) return 0; + if(!isRidingEntity()) return 0; var vehicle = player.getVehicle(); var velocity = vehicle.getDeltaMovement().multiply(1, 0, 1); @@ -30,7 +35,7 @@ public class BoatTools { public static double getRadians(float partialTick){ var player = getLocalPlayer(); if(player == null) return 0; - if(!isRidingBoat()) return 0; + if(!isRidingEntity()) return 0; float rawYaw = Mth.lerp(partialTick, player.getVehicle().yRotO, player.getVehicle().getYRot()); float normalizedYaw = (rawYaw % 360); diff --git a/src/main/resources/assets/simplehud/lang/en_us.json b/src/main/resources/assets/simplehud/lang/en_us.json index c606048..c71cdfb 100644 --- a/src/main/resources/assets/simplehud/lang/en_us.json +++ b/src/main/resources/assets/simplehud/lang/en_us.json @@ -5,7 +5,7 @@ "simple_hud.config.category.general.group.activated_huds.name": "Toggle HUD:s", "simple_hud.config.category.general.group.activated_huds.description": "Toggle menu for all transport HUD:s", "simple_hud.config.category.general.group.activated_huds.option.elytra_hud.name": "Elytra HUD", - "simple_hud.config.category.general.group.activated_huds.option.elytra_hud.description": "Elytra Hud toggle, if you don't want to see the an HUD when you fly.", + "simple_hud.config.category.general.group.activated_huds.option.elytra_hud.description": "Elytra Hud toggle", "simple_hud.config.category.elytra_options.name": "Elytra HUD options", "simple_hud.config.category.elytra_options.option.speed_enum.name": "Speed unit", "simple_hud.config.category.elytra_options.option.speed_enum.description": "You can change the speed unit to what you are used to", @@ -14,5 +14,9 @@ "simple_hud.config.speed_enum.ms": "m/s", "simple_hud.config.category.boat_hud.name": "Boat HUD options", "simple_hud.config.category.general.group.activated_huds.option.boat_hud.name": "Boat HUD", - "simple_hud.config.category.general.group.activated_huds.option.boat_hud.description": "Boat Hud toggle, if you don't want to see the an HUD when you boat around." + "simple_hud.config.category.general.group.activated_huds.option.boat_hud.description": "Boat Hud toggle", + "simple_hud.config.category.general.option.scale.description": "Change the scale of the HUD", + "simple_hud.config.category.general.option.scale.name": "Scale", + "simple_hud.config.category.general.group.activated_huds.option.minecart_hud.name": "Minecart HUD", + "simple_hud.config.category.general.group.activated_huds.option.minecart_hud.description": "Minecart Hud toggle" } \ No newline at end of file