diff --git a/src/main/java/me/juancarloscp52/entropy/EntropySettings.java b/src/main/java/me/juancarloscp52/entropy/EntropySettings.java index 4ec1a271..79efc12d 100644 --- a/src/main/java/me/juancarloscp52/entropy/EntropySettings.java +++ b/src/main/java/me/juancarloscp52/entropy/EntropySettings.java @@ -53,4 +53,5 @@ private VotingMode(String text) { public VotingMode votingMode = VotingMode.PROPORTIONAL; public UIStyle UIstyle = UIStyle.GTAV; public List disabledEvents = new ArrayList<>(); + public boolean accessibilityMode = false; } diff --git a/src/main/java/me/juancarloscp52/entropy/Variables.java b/src/main/java/me/juancarloscp52/entropy/Variables.java index 05872561..4cd00de0 100644 --- a/src/main/java/me/juancarloscp52/entropy/Variables.java +++ b/src/main/java/me/juancarloscp52/entropy/Variables.java @@ -56,4 +56,5 @@ public class Variables { public static boolean stuttering = false; public static boolean forceRiding = false; public static boolean blackAndWhite = false; + public static boolean fireEvent = false; } diff --git a/src/main/java/me/juancarloscp52/entropy/client/ClientEventHandler.java b/src/main/java/me/juancarloscp52/entropy/client/ClientEventHandler.java index 39d4b92a..96cfb9c4 100644 --- a/src/main/java/me/juancarloscp52/entropy/client/ClientEventHandler.java +++ b/src/main/java/me/juancarloscp52/entropy/client/ClientEventHandler.java @@ -41,7 +41,7 @@ public class ClientEventHandler { public VotingClient votingClient; public MinecraftClient client; short eventCountDown; - + short timerDuration; UIRenderer renderer = null; final short timerDurationFinal; @@ -102,7 +102,7 @@ public void render(MatrixStack matrixStack, float tickdelta) { int width = MinecraftClient.getInstance().getWindow().getScaledWidth(); // Render timer bar - /// Only the timer is differentiated in two declination for now but + /// Only the timer is differentiated in two declination for now but /// it will be interesting to adapt the event queue and poll rendering too renderer.renderTimer(matrixStack, width, time, timerDuration); @@ -124,7 +124,7 @@ public void remove(byte index) { public void addEvent(String registryIndex) { Event event = EventRegistry.get(registryIndex); - if(!client.player.isSpectator()) + if(!client.player.isSpectator() && !(event.isDisabledByAccessibilityMode() && Entropy.getInstance().settings.accessibilityMode)) event.initClient(); currentEvents.add(event); } diff --git a/src/main/java/me/juancarloscp52/entropy/client/EntropyClient.java b/src/main/java/me/juancarloscp52/entropy/client/EntropyClient.java index 40708e6d..949f90a6 100644 --- a/src/main/java/me/juancarloscp52/entropy/client/EntropyClient.java +++ b/src/main/java/me/juancarloscp52/entropy/client/EntropyClient.java @@ -18,6 +18,9 @@ package me.juancarloscp52.entropy.client; import com.google.gson.Gson; + +import me.juancarloscp52.entropy.Entropy; +import me.juancarloscp52.entropy.EntropySettings; import me.juancarloscp52.entropy.NetworkingConstants; import me.juancarloscp52.entropy.Variables; import me.juancarloscp52.entropy.events.Event; @@ -31,10 +34,15 @@ import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.gl.PostEffectProcessor; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.tooltip.Tooltip; +import net.minecraft.client.gui.widget.CyclingButtonWidget; +import net.minecraft.nbt.NbtElement; import net.minecraft.network.PacketByteBuf; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.sound.SoundEvent; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -91,7 +99,7 @@ public void onInitializeClient() { continue; event.setEnded(ended); event.setTickCount(tickCount); - if (tickCount > 0 && !ended) + if (tickCount > 0 && !ended && !(event.isDisabledByAccessibilityMode() && Entropy.getInstance().settings.accessibilityMode)) event.initClient(); client.execute(() -> clientEventHandler.currentEvents.add(event)); } diff --git a/src/main/java/me/juancarloscp52/entropy/client/Screens/EntropyConfigurationScreen.java b/src/main/java/me/juancarloscp52/entropy/client/Screens/EntropyConfigurationScreen.java index 752e62c0..a8aecdbf 100644 --- a/src/main/java/me/juancarloscp52/entropy/client/Screens/EntropyConfigurationScreen.java +++ b/src/main/java/me/juancarloscp52/entropy/client/Screens/EntropyConfigurationScreen.java @@ -54,6 +54,8 @@ public EntropyConfigurationScreen(Screen parent) { } protected void init() { + int buttonX = this.width / 2 - 100; + int buttonWidth = 200; eventDurationWidget = new EntropySliderWidget(this.width / 2 - 160, 50, 150, 20,"entropy.options.eventDuration",(settings.baseEventDuration-300)/1200d,(slider, translationKey, value) -> Text.translatable("entropy.options.eventDuration", MathHelper.floor(value*60+15)), value -> settings.baseEventDuration = (short) ((1200*value)+300)); this.addDrawableChild(eventDurationWidget); @@ -62,17 +64,17 @@ protected void init() { this.addDrawableChild(timerDurationWidget); - ButtonWidget eventSettings = ButtonWidget.builder(Text.translatable("entropy.options.disableEvents"), button -> this.client.setScreen(new EntropyEventConfigurationScreen(this))).position(this.width / 2 - 85, 75).width(170).build(); + ButtonWidget eventSettings = ButtonWidget.builder(Text.translatable("entropy.options.disableEvents"), button -> this.client.setScreen(new EntropyEventConfigurationScreen(this))).position(buttonX, 75).width(buttonWidth).build(); this.addDrawableChild(eventSettings); - ButtonWidget integrationSettings = ButtonWidget.builder(Text.translatable("entropy.options.integrations.title"), button -> this.client.setScreen(new EntropyIntegrationsScreen(this))).width(170).position(this.width / 2 - 85, 100).build(); + ButtonWidget integrationSettings = ButtonWidget.builder(Text.translatable("entropy.options.integrations.title"), button -> this.client.setScreen(new EntropyIntegrationsScreen(this))).width(buttonWidth).position(buttonX, 100).build(); this.addDrawableChild(integrationSettings); CyclingButtonWidget votingModeButton = CyclingButtonWidget.builder(votingMode -> votingMode.text) .values(VotingMode.values()) .initially(settings.votingMode) .tooltip(votingMode -> Tooltip.of(votingMode.tooltip)) - .build(this.width / 2 - 85, 125, 170, 20, Text.translatable("entropy.options.votingMode"), (button, newValue) -> settings.votingMode = newValue); + .build(buttonX, 125, buttonWidth, 20, Text.translatable("entropy.options.votingMode"), (button, newValue) -> settings.votingMode = newValue); this.addDrawableChild(votingModeButton); // UI style button @@ -80,10 +82,16 @@ protected void init() { .values(UIStyle.values()) .initially(settings.UIstyle) .tooltip(uiStyle -> Tooltip.of(uiStyle.tooltip)) - .build(this.width / 2 - 85, 150, 170, 20, Text.translatable("entropy.options.ui"), (button, newValue) -> settings.UIstyle = newValue); + .build(buttonX, 150, buttonWidth, 20, Text.translatable("entropy.options.ui"), (button, newValue) -> settings.UIstyle = newValue); this.addDrawableChild(uiStyleButton); - this.done = ButtonWidget.builder(ScreenTexts.DONE, button -> onDone()).width(200).position(this.width / 2 - 100, this.height - 30).build(); + this.addDrawableChild(CyclingButtonWidget.builder(bool -> Text.translatable("entropy.options." + (bool ? "enabled" : "disabled"))) + .values(true, false) + .initially(settings.accessibilityMode) + .tooltip(bool -> Tooltip.of(Text.translatable("entropy.options.accessibilityMode.explanation"))) + .build(buttonX, 175, buttonWidth, 20, Text.translatable("entropy.options.accessibilityMode"), (button, newValue) -> settings.accessibilityMode = newValue)); + + this.done = ButtonWidget.builder(ScreenTexts.DONE, button -> onDone()).width(buttonWidth).position(this.width / 2 - 100, this.height - 30).build(); this.addDrawableChild(done); } diff --git a/src/main/java/me/juancarloscp52/entropy/client/Screens/EntropyEventConfigurationScreen.java b/src/main/java/me/juancarloscp52/entropy/client/Screens/EntropyEventConfigurationScreen.java index 1d4e5c1f..39a07316 100644 --- a/src/main/java/me/juancarloscp52/entropy/client/Screens/EntropyEventConfigurationScreen.java +++ b/src/main/java/me/juancarloscp52/entropy/client/Screens/EntropyEventConfigurationScreen.java @@ -108,8 +108,8 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { private void onDone() { settings.disabledEvents = new ArrayList<>(); this.list.children().forEach(buttonEntry -> { - if (!buttonEntry.button.isChecked()) - settings.disabledEvents.add(buttonEntry.eventID); + if (!buttonEntry.checkbox.isChecked()) + settings.disabledEvents.add(buttonEntry.eventInfo.id()); }); Entropy.getInstance().saveSettings(); close(); @@ -117,13 +117,13 @@ private void onDone() { private void onCheckAll() { this.list.children().forEach(buttonEntry -> { - if (buttonEntry.button.visible && !buttonEntry.button.isChecked()) {buttonEntry.button.onPress();} + if (buttonEntry.checkbox.visible && !buttonEntry.checkbox.isChecked()) {buttonEntry.checkbox.onPress();} }); } private void onUncheckAll() { this.list.children().forEach(buttonEntry -> { - if (buttonEntry.button.visible && buttonEntry.button.isChecked()) {buttonEntry.button.onPress();} + if (buttonEntry.checkbox.visible && buttonEntry.checkbox.isChecked()) {buttonEntry.checkbox.onPress();} }); } diff --git a/src/main/java/me/juancarloscp52/entropy/client/Screens/Widgets/EntropyEventListWidget.java b/src/main/java/me/juancarloscp52/entropy/client/Screens/Widgets/EntropyEventListWidget.java index a3da452c..ac5ae357 100644 --- a/src/main/java/me/juancarloscp52/entropy/client/Screens/Widgets/EntropyEventListWidget.java +++ b/src/main/java/me/juancarloscp52/entropy/client/Screens/Widgets/EntropyEventListWidget.java @@ -18,22 +18,30 @@ package me.juancarloscp52.entropy.client.Screens.Widgets; import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.systems.RenderSystem; + import me.juancarloscp52.entropy.Entropy; import me.juancarloscp52.entropy.EntropySettings; +import me.juancarloscp52.entropy.events.Event; import me.juancarloscp52.entropy.events.EventRegistry; import me.juancarloscp52.entropy.mixin.EntryListWidgetAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.Selectable; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.CheckboxWidget; import net.minecraft.client.gui.widget.ElementListWidget; import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvents; +import net.minecraft.text.OrderedText; import net.minecraft.text.Text; -import net.minecraft.util.Pair; +import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import java.util.ArrayList; @@ -50,16 +58,19 @@ public EntropyEventListWidget(MinecraftClient minecraftClient, int i, int j, int } public void addAllFromRegistry() { - var list = new ArrayList>(); - for(var eventId : EventRegistry.entropyEvents.keySet()) - list.add(new Pair(Text.translatable(EventRegistry.getTranslationKey(eventId)).getString(), eventId)); + var list = new ArrayList(); + for(var event : EventRegistry.entropyEvents.entrySet()) { + String eventId = event.getKey(); + + list.add(new EventInfo(Text.translatable(EventRegistry.getTranslationKey(eventId)).getString(), eventId, event.getValue().get())); + } - Collections.sort(list, (a, b) -> a.getLeft().compareTo(b.getLeft())); + Collections.sort(list, (a, b) -> a.name.compareTo(b.name)); list.forEach(this::addEvent); } - public int addEvent(Pair event) { - return this.addEntry(EntropyEventListWidget.ButtonEntry.create(event)); + public int addEvent(EventInfo eventInfo) { + return this.addEntry(EntropyEventListWidget.ButtonEntry.create(eventInfo)); } @Override @@ -125,7 +136,7 @@ protected void renderList(MatrixStack matrices, int mouseX, int mouseY, float de int rowTop = this.getRowTop(drawIndex); int rowBottom = rowTop + this.itemHeight; - if (this.getEntry(index).button.visible) { + if (this.getEntry(index).checkbox.visible) { drawIndex++; if (rowBottom >= this.top && rowTop <= this.bottom) @@ -140,16 +151,16 @@ public void updateVisibleEntries(String searchText, FilterMode filterMode) { if (searchText.isBlank()) children().stream().forEach(buttonEntry -> { - buttonEntry.button.visible = filterMode.allowsVisibility(buttonEntry); + buttonEntry.checkbox.visible = filterMode.allowsVisibility(buttonEntry); - if(buttonEntry.button.visible) + if(buttonEntry.checkbox.visible) visibleEntries.add(buttonEntry); }); else { children().stream().forEach(buttonEntry -> { - buttonEntry.button.visible = filterMode.allowsVisibility(buttonEntry) && (buttonEntry.eventName.toLowerCase(Locale.ROOT).contains(lowerCasedNewText) || buttonEntry.eventID.toLowerCase(Locale.ROOT).contains(lowerCasedNewText)); + buttonEntry.checkbox.visible = filterMode.allowsVisibility(buttonEntry) && (buttonEntry.eventInfo.name.toLowerCase(Locale.ROOT).contains(lowerCasedNewText) || buttonEntry.eventInfo.id.toLowerCase(Locale.ROOT).contains(lowerCasedNewText)); - if(buttonEntry.button.visible) + if(buttonEntry.checkbox.visible) visibleEntries.add(buttonEntry); }); } @@ -159,41 +170,66 @@ public void updateVisibleEntries(String searchText, FilterMode filterMode) { @Environment(EnvType.CLIENT) public static class ButtonEntry extends ElementListWidget.Entry { - public final CheckboxWidget button; - public final String eventName; - public final String eventID; - - private ButtonEntry(String eventName, String eventID, CheckboxWidget button) { - this.button = button; - this.eventName = eventName; - this.eventID = eventID; + private static final Identifier ICON_OVERLAY_LOCATION = new Identifier("textures/gui/world_selection.png"); + private static final Text ACCESSIBILITY_TOOLTIP = Text.translatable("entropy.options.accessibilityMode.eventDisabled"); + public final CheckboxWidget checkbox; + public final EventInfo eventInfo; + + private ButtonEntry(EventInfo eventInfo, CheckboxWidget checkbox) { + this.checkbox = checkbox; + this.eventInfo = eventInfo; } - public static EntropyEventListWidget.ButtonEntry create(Pair event) { + public static EntropyEventListWidget.ButtonEntry create(EventInfo eventInfo) { EntropySettings settings = Entropy.getInstance().settings; - String eventID = event.getRight(); - return new EntropyEventListWidget.ButtonEntry(event.getLeft(), eventID, new CheckboxWidget(0, 0, MinecraftClient.getInstance().getWindow().getScaledWidth(), 20, Text.translatable(EventRegistry.getTranslationKey(eventID)), !settings.disabledEvents.contains(eventID))); + String eventID = eventInfo.id; + boolean isDisabledByAccessibilityMode = eventInfo.event.isDisabledByAccessibilityMode() && Entropy.getInstance().settings.accessibilityMode; + boolean enableCheckbox = !settings.disabledEvents.contains(eventID) && !isDisabledByAccessibilityMode; + CheckboxWidget checkbox = new CheckboxWidget(0, 0, MinecraftClient.getInstance().getWindow().getScaledWidth(), 20, Text.translatable(EventRegistry.getTranslationKey(eventID)), enableCheckbox); + checkbox.active = !isDisabledByAccessibilityMode; + return new EntropyEventListWidget.ButtonEntry(eventInfo, checkbox); } public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - button.setPos(x + 32,y); - button.render(matrices, mouseX, mouseY, tickDelta); + checkbox.setPos(x + 32, y); + checkbox.render(matrices, mouseX, mouseY, tickDelta); + + if(Entropy.getInstance().settings.accessibilityMode && eventInfo.event.isDisabledByAccessibilityMode()) { + RenderSystem.setShaderTexture(0, ICON_OVERLAY_LOCATION); + DrawableHelper.drawTexture(matrices, x, y - 6, 64, 32, 32, 32, 256, 256); + + if(mouseX >= x && mouseX <= x + 350 && mouseY >= y && mouseY <= y + entryHeight) { + MinecraftClient client = MinecraftClient.getInstance(); + List lines = client.textRenderer.wrapLines(ACCESSIBILITY_TOOLTIP, 200); + int tooltipHeight = client.textRenderer.fontHeight * lines.size(); + int tooltipYPosition = (int)(y + tooltipHeight * 1.5D); + + //if the tooltip would render further down than the list reaches, render it above the entry + if(tooltipYPosition + tooltipHeight > client.currentScreen.height - 32) + tooltipYPosition = y - 12 - tooltipHeight / 2; + + client.currentScreen.renderOrderedTooltip(matrices, lines, x, tooltipYPosition); + } + } } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - this.button.onPress(); - MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + if(checkbox.active) { + MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + this.checkbox.onPress(); + } + return true; } public List children() { - return ImmutableList.of(this.button); + return ImmutableList.of(this.checkbox); } @Override public List selectableChildren() { - return ImmutableList.of(button); + return ImmutableList.of(checkbox); } } @@ -209,8 +245,9 @@ private FilterMode(String text) { } public boolean allowsVisibility(ButtonEntry buttonEntry) { - return this == ALL || this == ENABLED && buttonEntry.button.isChecked() || this == DISABLED && !buttonEntry.button.isChecked(); + return this == ALL || this == ENABLED && buttonEntry.checkbox.isChecked() || this == DISABLED && !buttonEntry.checkbox.isChecked(); } } + public record EventInfo(String name, String id, Event event) {} } \ No newline at end of file diff --git a/src/main/java/me/juancarloscp52/entropy/events/AbstractInstantEvent.java b/src/main/java/me/juancarloscp52/entropy/events/AbstractInstantEvent.java index f5df3a44..b55ff8c7 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/AbstractInstantEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/AbstractInstantEvent.java @@ -17,13 +17,16 @@ package me.juancarloscp52.entropy.events; +import me.juancarloscp52.entropy.Entropy; import me.juancarloscp52.entropy.Variables; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.math.MathHelper; public abstract class AbstractInstantEvent implements Event { @@ -45,8 +48,13 @@ public void renderQueueItem(MatrixStack matrixStack, float tickdelta, int x, int if(Variables.doNotShowEvents) return; MinecraftClient client = MinecraftClient.getInstance(); - int size = client.textRenderer.getWidth(Text.translatable(EventRegistry.getTranslationKey(this))); - DrawableHelper.drawTextWithShadow(matrixStack, MinecraftClient.getInstance().textRenderer, Text.translatable(EventRegistry.getTranslationKey(this)), client.getWindow().getScaledWidth() - size - 40, y, MathHelper.packRgb(255, 255, 255)); + MutableText eventName = Text.translatable(EventRegistry.getTranslationKey(this)); + + if(isDisabledByAccessibilityMode() && Entropy.getInstance().settings.accessibilityMode) + eventName.formatted(Formatting.STRIKETHROUGH); + + int size = client.textRenderer.getWidth(eventName); + DrawableHelper.drawTextWithShadow(matrixStack, MinecraftClient.getInstance().textRenderer, eventName, client.getWindow().getScaledWidth() - size - 40, y, MathHelper.packRgb(255, 255, 255)); } public void tick() { diff --git a/src/main/java/me/juancarloscp52/entropy/events/AbstractTimedEvent.java b/src/main/java/me/juancarloscp52/entropy/events/AbstractTimedEvent.java index e813b51c..f4eb1408 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/AbstractTimedEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/AbstractTimedEvent.java @@ -30,7 +30,9 @@ import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.math.MathHelper; import java.util.List; @@ -47,8 +49,13 @@ public void renderQueueItem(MatrixStack matrixStack, float tickdelta, int x, int if(Variables.doNotShowEvents) y=20; MinecraftClient client = MinecraftClient.getInstance(); - int size = client.textRenderer.getWidth(Text.translatable(EventRegistry.getTranslationKey(this))); - DrawableHelper.drawTextWithShadow(matrixStack, client.textRenderer, Text.translatable(EventRegistry.getTranslationKey(this)), client.getWindow().getScaledWidth() - size - 40, y, MathHelper.packRgb(255, 255, 255)); + MutableText eventName = Text.translatable(EventRegistry.getTranslationKey(this)); + + if(isDisabledByAccessibilityMode() && Entropy.getInstance().settings.accessibilityMode) + eventName.formatted(Formatting.STRIKETHROUGH); + + int size = client.textRenderer.getWidth(eventName); + DrawableHelper.drawTextWithShadow(matrixStack, client.textRenderer, eventName, client.getWindow().getScaledWidth() - size - 40, y, MathHelper.packRgb(255, 255, 255)); if (!this.hasEnded()) { DrawableHelper.fill(matrixStack, client.getWindow().getScaledWidth() - 35, y + 1, client.getWindow().getScaledWidth() - 5, y + 8, MathHelper.packRgb(70, 70, 70) + (150 << 24)); DrawableHelper.fill(matrixStack, client.getWindow().getScaledWidth() - 35, y + 1, client.getWindow().getScaledWidth() - 35 + MathHelper.floor(30 * (getTickCount() / (double) getDuration())), y + 8, MathHelper.packRgb(255, 255, 255) + (200 << 24)); diff --git a/src/main/java/me/juancarloscp52/entropy/events/Event.java b/src/main/java/me/juancarloscp52/entropy/events/Event.java index 68efa852..b7c736d9 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/Event.java +++ b/src/main/java/me/juancarloscp52/entropy/events/Event.java @@ -65,5 +65,7 @@ default String type() { return "none"; } - + default boolean isDisabledByAccessibilityMode() { + return false; + } } diff --git a/src/main/java/me/juancarloscp52/entropy/events/EventRegistry.java b/src/main/java/me/juancarloscp52/entropy/events/EventRegistry.java index bf01f65c..d2a3ae1b 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/EventRegistry.java +++ b/src/main/java/me/juancarloscp52/entropy/events/EventRegistry.java @@ -218,11 +218,23 @@ public static Event getRandomDifferentEvent(List events){ if(FabricLoader.getInstance().getEnvironmentType() != EnvType.SERVER) eventKeys.remove("StutteringEvent"); - if(eventKeys.size() == 0) return null; + return getRandomEvent(eventKeys); + } + + private static Event getRandomEvent(List eventKeys) { + if(eventKeys.isEmpty()) + return null; int index = random.nextInt(eventKeys.size()); String newEventName = eventKeys.get(index); - return entropyEvents.get(newEventName).get(); + Event event = entropyEvents.get(newEventName).get(); + + if(Entropy.getInstance().settings.accessibilityMode && event.isDisabledByAccessibilityMode()) { + eventKeys.remove(index); + return getRandomEvent(eventKeys); + } + + return event; } public static Event get(String eventName) { diff --git a/src/main/java/me/juancarloscp52/entropy/events/db/FireEvent.java b/src/main/java/me/juancarloscp52/entropy/events/db/FireEvent.java index 61cd8933..cce36b00 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/db/FireEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/db/FireEvent.java @@ -18,6 +18,7 @@ package me.juancarloscp52.entropy.events.db; import me.juancarloscp52.entropy.Entropy; +import me.juancarloscp52.entropy.Variables; import me.juancarloscp52.entropy.events.AbstractTimedEvent; import net.minecraft.block.Blocks; import net.minecraft.client.util.math.MatrixStack; @@ -29,12 +30,13 @@ public class FireEvent extends AbstractTimedEvent { @Override - public void init() { - + public void initClient() { + Variables.fireEvent = true; } @Override - public void end() { + public void endClient() { + Variables.fireEvent = false; this.hasEnded = true; } diff --git a/src/main/java/me/juancarloscp52/entropy/events/db/LSDEvent.java b/src/main/java/me/juancarloscp52/entropy/events/db/LSDEvent.java index 127edf3e..abf0a637 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/db/LSDEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/db/LSDEvent.java @@ -53,4 +53,9 @@ public void tick() { public short getDuration() { return Entropy.getInstance().settings.baseEventDuration; } + + @Override + public boolean isDisabledByAccessibilityMode() { + return true; + } } diff --git a/src/main/java/me/juancarloscp52/entropy/events/db/LagEvent.java b/src/main/java/me/juancarloscp52/entropy/events/db/LagEvent.java index 084e7e3d..b1f9bf2d 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/db/LagEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/db/LagEvent.java @@ -59,4 +59,9 @@ public short getDuration() { public String type() { return "movement"; } + + @Override + public boolean isDisabledByAccessibilityMode() { + return true; + } } diff --git a/src/main/java/me/juancarloscp52/entropy/events/db/LowFPSEvent.java b/src/main/java/me/juancarloscp52/entropy/events/db/LowFPSEvent.java index 348ce405..780f6efa 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/db/LowFPSEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/db/LowFPSEvent.java @@ -59,4 +59,9 @@ public short getDuration() { public String type() { return "fps"; } + + @Override + public boolean isDisabledByAccessibilityMode() { + return true; + } } diff --git a/src/main/java/me/juancarloscp52/entropy/events/db/RandomCameraTiltEvent.java b/src/main/java/me/juancarloscp52/entropy/events/db/RandomCameraTiltEvent.java index 7d08977e..46521e78 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/db/RandomCameraTiltEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/db/RandomCameraTiltEvent.java @@ -33,4 +33,9 @@ public String type() { public short getDuration() { return Entropy.getInstance().settings.baseEventDuration; } + + @Override + public boolean isDisabledByAccessibilityMode() { + return true; + } } diff --git a/src/main/java/me/juancarloscp52/entropy/events/db/RollingCameraEvent.java b/src/main/java/me/juancarloscp52/entropy/events/db/RollingCameraEvent.java index 17136891..8eae37c6 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/db/RollingCameraEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/db/RollingCameraEvent.java @@ -39,4 +39,9 @@ public String type() { public short getDuration() { return Entropy.getInstance().settings.baseEventDuration; } + + @Override + public boolean isDisabledByAccessibilityMode() { + return true; + } } diff --git a/src/main/java/me/juancarloscp52/entropy/events/db/StutteringEvent.java b/src/main/java/me/juancarloscp52/entropy/events/db/StutteringEvent.java index 96580309..c0772e09 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/db/StutteringEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/db/StutteringEvent.java @@ -24,4 +24,9 @@ public void render(MatrixStack matrixStack, float tickdelta) {} public short getDuration() { return Entropy.getInstance().settings.baseEventDuration; } + + @Override + public boolean isDisabledByAccessibilityMode() { + return true; + } } diff --git a/src/main/java/me/juancarloscp52/entropy/events/db/UpsideDownEvent.java b/src/main/java/me/juancarloscp52/entropy/events/db/UpsideDownEvent.java index 20bcfc19..703315e5 100644 --- a/src/main/java/me/juancarloscp52/entropy/events/db/UpsideDownEvent.java +++ b/src/main/java/me/juancarloscp52/entropy/events/db/UpsideDownEvent.java @@ -54,4 +54,9 @@ public short getDuration() { public String type() { return "camera"; } + + @Override + public boolean isDisabledByAccessibilityMode() { + return true; + } } diff --git a/src/main/java/me/juancarloscp52/entropy/mixin/GameRendererMixin.java b/src/main/java/me/juancarloscp52/entropy/mixin/GameRendererMixin.java index 2c8682e0..5678a2ae 100644 --- a/src/main/java/me/juancarloscp52/entropy/mixin/GameRendererMixin.java +++ b/src/main/java/me/juancarloscp52/entropy/mixin/GameRendererMixin.java @@ -51,7 +51,7 @@ public class GameRendererMixin { public void changeFov(Camera camera, float tickDelta, boolean changingFov, CallbackInfoReturnable cir) { if (Variables.forcedFov) { if (Variables.ignoreVariableFov) { - cir.setReturnValue((double) Variables.fov); + cir.setReturnValue((double) Variables.fov * MathHelper.lerp(client.options.getFovEffectScale().getValue(), Variables.fov, 1.0D)); } else { cir.setReturnValue(updateFov(camera, tickDelta, changingFov, Variables.fov)); } diff --git a/src/main/java/me/juancarloscp52/entropy/mixin/InGameOverlayRendererMixin.java b/src/main/java/me/juancarloscp52/entropy/mixin/InGameOverlayRendererMixin.java new file mode 100644 index 00000000..9305e527 --- /dev/null +++ b/src/main/java/me/juancarloscp52/entropy/mixin/InGameOverlayRendererMixin.java @@ -0,0 +1,19 @@ +package me.juancarloscp52.entropy.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import me.juancarloscp52.entropy.Entropy; +import me.juancarloscp52.entropy.Variables; +import net.minecraft.client.gui.hud.InGameOverlayRenderer; + +@Mixin(InGameOverlayRenderer.class) +public class InGameOverlayRendererMixin { + @Inject(method = "renderFireOverlay", at = @At("HEAD"), cancellable = true) + private static void preventRenderingFireOverlay(CallbackInfo ci) { + if(Variables.fireEvent && Entropy.getInstance().settings.accessibilityMode) + ci.cancel(); + } +} diff --git a/src/main/java/me/juancarloscp52/entropy/server/VotingServer.java b/src/main/java/me/juancarloscp52/entropy/server/VotingServer.java index a1581dba..79259a0c 100644 --- a/src/main/java/me/juancarloscp52/entropy/server/VotingServer.java +++ b/src/main/java/me/juancarloscp52/entropy/server/VotingServer.java @@ -128,10 +128,7 @@ private List getRandomEvents(int size) { for (int i = 0; i < size; i++) { Event newEvent = EventRegistry.getRandomDifferentEvent(currentEvents); if(newEvent != null) - { newEvents.add(newEvent); - currentEvents.add(newEvent); - } } return newEvents; } diff --git a/src/main/resources/assets/entropy/lang/de_at.json b/src/main/resources/assets/entropy/lang/de_at.json index 347dd476..8522621a 100644 --- a/src/main/resources/assets/entropy/lang/de_at.json +++ b/src/main/resources/assets/entropy/lang/de_at.json @@ -189,6 +189,9 @@ "entropy.options.votingMode.majority.tooltip": "Das Ereignis mit den meisten Stimmen gewinnt.", "entropy.options.votingMode.proportional": "Proportional", "entropy.options.votingMode.proportional.tooltip": "Alle Ereignisse haben eine Chance zu gewinnen. Je mehr Stimmen ein Ereignis erhalten hat, desto wahrscheinlicher ist, dass es gewinnt. Beispiel: Wenn ein Ereignis 42% der Stimmen erhalten hat, hat es eine 42%-ige Chance zu gewinnen.", + "entropy.options.accessibilityMode": "Entropy-Barrierefreiheitsmodus", + "entropy.options.accessibilityMode.explanation": "Der Barrierefreiheitsmodus deaktiviert automatisch einige Ereignisse, welche blinkende, stotternde, oder eventuell Übelkeit erregende Bilder enthalten können. Wenn ein Server versucht, solch ein Ereignis abzuspielen während du den Barrierefreiheitsmodus an hast, wird das Ereignis durchgestrichen angezeigt und nicht abgespielt.", + "entropy.options.acessibilityMode.eventDisabled": "Dieses Ereignis wurde automatisch deaktiviert, weil der Barrierefreiheitsmodus aktiv ist.", "entropy.options.integrations.twitch.sendChatFeedBack": "Aktuelle Ereignisumfrage im Twitch-Chat anzeigen", "entropy.options.integrations.twitch.help": "Die Twitch-Integration ermöglicht es dem Chat, während der Streams abzustimmen, welches Ereignis als nächstes stattfindet. Der Chat wird in der Lage sein, Nummern im Chat zu schreiben, die einem Ereignis entsprechen. Die verschiedenen verfügbaren Ereignisse für die Umfrage werden auf dem Bildschirm mit ihrer entsprechenden Nummer angezeigt. Um diese Funktion nutzen zu können, muss der Streamer den OAuth-Token mit der Zugriffsberechtigung für den Chat-Login und den Twitch-Benutzernamen bereitstellen.", "entropy.options.integrations.discord.help": "Mit Discord-Integrationen können die Mitglieder eines Servers darüber abstimmen, was das nächste Ereignis sein wird. Auf dem ausgewählten Texkanal wird eine Nachricht mit den verschiedenen verfügbaren Optionen angezeigt, und die Nutzer können abstimmen, indem sie auf die Nachricht mit den angegebenen Zahlen reagieren. Um die Discord-Integration zu aktivieren, musst du einen Discord-Bot erstellen, ihn mit deinem Server verbinden und den Bot-Token hierhin kopieren. Außerdem musst du hier die Textkanal-ID eintragen (Es ist eine Zahl). Alternativ kannst du, sobald der Discord-Bot dem Server beigetreten ist und eine Minecraft-Welt mit Entropy geöffnet ist, \"!entropy join\" in den Discord-Serverkanal schreiben.", diff --git a/src/main/resources/assets/entropy/lang/de_ch.json b/src/main/resources/assets/entropy/lang/de_ch.json index 347dd476..8522621a 100644 --- a/src/main/resources/assets/entropy/lang/de_ch.json +++ b/src/main/resources/assets/entropy/lang/de_ch.json @@ -189,6 +189,9 @@ "entropy.options.votingMode.majority.tooltip": "Das Ereignis mit den meisten Stimmen gewinnt.", "entropy.options.votingMode.proportional": "Proportional", "entropy.options.votingMode.proportional.tooltip": "Alle Ereignisse haben eine Chance zu gewinnen. Je mehr Stimmen ein Ereignis erhalten hat, desto wahrscheinlicher ist, dass es gewinnt. Beispiel: Wenn ein Ereignis 42% der Stimmen erhalten hat, hat es eine 42%-ige Chance zu gewinnen.", + "entropy.options.accessibilityMode": "Entropy-Barrierefreiheitsmodus", + "entropy.options.accessibilityMode.explanation": "Der Barrierefreiheitsmodus deaktiviert automatisch einige Ereignisse, welche blinkende, stotternde, oder eventuell Übelkeit erregende Bilder enthalten können. Wenn ein Server versucht, solch ein Ereignis abzuspielen während du den Barrierefreiheitsmodus an hast, wird das Ereignis durchgestrichen angezeigt und nicht abgespielt.", + "entropy.options.acessibilityMode.eventDisabled": "Dieses Ereignis wurde automatisch deaktiviert, weil der Barrierefreiheitsmodus aktiv ist.", "entropy.options.integrations.twitch.sendChatFeedBack": "Aktuelle Ereignisumfrage im Twitch-Chat anzeigen", "entropy.options.integrations.twitch.help": "Die Twitch-Integration ermöglicht es dem Chat, während der Streams abzustimmen, welches Ereignis als nächstes stattfindet. Der Chat wird in der Lage sein, Nummern im Chat zu schreiben, die einem Ereignis entsprechen. Die verschiedenen verfügbaren Ereignisse für die Umfrage werden auf dem Bildschirm mit ihrer entsprechenden Nummer angezeigt. Um diese Funktion nutzen zu können, muss der Streamer den OAuth-Token mit der Zugriffsberechtigung für den Chat-Login und den Twitch-Benutzernamen bereitstellen.", "entropy.options.integrations.discord.help": "Mit Discord-Integrationen können die Mitglieder eines Servers darüber abstimmen, was das nächste Ereignis sein wird. Auf dem ausgewählten Texkanal wird eine Nachricht mit den verschiedenen verfügbaren Optionen angezeigt, und die Nutzer können abstimmen, indem sie auf die Nachricht mit den angegebenen Zahlen reagieren. Um die Discord-Integration zu aktivieren, musst du einen Discord-Bot erstellen, ihn mit deinem Server verbinden und den Bot-Token hierhin kopieren. Außerdem musst du hier die Textkanal-ID eintragen (Es ist eine Zahl). Alternativ kannst du, sobald der Discord-Bot dem Server beigetreten ist und eine Minecraft-Welt mit Entropy geöffnet ist, \"!entropy join\" in den Discord-Serverkanal schreiben.", diff --git a/src/main/resources/assets/entropy/lang/de_de.json b/src/main/resources/assets/entropy/lang/de_de.json index 347dd476..8522621a 100644 --- a/src/main/resources/assets/entropy/lang/de_de.json +++ b/src/main/resources/assets/entropy/lang/de_de.json @@ -189,6 +189,9 @@ "entropy.options.votingMode.majority.tooltip": "Das Ereignis mit den meisten Stimmen gewinnt.", "entropy.options.votingMode.proportional": "Proportional", "entropy.options.votingMode.proportional.tooltip": "Alle Ereignisse haben eine Chance zu gewinnen. Je mehr Stimmen ein Ereignis erhalten hat, desto wahrscheinlicher ist, dass es gewinnt. Beispiel: Wenn ein Ereignis 42% der Stimmen erhalten hat, hat es eine 42%-ige Chance zu gewinnen.", + "entropy.options.accessibilityMode": "Entropy-Barrierefreiheitsmodus", + "entropy.options.accessibilityMode.explanation": "Der Barrierefreiheitsmodus deaktiviert automatisch einige Ereignisse, welche blinkende, stotternde, oder eventuell Übelkeit erregende Bilder enthalten können. Wenn ein Server versucht, solch ein Ereignis abzuspielen während du den Barrierefreiheitsmodus an hast, wird das Ereignis durchgestrichen angezeigt und nicht abgespielt.", + "entropy.options.acessibilityMode.eventDisabled": "Dieses Ereignis wurde automatisch deaktiviert, weil der Barrierefreiheitsmodus aktiv ist.", "entropy.options.integrations.twitch.sendChatFeedBack": "Aktuelle Ereignisumfrage im Twitch-Chat anzeigen", "entropy.options.integrations.twitch.help": "Die Twitch-Integration ermöglicht es dem Chat, während der Streams abzustimmen, welches Ereignis als nächstes stattfindet. Der Chat wird in der Lage sein, Nummern im Chat zu schreiben, die einem Ereignis entsprechen. Die verschiedenen verfügbaren Ereignisse für die Umfrage werden auf dem Bildschirm mit ihrer entsprechenden Nummer angezeigt. Um diese Funktion nutzen zu können, muss der Streamer den OAuth-Token mit der Zugriffsberechtigung für den Chat-Login und den Twitch-Benutzernamen bereitstellen.", "entropy.options.integrations.discord.help": "Mit Discord-Integrationen können die Mitglieder eines Servers darüber abstimmen, was das nächste Ereignis sein wird. Auf dem ausgewählten Texkanal wird eine Nachricht mit den verschiedenen verfügbaren Optionen angezeigt, und die Nutzer können abstimmen, indem sie auf die Nachricht mit den angegebenen Zahlen reagieren. Um die Discord-Integration zu aktivieren, musst du einen Discord-Bot erstellen, ihn mit deinem Server verbinden und den Bot-Token hierhin kopieren. Außerdem musst du hier die Textkanal-ID eintragen (Es ist eine Zahl). Alternativ kannst du, sobald der Discord-Bot dem Server beigetreten ist und eine Minecraft-Welt mit Entropy geöffnet ist, \"!entropy join\" in den Discord-Serverkanal schreiben.", diff --git a/src/main/resources/assets/entropy/lang/en_us.json b/src/main/resources/assets/entropy/lang/en_us.json index f0274617..c3da006e 100644 --- a/src/main/resources/assets/entropy/lang/en_us.json +++ b/src/main/resources/assets/entropy/lang/en_us.json @@ -189,6 +189,9 @@ "entropy.options.votingMode.majority.tooltip": "The event with the most amount of votes wins.", "entropy.options.votingMode.proportional": "Proportional", "entropy.options.votingMode.proportional.tooltip": "All events have a chance to win. The more votes an event received, the more likely it is to win. Example: If an event received 42% of the votes, it has a 42% chance of winning.", + "entropy.options.accessibilityMode": "Entropy Accessibility Mode", + "entropy.options.accessibilityMode.explanation": "Accessibility mode automatically disables some events containing flashing, jittery, or potentially nauseating images. If a server tries to run such an event while you have accessibility mode active, it will be displayed crossed out and not run at all.", + "entropy.options.accessibilityMode.eventDisabled": "This event has been automatically disabled because accessibility mode is active.", "entropy.options.integrations.twitch.sendChatFeedBack": "Show Current Event Poll on Twitch Chat", "entropy.options.integrations.twitch.help": "Twitch Integrations enables the chat to vote what will be the next event during streams. Chat will be able to vote writing numbers in chat that correspond to an event. The different available events for the poll will be shown on screen with their corresponding number. In order to use this feature, the streamer needs to provide the OAuth token with chat login access permission and the Twitch channel name.", "entropy.options.integrations.discord.help": "Discord Integrations enables users of a server to vote what will be the next event. A message will appear on the selected channel with the different available options and users can vote by reacting to the message with the given numbers. To enable discord integration, you need to create a Discord bot, join it to your server and copy the bot token here. Also, you must write here the Channel ID (its a number). Alternatively, once the discord bot has joined the server and a minecraft world with entropy is open, you can write \"!entropy join\" on the discord server channel.", diff --git a/src/main/resources/assets/entropy/lang/es_es.json b/src/main/resources/assets/entropy/lang/es_es.json index 09f8ffe7..baa3517a 100644 --- a/src/main/resources/assets/entropy/lang/es_es.json +++ b/src/main/resources/assets/entropy/lang/es_es.json @@ -188,6 +188,9 @@ "entropy.options.votingMode.majority.tooltip": "El evento con mayor número de votos gana.", "entropy.options.votingMode.proportional": "Proporcional", "entropy.options.votingMode.proportional.tooltip": "Todos los eventos tienen posibilidad de ganar. Cuanto mas votos reciba un evento, mas posibilidad para ganar. Por ejemplo: Si un evento recibe el 42% de los votos, tiene una probabilidad del 42% de ganar.", + "entropy.options.accessibilityMode": "Modo de accesibilidad", + "entropy.options.accessibilityMode.explanation": "El modo Accesibilidad desactiva automaticamente eventos que contienen flashes, \"jitter\", o imagenes que puedan causar nauseas. Si un servidor intenta ejecutar dichos eventos con este modo activado, el nombre del evento aparecerá tachado y no se ejecutara en los jugadores con modo accesibilidad.", + "entropy.options.accessibilityMode.eventDisabled": "Este evento se ha desactivado automaticamente por el modo accesibilidad.", "entropy.options.integrations.twitch.sendChatFeedBack": "Mostrar encuesta actual en el chat", "entropy.options.integrations.twitch.help": "La integración con Twitch permite que el chat vote durante el directo cual será el próximo evento. Los usuarios podrán escribir numeros en el chat que representarán un evento especifico. Los diferentes eventos por los que se pueden votar se mostrarán en pantalla con su correspondiente número durante la encuesta. Para usar esta función, el streamer debe poner un OAuth Token con permisos de \"Chat Login\" y el nombre del canal de Twitch.", "entropy.options.integrations.discord.help": "La integración con discord permite a los usuarios de un servidor de discord votar cual será el siguiente evento en tu partida. Un mensaje con las diferentes opciones aparecerá en el canal de discord seleccionado, los usuarios podrán votar reaccionando a dicho mensaje. Para habilitar la integración con discord, deberás crear un bot de discord, hacer que se una a tu servidor y copiar el token del BOT en esta pantalla. También tendras que escribir aquí la ID del canal donde se publicarán los mensajes. Tambien puedes usar el comando \"!entropy join\" en el canal a unirse.", @@ -196,7 +199,7 @@ "entropy.options.uncheckAllEvents": "Deseleccionar todos", "entropy.options.filterEvents": "Filtrar eventos", "entropy.options.all": "Todos", - "entropy.options.enabled": "Activos", - "entropy.options.disabled": "Inactivos", + "entropy.options.enabled": "Activo", + "entropy.options.disabled": "Inactivo", "entropy.options.ui": "Estilo" } \ No newline at end of file diff --git a/src/main/resources/entropy.mixins.json b/src/main/resources/entropy.mixins.json index 1fd4dd79..c3406e7c 100644 --- a/src/main/resources/entropy.mixins.json +++ b/src/main/resources/entropy.mixins.json @@ -19,6 +19,7 @@ "ClientWorldMixin", "EntryListWidgetAccessor", "GameRendererMixin", + "InGameOverlayRendererMixin", "KeyboardInputMixin", "LivingEntityRendererMixin", "MathHelperMixin",