Skip to content

Commit

Permalink
add a heart change event for when config is modified in-game
Browse files Browse the repository at this point in the history
  • Loading branch information
Terrails committed Mar 18, 2024
1 parent c9ac48d commit e45a8c4
Show file tree
Hide file tree
Showing 16 changed files with 104 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,9 @@ public static void postRenderEvent(
) {
throw new AssertionError();
}

@ExpectPlatform
public static void heartChangeEvent() {
throw new AssertionError();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
import terrails.colorfulhearts.heart.CHeartType;
import terrails.colorfulhearts.heart.Heart;

public class AppleSkinCompat {
public abstract class AppleSkinCompat {

public final Minecraft client = Minecraft.getInstance();
private final RandomSource random = RandomSource.create();

private int lastHealth, lastModifiedHealth;
protected int lastHealth, lastModifiedHealth;
private Heart[] hearts;

public void drawHealthOverlay(GuiGraphics guiGraphics, int x, int y, int absorbing, int health, int modifiedHealth, float alpha, boolean hardcore) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class ColorSelectionScreen extends Screen {

private boolean vanillaHeart;
private boolean hasChanged;
private boolean colorsChanged;
private boolean colorsChanged, vanillaChanged;

private ScrollableWidgetList colorSelectionList;
private CHeartType heartType;
Expand Down Expand Up @@ -150,8 +150,9 @@ public void onClose() {
if (this.colorsChanged) {
// recreates texture atlas
this.minecraft.reloadResourcePacks();
// forces a heart update in renderer
HeartRenderer.INSTANCE.lastHealthType = null;
LoaderExpectPlatform.heartChangeEvent();
} else if (this.vanillaChanged) {
LoaderExpectPlatform.heartChangeEvent();
}
}

Expand Down Expand Up @@ -359,8 +360,9 @@ private void saveConfig() {
assert configColors != null && configVanilla != null;

// save only valid color fields
if (this.hasVanillaVariant() && !this.heartType.isEffect() && this.vanillaHeart != configVanilla.get()) {
if (this.hasVanillaVariant() && this.vanillaHeart != configVanilla.get()) {
configVanilla.set(this.vanillaHeart);
this.vanillaChanged = true;
}

List<String> previousValues = configColors.get().stream().map(String::toUpperCase).toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class TabHeartRenderer {
private final Minecraft client = Minecraft.getInstance();

private Heart[] hearts;
private int lastHealth, lastDisplayHealth;
public int lastHealth, lastDisplayHealth;

public void renderPlayerListHud(int y, int x, int offset, GuiGraphics guiGraphics, int health, PlayerTabOverlay.HealthState healthState) {
if (health != this.lastHealth || healthState.displayedValue() != this.lastDisplayHealth || this.hearts == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ObjectShare;
import terrails.colorfulhearts.fabric.api.event.FabHeartChangeEvent;
import terrails.colorfulhearts.render.HeartRenderer;
import terrails.colorfulhearts.render.TabHeartRenderer;

public class ColorfulHearts implements ClientModInitializer {

Expand All @@ -12,6 +15,11 @@ public class ColorfulHearts implements ClientModInitializer {
public void onInitializeClient() {
CONFIG = new FabConfig();
this.setupObjectShare();
FabHeartChangeEvent.EVENT.register(() -> {
// force an update to heart colors when config GUI is updated
HeartRenderer.INSTANCE.lastHealthType = null;
TabHeartRenderer.INSTANCE.lastHealth = 0;
});
}

private void setupObjectShare() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.gui.GuiGraphics;
import terrails.colorfulhearts.api.event.HeartRenderEvent;
import terrails.colorfulhearts.fabric.api.event.FabHeartChangeEvent;
import terrails.colorfulhearts.fabric.api.event.FabHeartRenderEvent;
import terrails.colorfulhearts.heart.CHeartType;

Expand Down Expand Up @@ -41,4 +42,8 @@ public static void postRenderEvent(
FabHeartRenderEvent.POST.invoker().accept(event);
}

public static void heartChangeEvent() {
FabHeartChangeEvent.EVENT.invoker().run();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package terrails.colorfulhearts.fabric.api.event;

import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;

/**
* Just an empty event used to notify about in-game changes from the Config Screen
*/
public class FabHeartChangeEvent {

public static final Event<Runnable> EVENT = EventFactory.createArrayBacked(Runnable.class, listeners -> () -> {
for (Runnable listener : listeners) {
listener.run();
}
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import squeek.appleskin.api.event.HUDOverlayEvent;
import squeek.appleskin.client.HUDOverlayHandler;
import terrails.colorfulhearts.compat.AppleSkinCompat;
import terrails.colorfulhearts.fabric.api.event.FabHeartChangeEvent;
import terrails.colorfulhearts.fabric.api.event.FabHeartRenderEvent;
import terrails.colorfulhearts.fabric.mixin.compat.appleskin.HUDOverlayHandlerAccessor;

Expand Down Expand Up @@ -41,5 +42,7 @@ public void registerEvents() {
// set value back to 0
modifiedHealth = 0;
});

FabHeartChangeEvent.EVENT.register(() -> this.lastHealth = 0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import terrails.colorfulhearts.CColorfulHearts;
import terrails.colorfulhearts.config.screen.ConfigurationScreen;
import terrails.colorfulhearts.forge.api.event.ForgeHeartChangeEvent;
import terrails.colorfulhearts.render.HeartRenderer;
import terrails.colorfulhearts.render.TabHeartRenderer;

import java.lang.reflect.InvocationTargetException;
import java.util.Map;
Expand Down Expand Up @@ -43,12 +46,19 @@ public ColorfulHearts() {
bus.addListener(this::setup);

MinecraftForge.EVENT_BUS.addListener(EventPriority.LOWEST, RenderEventHandler.INSTANCE::renderHearts);
MinecraftForge.EVENT_BUS.addListener(this::heartChanged);
}

private void setup(final FMLClientSetupEvent event) {
this.setupCompat();
}

private void heartChanged(ForgeHeartChangeEvent event) {
// force an update to heart colors when config GUI is updated
HeartRenderer.INSTANCE.lastHealthType = null;
TabHeartRenderer.INSTANCE.lastHealth = 0;
}

private void setupCompat() {
final String basePackage = "terrails.colorfulhearts.forge.compat";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.minecraftforge.common.MinecraftForge;
import terrails.colorfulhearts.CColorfulHearts;
import terrails.colorfulhearts.api.event.HeartRenderEvent;
import terrails.colorfulhearts.forge.api.event.ForgeHeartChangeEvent;
import terrails.colorfulhearts.forge.api.event.ForgeHeartRenderEvent;
import terrails.colorfulhearts.heart.CHeartType;

Expand Down Expand Up @@ -42,4 +43,8 @@ public static void postRenderEvent(
ForgeHeartRenderEvent.Post event = new ForgeHeartRenderEvent.Post(guiGraphics, x, y, blinking, hardcore, healthType, absorbingType);
MinecraftForge.EVENT_BUS.post(event);
}

public static void heartChangeEvent() {
MinecraftForge.EVENT_BUS.post(new ForgeHeartChangeEvent());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package terrails.colorfulhearts.forge.api.event;

import net.minecraftforge.eventbus.api.Event;

/**
* Just an empty event used to notify about in-game changes from the Config Screen
*/
public class ForgeHeartChangeEvent extends Event { }
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import squeek.appleskin.client.HUDOverlayHandler;
import squeek.appleskin.helpers.FoodHelper;
import terrails.colorfulhearts.compat.AppleSkinCompat;
import terrails.colorfulhearts.forge.api.event.ForgeHeartChangeEvent;
import terrails.colorfulhearts.forge.api.event.ForgeHeartRenderEvent;
import terrails.colorfulhearts.forge.mixin.compat.appleskin.HUDOverlayHandlerAccessor;

Expand All @@ -19,6 +20,7 @@ public class AppleSkinForgeCompat extends AppleSkinCompat {
public AppleSkinForgeCompat() {
MinecraftForge.EVENT_BUS.addListener(this::onDefaultRender);
MinecraftForge.EVENT_BUS.addListener(this::onPostRender);
MinecraftForge.EVENT_BUS.addListener(this::heartChanged);
}

/**
Expand Down Expand Up @@ -71,4 +73,8 @@ private void onPostRender(ForgeHeartRenderEvent.Post event) {

drawHealthOverlay(event.getGuiGraphics(), event.getX(), event.getY(), absorbing, health, modifiedHealth, alpha, event.isHardcore());
}

private void heartChanged(ForgeHeartChangeEvent event) {
this.lastHealth = 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
import net.neoforged.neoforge.common.NeoForge;
import terrails.colorfulhearts.CColorfulHearts;
import terrails.colorfulhearts.config.screen.ConfigurationScreen;
import terrails.colorfulhearts.neoforge.api.event.ForgeHeartChangeEvent;
import terrails.colorfulhearts.render.HeartRenderer;
import terrails.colorfulhearts.render.TabHeartRenderer;
import terrails.colorfulhearts.render.atlas.sources.ColoredHearts;

import java.lang.reflect.InvocationTargetException;
Expand Down Expand Up @@ -44,6 +47,7 @@ public ColorfulHearts(final IEventBus bus) {
bus.addListener(this::registerSprites);

NeoForge.EVENT_BUS.addListener(EventPriority.LOWEST, RenderEventHandler.INSTANCE::renderHearts);
NeoForge.EVENT_BUS.addListener(this::heartChanged);
}

private void setup(final FMLClientSetupEvent event) {
Expand All @@ -54,6 +58,12 @@ private void registerSprites(final RegisterSpriteSourceTypesEvent event) {
event.register(CColorfulHearts.SPRITE_NAME, ColoredHearts.CODEC);
}

private void heartChanged(ForgeHeartChangeEvent event) {
// force an update to heart colors when config GUI is updated
HeartRenderer.INSTANCE.lastHealthType = null;
TabHeartRenderer.INSTANCE.lastHealth = 0;
}

private void setupCompat() {
final String basePackage = "terrails.colorfulhearts.neoforge.compat";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import terrails.colorfulhearts.CColorfulHearts;
import terrails.colorfulhearts.api.event.HeartRenderEvent;
import terrails.colorfulhearts.heart.CHeartType;
import terrails.colorfulhearts.neoforge.api.event.ForgeHeartChangeEvent;
import terrails.colorfulhearts.neoforge.api.event.ForgeHeartRenderEvent;

import static terrails.colorfulhearts.CColorfulHearts.LOGGER;
Expand Down Expand Up @@ -42,4 +43,8 @@ public static void postRenderEvent(
ForgeHeartRenderEvent.Post event = new ForgeHeartRenderEvent.Post(guiGraphics, x, y, blinking, hardcore, healthType, absorbingType);
NeoForge.EVENT_BUS.post(event);
}

public static void heartChangeEvent() {
NeoForge.EVENT_BUS.post(new ForgeHeartChangeEvent());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package terrails.colorfulhearts.neoforge.api.event;

import net.neoforged.bus.api.Event;

/**
* Just an empty event used to notify about in-game changes from the Config Screen
*/
public class ForgeHeartChangeEvent extends Event { }
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import squeek.appleskin.client.HUDOverlayHandler;
import squeek.appleskin.helpers.FoodHelper;
import terrails.colorfulhearts.compat.AppleSkinCompat;
import terrails.colorfulhearts.neoforge.api.event.ForgeHeartChangeEvent;
import terrails.colorfulhearts.neoforge.api.event.ForgeHeartRenderEvent;
import terrails.colorfulhearts.neoforge.mixin.compat.appleskin.HUDOverlayHandlerAccessor;

Expand All @@ -19,6 +20,7 @@ public class AppleSkinForgeCompat extends AppleSkinCompat {
public AppleSkinForgeCompat() {
NeoForge.EVENT_BUS.addListener(this::onDefaultRender);
NeoForge.EVENT_BUS.addListener(this::onPostRender);
NeoForge.EVENT_BUS.addListener(this::heartChanged);
}

/**
Expand Down Expand Up @@ -71,4 +73,8 @@ private void onPostRender(ForgeHeartRenderEvent.Post event) {

drawHealthOverlay(event.getGuiGraphics(), event.getX(), event.getY(), absorbing, health, modifiedHealth, alpha, event.isHardcore());
}

private void heartChanged(ForgeHeartChangeEvent event) {
this.lastHealth = 0;
}
}

0 comments on commit e45a8c4

Please sign in to comment.