Skip to content

Commit

Permalink
Add FireflyHelper, rewrite ParticleHelper to use lambdas, bump versio…
Browse files Browse the repository at this point in the history
…n to 3.4.4
  • Loading branch information
azurelmao committed Feb 24, 2024
1 parent f648745 commit 40ebae7
Show file tree
Hide file tree
Showing 15 changed files with 574 additions and 81 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ bta_version=7.1-pre1a
loader_version=0.14.19-babric.3-bta

# Mod
mod_version=3.4.3
mod_version=3.4.4
mod_group=turniplabs
mod_name=halplibe

40 changes: 37 additions & 3 deletions src/main/java/turniplabs/halplibe/HalpLibe.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,34 @@
import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
import net.minecraft.client.entity.fx.EntityFireflyFX;
import net.minecraft.client.render.block.model.BlockModelRenderBlocks;
import net.minecraft.client.sound.block.BlockSounds;
import net.minecraft.core.Global;
import net.minecraft.core.block.Block;
import net.minecraft.core.block.BlockLanternFirefly;
import net.minecraft.core.block.tag.BlockTags;
import net.minecraft.core.item.Item;
import net.minecraft.core.item.ItemPlaceable;
import net.minecraft.core.item.ItemStack;
import net.minecraft.core.item.tag.ItemTags;
import net.minecraft.core.util.helper.MathHelper;
import net.minecraft.core.world.biome.Biome;
import net.minecraft.core.world.biome.Biomes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import turniplabs.halplibe.helper.AchievementHelper;
import turniplabs.halplibe.helper.ModVersionHelper;
import turniplabs.halplibe.helper.NetworkHelper;
import turniplabs.halplibe.helper.*;
import turniplabs.halplibe.mixin.accessors.EntityFireflyFXAccessor;
import turniplabs.halplibe.util.FireflyColor;
import turniplabs.halplibe.util.GameStartEntrypoint;
import turniplabs.halplibe.util.TomlConfigHandler;
import turniplabs.halplibe.util.achievements.AchievementPage;
import turniplabs.halplibe.util.achievements.VanillaAchievementsPage;
import turniplabs.halplibe.util.toml.Toml;
import turniplabs.halplibe.util.version.PacketModList;

import java.util.HashMap;
import java.util.Random;

public class HalpLibe implements ModInitializer, PreLaunchEntrypoint {
public static final String MOD_ID = "halplibe";
Expand Down Expand Up @@ -80,19 +93,40 @@ public static int getTrueItemOrBlockId(String key){
}
throw new IllegalArgumentException("Key '" + key + "' does not start with a valid predicate of 'item' or 'tile'");
}

@SuppressWarnings("unused")
@Deprecated
public static String addModId(String modId, String name) {
return modId + "." + name;
}

@Override
public void onInitialize() {
AchievementHelper.addPage(VANILLA_ACHIEVEMENTS);
LOGGER.info("HalpLibe initialized.");
}

public static FireflyColor fireflyGreen;
public static FireflyColor fireflyOrange;
public static FireflyColor fireflyBlue;
public static FireflyColor fireflyRed;

@Override
public void onPreLaunch() {
// Initializes halp statics first
NetworkHelper.register(PacketModList.class, false, true); // Register Halplibe packets first

fireflyGreen = new FireflyColor(0, "fireflyGreen", new ItemStack(Item.lanternFireflyGreen), new Biome[]{Biomes.OVERWORLD_RAINFOREST, Biomes.OVERWORLD_SWAMPLAND, Biomes.OVERWORLD_FOREST, Biomes.OVERWORLD_SEASONAL_FOREST});
fireflyOrange = new FireflyColor(1, "fireflyOrange", new ItemStack(Item.lanternFireflyOrange), new Biome[]{Biomes.OVERWORLD_DESERT, Biomes.OVERWORLD_OUTBACK, Biomes.OVERWORLD_OUTBACK_GRASSY});
fireflyBlue = new FireflyColor(2, "fireflyBlue", new ItemStack(Item.lanternFireflyBlue), new Biome[]{Biomes.OVERWORLD_TAIGA, Biomes.OVERWORLD_TUNDRA, Biomes.OVERWORLD_BOREAL_FOREST, Biomes.OVERWORLD_GLACIER, Biomes.PARADISE_PARADISE});
fireflyRed = new FireflyColor(3, "fireflyRed", new ItemStack(Item.lanternFireflyRed), new Biome[]{Biomes.NETHER_NETHER});
FireflyHelper.createColor(fireflyGreen);
FireflyHelper.createColor(fireflyOrange);
FireflyHelper.createColor(fireflyBlue);
FireflyHelper.createColor(fireflyRed);
FireflyHelper.setColor((BlockLanternFirefly) Block.lanternFireflyGreen, fireflyGreen);
FireflyHelper.setColor((BlockLanternFirefly) Block.lanternFireflyOrange, fireflyOrange);
FireflyHelper.setColor((BlockLanternFirefly) Block.lanternFireflyBlue, fireflyBlue);
FireflyHelper.setColor((BlockLanternFirefly) Block.lanternFireflyRed, fireflyRed);
}
}
22 changes: 22 additions & 0 deletions src/main/java/turniplabs/halplibe/helper/FireflyHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package turniplabs.halplibe.helper;

import net.minecraft.client.entity.fx.EntityFireflyFX;
import net.minecraft.core.block.BlockLanternFirefly;
import turniplabs.halplibe.mixin.accessors.EntityFireflyFXAccessor;
import turniplabs.halplibe.util.FireflyColor;
import turniplabs.halplibe.util.IFireflyColor;

import java.util.ArrayList;
import java.util.List;

abstract public class FireflyHelper {
public static final List<FireflyColor> registeredColors = new ArrayList<>();

public static void createColor(FireflyColor fireflyColor) {
registeredColors.add(fireflyColor);
}

public static void setColor(BlockLanternFirefly block, FireflyColor color) {
((IFireflyColor) block).halplibe$setColor(color);
}
}
59 changes: 57 additions & 2 deletions src/main/java/turniplabs/halplibe/helper/ParticleHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,70 @@


import net.minecraft.client.entity.fx.EntityFX;
import net.minecraft.client.entity.fx.EntityFireflyFX;
import net.minecraft.core.util.helper.MathHelper;
import net.minecraft.core.world.World;
import turniplabs.halplibe.mixin.accessors.EntityFXAccessor;
import turniplabs.halplibe.mixin.accessors.EntityFireflyFXAccessor;

import java.util.HashMap;
import java.util.Map;

public class ParticleHelper {
public static Map<String, Class<? extends EntityFX>> particlesOld = new HashMap<>();
public static Map<String, ParticleLambda> particles = new HashMap<>();

public static Map<String, Class<? extends EntityFX>> particles = new HashMap<>();
@SuppressWarnings("unused") // API function
@Deprecated
public static void createParticle(Class<? extends EntityFX> clazz, String name) {
particles.put(name, clazz);
particlesOld.put(name, clazz);
}

@SuppressWarnings("unused") // API function
public static void createParticle(String name, ParticleLambda lambda) {
particles.put(name, lambda);
}


/**
* Set the firefly particle's color using the vanilla scheme,
* which only takes in mid RGB colors and interpolates the rest.
*/
public static void setFireflyColor(EntityFireflyFX particle, float r, float g, float b) {
((EntityFireflyFXAccessor) particle).setMidR(r);
((EntityFireflyFXAccessor) particle).setMidG(g);
((EntityFireflyFXAccessor) particle).setMidB(b);
((EntityFXAccessor) particle).setParticleRed(r);
((EntityFXAccessor) particle).setParticleGreen(g);
((EntityFXAccessor) particle).setParticleBlue(b);
((EntityFireflyFXAccessor) particle).setMaxR(MathHelper.clamp(r + 0.25F, 0.0F, 1.0F));
((EntityFireflyFXAccessor) particle).setMaxG(MathHelper.clamp(g + 0.25F, 0.0F, 1.0F));
((EntityFireflyFXAccessor) particle).setMaxB(MathHelper.clamp(b + 0.25F, 0.0F, 1.0F));
}

public static void setFireflyColorMin(EntityFireflyFX particle, float r, float g, float b) {
((EntityFireflyFXAccessor) particle).setMinR(r);
((EntityFireflyFXAccessor) particle).setMinG(g);
((EntityFireflyFXAccessor) particle).setMinB(b);
}

public static void setFireflyColorMid(EntityFireflyFX particle, float r, float g, float b) {
((EntityFireflyFXAccessor) particle).setMidR(r);
((EntityFireflyFXAccessor) particle).setMidG(g);
((EntityFireflyFXAccessor) particle).setMidB(b);
((EntityFXAccessor) particle).setParticleRed(r);
((EntityFXAccessor) particle).setParticleRed(g);
((EntityFXAccessor) particle).setParticleRed(b);
}

public static void setFireflyColorMax(EntityFireflyFX particle, float r, float g, float b) {
((EntityFireflyFXAccessor) particle).setMaxR(r);
((EntityFireflyFXAccessor) particle).setMaxG(g);
((EntityFireflyFXAccessor) particle).setMaxB(b);
}

@FunctionalInterface
public interface ParticleLambda {
EntityFX run(World world, double x, double y, double z, double motionX, double motionY, double motionZ);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package turniplabs.halplibe.mixin.accessors;

import net.minecraft.client.entity.fx.EntityFX;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(value = EntityFX.class, remap = false)
public interface EntityFXAccessor {
@Accessor
void setParticleRed(float particleRed);

@Accessor
void setParticleGreen(float particleGreen);

@Accessor
void setParticleBlue(float particleBlue);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package turniplabs.halplibe.mixin.accessors;

import net.minecraft.client.entity.fx.EntityFireflyFX;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(value = EntityFireflyFX.class, remap = false)
public interface EntityFireflyFXAccessor {
@Accessor
void setMidR(float midR);

@Accessor
void setMidG(float midG);

@Accessor
void setMidB(float midB);

@Mutable
@Accessor
void setMinR(float minR);

@Mutable
@Accessor
void setMinG(float minG);

@Mutable
@Accessor
void setMinB(float minB);

@Accessor
void setMaxR(float maxR);

@Accessor
void setMaxG(float maxG);

@Accessor
void setMaxB(float maxB);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package turniplabs.halplibe.mixin.mixins;

import net.minecraft.core.block.Block;
import net.minecraft.core.block.BlockLanternFirefly;
import net.minecraft.core.block.material.Material;
import net.minecraft.core.entity.animal.EntityFireflyCluster;
import net.minecraft.core.enums.EnumFireflyColor;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import turniplabs.halplibe.util.FireflyColor;
import turniplabs.halplibe.util.IFireflyColor;

@Debug(export = true)
@Mixin(value = BlockLanternFirefly.class, remap = false)
abstract public class BlockLanternFireflyMixin extends Block implements IFireflyColor {
@Mutable
@Shadow
@Final
private EnumFireflyColor color;

public BlockLanternFireflyMixin(String key, int id, Material material) {
super(key, id, material);
}

@Unique
private FireflyColor halplibe$color;

@Unique
public void halplibe$setColor(FireflyColor color) {
halplibe$color = color;
}

@Inject(method = "<init>", at = @At(value = "TAIL"))
private void constructorInject(String key, int id, EnumFireflyColor colour, CallbackInfo ci) {
color = null;
}

@Redirect(method = "randomDisplayTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/enums/EnumFireflyColor;getParticleName()Ljava/lang/String;"))
private String redirectParticleName(EnumFireflyColor instance) {
return halplibe$color.getParticleName();
}

@Redirect(
method = "onBlockDestroyedByPlayer",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/core/entity/animal/EntityFireflyCluster;setColor(Lnet/minecraft/core/enums/EnumFireflyColor;)V"
)
)
private void redirectColor(EntityFireflyCluster instance, EnumFireflyColor colour) {
((IFireflyColor) instance).halplibe$setColor(halplibe$color);
}
}
Loading

0 comments on commit 40ebae7

Please sign in to comment.