From 1e9b5b36e42b54db25c1246ff4f221051002a33c Mon Sep 17 00:00:00 2001 From: mine_diver Date: Tue, 24 Dec 2024 02:19:04 +0500 Subject: [PATCH 01/27] Switched from HMI to RetroCommands --- build.gradle.kts | 13 +------------ gradle.properties | 4 +--- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 453f84153..90eb97a59 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -88,20 +88,9 @@ allprojects { modLocalRuntime("net.glasslauncher.mods:ModMenu:${project.properties["modmenu_version"]}") { isTransitive = false } - - implementation("blue.endless:jankson:1.2.1") - implementation("me.carleslc:Simple-Yaml:1.8.4") - modLocalRuntime("net.glasslauncher.mods:glass-networking:1.0.2") { - isTransitive = false - } - modLocalRuntime("net.glasslauncher.mods:GlassConfigAPI:${project.properties["gcapi_version"]}") { - isTransitive = false - } - modLocalRuntime("net.glasslauncher:HowManyItems-Fabric-Unofficial:${project.properties["hmi_version"]}") { + modLocalRuntime("maven.modrinth:retrocommands:${project.properties["rc_version"]}") { isTransitive = false } - // Optional bugfix mod for testing qol. Remove the // to enable. - //modLocalRuntime "maven.modrinth:mojangfix:${project.properties["mojangfix_version"]}" annotationProcessor("io.github.llamalad7:mixinextras-fabric:0.4.1") } diff --git a/gradle.properties b/gradle.properties index fb690debc..368993ac6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,7 +27,5 @@ fabric.loom.multiProjectOptimisation=true archives_base_name = StationAPI # Test properties - gcapi_version = 3.0.0 - hmi_version = 5.2.1 modmenu_version = 1.8.5-beta.9 - mojangfix_version = 0.5.2 \ No newline at end of file + rc_version = 0.5.4 \ No newline at end of file From 4949fccc9a3a68c09723df657267b5ba0ecdf078 Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Sat, 28 Dec 2024 23:57:02 +0500 Subject: [PATCH 02/27] Removed broken reimplementation of Divisor's old PlayerAPI. (#139) --- .../sltest/entity/player/PlayerHandler.java | 45 -- .../entity/player/PlayerHandlerListener.java | 12 - src/test/resources/fabric.mod.json | 1 - .../stationapi/api/item/ArmorUtil.java | 28 - .../stationapi/api/item/CustomArmorValue.java | 7 - .../impl/item/CustomArmorValuesImpl.java | 53 -- .../src/main/resources/fabric.mod.json | 3 - .../player/PlayerBaseSettersGetters.java | 30 - .../api/entity/player/PlayerBaseSuper.java | 28 - .../api/entity/player/PlayerHandler.java | 206 ------- .../entity/player/PlayerHandlerContainer.java | 8 - .../api/event/entity/player/PlayerEvent.java | 9 - .../impl/entity/player/PlayerAPI.java | 523 ------------------ .../mixin/player/PlayerEntityMixin.java | 494 ----------------- .../client/ClientPlayerEntityMixin.java | 46 -- .../station-player-api-v0.mixins.json | 6 - 16 files changed, 1499 deletions(-) delete mode 100644 src/test/java/net/modificationstation/sltest/entity/player/PlayerHandler.java delete mode 100644 src/test/java/net/modificationstation/sltest/entity/player/PlayerHandlerListener.java delete mode 100644 station-armor-api-v0/src/main/java/net/modificationstation/stationapi/api/item/ArmorUtil.java delete mode 100644 station-armor-api-v0/src/main/java/net/modificationstation/stationapi/api/item/CustomArmorValue.java delete mode 100644 station-armor-api-v0/src/main/java/net/modificationstation/stationapi/impl/item/CustomArmorValuesImpl.java delete mode 100644 station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerBaseSettersGetters.java delete mode 100644 station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerBaseSuper.java delete mode 100644 station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerHandler.java delete mode 100644 station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerHandlerContainer.java delete mode 100644 station-player-api-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/PlayerAPI.java delete mode 100644 station-player-api-v0/src/main/java/net/modificationstation/stationapi/mixin/player/PlayerEntityMixin.java delete mode 100644 station-player-api-v0/src/main/java/net/modificationstation/stationapi/mixin/player/client/ClientPlayerEntityMixin.java diff --git a/src/test/java/net/modificationstation/sltest/entity/player/PlayerHandler.java b/src/test/java/net/modificationstation/sltest/entity/player/PlayerHandler.java deleted file mode 100644 index dba089950..000000000 --- a/src/test/java/net/modificationstation/sltest/entity/player/PlayerHandler.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.modificationstation.sltest.entity.player; - -import net.minecraft.entity.player.PlayerEntity; - -public class PlayerHandler implements net.modificationstation.stationapi.api.entity.player.PlayerHandler { - - private final PlayerEntity player; - - public PlayerHandler(PlayerEntity playerBase) { - player = playerBase; - } - - @Override - public boolean jump() { -// int tests = 1000; -// int listeners = 1; -// int dispatches = 1000000; -// long total = 0; -// long min = Long.MAX_VALUE; -// long max = Long.MIN_VALUE; -// EventBus bmBus = StationAPI.EVENT_BUS; -// bmBus.register(SLTest.Listener.class); -// for (int i = 0; i < tests; i++) { -//// for (int j = 0; j < listeners; j++) -// long startTS = System.nanoTime(); -// for (int j = 0; j < dispatches; j++) -// bmBus.post(new SLTest.TestEvent()); -// long stopTS = System.nanoTime(); -// long result = stopTS - startTS; -// System.out.println("Took: " + result + "ns"); -// total += result; -// if (result < min) -// min = result; -// if (result > max) -// max = result; -// } -// System.out.println("Tests: " + tests); -// System.out.println("Listeners: " + listeners); -// System.out.println("Dispatches: " + dispatches); -// System.out.println("Average: " + total / tests + "ns"); -// System.out.println("Min: " + min + "ns"); -// System.out.println("Max: " + max + "ns"); - return false; - } -} diff --git a/src/test/java/net/modificationstation/sltest/entity/player/PlayerHandlerListener.java b/src/test/java/net/modificationstation/sltest/entity/player/PlayerHandlerListener.java deleted file mode 100644 index 7e8c33819..000000000 --- a/src/test/java/net/modificationstation/sltest/entity/player/PlayerHandlerListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.modificationstation.sltest.entity.player; - -import net.mine_diver.unsafeevents.listener.EventListener; -import net.modificationstation.stationapi.api.event.entity.player.PlayerEvent; - -public class PlayerHandlerListener { - - @EventListener - public void registerPlayerHandlers(PlayerEvent.HandlerRegister event) { - event.playerHandlers.add(new PlayerHandler(event.player)); - } -} diff --git a/src/test/resources/fabric.mod.json b/src/test/resources/fabric.mod.json index 3ef1d5b6f..3436de72c 100644 --- a/src/test/resources/fabric.mod.json +++ b/src/test/resources/fabric.mod.json @@ -25,7 +25,6 @@ "net.modificationstation.sltest.SLTest", "net.modificationstation.sltest.recipe.RecipeListener", "net.modificationstation.sltest.achievement.AchievementListener", - "net.modificationstation.sltest.entity.player.PlayerHandlerListener", "net.modificationstation.sltest.level.gen.ChunkListener", "net.modificationstation.sltest.entity.EntityListener", "net.modificationstation.sltest.tileentity.TileEntityListener", diff --git a/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/api/item/ArmorUtil.java b/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/api/item/ArmorUtil.java deleted file mode 100644 index 70a5c30ec..000000000 --- a/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/api/item/ArmorUtil.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.modificationstation.stationapi.api.item; - -import net.minecraft.item.ArmorItem; -import net.minecraft.item.ItemStack; - -public class ArmorUtil { - /** - * This is not perfect, but it gets very close to exact vanilla. Uses double to allow for extra precision. - * Gets vanilla armor reduction for the given armor piece. - */ - public static double getVanillaArmorReduction(ItemStack armor) { - double var1 = 0; - double var2 = 0; - double var3 = 0; - - if (armor != null && armor.getItem() instanceof ArmorItem actualArmor) { - double var5 = armor.getMaxDamage(); - double var6 = armor.getDamage2(); - double var7 = var5 - var6; - var2 += var7; - var3 += var5; - double var8 = actualArmor.maxProtection; - var1 += var8; - } - - return ((var1 - 1D) * var2 / var3 + 1D) / 5; - } -} diff --git a/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/api/item/CustomArmorValue.java b/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/api/item/CustomArmorValue.java deleted file mode 100644 index 8a39ffa3b..000000000 --- a/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/api/item/CustomArmorValue.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.modificationstation.stationapi.api.item; - -import net.minecraft.entity.player.PlayerEntity; - -public interface CustomArmorValue { - double modifyDamageDealt(PlayerEntity player, int armorSlot, int initialDamage, double currentAdjustedDamage); -} diff --git a/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/impl/item/CustomArmorValuesImpl.java b/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/impl/item/CustomArmorValuesImpl.java deleted file mode 100644 index 1eae19e8f..000000000 --- a/station-armor-api-v0/src/main/java/net/modificationstation/stationapi/impl/item/CustomArmorValuesImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.modificationstation.stationapi.impl.item; - -import net.mine_diver.unsafeevents.listener.EventListener; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.ItemStack; -import net.modificationstation.stationapi.api.StationAPI; -import net.modificationstation.stationapi.api.entity.player.PlayerBaseSuper; -import net.modificationstation.stationapi.api.entity.player.PlayerHandler; -import net.modificationstation.stationapi.api.event.entity.player.PlayerEvent; -import net.modificationstation.stationapi.api.item.ArmorUtil; -import net.modificationstation.stationapi.api.item.CustomArmorValue; -import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; -import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; - -@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) -@EventListener(phase = StationAPI.INTERNAL_PHASE) -public class CustomArmorValuesImpl { - @EventListener - private static void calcArmorDamageReduce(PlayerEvent.HandlerRegister event) { - event.playerHandlers.add(new ArmorHandler(event.player)); - } - - private record ArmorHandler(PlayerEntity player) implements PlayerHandler { - @Override - public boolean damageEntityBase(int initialDamage) { - double damageAmount = initialDamage; - ItemStack[] armor = player.inventory.armor; - - for (int i = 0; i < armor.length; i++) { - ItemStack armorInstance = armor[i]; - // This solution is not exact with vanilla, but is WAY better than previous solutions which weren't even close to vanilla. - if (armorInstance != null) { - if (armorInstance.getItem() instanceof CustomArmorValue armorValue) { - double damageNegated = armorValue.modifyDamageDealt(player, i, initialDamage, damageAmount); - damageAmount -= damageNegated; - } else if (armorInstance.getItem() instanceof ArmorItem) { - damageAmount -= ArmorUtil.getVanillaArmorReduction(armorInstance); - armorInstance.damage(initialDamage, null); - if (armorInstance.count <= 0) { - armor[i] = null; - } - } - if (damageAmount < 0) { - damageAmount = 0; - } - } - } - ((PlayerBaseSuper) player).superDamageEntity((int) damageAmount); - return true; - } - } -} diff --git a/station-armor-api-v0/src/main/resources/fabric.mod.json b/station-armor-api-v0/src/main/resources/fabric.mod.json index 09a726049..c8ed29904 100644 --- a/station-armor-api-v0/src/main/resources/fabric.mod.json +++ b/station-armor-api-v0/src/main/resources/fabric.mod.json @@ -19,9 +19,6 @@ "environment": "*", "entrypoints": { - "stationapi:event_bus": [ - "net.modificationstation.stationapi.impl.item.CustomArmorValuesImpl" - ] }, "mixins": [ "station-armor-api-v0.mixins.json" diff --git a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerBaseSettersGetters.java b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerBaseSettersGetters.java deleted file mode 100644 index 19baffb06..000000000 --- a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerBaseSettersGetters.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.modificationstation.stationapi.api.entity.player; - -import java.util.Random; - -public interface PlayerBaseSettersGetters { - - void doFall(float fallDist); - - float getFallDistance(); - - void setFallDistance(float f); - - boolean getSleeping(); - - boolean getJumping(); - - void doJump(); - - Random getRandom(); - - void setYSize(float f); - - void setActionState(float newMoveStrafing, float newMoveForward, boolean newIsJumping); - - void setMoveForward(float value); - - void setMoveStrafing(float value); - - void setIsJumping(boolean value); -} diff --git a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerBaseSuper.java b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerBaseSuper.java deleted file mode 100644 index bad38f03d..000000000 --- a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerBaseSuper.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.modificationstation.stationapi.api.entity.player; - -import net.minecraft.block.Material; -import net.minecraft.entity.Entity; - -public interface PlayerBaseSuper { - void superMoveFlying(float f, float f1, float f2); - - boolean superIsInsideOfMaterial(Material material); - - float superGetEntityBrightness(float f); - - String superGetHurtSound(); - - void superFall(float f); - - void superJump(); - - void superDamageEntity(int i); - - double superGetDistanceSqToEntity(Entity entity); - - boolean superHandleWaterMovement(); - - boolean superHandleLavaMovement(); - - void superUpdatePlayerActionState(); -} diff --git a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerHandler.java b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerHandler.java deleted file mode 100644 index 004a7b890..000000000 --- a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerHandler.java +++ /dev/null @@ -1,206 +0,0 @@ -package net.modificationstation.stationapi.api.entity.player; - -import net.minecraft.block.Block; -import net.minecraft.block.Material; -import net.minecraft.block.SignBlock; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.block.entity.FurnaceBlockEntity; -import net.minecraft.class_141; -import net.minecraft.entity.Entity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; - -public interface PlayerHandler { - - default boolean onLivingUpdate() { - return false; - } - - default boolean updatePlayerActionState() { - return false; - } - - default boolean handleKeyPress(int i, boolean flag) { - return false; - } - - default boolean writeEntityBaseToNBT(NbtCompound tag) { - return false; - } - - default boolean readEntityBaseFromNBT(NbtCompound tag) { - return false; - } - - default boolean setEntityBaseDead() { - return false; - } - - default boolean onDeath(Entity killer) { - return false; - } - - default boolean respawn() { - return false; - } - - default boolean attackEntityBaseFrom(Entity attacker, int damage) { - return false; - } - - default double getDistanceSq(double d, double d1, double d2, double answer) { - return answer; - } - - default boolean isInWater(boolean inWater) { - return inWater; - } - - default boolean onExitGUI() { - return false; - } - - default boolean heal(int i) { - return false; - } - - default boolean canTriggerWalking(boolean canTrigger) { - return canTrigger; - } - - default int getPlayerArmorValue(int armor) { - return armor; - } - - default float getCurrentPlayerStrVsBlock(Block block, float f) { - return f; - } - - default boolean moveFlying(float x, float y, float z) { - return false; - } - - default boolean moveEntityBase(double x, double y, double d) { - return false; - } - - default class_141 sleepInBedAt(int x, int y, int z, class_141 status) { - return status; - } - - default float getEntityBaseBrightness(float f, float brightness) { - return brightness; - } - - default boolean pushOutOfBlocks(double x, double y, double d) { - return false; - } - - default boolean onUpdate() { - return false; - } - - default void afterUpdate() { - } - - default boolean moveEntityBaseWithHeading(float f, float f1) { - return false; - } - - default boolean isOnLadder(boolean onLadder) { - return onLadder; - } - - default boolean isInsideOfMaterial(Material material, boolean inMaterial) { - return inMaterial; - } - - default boolean isSneaking(boolean sneaking) { - return sneaking; - } - - default boolean dropCurrentItem() { - return false; - } - - default boolean dropPlayerItem(ItemStack itemstack) { - return false; - } - - default boolean displayGUIEditSign(SignBlock sign) { - return false; - } - - default boolean displayGUIChest(Inventory iinventory) { - return false; - } - - default boolean displayWorkbenchGUI(int i, int j, int k) { - return false; - } - - default boolean displayGUIFurnace(FurnaceBlockEntity furnace) { - return false; - } - - default boolean displayGUIDispenser(DispenserBlockEntity dispenser) { - return false; - } - - default boolean sendChatMessage(String s) { - return false; - } - - default String getHurtSound(String previous) { - return null; - } - - default Boolean canHarvestBlock(Block block, Boolean previous) { - return null; - } - - default boolean fall(float f) { - return false; - } - - default boolean jump() { - return false; - } - - default boolean damageEntityBase(int i) { - return false; - } - - default Double getDistanceSqToEntityBase(Entity EntityBase, Double previous) { - return null; - } - - default boolean attackTargetEntityBaseWithCurrentItem(Entity EntityBase) { - return false; - } - - default Boolean handleWaterMovement(Boolean previous) { - return null; - } - - default Boolean handleLavaMovement(Boolean previous) { - return null; - } - - default boolean dropPlayerItemWithRandomChoice(ItemStack itemstack, boolean flag) { - return false; - } - - default void beforeUpdate() { - } - - default void beforeMoveEntityBase(double d3, double d4, double d5) { - } - - default void afterMoveEntityBase(double d3, double d4, double d5) { - } - - default void beforeSleepInBedAt(int l, int i1, int j1) { - } -} diff --git a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerHandlerContainer.java b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerHandlerContainer.java deleted file mode 100644 index 8039962f4..000000000 --- a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerHandlerContainer.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.modificationstation.stationapi.api.entity.player; - -import java.util.List; - -public interface PlayerHandlerContainer { - - List getPlayerHandlers(); -} \ No newline at end of file diff --git a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/PlayerEvent.java b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/PlayerEvent.java index bdc0e7ea8..b9221b027 100644 --- a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/PlayerEvent.java +++ b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/PlayerEvent.java @@ -6,9 +6,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.hit.HitResultType; import net.modificationstation.stationapi.api.StationAPI; -import net.modificationstation.stationapi.api.entity.player.PlayerHandler; - -import java.util.List; @SuperBuilder public abstract class PlayerEvent extends Event { @@ -20,10 +17,4 @@ public static class Reach extends PlayerEvent { public final HitResultType type; public double currentReach; } - - @SuperBuilder - @EventPhases(StationAPI.INTERNAL_PHASE) - public static class HandlerRegister extends PlayerEvent { - public final List playerHandlers; - } } diff --git a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/PlayerAPI.java b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/PlayerAPI.java deleted file mode 100644 index 80320deb8..000000000 --- a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/PlayerAPI.java +++ /dev/null @@ -1,523 +0,0 @@ -package net.modificationstation.stationapi.impl.entity.player; - -import net.minecraft.block.Block; -import net.minecraft.block.Material; -import net.minecraft.block.SignBlock; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.block.entity.FurnaceBlockEntity; -import net.minecraft.class_141; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.modificationstation.stationapi.api.entity.player.PlayerHandler; -import net.modificationstation.stationapi.api.entity.player.PlayerHandlerContainer; - -public class PlayerAPI { - - public static PlayerHandler getPlayerHandler(PlayerEntity player, Class pb) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (pb.isInstance(((PlayerHandlerContainer) player).getPlayerHandlers().get(i))) { - return ((PlayerHandlerContainer) player).getPlayerHandlers().get(i); - } - } - return null; - } - - public static boolean onLivingUpdate(PlayerEntity player) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).onLivingUpdate()) { - override = true; - } - } - - return override; - } - - public static boolean respawn(PlayerEntity player) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).respawn()) { - override = true; - } - } - - return override; - } - - public static boolean moveFlying(PlayerEntity player, float x, float y, float z) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).moveFlying(x, y, z)) { - override = true; - } - } - - return override; - } - - public static boolean updatePlayerActionState(PlayerEntity player) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).updatePlayerActionState()) { - override = true; - } - } - - return override; - } - - public static boolean handleKeyPress(PlayerEntity player, int j, boolean flag) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).handleKeyPress(j, flag)) { - override = true; - } - } - - return override; - } - - public static boolean writeEntityToNBT(PlayerEntity player, NbtCompound tag) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).writeEntityBaseToNBT(tag)) { - override = true; - } - } - - return override; - } - - public static boolean readEntityFromNBT(PlayerEntity player, NbtCompound tag) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).readEntityBaseFromNBT(tag)) { - override = true; - } - } - - return override; - } - - public static boolean onExitGUI(PlayerEntity player) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).onExitGUI()) { - override = true; - } - } - - return override; - } - - public static boolean setEntityDead(PlayerEntity player) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).setEntityBaseDead()) { - override = true; - } - } - - return override; - } - - public static boolean onDeath(PlayerEntity player, Entity killer) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).onDeath(killer)) { - override = true; - } - } - - return override; - } - - public static boolean attackEntityFrom(PlayerEntity player, Entity attacker, int damage) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).attackEntityBaseFrom(attacker, damage)) { - override = true; - } - } - - return override; - } - - public static double getDistanceSq(PlayerEntity player, double d, double d1, double d2, double answer) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - answer = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).getDistanceSq(d, d1, d2, answer); - } - - return answer; - } - - public static boolean isInWater(PlayerEntity player, boolean inWater) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - inWater = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).isInWater(inWater); - } - - return inWater; - } - - public static boolean canTriggerWalking(PlayerEntity player, boolean canTrigger) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - canTrigger = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).canTriggerWalking(canTrigger); - } - - return canTrigger; - } - - public static boolean heal(PlayerEntity player, int j) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).heal(j)) { - override = true; - } - } - - return override; - } - - public static int getPlayerArmorValue(PlayerEntity player, int armor) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - armor = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).getPlayerArmorValue(armor); - } - - return armor; - } - - public static float getCurrentPlayerStrVsBlock(PlayerEntity player, Block block, float f) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - f = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).getCurrentPlayerStrVsBlock(block, f); - } - - return f; - } - - public static boolean moveEntity(PlayerEntity player, double d, double d1, double d2) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).moveEntityBase(d, d1, d2)) { - override = true; - } - } - - return override; - } - - public static class_141 sleepInBedAt(PlayerEntity player, int x, int y, int z) { - class_141 status = null; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - status = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).sleepInBedAt(x, y, z, status); - } - - return status; - } - - public static float getEntityBrightness(PlayerEntity player, float f, float brightness) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - f = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).getEntityBaseBrightness(f, brightness); - } - - return f; - } - - public static boolean pushOutOfBlocks(PlayerEntity player, double d, double d1, double d2) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).pushOutOfBlocks(d, d1, d2)) { - override = true; - } - } - - return override; - } - - public static boolean onUpdate(PlayerEntity player) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).onUpdate()) { - override = true; - } - } - - return override; - } - - public static void afterUpdate(PlayerEntity player) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).afterUpdate(); - } - - } - - public static boolean moveEntityWithHeading(PlayerEntity player, float f, float f1) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).moveEntityBaseWithHeading(f, f1)) { - override = true; - } - } - - return override; - } - - public static boolean isOnLadder(PlayerEntity player, boolean onLadder) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - onLadder = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).isOnLadder(onLadder); - } - - return onLadder; - } - - public static boolean isInsideOfMaterial(PlayerEntity player, Material material, boolean inMaterial) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - inMaterial = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).isInsideOfMaterial(material, inMaterial); - } - - return inMaterial; - } - - public static boolean isSneaking(PlayerEntity player, boolean sneaking) { - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - sneaking = ((PlayerHandlerContainer) player).getPlayerHandlers().get(i).isSneaking(sneaking); - } - - return sneaking; - } - - public static boolean dropCurrentItem(PlayerEntity player) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).dropCurrentItem()) { - override = true; - } - } - - return override; - } - - public static boolean dropPlayerItem(PlayerEntity player, ItemStack itemstack) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).dropPlayerItem(itemstack)) { - override = true; - } - } - - return override; - } - - public static boolean displayGUIEditSign(PlayerEntity player, SignBlock sign) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).displayGUIEditSign(sign)) { - override = true; - } - } - - return override; - } - - public static boolean displayGUIChest(PlayerEntity player, Inventory inventory) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).displayGUIChest(inventory)) { - override = true; - } - } - - return override; - } - - public static boolean displayWorkbenchGUI(PlayerEntity player, int i, int j, int k) { - boolean override = false; - for (int n = 0; n < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); n++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(n).displayWorkbenchGUI(i, j, k)) { - override = true; - } - } - - return override; - } - - public static boolean displayGUIFurnace(PlayerEntity player, FurnaceBlockEntity furnace) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).displayGUIFurnace(furnace)) { - override = true; - } - } - - return override; - } - - public static boolean displayGUIDispenser(PlayerEntity player, DispenserBlockEntity dispenser) { - boolean override = false; - for (int i = 0; i < ((PlayerHandlerContainer) player).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) player).getPlayerHandlers().get(i).displayGUIDispenser(dispenser)) { - override = true; - } - } - - return override; - } - - public static boolean sendChatMessage(PlayerEntity PlayerBase, String s) { - boolean flag = false; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).sendChatMessage(s)) { - flag = true; - } - } - - return flag; - } - - public static String getHurtSound(PlayerEntity PlayerBase) { - String result = null; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - String baseResult = ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).getHurtSound(result); - if (baseResult != null) { - result = baseResult; - } - } - - return result; - } - - public static Boolean canHarvestBlock(PlayerEntity PlayerBase, Block block) { - Boolean result = null; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - Boolean baseResult = ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).canHarvestBlock(block, result); - if (baseResult != null) { - result = baseResult; - } - } - - return result; - } - - public static boolean fall(PlayerEntity PlayerBase, float f) { - boolean flag = false; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).fall(f)) { - flag = true; - } - } - - return flag; - } - - public static boolean jump(PlayerEntity PlayerBase) { - boolean flag = false; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).jump()) { - flag = true; - } - } - - return flag; - } - - public static boolean damageEntity(PlayerEntity PlayerBase, int i1) { - boolean flag = false; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).damageEntityBase(i1)) { - flag = true; - } - } - - return flag; - } - - public static Double getDistanceSqToEntity(PlayerEntity PlayerBase, Entity entity) { - Double result = null; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - Double baseResult = ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).getDistanceSqToEntityBase(entity, result); - if (baseResult != null) { - result = baseResult; - } - } - - return result; - } - - public static boolean attackTargetEntityWithCurrentItem(PlayerEntity PlayerBase, Entity entity) { - boolean flag = false; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).attackTargetEntityBaseWithCurrentItem(entity)) { - flag = true; - } - } - - return flag; - } - - public static Boolean handleWaterMovement(PlayerEntity PlayerBase) { - Boolean result = null; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - Boolean baseResult = ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).handleWaterMovement(result); - if (baseResult != null) { - result = baseResult; - } - } - - return result; - } - - public static Boolean handleLavaMovement(PlayerEntity PlayerBase) { - Boolean result = null; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - Boolean baseResult = ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).handleLavaMovement(result); - if (baseResult != null) { - result = baseResult; - } - } - - return result; - } - - public static boolean dropPlayerItemWithRandomChoice(PlayerEntity PlayerBase, ItemStack itemstack, boolean flag1) { - boolean flag = false; - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - if (((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).dropPlayerItemWithRandomChoice(itemstack, flag1)) { - flag = true; - } - } - - return flag; - } - - public static void beforeUpdate(PlayerEntity PlayerBase) { - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).beforeUpdate(); - } - - } - - public static void beforeMoveEntity(PlayerEntity PlayerBase, double d, double d1, double d2) { - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).beforeMoveEntityBase(d, d1, d2); - } - - } - - public static void afterMoveEntity(PlayerEntity PlayerBase, double d, double d1, double d2) { - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).afterMoveEntityBase(d, d1, d2); - } - - } - - public static void beforeSleepInBedAt(PlayerEntity PlayerBase, int i1, int j, int k) { - for (int i = 0; i < ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().size(); i++) { - ((PlayerHandlerContainer) PlayerBase).getPlayerHandlers().get(i).beforeSleepInBedAt(i1, j, k); - } - - } - -} diff --git a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/mixin/player/PlayerEntityMixin.java b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/mixin/player/PlayerEntityMixin.java deleted file mode 100644 index 0a82daa73..000000000 --- a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/mixin/player/PlayerEntityMixin.java +++ /dev/null @@ -1,494 +0,0 @@ -package net.modificationstation.stationapi.mixin.player; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.Block; -import net.minecraft.block.Material; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.block.entity.FurnaceBlockEntity; -import net.minecraft.class_141; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.world.World; -import net.modificationstation.stationapi.api.StationAPI; -import net.modificationstation.stationapi.api.entity.player.PlayerBaseSettersGetters; -import net.modificationstation.stationapi.api.entity.player.PlayerBaseSuper; -import net.modificationstation.stationapi.api.entity.player.PlayerHandler; -import net.modificationstation.stationapi.api.entity.player.PlayerHandlerContainer; -import net.modificationstation.stationapi.api.event.entity.player.PlayerEvent; -import net.modificationstation.stationapi.impl.entity.player.PlayerAPI; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -@Mixin(PlayerEntity.class) -class PlayerEntityMixin extends LivingEntity implements PlayerBaseSettersGetters, PlayerHandlerContainer, PlayerBaseSuper { - @Shadow - public PlayerInventory inventory; - @Shadow - protected boolean sleeping; - @Unique - private List playerBases; - - private PlayerEntityMixin(World world) { - super(world); - } - - @Override - public List getPlayerHandlers() { - if (playerBases == null) { - playerBases = new ArrayList<>(); - StationAPI.EVENT_BUS.post( - PlayerEvent.HandlerRegister.builder() - .player((PlayerEntity) (Object) this) - .playerHandlers(playerBases) - .build() - ); - } - return playerBases; - } - - @Inject( - method = "method_910", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onUpdatePlayerActionState(CallbackInfo ci) { - if (PlayerAPI.updatePlayerActionState((PlayerEntity) (Object) this)) - ci.cancel(); - } - - @Inject( - method = "writeNbt", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onWriteEntityToNBT(NbtCompound nbtTagCompound, CallbackInfo ci) { - if (PlayerAPI.writeEntityToNBT((PlayerEntity) (Object) this, nbtTagCompound)) - ci.cancel(); - } - - @Inject( - method = "readNbt", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onReadEntityFromNBT(NbtCompound nbtTagCompound, CallbackInfo ci) { - if (PlayerAPI.readEntityFromNBT((PlayerEntity) (Object) this, nbtTagCompound)) - ci.cancel(); - } - - @Inject( - method = "closeScreen", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onCloseScreen(CallbackInfo ci) { - if (PlayerAPI.onExitGUI((PlayerEntity) (Object) this)) - ci.cancel(); - } - - @Inject( - method = "method_486", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onDisplayGUIChest(Inventory iInventory, CallbackInfo ci) { - if (PlayerAPI.displayGUIChest((PlayerEntity) (Object) this, iInventory)) - ci.cancel(); - } - - @Inject( - method = "method_484", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onDisplayWorkbenchGUI(int i, int i1, int i2, CallbackInfo ci) { - if (PlayerAPI.displayWorkbenchGUI((PlayerEntity) (Object) this, i, i1, i2)) - ci.cancel(); - } - - @Inject( - method = "method_487", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onDisplayGUIFurnace(FurnaceBlockEntity tileEntityFurnace, CallbackInfo ci) { - if (PlayerAPI.displayGUIFurnace((PlayerEntity) (Object) this, tileEntityFurnace)) - ci.cancel(); - } - - @Inject( - method = "method_485", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onDisplayGUIDispenser(DispenserBlockEntity tileEntityDispenser, CallbackInfo ci) { - if (PlayerAPI.displayGUIDispenser((PlayerEntity) (Object) this, tileEntityDispenser)) - ci.cancel(); - } - - @Override - public void method_1340(double v, double v1, double v2) { - if (PlayerAPI.moveEntity((PlayerEntity) (Object) this, v, v1, v2)) - return; - super.method_1340(v, v1, v2); - } - - @Inject( - method = "method_511", - at = @At("RETURN"), - cancellable = true - ) - private void stationapi_getStrength(Block arg, CallbackInfoReturnable cir) { - cir.setReturnValue(PlayerAPI.getCurrentPlayerStrVsBlock((PlayerEntity) (Object) this, arg, cir.getReturnValue())); - } - - @Override - public void method_939(int i) { - if (!PlayerAPI.heal(((PlayerEntity) (Object) this), i)) - super.method_939(i); - } - - @Environment(EnvType.CLIENT) - @Inject( - method = "respawn", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onRespawnPlayer(CallbackInfo ci) { - if (PlayerAPI.respawn((PlayerEntity) (Object) this)) - ci.cancel(); - } - - @Inject( - method = "method_937", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_onLivingUpdate(CallbackInfo ci) { - if (PlayerAPI.onLivingUpdate((PlayerEntity) (Object) this)) - ci.cancel(); - } - - @Inject( - method = "tick()V", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_beforeTick(CallbackInfo ci) { - PlayerAPI.beforeUpdate((PlayerEntity) (Object) this); - if (PlayerAPI.onUpdate((PlayerEntity) (Object) this)) - ci.cancel(); - } - - @Inject( - method = "tick()V", - at = @At("RETURN") - ) - private void afterTick(CallbackInfo ci) { - PlayerAPI.afterUpdate((PlayerEntity) (Object) this); - } - - @Override - public void superMoveFlying(float f, float f1, float f2) { - super.method_1324(f, f1, f2); - } - - @Override - public void move(double v, double v1, double v2) { - PlayerAPI.beforeMoveEntity((PlayerEntity) (Object) this, v, v1, v2); - if (!PlayerAPI.moveEntity((PlayerEntity) (Object) this, v, v1, v2)) { - super.move(v, v1, v2); - } - PlayerAPI.afterMoveEntity((PlayerEntity) (Object) this, v, v1, v2); - } - - @Inject( - method = "method_495", - at = @At("HEAD"), - cancellable = true - ) - public void stationapi_trySleep(int i, int i1, int i2, CallbackInfoReturnable cir) { - PlayerAPI.beforeSleepInBedAt((PlayerEntity) (Object) this, i, i1, i2); - class_141 enumstatus = PlayerAPI.sleepInBedAt((PlayerEntity) (Object) this, i, i1, i2); - if (enumstatus != null) - cir.setReturnValue(enumstatus); - } - - @Override - public void doFall(float fallDist) { - this.method_1389(fallDist); - } - - @Override - public float getFallDistance() { - return field_1636; - } - - @Override - public void setFallDistance(float f) { - field_1636 = f; - } - - @Override - public boolean getSleeping() { - return sleeping; - } - - @Override - public boolean getJumping() { - return jumping; - } - - @Override - public void doJump() { - method_944(); - } - - @Override - public Random getRandom() { - return random; - } - - @Override - public void setYSize(float f) { - eyeHeight = f; - } - - @Inject( - method = "method_945", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_travel(float f, float f1, CallbackInfo ci) { - if (PlayerAPI.moveEntityWithHeading((PlayerEntity) (Object) this, f, f1)) - ci.cancel(); - } - - @Override - public boolean method_932() { - return PlayerAPI.isOnLadder((PlayerEntity) (Object) this, super.method_932()); - } - - @Override - public void setActionState(float newMoveStrafing, float newMoveForward, boolean newIsJumping) { - setMoveStrafing(newMoveStrafing); - setMoveForward(newMoveForward); - setIsJumping(newIsJumping); - } - - @Override - public boolean isInFluid(Material material) { - return PlayerAPI.isInsideOfMaterial((PlayerEntity) (Object) this, material, super.isInFluid(material)); - } - - @Inject( - method = "dropSelectedItem()V", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_dropSelectedItem(CallbackInfo ci) { - if (PlayerAPI.dropCurrentItem((PlayerEntity) (Object) this)) - ci.cancel(); - } - - @Inject( - method = "dropItem(Lnet/minecraft/item/ItemStack;)V", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_dropItem(ItemStack arg, CallbackInfo ci) { - if (PlayerAPI.dropPlayerItem((PlayerEntity) (Object) this, arg)) - ci.cancel(); - } - - @Override - public boolean superIsInsideOfMaterial(Material material) { - return super.isInFluid(material); - } - - @Override - public float superGetEntityBrightness(float f) { - return super.method_1394(f); - } - - @Override - public String method_912() { - String hurtSound = PlayerAPI.getHurtSound((PlayerEntity) (Object) this); - if (hurtSound != null) { - return hurtSound; - } - return super.method_912(); - } - - @Override - public String superGetHurtSound() { - return super.method_912(); - } - - @Inject( - method = "method_514", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_canRemoveBlock(Block arg, CallbackInfoReturnable cir) { - Boolean canHarvestBlock = PlayerAPI.canHarvestBlock((PlayerEntity) (Object) this, arg); - if (canHarvestBlock != null) - cir.setReturnValue(canHarvestBlock); - } - - @Override - public void method_1389(float f) { - if (!PlayerAPI.fall((PlayerEntity) (Object) this, f)) { - super.method_1389(f); - } - } - - @Inject( - method = "method_1389", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_handleFallDamage(float height, CallbackInfo ci) { - if (PlayerAPI.fall((PlayerEntity) (Object) this, height)) - ci.cancel(); - } - - @Override - public void superFall(float f) { - super.method_1389(f); - } - - @Inject( - method = "method_944", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_jump(CallbackInfo ci) { - if (PlayerAPI.jump((PlayerEntity) (Object) this)) - ci.cancel(); - } - - @Override - public void superJump() { - super.method_944(); - } - - @Override - public void superDamageEntity(int i) { - super.method_946(i); - } - - @Override - public double method_1352(Entity entity) { - Double result = PlayerAPI.getDistanceSqToEntity((PlayerEntity) (Object) this, entity); - if (result != null) - return result; - return super.method_1352(entity); - } - - @Override - public double superGetDistanceSqToEntity(Entity entity) { - return super.method_1352(entity); - } - - // ??? - /*public void superAttackTargetEntityWithCurrentItem(EntityBase entity) { - super.attack(entity); - }*/ - - @Inject( - method = "attack", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_attackTargetEntityWithCurrentItem(Entity arg, CallbackInfo ci) { - if (PlayerAPI.attackTargetEntityWithCurrentItem((PlayerEntity) (Object) this, arg)) - ci.cancel(); - } - - @Override - public boolean isSubmergedInWater() { - Boolean result = PlayerAPI.handleWaterMovement((PlayerEntity) (Object) this); - if (result != null) - return result; - return super.isSubmergedInWater(); - } - - @Override - public boolean superHandleWaterMovement() { - return super.isSubmergedInWater(); - } - - @Override - public boolean method_1335() { - Boolean result = PlayerAPI.handleLavaMovement((PlayerEntity) (Object) this); - if (result != null) - return result; - return super.method_1335(); - } - - @Override - public boolean superHandleLavaMovement() { - return super.method_1335(); - } - - // ??? - /*public void superDropPlayerItemWithRandomChoice(ItemInstance itemstack, boolean flag) { - super.dropItem(itemstack, flag); - }*/ - - @Inject( - method = "dropItem(Lnet/minecraft/item/ItemStack;Z)V", - at = @At("HEAD"), - cancellable = true - ) - public void stationapi_dropPlayerItemWithRandomChoice(ItemStack arg, boolean flag, CallbackInfo ci) { - if (PlayerAPI.dropPlayerItemWithRandomChoice((PlayerEntity) (Object) this, arg, flag)) - ci.cancel(); - } - - @Inject( - method = "method_946", - at = @At("HEAD"), - cancellable = true - ) - private void stationapi_applyDamage(int initialDamage, CallbackInfo ci) { - if (PlayerAPI.damageEntity((PlayerEntity) (Object) this, initialDamage)) - ci.cancel(); - } - - @Override - public void superUpdatePlayerActionState() { - super.method_910(); - } - - @Override - public void setMoveForward(float value) { - this.field_1060 = value; - } - - @Override - public void setMoveStrafing(float value) { - this.field_1029 = value; - } - - @Override - public void setIsJumping(boolean value) { - this.jumping = value; - } -} diff --git a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/mixin/player/client/ClientPlayerEntityMixin.java b/station-player-api-v0/src/main/java/net/modificationstation/stationapi/mixin/player/client/ClientPlayerEntityMixin.java deleted file mode 100644 index 9e2745e5d..000000000 --- a/station-player-api-v0/src/main/java/net/modificationstation/stationapi/mixin/player/client/ClientPlayerEntityMixin.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.modificationstation.stationapi.mixin.player.client; - -import net.minecraft.entity.player.ClientPlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.modificationstation.stationapi.impl.entity.player.PlayerAPI; -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.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(ClientPlayerEntity.class) -class ClientPlayerEntityMixin { - @Inject(method = "method_136", at = @At("HEAD"), cancellable = true) - private void stationapi_onHandleKeyPress(int i, boolean b, CallbackInfo ci) { - if (PlayerAPI.handleKeyPress((ClientPlayerEntity) (Object) this, i, b)) - ci.cancel(); - } - - @Redirect(method = "method_141", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerInventory;method_687()I")) - private int stationapi_redirectGetPlayerArmorValue(PlayerInventory inventoryPlayer) { - return PlayerAPI.getPlayerArmorValue((ClientPlayerEntity) (Object) this, inventoryPlayer.method_687()); - } - - @Inject(method = "method_1373", at = @At("RETURN"), cancellable = true) - private void stationapi_isSneaking(CallbackInfoReturnable cir) { - cir.setReturnValue(PlayerAPI.isSneaking((ClientPlayerEntity) (Object) this, cir.getReturnValue())); - } - - @Inject(method = "pushOutOfBlock", at = @At("HEAD"), cancellable = true) - private void stationapi_injectPushOutOfBlocks(double v, double v1, double v2, CallbackInfoReturnable cir) { - if (PlayerAPI.pushOutOfBlocks((ClientPlayerEntity) (Object) this, v, v1, v2)) - cir.setReturnValue(false); - } - - @Inject(method = "sendChatMessage(Ljava/lang/String;)V", at = @At("HEAD")) - private void stationapi_sendChatMessage(String string, CallbackInfo ci) { - PlayerAPI.sendChatMessage((ClientPlayerEntity) (Object) this, string); - } - - // ??? - /*public float superGetCurrentPlayerStrVsBlock(BlockBase block) { - return super.getStrengh(block); - }*/ -} diff --git a/station-player-api-v0/src/main/resources/station-player-api-v0.mixins.json b/station-player-api-v0/src/main/resources/station-player-api-v0.mixins.json index 4db4834fd..f540ebaed 100644 --- a/station-player-api-v0/src/main/resources/station-player-api-v0.mixins.json +++ b/station-player-api-v0/src/main/resources/station-player-api-v0.mixins.json @@ -3,15 +3,9 @@ "minVersion": "0.8", "package": "net.modificationstation.stationapi.mixin.player", "compatibilityLevel": "JAVA_17", - "mixins": [ - "PlayerEntityMixin" - ], "server": [ "server.ServerPlayNetworkHandlerAccessor" ], - "client": [ - "client.ClientPlayerEntityMixin" - ], "injectors": { "defaultRequire": 1 } From e8f2f815c63ace85f11e292dce078b6f7578ed40 Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Sat, 28 Dec 2024 23:57:15 +0500 Subject: [PATCH 03/27] Removed Indigo renderer (#140) --- .../api/client/render/RenderContext.java | 75 ------ .../api/client/render/Renderer.java | 40 --- .../api/client/render/material/BlendMode.java | 37 --- .../render/material/MaterialFinder.java | 71 ----- .../render/material/RenderMaterial.java | 71 ----- .../api/client/render/mesh/Mesh.java | 24 -- .../api/client/render/mesh/MeshBuilder.java | 21 -- .../client/render/mesh/MutableQuadView.java | 214 --------------- .../api/client/render/mesh/QuadEmitter.java | 158 ------------ .../api/client/render/mesh/QuadView.java | 187 -------------- .../api/client/render/model/BakedModel.java | 96 ------- .../render/model/ForwardingBakedModel.java | 17 -- .../api/client/render/model/ModelHelper.java | 113 -------- .../render/model/MultipartBakedModel.java | 46 ---- .../api/client/render/model/SpriteFinder.java | 51 ---- .../render/model/WeightedBakedModel.java | 32 --- .../client/texture/SpriteAtlasTexture.java | 14 +- .../impl/client/render/SpriteFinderImpl.java | 130 ---------- .../arsenic/renderer/ArsenicRenderer.java | 39 --- .../arsenic/renderer/RenderMaterialImpl.java | 126 --------- .../aocalc/LightingCalculatorImpl.java | 15 +- .../arsenic/renderer/helper/ColorHelper.java | 59 ----- .../renderer/helper/GeometryHelper.java | 222 ---------------- .../arsenic/renderer/helper/NormalHelper.java | 99 ------- .../renderer/helper/TextureHelper.java | 94 ------- .../arsenic/renderer/mesh/EncodingFormat.java | 121 --------- .../renderer/mesh/MeshBuilderImpl.java | 64 ----- .../arsenic/renderer/mesh/MeshImpl.java | 46 ---- .../renderer/mesh/MutableQuadViewImpl.java | 151 ----------- .../arsenic/renderer/mesh/QuadViewImpl.java | 243 ------------------ .../renderer/render/AbstractMeshConsumer.java | 113 -------- .../renderer/render/AbstractQuadRenderer.java | 146 ----------- .../render/AbstractRenderContext.java | 63 ----- .../render/BakedModelRendererImpl.java | 84 +++--- .../renderer/render/BlockRenderContext.java | 97 ------- .../renderer/render/BlockRenderInfo.java | 89 ------- .../renderer/render/ItemRenderContext.java | 211 --------------- .../renderer/render/VanillaModelsAdapter.java | 25 -- .../src/main/resources/fabric.mod.json | 3 +- 39 files changed, 40 insertions(+), 3467 deletions(-) delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/RenderContext.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/BlendMode.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/MaterialFinder.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/RenderMaterial.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/Mesh.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/MeshBuilder.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/MutableQuadView.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/QuadEmitter.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/QuadView.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ModelHelper.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/SpriteFinder.java delete mode 100644 station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/SpriteFinderImpl.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/RenderMaterialImpl.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/ColorHelper.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/GeometryHelper.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/NormalHelper.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/TextureHelper.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/EncodingFormat.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MeshBuilderImpl.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MeshImpl.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MutableQuadViewImpl.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/QuadViewImpl.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractMeshConsumer.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractQuadRenderer.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractRenderContext.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BlockRenderContext.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BlockRenderInfo.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/ItemRenderContext.java delete mode 100644 station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/VanillaModelsAdapter.java diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/RenderContext.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/RenderContext.java deleted file mode 100644 index f4e8a8f4b..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/RenderContext.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.modificationstation.stationapi.api.client.render; - -import net.modificationstation.stationapi.api.client.render.mesh.Mesh; -import net.modificationstation.stationapi.api.client.render.mesh.MeshBuilder; -import net.modificationstation.stationapi.api.client.render.mesh.MutableQuadView; -import net.modificationstation.stationapi.api.client.render.mesh.QuadEmitter; -import net.modificationstation.stationapi.api.client.render.model.BakedModel; - -import java.util.function.Consumer; - -/** - * This defines the instance made available to models for buffering vertex data at render time. - * - *

Only the renderer should implement or extend this interface. - */ -public interface RenderContext { - /** - * Used by models to send vertex data previously baked via {@link MeshBuilder}. - * The fastest option and preferred whenever feasible. - */ - Consumer meshConsumer(); - - /** - * Fabric causes vanilla baked models to send themselves - * via this interface. Can also be used by compound models that contain a mix - * of vanilla baked models, packaged quads and/or dynamic elements. - */ - Consumer fallbackConsumer(); - - /** - * Returns a {@link QuadEmitter} instance that emits directly to the render buffer. - * It remains necessary to call {@link QuadEmitter#emit()} to output the quad. - * - *

This method will always be less performant than passing pre-baked meshes - * via {@link #meshConsumer()}. It should be used sparingly for model components that - * demand it - text, icons, dynamic indicators, or other elements that vary too - * much for static baking to be feasible. - * - *

Calling this method invalidates any {@link QuadEmitter} returned earlier. - * Will be threadlocal/re-used - do not retain references. - */ - QuadEmitter getEmitter(); - - /** - * Causes all models/quads/meshes sent to this consumer to be transformed by the provided - * {@link QuadTransform} that edits each quad before buffering. Quads in the mesh will - * be passed to the {@link QuadTransform} for modification before offsets, face culling or lighting are applied. - * Meant for animation and mesh customization. - * - *

You MUST call {@link #popTransform()} after model is done outputting quads. - * - *

More than one transformer can be added to the context. Transformers are applied in reverse order. - * (Last pushed is applied first.) - * - *

Meshes are never mutated by the transformer - only buffered quads. This ensures thread-safe - * use of meshes/models across multiple chunk builders. - */ - void pushTransform(QuadTransform transform); - - /** - * Removes the transformation added by the last call to {@link #pushTransform(QuadTransform)}. - * MUST be called before exiting from {@link BakedModel} .emit... methods. - */ - void popTransform(); - - @FunctionalInterface - interface QuadTransform { - - /** - * Return false to filter out quads from rendering. When more than one transform - * is in effect, returning false means unapplied transforms will not receive the quad. - */ - boolean transform(MutableQuadView quad); - } -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/Renderer.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/Renderer.java index 796d07013..0b6259d94 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/Renderer.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/Renderer.java @@ -1,11 +1,6 @@ package net.modificationstation.stationapi.api.client.render; -import net.modificationstation.stationapi.api.client.render.material.MaterialFinder; -import net.modificationstation.stationapi.api.client.render.material.RenderMaterial; -import net.modificationstation.stationapi.api.client.render.mesh.MeshBuilder; import net.modificationstation.stationapi.api.client.render.model.BakedModelRenderer; -import net.modificationstation.stationapi.api.util.Identifier; -import org.jetbrains.annotations.Nullable; /** * Interface for rendering plug-ins that provide enhanced capabilities @@ -13,41 +8,6 @@ * enhanced model rendering interfaces specified by the Fabric API. */ public interface Renderer { - /** - * Obtain a new {@link MeshBuilder} instance used to create - * baked models with enhanced features. - * - *

Renderer does not retain a reference to returned instances and they should be re-used for - * multiple models when possible to avoid memory allocation overhead. - */ - MeshBuilder meshBuilder(); - - /** - * Obtain a new {@link MaterialFinder} instance used to retrieve - * standard {@link RenderMaterial} instances. - * - *

Renderer does not retain a reference to returned instances and they should be re-used for - * multiple materials when possible to avoid memory allocation overhead. - */ - MaterialFinder materialFinder(); - - /** - * Return a material previously registered via {@link #registerMaterial(Identifier, RenderMaterial)}. - * Will return null if no material was found matching the given identifier. - */ - @Nullable - RenderMaterial materialById(Identifier id); - - /** - * Register a material for re-use by other mods or models within a mod. - * The registry does not persist registrations - mods must create and register - * all materials at game initialization. - * - *

Returns false if a material with the given identifier is already present, - * leaving the existing material intact. - */ - boolean registerMaterial(Identifier id, RenderMaterial material); - /** * Obtain a new {@link BakedModelRenderer} instance used to render * baked models. diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/BlendMode.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/BlendMode.java deleted file mode 100644 index 68db3ee17..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/BlendMode.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.material; - -/** - * Defines how sprite pixels will be blended with the scene. - */ -public enum BlendMode { - - /** - * Emulate blending behavior of {@code BlockRenderLayer} associated with the block. - */ - DEFAULT(-1), - - /** - * Fully opaque with depth test, no blending. Used for most normal blocks. - */ - SOLID(0), - - /** - * Pixels are blended with the background according to alpha colour values. Some performance cost, - * use in moderation. Texture mip-map enabled. Used for ice. - */ - TRANSLUCENT(1); - - public final int blockRenderPass; - - BlendMode(int blockRenderPass) { - this.blockRenderPass = blockRenderPass; - } - - public static BlendMode fromRenderPass(int renderPass) { - return switch (renderPass) { - case 0 -> SOLID; - case 1 -> TRANSLUCENT; - default -> DEFAULT; - }; - } -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/MaterialFinder.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/MaterialFinder.java deleted file mode 100644 index 7b0845d5c..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/MaterialFinder.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.material; - -import net.modificationstation.stationapi.api.client.render.RenderContext; -import net.modificationstation.stationapi.api.client.render.Renderer; -import net.modificationstation.stationapi.api.client.render.mesh.QuadEmitter; - -/** - * Finds standard {@link RenderMaterial} instances used to communicate - * quad rendering characteristics to a {@link RenderContext}. - * - *

Must be obtained via {@link Renderer#materialFinder()}. - */ -public interface MaterialFinder { - /** - * Returns the standard material encoding all - * of the current settings in this finder. The settings in - * this finder are not changed. - * - *

Resulting instances can and should be re-used to prevent - * needless memory allocation. {@link Renderer} implementations - * may or may not cache standard material instances. - */ - RenderMaterial find(); - - /** - * Resets this instance to default values. Values will match those - * in effect when an instance is newly obtained via {@link Renderer#materialFinder()}. - */ - MaterialFinder clear(); - - /** - * Reserved for future use. Behavior for values > 1 is currently undefined. - */ - MaterialFinder spriteDepth(int depth); - - /** - * Defines how sprite pixels will be blended with the scene. - * - *

See {@link BlendMode} for more information. - */ - MaterialFinder blendMode(int spriteIndex, BlendMode blendMode); - - /** - * Vertex color(s) will be modified for quad color index unless disabled. - */ - MaterialFinder disableColorIndex(int spriteIndex, boolean disable); - - /** - * Vertex color(s) will be modified for diffuse shading unless disabled. - */ - MaterialFinder disableDiffuse(int spriteIndex, boolean disable); - - /** - * Vertex color(s) will be modified for ambient occlusion unless disabled. - */ - MaterialFinder disableAo(int spriteIndex, boolean disable); - - /** - * When true, sprite texture and color will be rendered at full brightness. - * Lightmap values provided via {@link QuadEmitter#lightmap(int)} will be ignored. - * False by default - * - *

This is the preferred method for emissive lighting effects. Some renderers - * with advanced lighting models may not use block lightmaps and this method will - * allow per-sprite emissive lighting in future extensions that support overlay sprites. - * - *

Note that color will still be modified by diffuse shading and ambient occlusion, - * unless disabled via {@link #disableAo(int, boolean)} and {@link #disableDiffuse(int, boolean)}. - */ - MaterialFinder emissive(int spriteIndex, boolean isEmissive); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/RenderMaterial.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/RenderMaterial.java deleted file mode 100644 index 20935c16b..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/material/RenderMaterial.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.material; - -import net.modificationstation.stationapi.api.client.render.Renderer; -import net.modificationstation.stationapi.api.client.render.mesh.MeshBuilder; -import net.modificationstation.stationapi.api.client.render.mesh.MutableQuadView; -import net.modificationstation.stationapi.api.util.Identifier; - -import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; -import static net.modificationstation.stationapi.api.util.Identifier.of; - -import net.minecraft.block.Block; - -/** - * All model quads have an associated render material governing - * how the quad will be rendered. - * - *

A material instance is always immutable and thread-safe. References to a material - * remain valid until the end of the current game session. - * - *

Materials can be registered and shared between mods using {@link Renderer#registerMaterial(Identifier, RenderMaterial)}. - * The registering mod is responsible for creating each registered material at startup. - * - *

Materials are not required to know their registration identity, and two materials - * with the same attributes may or may not satisfy equality and identity tests. Model - * implementations should never attempt to analyze materials or implement control logic based on them. - * They are only tokens for communicating quad attributes to the ModelRenderer. - * - *

There are three classes of materials... - * - *

STANDARD MATERIALS - * - *

Standard materials have "normal" rendering with control over lighting, - * color, and texture blending. In the default renderer, "normal" rendering - * emulates unmodified Minecraft. Other renderers may offer a different aesthetic. - * - *

The number of standard materials is finite, but not necessarily small. - * To find a standard material, use {@link Renderer#materialFinder()}. - * - *

All renderer implementations should support standard materials. - * - *

SPECIAL MATERIALS - * - *

Special materials are implemented directly by the Renderer implementation, typically - * with the aim of providing advanced/extended features. Such materials may offer additional - * vertex attributes via extensions to {@link MeshBuilder} and {@link MutableQuadView}. - * - *

Special materials can be obtained using {@link Renderer#materialById(Identifier)} - * with a known identifier. Renderers may provide other means of access. Popular - * special materials could be implemented by multiple renderers, however there is - * no requirement that special materials be cross-compatible. - */ -public interface RenderMaterial { - /** - * This will be identical to the material that would be obtained by calling {@link MaterialFinder#find()} - * on a new, unaltered, {@link MaterialFinder} instance. It is defined here for clarity and convenience. - * - *

Quads using this material use {@link Block#getRenderLayer()} of - * the associated block to determine texture blending, honor block color index, are non-emissive, and apply both - * diffuse and ambient occlusion shading to vertex colors. - * - *

All standard, non-fluid baked models are rendered using this material. - */ - Identifier MATERIAL_STANDARD = of(NAMESPACE, "standard"); - - /** - * How many sprite color/uv coordinates are in the material. - * Behavior for values > 1 is currently undefined. - * See {@link MaterialFinder#spriteDepth(int)} - */ - int spriteDepth(); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/Mesh.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/Mesh.java deleted file mode 100644 index ce536f373..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/Mesh.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.mesh; - -import net.modificationstation.stationapi.api.client.render.Renderer; - -import java.util.function.Consumer; - -/** - * A bundle of one or more {@link QuadView} instances encoded by the renderer, - * typically via {@link Renderer#meshBuilder()}. - * - *

Similar in purpose to the {@code List} instances returned by BakedModel, but - * affords the renderer the ability to optimize the format for performance - * and memory allocation. - * - *

Only the renderer should implement or extend this interface. - */ -public interface Mesh { - /** - * Use to access all of the quads encoded in this mesh. The quad instances - * sent to the consumer will likely be threadlocal/reused and should never - * be retained by the consumer. - */ - void forEach(Consumer consumer); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/MeshBuilder.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/MeshBuilder.java deleted file mode 100644 index b7943de07..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/MeshBuilder.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.mesh; - -/** - * Decouples models from the vertex format(s) used by - * ModelRenderer to allow compatibility across diverse implementations. - */ -public interface MeshBuilder { - - /** - * Returns the {@link QuadEmitter} used to append quad to this mesh. - * Calling this method a second time invalidates any prior result. - * Do not retain references outside the context of building the mesh. - */ - QuadEmitter getEmitter(); - - /** - * Returns a new {@link Mesh} instance containing all - * quads added to this builder and resets the builder to an empty state. - */ - Mesh build(); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/MutableQuadView.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/MutableQuadView.java deleted file mode 100644 index cede9400c..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/MutableQuadView.java +++ /dev/null @@ -1,214 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.mesh; - -import net.modificationstation.stationapi.api.client.render.Renderer; -import net.modificationstation.stationapi.api.client.render.material.RenderMaterial; -import net.modificationstation.stationapi.api.client.render.model.BakedQuad; -import net.modificationstation.stationapi.api.client.texture.Sprite; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import net.modificationstation.stationapi.api.util.math.Vector2f; -import org.jetbrains.annotations.Nullable; - -/** - * A mutable {@link QuadView} instance. The base interface for - * {@link QuadEmitter} and for dynamic renders/mesh transforms. - * - *

Instances of {@link MutableQuadView} will practically always be - * threadlocal and/or reused - do not retain references. - * - *

Only the renderer should implement or extend this interface. - */ -public interface MutableQuadView extends QuadView { - /** - * Causes texture to appear with no rotation. - * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}. - */ - int BAKE_ROTATE_NONE = 0; - - /** - * Causes texture to appear rotated 90 deg. clockwise relative to nominal face. - * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}. - */ - int BAKE_ROTATE_90 = 1; - - /** - * Causes texture to appear rotated 180 deg. relative to nominal face. - * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}. - */ - int BAKE_ROTATE_180 = 2; - - /** - * Causes texture to appear rotated 270 deg. clockwise relative to nominal face. - * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}. - */ - int BAKE_ROTATE_270 = 3; - - /** - * When enabled, texture coordinate are assigned based on vertex position. - * Any existing uv coordinates will be replaced. - * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}. - * - *

UV lock always derives texture coordinates based on nominal face, even - * when the quad is not co-planar with that face, and the result is - * the same as if the quad were projected onto the nominal face, which - * is usually the desired result. - */ - int BAKE_LOCK_UV = 4; - - /** - * When set, U texture coordinates for the given sprite are - * flipped as part of baking. Can be useful for some randomization - * and texture mapping scenarios. Results are different than what - * can be obtained via rotation and both can be applied. - * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}. - */ - int BAKE_FLIP_U = 8; - - /** - * Same as {@link MutableQuadView#BAKE_FLIP_U} but for V coordinate. - */ - int BAKE_FLIP_V = 16; - - /** - * UV coordinates by default are assumed to be 0-16 scale for consistency - * with conventional Minecraft model format. This is scaled to 0-1 during - * baking before interpolation. Model loaders that already have 0-1 coordinates - * can avoid wasteful multiplication/division by passing 0-1 coordinates directly. - * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}. - */ - int BAKE_NORMALIZED = 32; - - /** - * Assigns a different material to this quad. Useful for transformation of - * existing meshes because lighting and texture blending are controlled by material. - */ - MutableQuadView material(RenderMaterial material); - - /** - * If non-null, quad is coplanar with a block face which, if known, simplifies - * or shortcuts geometric analysis that might otherwise be needed. - * Set to null if quad is not coplanar or if this is not known. - * Also controls face culling during block rendering. - * - *

Null by default. - * - *

When called with a non-null value, also sets {@link #nominalFace(Direction)} - * to the same value. - * - *

This is different than the value reported by {@link BakedQuad#getFace()}. That value - * is computed based on face geometry and must be non-null in vanilla quads. - * That computed value is returned by {@link #lightFace()}. - */ - @Nullable - MutableQuadView cullFace(@Nullable Direction face); - - /** - * Provides a hint to renderer about the facing of this quad. Not required, - * but if provided can shortcut some geometric analysis if the quad is parallel to a block face. - * Should be the expected value of {@link #lightFace()}. Value will be confirmed - * and if invalid the correct light face will be calculated. - * - *

Null by default, and set automatically by {@link #cullFace()}. - * - *

Models may also find this useful as the face for texture UV locking and rotation semantics. - * - *

Note: This value is not persisted independently when the quad is encoded. - * When reading encoded quads, this value will always be the same as {@link #lightFace()}. - */ - @Nullable - MutableQuadView nominalFace(Direction face); - - /** - * Value functions identically to {@link BakedQuad#getColorIndex()} and is - * used by renderer / model builder in same way. Default value is -1. - */ - MutableQuadView colorIndex(int colourIndex); - - /** - * Enables bulk vertex data transfer using the standard Minecraft vertex formats. - * This method should be performant whenever caller's vertex representation makes it feasible. - * - *

Calling this method does not emit the quad. - */ - MutableQuadView fromVanilla(BakedQuad quad, RenderMaterial material, Direction cullFace); - - /** - * Encodes an integer tag with this quad that can later be retrieved via - * {@link QuadView#tag()}. Useful for models that want to perform conditional - * transformation or filtering on static meshes. - */ - MutableQuadView tag(int tag); - - /** - * Sets the geometric vertex position for the given vertex, - * relative to block origin. (0,0,0). Minecraft rendering is designed - * for models that fit within a single block space and is recommended - * that coordinates remain in the 0-1 range, with multi-block meshes - * split into multiple per-block models. - */ - MutableQuadView pos(int vertexIndex, float x, float y, float z); - - /** - * Same as {@link #pos(int, float, float, float)} but accepts vector type. - */ - default MutableQuadView pos(int vertexIndex, Vec3f vec) { - return pos(vertexIndex, vec.getX(), vec.getY(), vec.getZ()); - } - - /** - * Adds a vertex normal. Models that have per-vertex - * normals should include them to get correct lighting when it matters. - * Computed face normal is used when no vertex normal is provided. - * - *

{@link Renderer} implementations should honor vertex normals for - * diffuse lighting - modifying vertex color(s) or packing normals in the vertex - * buffer as appropriate for the rendering method/vertex format in effect. - */ - MutableQuadView normal(int vertexIndex, float x, float y, float z); - - /** - * Same as {@link #normal(int, float, float, float)} but accepts vector type. - */ - default MutableQuadView normal(int vertexIndex, Vec3f vec) { - return normal(vertexIndex, vec.getX(), vec.getY(), vec.getZ()); - } - - /** - * Set sprite color. Behavior for {@code spriteIndex > 0} is currently undefined. - */ - MutableQuadView spriteColor(int vertexIndex, int spriteIndex, int color); - - /** - * Convenience: set sprite color for all vertices at once. Behavior for {@code spriteIndex > 0} is currently undefined. - */ - default MutableQuadView spriteColor(int spriteIndex, int c0, int c1, int c2, int c3) { - spriteColor(0, spriteIndex, c0); - spriteColor(1, spriteIndex, c1); - spriteColor(2, spriteIndex, c2); - spriteColor(3, spriteIndex, c3); - return this; - } - - /** - * Set sprite atlas coordinates. Behavior for {@code spriteIndex > 0} is currently undefined. - */ - MutableQuadView sprite(int vertexIndex, int spriteIndex, float u, float v); - - /** - * Set sprite atlas coordinates. Behavior for {@code spriteIndex > 0} is currently undefined. - * - *

Only use this function if you already have a {@link Vector2f}. - * Otherwise, see {@link MutableQuadView#sprite(int, int, float, float)}. - */ - default MutableQuadView sprite(int vertexIndex, int spriteIndex, Vector2f uv) { - return sprite(vertexIndex, spriteIndex, uv.x, uv.y); - } - - /** - * Assigns sprite atlas u,v coordinates to this quad for the given sprite. - * Can handle UV locking, rotation, interpolation, etc. Control this behavior - * by passing additive combinations of the BAKE_ flags defined in this interface. - * Behavior for {@code spriteIndex > 0} is currently undefined. - */ - MutableQuadView spriteBake(int spriteIndex, Sprite sprite, int bakeFlags); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/QuadEmitter.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/QuadEmitter.java deleted file mode 100644 index e00a46190..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/QuadEmitter.java +++ /dev/null @@ -1,158 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.mesh; - -import net.modificationstation.stationapi.api.client.render.RenderContext; -import net.modificationstation.stationapi.api.client.render.material.RenderMaterial; -import net.modificationstation.stationapi.api.client.texture.Sprite; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import net.modificationstation.stationapi.api.util.math.Vector2f; - -/** - * Specialized {@link MutableQuadView} obtained via {@link MeshBuilder#getEmitter()} - * to append quads during mesh building. - * - *

Also obtained from {@link RenderContext#getEmitter()} to submit - * dynamic quads one-by-one at render time. - * - *

Instances of {@link QuadEmitter} will practically always be - * threadlocal and/or reused - do not retain references. - * - *

Only the renderer should implement or extend this interface. - */ -public interface QuadEmitter extends MutableQuadView { - @Override - QuadEmitter material(RenderMaterial material); - - @Override - QuadEmitter cullFace(Direction face); - - @Override - QuadEmitter nominalFace(Direction face); - - @Override - QuadEmitter colorIndex(int colourIndex); - - @Override - QuadEmitter tag(int tag); - - @Override - QuadEmitter pos(int vertexIndex, float x, float y, float z); - - @Override - default QuadEmitter pos(int vertexIndex, Vec3f vec) { - MutableQuadView.super.pos(vertexIndex, vec); - return this; - } - - @Override - default QuadEmitter normal(int vertexIndex, Vec3f vec) { - MutableQuadView.super.normal(vertexIndex, vec); - return this; - } - - @Override - QuadEmitter spriteColor(int vertexIndex, int spriteIndex, int color); - - @Override - default QuadEmitter spriteColor(int spriteIndex, int c0, int c1, int c2, int c3) { - MutableQuadView.super.spriteColor(spriteIndex, c0, c1, c2, c3); - return this; - } - - @Override - QuadEmitter sprite(int vertexIndex, int spriteIndex, float u, float v); - - /** - * Set sprite atlas coordinates. Behavior for {@code spriteIndex > 0} is currently undefined. - * - *

Only use this function if you already have a {@link Vector2f}. - * Otherwise, see {@link QuadEmitter#sprite(int, int, float, float)}. - */ - default QuadEmitter sprite(int vertexIndex, int spriteIndex, Vector2f uv) { - return sprite(vertexIndex, spriteIndex, uv.x, uv.y); - } - - default QuadEmitter spriteUnitSquare(int spriteIndex) { - sprite(0, spriteIndex, 0, 0); - sprite(1, spriteIndex, 0, 1); - sprite(2, spriteIndex, 1, 1); - sprite(3, spriteIndex, 1, 0); - return this; - } - - @Override - QuadEmitter spriteBake(int spriteIndex, Sprite sprite, int bakeFlags); - - /** - * Tolerance for determining if the depth parameter to {@link #square(Direction, float, float, float, float, float)} - * is effectively zero - meaning the face is a cull face. - */ - float CULL_FACE_EPSILON = 0.00001f; - - /** - * Helper method to assign vertex coordinates for a square aligned with the given face. - * Ensures that vertex order is consistent with vanilla convention. (Incorrect order can - * lead to bad AO lighting unless enhanced lighting logic is available/enabled.) - * - *

Square will be parallel to the given face and coplanar with the face (and culled if the - * face is occluded) if the depth parameter is approximately zero. See {@link #CULL_FACE_EPSILON}. - * - *

All coordinates should be normalized (0-1). - */ - default QuadEmitter square(Direction nominalFace, float left, float bottom, float right, float top, float depth) { - if (Math.abs(depth) < CULL_FACE_EPSILON) { - cullFace(nominalFace); - depth = 0; // avoid any inconsistency for face quads - } else { - cullFace(null); - } - - nominalFace(nominalFace); - switch (nominalFace) { - case UP: - depth = 1 - depth; - top = 1 - top; - bottom = 1 - bottom; - - case DOWN: - pos(0, left, depth, top); - pos(1, left, depth, bottom); - pos(2, right, depth, bottom); - pos(3, right, depth, top); - break; - - case WEST: - depth = 1 - depth; - left = 1 - left; - right = 1 - right; - - case EAST: - pos(0, 1 - left, top, depth); - pos(1, 1 - left, bottom, depth); - pos(2, 1 - right, bottom, depth); - pos(3, 1 - right, top, depth); - break; - - case SOUTH: - depth = 1 - depth; - left = 1 - left; - right = 1 - right; - - case NORTH: - pos(0, depth, top, left); - pos(1, depth, bottom, left); - pos(2, depth, bottom, right); - pos(3, depth, top, right); - break; - } - - return this; - } - - /** - * In static mesh building, causes quad to be appended to the mesh being built. - * In a dynamic render context, create a new quad to be output to rendering. - * In both cases, current instance is reset to default values. - */ - QuadEmitter emit(); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/QuadView.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/QuadView.java deleted file mode 100644 index 7cb7c8126..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/mesh/QuadView.java +++ /dev/null @@ -1,187 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.mesh; - -import net.modificationstation.stationapi.api.client.render.material.RenderMaterial; -import net.modificationstation.stationapi.api.client.render.model.BakedQuad; -import net.modificationstation.stationapi.api.client.texture.Sprite; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * Interface for reading quad data encoded by {@link MeshBuilder}. - * Enables models to do analysis, re-texturing or translation without knowing the - * renderer's vertex formats and without retaining redundant information. - * - *

Only the renderer should implement or extend this interface. - */ -public interface QuadView { - /** Count of integers in a conventional (un-modded) block or item vertex. */ - int VANILLA_VERTEX_STRIDE = 8; - - /** Count of integers in a conventional (un-modded) block or item quad. */ - int VANILLA_QUAD_STRIDE = VANILLA_VERTEX_STRIDE * 4; - - /** - * Reads baked vertex data and outputs standard baked quad - * vertex data in the given array and location. - * - * @param spriteIndex The sprite to be used for the quad. - * Behavior for values > 0 is currently undefined. - * - * @param target Target array for the baked quad data. - * - * @param targetIndex Starting position in target array - array must have - * at least 28 elements available at this index. - * - * @param isItem If true, will output vertex normals. Otherwise will output - * lightmaps, per Minecraft vertex formats for baked models. - */ - void toVanilla(int spriteIndex, int[] target, int targetIndex, boolean isItem); - - /** - * Extracts all quad properties except material to the given {@link MutableQuadView} instance. - * Must be used before calling {link QuadEmitter#emit()} on the target instance. - * Meant for re-texturing, analysis and static transformation use cases. - */ - void copyTo(MutableQuadView target); - - /** - * Retrieves the material serialized with the quad. - */ - RenderMaterial material(); - - /** - * Retrieves the quad color index serialized with the quad. - */ - int colorIndex(); - - /** - * Equivalent to {@link BakedQuad#getFace()}. This is the face used for vanilla lighting - * calculations and will be the block face to which the quad is most closely aligned. Always - * the same as cull face for quads that are on a block face, but never null. - */ - @NotNull - Direction lightFace(); - - /** - * If non-null, quad should not be rendered in-world if the - * opposite face of a neighbor block occludes it. - * - * @see MutableQuadView#cullFace(Direction) - */ - @Nullable Direction cullFace(); - - /** - * See {@link MutableQuadView#nominalFace(Direction)}. - */ - Direction nominalFace(); - - /** - * Normal of the quad as implied by geometry. Will be invalid - * if quad vertices are not co-planar. Typically computed lazily - * on demand and not encoded. - * - *

Not typically needed by models. Exposed to enable standard lighting - * utility functions for use by renderers. - */ - Vec3f faceNormal(); - - /** - * Generates a new BakedQuad instance with texture - * coordinates and colors from the given sprite. - * - * @param spriteIndex The sprite to be used for the quad. - * Behavior for {@code spriteIndex > 0} is currently undefined. - * - * @param sprite {@link MutableQuadView} does not serialize sprites - * so the sprite must be provided by the caller. - * - * @param isItem If true, will output vertex normals. Otherwise will output - * lightmaps, per Minecraft vertex formats for baked models. - * - * @return A new baked quad instance with the closest-available appearance - * supported by vanilla features. Will retain emissive light maps, for example, - * but the standard Minecraft renderer will not use them. - */ - default BakedQuad toBakedQuad(int spriteIndex, Sprite sprite, boolean isItem) { - int[] vertexData = new int[VANILLA_QUAD_STRIDE]; - toVanilla(spriteIndex, vertexData, 0, isItem); - return new BakedQuad(vertexData, colorIndex(), lightFace(), sprite, true); - } - - /** - * Retrieves the integer tag encoded with this quad via {@link MutableQuadView#tag(int)}. - * Will return zero if no tag was set. For use by models. - */ - int tag(); - - /** - * Pass a non-null target to avoid allocation - will be returned with values. - * Otherwise returns a new instance. - */ - Vec3f copyPos(int vertexIndex, @Nullable Vec3f target); - - /** - * Convenience: access x, y, z by index 0-2. - */ - float posByIndex(int vertexIndex, int coordinateIndex); - - /** - * Geometric position, x coordinate. - */ - float x(int vertexIndex); - - /** - * Geometric position, y coordinate. - */ - float y(int vertexIndex); - - /** - * Geometric position, z coordinate. - */ - float z(int vertexIndex); - - /** - * If false, no vertex normal was provided. - * Lighting should use face normal in that case. - */ - boolean hasNormal(int vertexIndex); - - /** - * Pass a non-null target to avoid allocation - will be returned with values. - * Otherwise returns a new instance. Returns null if normal not present. - */ - @Nullable - Vec3f copyNormal(int vertexIndex, @Nullable Vec3f target); - - /** - * Will return {@link Float#NaN} if normal not present. - */ - float normalX(int vertexIndex); - - /** - * Will return {@link Float#NaN} if normal not present. - */ - float normalY(int vertexIndex); - - /** - * Will return {@link Float#NaN} if normal not present. - */ - float normalZ(int vertexIndex); - - /** - * Retrieve vertex color. - */ - int spriteColor(int vertexIndex, int spriteIndex); - - /** - * Retrieve horizontal sprite atlas coordinates. - */ - float spriteU(int vertexIndex, int spriteIndex); - - /** - * Retrieve vertical sprite atlas coordinates. - */ - float spriteV(int vertexIndex, int spriteIndex); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/BakedModel.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/BakedModel.java index da510c4b1..175a1647c 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/BakedModel.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/BakedModel.java @@ -1,20 +1,14 @@ package net.modificationstation.stationapi.api.client.render.model; import com.google.common.collect.ImmutableList; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; import net.modificationstation.stationapi.api.block.BlockState; -import net.modificationstation.stationapi.api.client.render.RenderContext; import net.modificationstation.stationapi.api.client.render.model.json.ModelOverrideList; import net.modificationstation.stationapi.api.client.render.model.json.ModelTransformation; import net.modificationstation.stationapi.api.client.texture.Sprite; import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.MatrixStack; import org.jetbrains.annotations.Nullable; import java.util.Random; -import java.util.function.Supplier; public interface BakedModel { @@ -41,94 +35,4 @@ public interface BakedModel { ModelTransformation getTransformation(); ModelOverrideList getOverrides(); - - /** - * When true, signals renderer this producer is implemented through {@link BakedModel#getQuads(BlockState, Direction, Random)}. - * Also means the model does not rely on any non-vanilla features. - * Allows the renderer to optimize or route vanilla models through the unmodified vanilla pipeline if desired. - * - *

Fabric overrides to true for vanilla baked models. - * Enhanced models that use this API should return false, - * otherwise the API will not recognize the model. - */ - default boolean isVanillaAdapter() { - return true; - } - - /** - * This method will be called during chunk rebuilds to generate both the static and - * dynamic portions of a block model when the model implements this interface and - * {@link #isVanillaAdapter()} returns false. - * - *

During chunk rebuild, this method will always be called exactly one time per block - * position, irrespective of which or how many faces or block render layers are included - * in the model. Models must output all quads/meshes in a single pass. - * - *

Also called to render block models outside of chunk rebuild or block entity rendering. - * Typically this happens when the block is being rendered as an entity, not as a block placed in the world. - * Currently this happens for falling blocks and blocks being pushed by a piston, but renderers - * should invoke this for all calls to {@link BlockModelRenderer#render(BlockView, BakedModel, BlockState, TilePos, MatrixStack, VertexConsumer, boolean, Random, long, int)} - * that occur outside of chunk rebuilds to allow for features added by mods, unless - * {@link #isVanillaAdapter()} returns true. - * - *

Outside of chunk rebuilds, this method will be called every frame. Model implementations should - * rely on pre-baked meshes as much as possible and keep transformation to a minimum. The provided - * block position may be the nearest block position and not actual. For this reason, neighbor - * state lookups are best avoided or will require special handling. Block entity lookups are - * likely to fail and/or give meaningless results. - * - *

In all cases, renderer will handle face occlusion and filter quads on faces obscured by - * neighboring blocks (if appropriate). Models only need to consider "sides" to the - * extent the model is driven by connection with neighbor blocks or other world state. - * - *

Note: with {@link BakedModel#getQuads(BlockState, Direction, Random)}, the random - * parameter is normally initialized with the same seed prior to each face layer. - * Model authors should note this method is called only once per block, and call the provided - * Random supplier multiple times if re-seeding is necessary. For wrapped vanilla baked models, - * it will probably be easier to use {@link RenderContext#fallbackConsumer} which handles - * re-seeding per face automatically. - * - * @param blockView Access to world state. Using {@link net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView#getBlockEntityRenderAttachment(BlockPos)} to - * retrieve block entity state unless thread safety can be guaranteed. - * param safeBlockEntityAccessor Thread-safe access to block entity data - * @param state Block state for model being rendered. - * @param pos Position of block for model being rendered. - * @param randomSupplier Random object seeded per vanilla conventions. Call multiple times to re-seed. - * Will not be thread-safe. Do not cache or retain a reference. - * @param context Accepts model output. - */ - default void emitBlockQuads(BlockView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { - context.fallbackConsumer().accept(this); - } - - /** - * This method will be called during item rendering to generate both the static and - * dynamic portions of an item model when the model implements this interface and - * {@link #isVanillaAdapter()} returns false. - * - *

Vanilla item rendering is normally very limited. It ignores lightmaps, vertex colors, - * and vertex normals. Renderers are expected to implement enhanced features for item - * models. If a feature is impractical due to performance or other concerns, then the - * renderer must at least give acceptable visual results without the need for special- - * case handling in model implementations. - * - *

Calls to this method will generally happen on the main client thread but nothing - * prevents a mod or renderer from calling this method concurrently. Implementations - * should not mutate the ItemStack parameter, and best practice will be to make the - * method thread-safe. - * - *

Implementing this method does NOT mitigate the need to implement a functional - * {@link BakedModel#getOverrides()} method, because this method will be called - * on the result of {@link BakedModel#getOverrides}. However, that - * method can simply return the base model because the output from this method will - * be used for rendering. - * - *

Renderer implementations should also use this method to obtain the quads used - * for item enchantment glint rendering. This means models can put geometric variation - * logic here, instead of returning every possible shape from {@link BakedModel#getOverrides} - * as vanilla baked models. - */ - default void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - context.fallbackConsumer().accept(this); - } } diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ForwardingBakedModel.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ForwardingBakedModel.java index 164e74a79..8c90d6fcd 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ForwardingBakedModel.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ForwardingBakedModel.java @@ -1,18 +1,13 @@ package net.modificationstation.stationapi.api.client.render.model; import com.google.common.collect.ImmutableList; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; import net.modificationstation.stationapi.api.block.BlockState; -import net.modificationstation.stationapi.api.client.render.RenderContext; import net.modificationstation.stationapi.api.client.render.model.json.ModelOverrideList; import net.modificationstation.stationapi.api.client.render.model.json.ModelTransformation; import net.modificationstation.stationapi.api.client.texture.Sprite; import net.modificationstation.stationapi.api.util.math.Direction; import java.util.Random; -import java.util.function.Supplier; /** * Base class for specialized model implementations that need to wrap other baked models. @@ -23,18 +18,6 @@ public abstract class ForwardingBakedModel implements BakedModel { /** implementations must set this somehow. */ protected BakedModel wrapped; - public void emitBlockQuads(BlockView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { - wrapped.emitBlockQuads(blockView, state, pos, randomSupplier, context); - } - - public boolean isVanillaAdapter() { - return wrapped.isVanillaAdapter(); - } - - public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - wrapped.emitItemQuads(stack, randomSupplier, context); - } - @Override public ImmutableList getQuads(BlockState blockState, Direction face, Random rand) { return wrapped.getQuads(blockState, face, rand); diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ModelHelper.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ModelHelper.java deleted file mode 100644 index 9021a87ed..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ModelHelper.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.model; - -import com.google.common.collect.ImmutableList; -import net.modificationstation.stationapi.api.client.StationRenderAPI; -import net.modificationstation.stationapi.api.client.render.mesh.Mesh; -import net.modificationstation.stationapi.api.client.render.model.json.ModelTransformation; -import net.modificationstation.stationapi.api.client.render.model.json.Transformation; -import net.modificationstation.stationapi.api.client.texture.atlas.Atlases; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import org.jetbrains.annotations.Nullable; - -import java.util.Arrays; -import java.util.List; - -/** - * Collection of utilities for model implementations. - */ -public abstract class ModelHelper { - private ModelHelper() { } - - /** Result from {@link #toFaceIndex(Direction)} for null values. */ - public static final int NULL_FACE_ID = 6; - - /** - * Convenient way to encode faces that may be null. - * Null is returned as {@link #NULL_FACE_ID}. - * Use {@link #faceFromIndex(int)} to retrieve encoded face. - */ - public static int toFaceIndex(Direction face) { - return face == null ? NULL_FACE_ID : face.getId(); - } - - /** - * Use to decode a result from {@link #toFaceIndex(Direction)}. - * Return value will be null if encoded value was null. - * Can also be used for no-allocation iteration of {@link Direction#values()}, - * optionally including the null face. (Use < or <= {@link #NULL_FACE_ID} - * to exclude or include the null value, respectively.) - */ - @Nullable - public static Direction faceFromIndex(int faceIndex) { - return FACES[faceIndex]; - } - - /** @see #faceFromIndex(int) */ - private static final Direction[] FACES = Arrays.copyOf(Direction.values(), 7); - - /** - * Converts a mesh into an array of lists of vanilla baked quads. - * Useful for creating vanilla baked models when required for compatibility. - * The array indexes correspond to {@link Direction#getId()} with the - * addition of {@link #NULL_FACE_ID}. - * - *

Retrieves sprites from the block texture atlas via {@link SpriteFinder}. - */ - public static List[] toQuadLists(Mesh mesh) { - SpriteFinder finder = SpriteFinder.get(StationRenderAPI.getBakedModelManager().getAtlas(Atlases.GAME_ATLAS_TEXTURE)); - - @SuppressWarnings("unchecked") - final ImmutableList.Builder[] builders = new ImmutableList.Builder[7]; - - for (int i = 0; i < 7; i++) { - builders[i] = ImmutableList.builder(); - } - - if (mesh != null) { - mesh.forEach(q -> { - final int limit = q.material().spriteDepth(); - - for (int l = 0; l < limit; l++) { - Direction face = q.cullFace(); - builders[face == null ? 6 : face.getId()].add(q.toBakedQuad(l, finder.find(q, l), false)); - } - }); - } - - @SuppressWarnings("unchecked") - List[] result = new List[7]; - - for (int i = 0; i < 7; i++) { - result[i] = builders[i].build(); - } - - return result; - } - - /** - * The vanilla model transformation logic is closely coupled with model deserialization. - * That does little good for modded model loaders and procedurally generated models. - * This convenient construction method applies the same scaling factors used for vanilla models. - * This means you can use values from a vanilla JSON file as inputs to this method. - */ - private static Transformation makeTransform(float rotationX, float rotationY, @SuppressWarnings("SameParameterValue") float rotationZ, @SuppressWarnings("SameParameterValue") float translationX, float translationY, @SuppressWarnings("SameParameterValue") float translationZ, float scaleX, float scaleY, float scaleZ) { - Vec3f translation = new Vec3f(translationX, translationY, translationZ); - translation.scale(0.0625f); - translation.clamp(-5.0F, 5.0F); - return new Transformation(new Vec3f(rotationX, rotationY, rotationZ), translation, new Vec3f(scaleX, scaleY, scaleZ)); - } - - public static final Transformation TRANSFORM_BLOCK_GUI = makeTransform(30, 225, 0, 0, 0, 0, 0.625f, 0.625f, 0.625f); - public static final Transformation TRANSFORM_BLOCK_GROUND = makeTransform(0, 0, 0, 0, 3, 0, 0.25f, 0.25f, 0.25f); - public static final Transformation TRANSFORM_BLOCK_FIXED = makeTransform(0, 0, 0, 0, 0, 0, 0.5f, 0.5f, 0.5f); - public static final Transformation TRANSFORM_BLOCK_3RD_PERSON_RIGHT = makeTransform(75, 45, 0, 0, 2.5f, 0, 0.375f, 0.375f, 0.375f); - public static final Transformation TRANSFORM_BLOCK_1ST_PERSON_RIGHT = makeTransform(0, 45, 0, 0, 0, 0, 0.4f, 0.4f, 0.4f); - public static final Transformation TRANSFORM_BLOCK_1ST_PERSON_LEFT = makeTransform(0, 225, 0, 0, 0, 0, 0.4f, 0.4f, 0.4f); - - /** - * Mimics the vanilla model transformation used for most vanilla blocks, - * and should be suitable for most custom block-like models. - */ - public static final ModelTransformation MODEL_TRANSFORM_BLOCK = new ModelTransformation(TRANSFORM_BLOCK_3RD_PERSON_RIGHT, TRANSFORM_BLOCK_3RD_PERSON_RIGHT, TRANSFORM_BLOCK_1ST_PERSON_LEFT, TRANSFORM_BLOCK_1ST_PERSON_RIGHT, Transformation.IDENTITY, TRANSFORM_BLOCK_GUI, TRANSFORM_BLOCK_GROUND, TRANSFORM_BLOCK_FIXED); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/MultipartBakedModel.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/MultipartBakedModel.java index c973f0337..60cbbb154 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/MultipartBakedModel.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/MultipartBakedModel.java @@ -5,11 +5,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; import net.modificationstation.stationapi.api.block.BlockState; -import net.modificationstation.stationapi.api.client.render.RenderContext; import net.modificationstation.stationapi.api.client.render.model.json.ModelOverrideList; import net.modificationstation.stationapi.api.client.render.model.json.ModelTransformation; import net.modificationstation.stationapi.api.client.texture.Sprite; @@ -23,7 +19,6 @@ import java.util.Map; import java.util.Random; import java.util.function.Predicate; -import java.util.function.Supplier; @Environment(EnvType.CLIENT) public class MultipartBakedModel implements BakedModel { @@ -35,7 +30,6 @@ public class MultipartBakedModel implements BakedModel { protected final ModelTransformation transformations; protected final ModelOverrideList itemPropertyOverrides; private final Map stateCache = new Object2ObjectOpenCustomHashMap<>(Util.identityHashStrategy()); - private final boolean isVanilla; public MultipartBakedModel(List, BakedModel>> components) { this.components = components; @@ -46,46 +40,6 @@ public MultipartBakedModel(List, BakedModel>> compone this.sprite = bakedModel.getSprite(); this.transformations = bakedModel.getTransformation(); this.itemPropertyOverrides = bakedModel.getOverrides(); - boolean isVanilla = true; - for (Pair, BakedModel> component : components) - if (!component.getRight().isVanillaAdapter()) { - isVanilla = false; - break; - } - this.isVanilla = isVanilla; - } - - @Override - public boolean isVanillaAdapter() { - return isVanilla; - } - - @Override - public void emitBlockQuads(BlockView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { - BitSet bitSet = this.stateCache.get(state); - - if (bitSet == null) { - bitSet = new BitSet(); - - for (int i = 0; i < this.components.size(); i++) { - Pair, BakedModel> pair = components.get(i); - - if (pair.getLeft().test(state)) { - pair.getRight().emitBlockQuads(blockView, state, pos, randomSupplier, context); - bitSet.set(i); - } - } - - stateCache.put(state, bitSet); - } else - for (int i = 0; i < this.components.size(); i++) - if (bitSet.get(i)) - components.get(i).getRight().emitBlockQuads(blockView, state, pos, randomSupplier, context); - } - - @Override - public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - // Vanilla doesn't use MultipartBakedModel for items. } @Override diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/SpriteFinder.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/SpriteFinder.java deleted file mode 100644 index dd0b9d678..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/SpriteFinder.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.modificationstation.stationapi.api.client.render.model; - -import net.modificationstation.stationapi.api.client.render.mesh.Mesh; -import net.modificationstation.stationapi.api.client.render.mesh.MutableQuadView; -import net.modificationstation.stationapi.api.client.render.mesh.QuadView; -import net.modificationstation.stationapi.api.client.texture.Sprite; -import net.modificationstation.stationapi.api.client.texture.SpriteAtlasTexture; -import net.modificationstation.stationapi.impl.client.render.SpriteFinderImpl; - -/** - * Indexes a texture atlas to allow fast lookup of Sprites from - * baked vertex coordinates. Main use is for {@link Mesh}-based models - * to generate vanilla quads on demand without tracking and retaining - * the sprites that were baked into the mesh. In other words, this class - * supplies the sprite parameter for {@link QuadView#toBakedQuad(int, Sprite, boolean)}. - */ -public interface SpriteFinder { - /** - * Retrieves or creates the finder for the given atlas. - * Instances should not be retained as fields or they must be - * refreshed whenever there is a resource reload or other event - * that causes atlas textures to be re-stitched. - */ - static SpriteFinder get(SpriteAtlasTexture atlas) { - return SpriteFinderImpl.get(atlas); - } - - /** - * Finds the atlas sprite containing the vertex centroid of the quad. - * Vertex centroid is essentially the mean u,v coordinate - the intent being - * to find a point that is unambiguously inside the sprite (vs on an edge.) - * - *

Should be reliable for any convex quad or triangle. May fail for non-convex quads. - * Note that all the above refers to u,v coordinates. Geometric vertex does not matter, - * except to the extent it was used to determine u,v. - */ - Sprite find(QuadView quad, int textureIndex); - - /** - * Alternative to {@link #find(QuadView, int)} when vertex centroid is already - * known or unsuitable. Expects normalized (0-1) coordinates on the atlas texture, - * which should already be the case for u,v values in vanilla baked quads and in - * {@link QuadView} after calling {@link MutableQuadView#spriteBake(int, Sprite, int)}. - * - *

Coordinates must be in the sprite interior for reliable results. Generally will - * be easier to use {@link #find(QuadView, int)} unless you know the vertex - * centroid will somehow not be in the quad interior. This method will be slightly - * faster if you already have the centroid or another appropriate value. - */ - Sprite find(float u, float v); -} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/WeightedBakedModel.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/WeightedBakedModel.java index a876640f9..a9059606f 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/WeightedBakedModel.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/WeightedBakedModel.java @@ -4,11 +4,7 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; import net.modificationstation.stationapi.api.block.BlockState; -import net.modificationstation.stationapi.api.client.render.RenderContext; import net.modificationstation.stationapi.api.client.render.model.json.ModelOverrideList; import net.modificationstation.stationapi.api.client.render.model.json.ModelTransformation; import net.modificationstation.stationapi.api.client.texture.Sprite; @@ -19,45 +15,17 @@ import java.util.List; import java.util.Objects; import java.util.Random; -import java.util.function.Supplier; @Environment(EnvType.CLIENT) public class WeightedBakedModel implements BakedModel { private final int totalWeight; private final List models; private final BakedModel defaultModel; - private final boolean isVanilla; public WeightedBakedModel(List models) { this.models = models; this.totalWeight = WeightedPicker.getWeightSum(models); this.defaultModel = models.get(0).model; - boolean isVanilla = true; - for (Entry model : models) - if (!model.model.isVanillaAdapter()) { - isVanilla = false; - break; - } - this.isVanilla = isVanilla; - } - - @Override - public boolean isVanillaAdapter() { - return isVanilla; - } - - @Override - public void emitBlockQuads(BlockView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { - Entry entry = WeightedPicker.getAt(this.models, Math.abs((int) randomSupplier.get().nextLong()) % this.totalWeight); - if (entry != null) - entry.model.emitBlockQuads(blockView, state, pos, randomSupplier, context); - } - - @Override - public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - Entry entry = WeightedPicker.getAt(this.models, Math.abs((int) randomSupplier.get().nextLong()) % this.totalWeight); - if (entry != null) - entry.model.emitItemQuads(stack, randomSupplier, context); } @Override diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/SpriteAtlasTexture.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/SpriteAtlasTexture.java index 0b9db1805..24794cabb 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/SpriteAtlasTexture.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/SpriteAtlasTexture.java @@ -1,12 +1,11 @@ package net.modificationstation.stationapi.api.client.texture; import lombok.Getter; -import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.resource.ResourceManager; +import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.util.crash.CrashException; import net.modificationstation.stationapi.api.util.crash.CrashReport; import net.modificationstation.stationapi.api.util.crash.CrashReportSection; -import net.modificationstation.stationapi.impl.client.render.SpriteFinderImpl; import java.io.BufferedWriter; import java.io.IOException; @@ -29,7 +28,6 @@ public class SpriteAtlasTexture extends AbstractTexture implements DynamicTextur private int width; @Getter private int height; - private SpriteFinderImpl spriteFinder = null; public SpriteAtlasTexture(Identifier id) { this.id = id; @@ -65,7 +63,6 @@ public void upload(SpriteLoader.StitchResult stitchResult) { } this.spritesToLoad = List.copyOf(list); this.animatedSprites = List.copyOf(list2); - spriteFinder = null; } @Override @@ -118,14 +115,5 @@ public int getMaxTextureSize() { public void applyTextureFilter(SpriteLoader.StitchResult data) { this.setFilter(false, false); } - - public SpriteFinderImpl spriteFinder() { - SpriteFinderImpl result = spriteFinder; - if (result == null) { - result = new SpriteFinderImpl(sprites, this); - spriteFinder = result; - } - return result; - } } diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/SpriteFinderImpl.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/SpriteFinderImpl.java deleted file mode 100644 index 0b7d1835e..000000000 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/SpriteFinderImpl.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.modificationstation.stationapi.impl.client.render; - -import net.modificationstation.stationapi.api.client.render.mesh.QuadView; -import net.modificationstation.stationapi.api.client.render.model.SpriteFinder; -import net.modificationstation.stationapi.api.client.texture.MissingSprite; -import net.modificationstation.stationapi.api.client.texture.Sprite; -import net.modificationstation.stationapi.api.client.texture.SpriteAtlasTexture; -import net.modificationstation.stationapi.api.util.Identifier; - -import java.util.Map; -import java.util.function.Consumer; - -/** - * Indexes an atlas sprite to allow fast lookup of Sprites from - * baked vertex coordinates. Implementation is a straightforward - * quad tree. Other options that were considered were linear search - * (slow) and direct indexing of fixed-size cells. Direct indexing - * would be fastest but would be memory-intensive for large atlases - * and unsuitable for any atlas that isn't consistently aligned to - * a fixed cell size. - */ -public class SpriteFinderImpl implements SpriteFinder { - - private final Node root; - private final SpriteAtlasTexture spriteAtlasTexture; - - public SpriteFinderImpl(Map sprites, SpriteAtlasTexture spriteAtlasTexture) { - root = new Node(0.5f, 0.5f, 0.25f); - this.spriteAtlasTexture = spriteAtlasTexture; - sprites.values().forEach(root::add); - } - - @Override - public Sprite find(QuadView quad, int textureIndex) { - float u = 0; - float v = 0; - - for (int i = 0; i < 4; i++) { - u += quad.spriteU(i, textureIndex); - v += quad.spriteV(i, textureIndex); - } - - return find(u * 0.25f, v * 0.25f); - } - - @Override - public Sprite find(float u, float v) { - return root.find(u, v); - } - - private class Node { - final float midU; - final float midV; - final float cellRadius; - Object lowLow = null; - Object lowHigh = null; - Object highLow = null; - Object highHigh = null; - - Node(float midU, float midV, float radius) { - this.midU = midU; - this.midV = midV; - cellRadius = radius; - } - - static final float EPS = 0.00001f; - - void add(Sprite sprite) { - final boolean lowU = sprite.getMinU() < midU - EPS; - final boolean highU = sprite.getMaxU() > midU + EPS; - final boolean lowV = sprite.getMinV() < midV - EPS; - final boolean highV = sprite.getMaxV() > midV + EPS; - - if (lowU && lowV) { - addInner(sprite, lowLow, -1, -1, q -> lowLow = q); - } - - if (lowU && highV) { - addInner(sprite, lowHigh, -1, 1, q -> lowHigh = q); - } - - if (highU && lowV) { - addInner(sprite, highLow, 1, -1, q -> highLow = q); - } - - if (highU && highV) { - addInner(sprite, highHigh, 1, 1, q -> highHigh = q); - } - } - - private void addInner(Sprite sprite, Object quadrant, int uStep, int vStep, Consumer setter) { - if (quadrant == null) { - setter.accept(sprite); - } else if (quadrant instanceof Node) { - ((Node) quadrant).add(sprite); - } else { - Node n = new Node(midU + cellRadius * uStep, midV + cellRadius * vStep, cellRadius * 0.5f); - - if (quadrant instanceof Sprite) { - n.add((Sprite) quadrant); - } - - n.add(sprite); - setter.accept(n); - } - } - - private Sprite find(float u, float v) { - if (u < midU) { - return v < midV ? findInner(lowLow, u, v) : findInner(lowHigh, u, v); - } else { - return v < midV ? findInner(highLow, u, v) : findInner(highHigh, u, v); - } - } - - private Sprite findInner(Object quadrant, float u, float v) { - if (quadrant instanceof Sprite) { - return (Sprite) quadrant; - } else if (quadrant instanceof Node) { - return ((Node) quadrant).find(u, v); - } else { - return spriteAtlasTexture.getSprite(MissingSprite.getMissingSpriteId()); - } - } - } - - public static SpriteFinderImpl get(SpriteAtlasTexture atlas) { - return atlas.spriteFinder(); - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/ArsenicRenderer.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/ArsenicRenderer.java index ef4923047..a047304dd 100644 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/ArsenicRenderer.java +++ b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/ArsenicRenderer.java @@ -4,16 +4,9 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import net.modificationstation.stationapi.api.client.render.Renderer; -import net.modificationstation.stationapi.api.client.render.material.MaterialFinder; -import net.modificationstation.stationapi.api.client.render.material.RenderMaterial; -import net.modificationstation.stationapi.api.client.render.mesh.MeshBuilder; import net.modificationstation.stationapi.api.client.render.model.BakedModelRenderer; -import net.modificationstation.stationapi.api.util.Identifier; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.MeshBuilderImpl; import net.modificationstation.stationapi.impl.client.arsenic.renderer.render.BakedModelRendererImpl; -import java.util.IdentityHashMap; -import java.util.Map; import java.util.function.Supplier; @NoArgsConstructor(access = AccessLevel.PRIVATE) @@ -21,38 +14,6 @@ public final class ArsenicRenderer implements Renderer { public static final ArsenicRenderer INSTANCE = new ArsenicRenderer(); - public static final RenderMaterialImpl.Value MATERIAL_STANDARD = (RenderMaterialImpl.Value) INSTANCE.materialFinder().find(); - - static { - INSTANCE.registerMaterial(RenderMaterial.MATERIAL_STANDARD, MATERIAL_STANDARD); - } - - private final Map materialMap = new IdentityHashMap<>(); - - @Override - public MeshBuilder meshBuilder() { - return new MeshBuilderImpl(); - } - - @Override - public MaterialFinder materialFinder() { - return new RenderMaterialImpl.Finder(); - } - - @Override - public RenderMaterial materialById(Identifier id) { - return materialMap.get(id); - } - - @Override - public boolean registerMaterial(Identifier id, RenderMaterial material) { - if (materialMap.containsKey(id)) return false; - - // cast to prevent acceptance of impostor implementations - materialMap.put(id, material); - return true; - } - @Override public BakedModelRenderer bakedModelRenderer() { return bakedModelRenderer.get(); diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/RenderMaterialImpl.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/RenderMaterialImpl.java deleted file mode 100644 index 519391ed2..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/RenderMaterialImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer; - -import com.google.common.base.Preconditions; -import net.modificationstation.stationapi.api.client.render.material.BlendMode; -import net.modificationstation.stationapi.api.client.render.material.MaterialFinder; -import net.modificationstation.stationapi.api.client.render.material.RenderMaterial; -import net.modificationstation.stationapi.api.util.math.MathHelper; - -/** - * Default implementation of the standard render materials. - * The underlying representation is simply an int with bit-wise - * packing of the various material properties. This offers - * easy/fast interning via int/object hashmap. - */ -public abstract class RenderMaterialImpl { - private static final BlendMode[] BLEND_MODES = BlendMode.values(); - - private static final int BLEND_MODE_MASK = MathHelper.smallestEncompassingPowerOfTwo(BlendMode.values().length) - 1; - private static final int COLOR_DISABLE_FLAG = BLEND_MODE_MASK + 1; - private static final int EMISSIVE_FLAG = COLOR_DISABLE_FLAG << 1; - private static final int DIFFUSE_FLAG = EMISSIVE_FLAG << 1; - private static final int AO_FLAG = DIFFUSE_FLAG << 1; - public static final int VALUE_COUNT = (AO_FLAG << 1); - - private static final Value[] VALUES = new Value[VALUE_COUNT]; - - static { - for (int i = 0; i < VALUE_COUNT; i++) { - VALUES[i] = new Value(i); - } - } - - public static RenderMaterialImpl.Value byIndex(int index) { - return VALUES[index]; - } - - protected int bits; - - public BlendMode blendMode(int textureIndex) { - return BLEND_MODES[bits & BLEND_MODE_MASK]; - } - - public boolean disableColorIndex(int textureIndex) { - return (bits & COLOR_DISABLE_FLAG) != 0; - } - - public int spriteDepth() { - return 1; - } - - public boolean emissive(int textureIndex) { - return (bits & EMISSIVE_FLAG) != 0; - } - - public boolean disableDiffuse(int textureIndex) { - return (bits & DIFFUSE_FLAG) != 0; - } - - public boolean disableAo(int textureIndex) { - return (bits & AO_FLAG) != 0; - } - - public static class Value extends RenderMaterialImpl implements RenderMaterial { - private Value(int bits) { - this.bits = bits; - } - - public int index() { - return bits; - } - } - - public static class Finder extends RenderMaterialImpl implements MaterialFinder { - @Override - public RenderMaterial find() { - return VALUES[bits]; - } - - @Override - public MaterialFinder clear() { - bits = 0; - return this; - } - - @Override - public MaterialFinder blendMode(int textureIndex, BlendMode blendMode) { - if (blendMode == null) { - blendMode = BlendMode.DEFAULT; - } - - bits = (bits & ~BLEND_MODE_MASK) | blendMode.ordinal(); - return this; - } - - @Override - public MaterialFinder disableColorIndex(int textureIndex, boolean disable) { - bits = disable ? (bits | COLOR_DISABLE_FLAG) : (bits & ~COLOR_DISABLE_FLAG); - return this; - } - - @Override - public MaterialFinder spriteDepth(int depth) { - Preconditions.checkArgument(depth == 1, "Unsupported sprite depth: %s", depth); - - return this; - } - - @Override - public MaterialFinder emissive(int textureIndex, boolean isEmissive) { - bits = isEmissive ? (bits | EMISSIVE_FLAG) : (bits & ~EMISSIVE_FLAG); - return this; - } - - @Override - public MaterialFinder disableDiffuse(int textureIndex, boolean disable) { - bits = disable ? (bits | DIFFUSE_FLAG) : (bits & ~DIFFUSE_FLAG); - return this; - } - - @Override - public MaterialFinder disableAo(int textureIndex, boolean disable) { - bits = disable ? (bits | AO_FLAG) : (bits & ~AO_FLAG); - return this; - } - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/aocalc/LightingCalculatorImpl.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/aocalc/LightingCalculatorImpl.java index 4c3ec343e..c79d428d2 100644 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/aocalc/LightingCalculatorImpl.java +++ b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/aocalc/LightingCalculatorImpl.java @@ -2,11 +2,9 @@ import net.minecraft.block.Block; import net.minecraft.world.BlockView; -import net.modificationstation.stationapi.api.client.render.mesh.QuadEmitter; import net.modificationstation.stationapi.api.client.render.model.BakedQuad; import net.modificationstation.stationapi.api.util.math.Direction; import net.modificationstation.stationapi.api.util.math.MathHelper; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.MutableQuadViewImpl; import java.util.Arrays; @@ -114,17 +112,6 @@ public void calculateForQuad(BakedQuad q) { light[3] = MathHelper.lerp(emission, light[3], 1F); } - public void calculateForQuad(MutableQuadViewImpl q) { - calculateForQuad( - q.lightFace(), - x + q.x(0), y + q.y(0), z + q.z(0), - x + q.x(1), y + q.y(1), z + q.z(1), - x + q.x(2), y + q.y(2), z + q.z(2), - x + q.x(3), y + q.y(3), z + q.z(3), - q.hasShade() - ); - } - private void calculateForQuad( Direction face, double v00x, double v00y, double v00z, @@ -458,7 +445,7 @@ private void quadFast( case X -> Math.abs(mX - x); case Y -> Math.abs(mY - y); case Z -> Math.abs(mZ - z); - } < QuadEmitter.CULL_FACE_EPSILON ? + } < 0.00001f ? light(floor(mX) + face.getOffsetX(), floor(mY) + face.getOffsetY(), floor(mZ) + face.getOffsetZ()) : light(floor(mX), floor(mY), floor(mZ)); } diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/ColorHelper.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/ColorHelper.java deleted file mode 100644 index 394015844..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/ColorHelper.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.helper; - -import it.unimi.dsi.fastutil.ints.Int2IntFunction; - -import java.nio.ByteOrder; - -/** - * Static routines of general utility for renderer implementations. - * Renderers are not required to use these helpers, but they were - * designed to be usable without the default renderer. - */ -public abstract class ColorHelper { - private ColorHelper() { } - - private static final Int2IntFunction colorSwapper = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? color -> ((color & 0xFF00FF00) | ((color & 0x00FF0000) >> 16) | ((color & 0xFF) << 16)) : color -> color; - - /** - * Swaps red blue order if needed to match GPU expectations for color component order. - */ - public static int swapRedBlueIfNeeded(int color) { - return colorSwapper.applyAsInt(color); - } - - /** Component-wise multiply. Components need to be in same order in both inputs! */ - public static int multiplyColour(int color1, int color2) { - if (color1 == -1) { - return color2; - } else if (color2 == -1) { - return color1; - } - - final int alpha = ((color1 >> 24) & 0xFF) * ((color2 >> 24) & 0xFF) / 0xFF; - final int red = ((color1 >> 16) & 0xFF) * ((color2 >> 16) & 0xFF) / 0xFF; - final int green = ((color1 >> 8) & 0xFF) * ((color2 >> 8) & 0xFF) / 0xFF; - final int blue = (color1 & 0xFF) * (color2 & 0xFF) / 0xFF; - - return (alpha << 24) | (red << 16) | (green << 8) | blue; - } - - /** Multiplies three lowest components by shade. High byte (usually alpha) unchanged. */ - public static int multiplyRGB(int color, float shade) { - final int alpha = ((color >> 24) & 0xFF); - final int red = (int) (((color >> 16) & 0xFF) * shade); - final int green = (int) (((color >> 8) & 0xFF) * shade); - final int blue = (int) ((color & 0xFF) * shade); - - return (alpha << 24) | (red << 16) | (green << 8) | blue; - } - - /** - * Component-wise max. - */ - public static int maxBrightness(int b0, int b1) { - if (b0 == 0) return b1; - if (b1 == 0) return b0; - - return Math.max(b0 & 0xFFFF, b1 & 0xFFFF) | Math.max(b0 & 0xFFFF0000, b1 & 0xFFFF0000); - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/GeometryHelper.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/GeometryHelper.java deleted file mode 100644 index 0b181c71c..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/GeometryHelper.java +++ /dev/null @@ -1,222 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.helper; - -import net.modificationstation.stationapi.api.client.render.mesh.QuadView; -import net.modificationstation.stationapi.api.client.render.model.BakedQuad; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import org.jetbrains.annotations.NotNull; - -import static net.modificationstation.stationapi.api.util.math.MathHelper.approximatelyEquals; - -/** - * Static routines of general utility for renderer implementations. - * Renderers are not required to use these helpers, but they were - * designed to be usable without the default renderer. - */ -public abstract class GeometryHelper { - private GeometryHelper() { } - - /** set when a quad touches all four corners of a unit cube. */ - public static final int CUBIC_FLAG = 1; - - /** set when a quad is parallel to (but not necessarily on) a its light face. */ - public static final int AXIS_ALIGNED_FLAG = CUBIC_FLAG << 1; - - /** set when a quad is coplanar with its light face. Implies {@link #AXIS_ALIGNED_FLAG} */ - public static final int LIGHT_FACE_FLAG = AXIS_ALIGNED_FLAG << 1; - - /** how many bits quad header encoding should reserve for encoding geometry flags. */ - public static final int FLAG_BIT_COUNT = 3; - - private static final float EPS_MIN = 0.0001f; - private static final float EPS_MAX = 1.0f - EPS_MIN; - - /** - * Analyzes the quad and returns a value with some combination - * of {@link #AXIS_ALIGNED_FLAG}, {@link #LIGHT_FACE_FLAG} and {@link #CUBIC_FLAG}. - * Intended use is to optimize lighting when the geometry is regular. - * Expects convex quads with all points co-planar. - */ - public static int computeShapeFlags(QuadView quad) { - Direction lightFace = quad.lightFace(); - int bits = 0; - - if (isQuadParallelToFace(lightFace, quad)) { - bits |= AXIS_ALIGNED_FLAG; - - if (isParallelQuadOnFace(lightFace, quad)) { - bits |= LIGHT_FACE_FLAG; - } - } - - if (isQuadCubic(lightFace, quad)) { - bits |= CUBIC_FLAG; - } - - return bits; - } - - /** - * Returns true if quad is parallel to the given face. - * Does not validate quad winding order. - * Expects convex quads with all points co-planar. - */ - public static boolean isQuadParallelToFace(Direction face, QuadView quad) { - if (face == null) { - return false; - } - - int i = face.getAxis().ordinal(); - final float val = quad.posByIndex(0, i); - return approximatelyEquals(val, quad.posByIndex(1, i)) && approximatelyEquals(val, quad.posByIndex(2, i)) && approximatelyEquals(val, quad.posByIndex(3, i)); - } - - /** - * True if quad - already known to be parallel to a face - is actually coplanar with it. - * For compatibility with vanilla resource packs, also true if quad is outside the face. - * - *

Test will be unreliable if not already parallel, use {@link #isQuadParallelToFace(Direction, QuadView)} - * for that purpose. Expects convex quads with all points co-planar. - */ - public static boolean isParallelQuadOnFace(Direction lightFace, QuadView quad) { - if (lightFace == null) return false; - - final float x = quad.posByIndex(0, lightFace.getAxis().ordinal()); - return lightFace.getDirection() == Direction.AxisDirection.POSITIVE ? x >= EPS_MAX : x <= EPS_MIN; - } - - /** - * Returns true if quad is truly a quad (not a triangle) and fills a full block cross-section. - * If known to be true, allows use of a simpler/faster AO lighting algorithm. - * - *

Does not check if quad is actually coplanar with the light face, nor does it check that all - * quad vertices are coplanar with each other. - * - *

Expects convex quads with all points co-planar. - * - * @param lightFace MUST be non-null. - */ - public static boolean isQuadCubic(@NotNull Direction lightFace, QuadView quad) { - - int a, b; - - switch (lightFace) { - case EAST: - case WEST: - a = 1; - b = 2; - break; - case UP: - case DOWN: - a = 0; - b = 2; - break; - case SOUTH: - case NORTH: - a = 1; - b = 0; - break; - default: - // handle WTF case - return false; - } - - return confirmSquareCorners(a, b, quad); - } - - /** - * Used by {@link #isQuadCubic(Direction, QuadView)}. - * True if quad touches all four corners of unit square. - * - *

For compatibility with resource packs that contain models with quads exceeding - * block boundaries, considers corners outside the block to be at the corners. - */ - private static boolean confirmSquareCorners(int aCoordinate, int bCoordinate, QuadView quad) { - int flags = 0; - - for (int i = 0; i < 4; i++) { - final float a = quad.posByIndex(i, aCoordinate); - final float b = quad.posByIndex(i, bCoordinate); - - if (a <= EPS_MIN) { - if (b <= EPS_MIN) { - flags |= 1; - } else if (b >= EPS_MAX) { - flags |= 2; - } else { - return false; - } - } else if (a >= EPS_MAX) { - if (b <= EPS_MIN) { - flags |= 4; - } else if (b >= EPS_MAX) { - flags |= 8; - } else { - return false; - } - } else { - return false; - } - } - - return flags == 15; - } - - /** - * Identifies the face to which the quad is most closely aligned. - * This mimics the value that {@link BakedQuad#getFace()} returns, and is - * used in the vanilla renderer for all diffuse lighting. - * - *

Derived from the quad face normal and expects convex quads with all points co-planar. - */ - public static Direction lightFace(QuadView quad) { - final Vec3f normal = quad.faceNormal(); - return switch (GeometryHelper.longestAxis(normal)) { - case X -> normal.getX() > 0 ? Direction.EAST : Direction.WEST; - case Y -> normal.getY() > 0 ? Direction.UP : Direction.DOWN; - case Z -> normal.getZ() > 0 ? Direction.SOUTH : Direction.NORTH; - }; - } - - /** - * Simple 4-way compare, doesn't handle NaN values. - */ - public static float min(float a, float b, float c, float d) { - final float x = Math.min(a, b); - final float y = Math.min(c, d); - return Math.min(x, y); - } - - /** - * Simple 4-way compare, doesn't handle NaN values. - */ - public static float max(float a, float b, float c, float d) { - final float x = Math.max(a, b); - final float y = Math.max(c, d); - return Math.max(x, y); - } - - /** - * @see #longestAxis(float, float, float) - */ - public static Direction.Axis longestAxis(Vec3f vec) { - return longestAxis(vec.getX(), vec.getY(), vec.getZ()); - } - - /** - * Identifies the largest (max absolute magnitude) component (X, Y, Z) in the given vector. - */ - public static Direction.Axis longestAxis(float normalX, float normalY, float normalZ) { - Direction.Axis result = Direction.Axis.Y; - float longest = Math.abs(normalY); - float a = Math.abs(normalX); - - if (a > longest) { - result = Direction.Axis.X; - longest = a; - } - - return Math.abs(normalZ) > longest - ? Direction.Axis.Z : result; - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/NormalHelper.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/NormalHelper.java deleted file mode 100644 index 417c74e9f..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/NormalHelper.java +++ /dev/null @@ -1,99 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.helper; - -import net.modificationstation.stationapi.api.client.render.mesh.QuadView; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.MathHelper; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import net.modificationstation.stationapi.api.util.math.Vec3i; -import org.jetbrains.annotations.NotNull; - -/** - * Static routines of general utility for renderer implementations. - * Renderers are not required to use these helpers, but they were - * designed to be usable without the default renderer. - */ -public abstract class NormalHelper { - private NormalHelper() { } - - /** - * Stores a normal plus an extra value as a quartet of signed bytes. - * This is the same normal format that vanilla item rendering expects. - * The extra value is for use by shaders. - */ - public static int packNormal(float x, float y, float z, float w) { - x = MathHelper.clamp(x, -1, 1); - y = MathHelper.clamp(y, -1, 1); - z = MathHelper.clamp(z, -1, 1); - w = MathHelper.clamp(w, -1, 1); - - return ((int) (x * 127) & 255) | (((int) (y * 127) & 255) << 8) | (((int) (z * 127) & 255) << 16) | (((int) (w * 127) & 255) << 24); - } - - /** - * Version of {@link #packNormal(float, float, float, float)} that accepts a vector type. - */ - public static int packNormal(Vec3f normal, float w) { - return packNormal(normal.getX(), normal.getY(), normal.getZ(), w); - } - - /** - * Retrieves values packed by {@link #packNormal(float, float, float, float)}. - * - *

Components are x, y, z, w - zero based. - */ - public static float getPackedNormalComponent(int packedNormal, int component) { - return ((byte) (packedNormal >> (8 * component))) / 127f; - } - - /** - * Computes the face normal of the given quad and saves it in the provided non-null vector. - * If {@link QuadView#nominalFace()} is set will optimize by confirming quad is parallel to that - * face and, if so, use the standard normal for that face direction. - * - *

Will work with triangles also. Assumes counter-clockwise winding order, which is the norm. - * Expects convex quads with all points co-planar. - */ - public static void computeFaceNormal(@NotNull Vec3f saveTo, QuadView q) { - final Direction nominalFace = q.nominalFace(); - - if (GeometryHelper.isQuadParallelToFace(nominalFace, q)) { - Vec3i vec = nominalFace.getVector(); - saveTo.set(vec.getX(), vec.getY(), vec.getZ()); - return; - } - - final float x0 = q.x(0); - final float y0 = q.y(0); - final float z0 = q.z(0); - final float x1 = q.x(1); - final float y1 = q.y(1); - final float z1 = q.z(1); - final float x2 = q.x(2); - final float y2 = q.y(2); - final float z2 = q.z(2); - final float x3 = q.x(3); - final float y3 = q.y(3); - final float z3 = q.z(3); - - final float dx0 = x2 - x0; - final float dy0 = y2 - y0; - final float dz0 = z2 - z0; - final float dx1 = x3 - x1; - final float dy1 = y3 - y1; - final float dz1 = z3 - z1; - - float normX = dy0 * dz1 - dz0 * dy1; - float normY = dz0 * dx1 - dx0 * dz1; - float normZ = dx0 * dy1 - dy0 * dx1; - - float l = (float) Math.sqrt(normX * normX + normY * normY + normZ * normZ); - - if (l != 0) { - normX /= l; - normY /= l; - normZ /= l; - } - - saveTo.set(normX, normY, normZ); - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/TextureHelper.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/TextureHelper.java deleted file mode 100644 index 7eebdcfae..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/helper/TextureHelper.java +++ /dev/null @@ -1,94 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.helper; - -import net.modificationstation.stationapi.api.client.render.mesh.MutableQuadView; -import net.modificationstation.stationapi.api.client.texture.Sprite; -import net.modificationstation.stationapi.api.util.math.Direction; - -/** - * Handles most texture-baking use cases for model loaders and model libraries - * via {@link #bakeSprite(MutableQuadView, int, Sprite, int)}. Also used by the API - * itself to implement automatic block-breaking models for enhanced models. - */ -public class TextureHelper { - private TextureHelper() { } - - private static final float NORMALIZER = 1f / 16f; - - /** - * Bakes textures in the provided vertex data, handling UV locking, - * rotation, interpolation, etc. Textures must not be already baked. - */ - public static void bakeSprite(MutableQuadView quad, int spriteIndex, Sprite sprite, int bakeFlags) { - if (quad.nominalFace() != null && (MutableQuadView.BAKE_LOCK_UV & bakeFlags) != 0) { - // Assigns normalized UV coordinates based on vertex positions - applyModifier(quad, spriteIndex, UVLOCKERS[quad.nominalFace().getId()]); - } else if ((MutableQuadView.BAKE_NORMALIZED & bakeFlags) == 0) { - // Scales from 0-16 to 0-1 - applyModifier(quad, spriteIndex, (q, i, t) -> q.sprite(i, t, q.spriteU(i, t) * NORMALIZER, q.spriteV(i, t) * NORMALIZER)); - } - - final int rotation = bakeFlags & 3; - - if (rotation != 0) { - // Rotates texture around the center of sprite. - // Assumes normalized coordinates. - applyModifier(quad, spriteIndex, ROTATIONS[rotation]); - } - - if ((MutableQuadView.BAKE_FLIP_U & bakeFlags) != 0) { - // Inverts U coordinates. Assumes normalized (0-1) values. - applyModifier(quad, spriteIndex, (q, i, t) -> q.sprite(i, t, 1 - q.spriteU(i, t), q.spriteV(i, t))); - } - - if ((MutableQuadView.BAKE_FLIP_V & bakeFlags) != 0) { - // Inverts V coordinates. Assumes normalized (0-1) values. - applyModifier(quad, spriteIndex, (q, i, t) -> q.sprite(i, t, q.spriteU(i, t), 1 - q.spriteV(i, t))); - } - - interpolate(quad, spriteIndex, sprite); - } - - /** - * Faster than sprite method. Sprite computes span and normalizes inputs each call, - * so we'd have to denormalize before we called, only to have the sprite renormalize immediately. - */ - private static void interpolate(MutableQuadView q, int spriteIndex, Sprite sprite) { - final float uMin = sprite.getMinU(); - final float uSpan = sprite.getMaxU() - uMin; - final float vMin = sprite.getMinV(); - final float vSpan = sprite.getMaxV() - vMin; - - for (int i = 0; i < 4; i++) { - q.sprite(i, spriteIndex, uMin + q.spriteU(i, spriteIndex) * uSpan, vMin + q.spriteV(i, spriteIndex) * vSpan); - } - } - - @FunctionalInterface - private interface VertexModifier { - void apply(MutableQuadView quad, int vertexIndex, int spriteIndex); - } - - private static void applyModifier(MutableQuadView quad, int spriteIndex, VertexModifier modifier) { - for (int i = 0; i < 4; i++) { - modifier.apply(quad, i, spriteIndex); - } - } - - private static final VertexModifier[] ROTATIONS = new VertexModifier[] { - null, - (q, i, t) -> q.sprite(i, t, q.spriteV(i, t), 1 - q.spriteU(i, t)), //90 - (q, i, t) -> q.sprite(i, t, 1 - q.spriteU(i, t), 1 - q.spriteV(i, t)), //180 - (q, i, t) -> q.sprite(i, t, 1 - q.spriteV(i, t), q.spriteU(i, t)) // 270 - }; - - private static final VertexModifier[] UVLOCKERS = new VertexModifier[6]; - - static { - UVLOCKERS[Direction.SOUTH.getId()] = (q, i, t) -> q.sprite(i, t, 1 - q.z(i), 1 - q.y(i)); - UVLOCKERS[Direction.NORTH.getId()] = (q, i, t) -> q.sprite(i, t, q.z(i), 1 - q.y(i)); - UVLOCKERS[Direction.EAST.getId()] = (q, i, t) -> q.sprite(i, t, 1 - q.x(i), 1 - q.y(i)); - UVLOCKERS[Direction.WEST.getId()] = (q, i, t) -> q.sprite(i, t, q.x(i), 1 - q.y(i)); - UVLOCKERS[Direction.DOWN.getId()] = (q, i, t) -> q.sprite(i, t, q.x(i), 1 - q.z(i)); - UVLOCKERS[Direction.UP.getId()] = (q, i, t) -> q.sprite(i, t, q.x(i), q.z(i)); - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/EncodingFormat.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/EncodingFormat.java deleted file mode 100644 index 9829bfe77..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/EncodingFormat.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh; - -import com.google.common.base.Preconditions; -import net.modificationstation.stationapi.api.client.render.mesh.QuadView; -import net.modificationstation.stationapi.api.client.render.model.ModelHelper; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.MathHelper; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.RenderMaterialImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.helper.GeometryHelper; - -/** - * Holds all the array offsets and bit-wise encoders/decoders for - * packing/unpacking quad data in an array of integers. - * All of this is implementation-specific - that's why it isn't a "helper" class. - */ -public abstract class EncodingFormat { - private EncodingFormat() { } - - static final int HEADER_BITS = 0; - static final int HEADER_COLOR_INDEX = 1; - static final int HEADER_TAG = 2; - public static final int HEADER_STRIDE = 3; - - static final int VERTEX_X; - static final int VERTEX_Y; - static final int VERTEX_Z; - static final int VERTEX_COLOR; - static final int VERTEX_U; - static final int VERTEX_V; - static final int VERTEX_NORMAL; - public static final int VERTEX_STRIDE; - - public static final int QUAD_STRIDE; - public static final int QUAD_STRIDE_BYTES; - public static final int TOTAL_STRIDE; - - static { - VERTEX_X = HEADER_STRIDE; - VERTEX_Y = HEADER_STRIDE + 1; - VERTEX_Z = HEADER_STRIDE + 2; - VERTEX_U = HEADER_STRIDE + 4; - VERTEX_V = VERTEX_U + 1; - VERTEX_COLOR = HEADER_STRIDE + 6; - VERTEX_NORMAL = HEADER_STRIDE + 7; - VERTEX_STRIDE = 8; - QUAD_STRIDE = VERTEX_STRIDE * 4; - QUAD_STRIDE_BYTES = QUAD_STRIDE * 4; - TOTAL_STRIDE = HEADER_STRIDE + QUAD_STRIDE; - - //noinspection ConstantValue - Preconditions.checkState(VERTEX_STRIDE == QuadView.VANILLA_VERTEX_STRIDE, "Indigo vertex stride (%s) mismatched with rendering API (%s)", VERTEX_STRIDE, QuadView.VANILLA_VERTEX_STRIDE); - //noinspection ConstantValue - Preconditions.checkState(QUAD_STRIDE == QuadView.VANILLA_QUAD_STRIDE, "Indigo quad stride (%s) mismatched with rendering API (%s)", QUAD_STRIDE, QuadView.VANILLA_QUAD_STRIDE); - } - - /** used for quick clearing of quad buffers. */ - static final int[] EMPTY = new int[TOTAL_STRIDE]; - - private static final int DIRECTION_MASK = MathHelper.smallestEncompassingPowerOfTwo(ModelHelper.NULL_FACE_ID) - 1; - private static final int DIRECTION_BIT_COUNT = Integer.bitCount(DIRECTION_MASK); - private static final int CULL_SHIFT = 0; - private static final int CULL_INVERSE_MASK = ~(DIRECTION_MASK << CULL_SHIFT); - private static final int LIGHT_SHIFT = CULL_SHIFT + DIRECTION_BIT_COUNT; - private static final int LIGHT_INVERSE_MASK = ~(DIRECTION_MASK << LIGHT_SHIFT); - private static final int NORMALS_SHIFT = LIGHT_SHIFT + DIRECTION_BIT_COUNT; - private static final int NORMALS_COUNT = 4; - private static final int NORMALS_MASK = (1 << NORMALS_COUNT) - 1; - private static final int NORMALS_INVERSE_MASK = ~(NORMALS_MASK << NORMALS_SHIFT); - private static final int GEOMETRY_SHIFT = NORMALS_SHIFT + NORMALS_COUNT; - private static final int GEOMETRY_MASK = (1 << GeometryHelper.FLAG_BIT_COUNT) - 1; - private static final int GEOMETRY_INVERSE_MASK = ~(GEOMETRY_MASK << GEOMETRY_SHIFT); - private static final int MATERIAL_SHIFT = GEOMETRY_SHIFT + GeometryHelper.FLAG_BIT_COUNT; - private static final int MATERIAL_MASK = MathHelper.smallestEncompassingPowerOfTwo(RenderMaterialImpl.VALUE_COUNT) - 1; - private static final int MATERIAL_BIT_COUNT = Integer.bitCount(MATERIAL_MASK); - private static final int MATERIAL_INVERSE_MASK = ~(MATERIAL_MASK << MATERIAL_SHIFT); - - static { - Preconditions.checkArgument(MATERIAL_SHIFT + MATERIAL_BIT_COUNT <= 32, "Indigo header encoding bit count (%s) exceeds integer bit length)", TOTAL_STRIDE); - } - - static Direction cullFace(int bits) { - return ModelHelper.faceFromIndex((bits >> CULL_SHIFT) & DIRECTION_MASK); - } - - static int cullFace(int bits, Direction face) { - return (bits & CULL_INVERSE_MASK) | (ModelHelper.toFaceIndex(face) << CULL_SHIFT); - } - - static Direction lightFace(int bits) { - return ModelHelper.faceFromIndex((bits >> LIGHT_SHIFT) & DIRECTION_MASK); - } - - static int lightFace(int bits, Direction face) { - return (bits & LIGHT_INVERSE_MASK) | (ModelHelper.toFaceIndex(face) << LIGHT_SHIFT); - } - - /** indicate if vertex normal has been set - bits correspond to vertex ordinals. */ - static int normalFlags(int bits) { - return (bits >> NORMALS_SHIFT) & NORMALS_MASK; - } - - static int normalFlags(int bits, int normalFlags) { - return (bits & NORMALS_INVERSE_MASK) | ((normalFlags & NORMALS_MASK) << NORMALS_SHIFT); - } - - static int geometryFlags(int bits) { - return (bits >> GEOMETRY_SHIFT) & GEOMETRY_MASK; - } - - static int geometryFlags(int bits, int geometryFlags) { - return (bits & GEOMETRY_INVERSE_MASK) | ((geometryFlags & GEOMETRY_MASK) << GEOMETRY_SHIFT); - } - - static RenderMaterialImpl.Value material(int bits) { - return RenderMaterialImpl.byIndex((bits >> MATERIAL_SHIFT) & MATERIAL_MASK); - } - - static int material(int bits, RenderMaterialImpl.Value material) { - return (bits & MATERIAL_INVERSE_MASK) | (material.index() << MATERIAL_SHIFT); - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MeshBuilderImpl.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MeshBuilderImpl.java deleted file mode 100644 index 3ba34c0f4..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MeshBuilderImpl.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh; - -import net.modificationstation.stationapi.api.client.render.mesh.Mesh; -import net.modificationstation.stationapi.api.client.render.mesh.MeshBuilder; -import net.modificationstation.stationapi.api.client.render.mesh.MutableQuadView; -import net.modificationstation.stationapi.api.client.render.mesh.QuadEmitter; - -/** - * Our implementation of {@link MeshBuilder}, used for static mesh creation and baking. - * Not much to it - mainly it just needs to grow the int[] array as quads are appended - * and maintain/provide a properly-configured {@link MutableQuadView} instance. - * All the encoding and other work is handled in the quad base classes. - * The one interesting bit is in {@link Maker#emit()}. - */ -public class MeshBuilderImpl implements MeshBuilder { - int[] data = new int[256]; - private final Maker maker = new Maker(); - int index = 0; - int limit = data.length; - - protected void ensureCapacity(int stride) { - if (stride > limit - index) { - limit *= 2; - final int[] bigger = new int[limit]; - System.arraycopy(data, 0, bigger, 0, index); - data = bigger; - maker.data = bigger; - } - } - - @Override - public Mesh build() { - final int[] packed = new int[index]; - System.arraycopy(data, 0, packed, 0, index); - index = 0; - maker.begin(data, index); - return new MeshImpl(packed); - } - - @Override - public QuadEmitter getEmitter() { - ensureCapacity(EncodingFormat.TOTAL_STRIDE); - maker.begin(data, index); - return maker; - } - - /** - * Our base classes are used differently so we define final - * encoding steps in subtypes. This will be a static mesh used - * at render time so we want to capture all geometry now and - * apply non-location-dependent lighting. - */ - private class Maker extends MutableQuadViewImpl implements QuadEmitter { - @Override - public Maker emit() { - computeGeometry(); - index += EncodingFormat.TOTAL_STRIDE; - ensureCapacity(EncodingFormat.TOTAL_STRIDE); - baseIndex = index; - clear(); - return this; - } - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MeshImpl.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MeshImpl.java deleted file mode 100644 index fe7ec8561..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MeshImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh; - -import net.modificationstation.stationapi.api.client.render.mesh.Mesh; -import net.modificationstation.stationapi.api.client.render.mesh.QuadView; - -import java.util.function.Consumer; - -/** - * Implementation of {@link Mesh}. - * The way we encode meshes makes it very simple. - */ -public class MeshImpl implements Mesh { - /** Used to satisfy external calls to {@link #forEach(Consumer)}. */ - ThreadLocal POOL = ThreadLocal.withInitial(QuadViewImpl::new); - - final int[] data; - - MeshImpl(int[] data) { - this.data = data; - } - - public int[] data() { - return data; - } - - @Override - public void forEach(Consumer consumer) { - forEach(consumer, POOL.get()); - } - - /** - * The renderer will call this with it's own cursor - * to avoid the performance hit of a thread-local lookup. - * Also means renderer can hold final references to quad buffers. - */ - void forEach(Consumer consumer, QuadViewImpl cursor) { - final int limit = data.length; - int index = 0; - - while (index < limit) { - cursor.load(data, index); - consumer.accept(cursor); - index += EncodingFormat.TOTAL_STRIDE; - } - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MutableQuadViewImpl.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MutableQuadViewImpl.java deleted file mode 100644 index 824147bb4..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/MutableQuadViewImpl.java +++ /dev/null @@ -1,151 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh; - -import com.google.common.base.Preconditions; -import net.modificationstation.stationapi.api.client.render.material.RenderMaterial; -import net.modificationstation.stationapi.api.client.render.mesh.QuadEmitter; -import net.modificationstation.stationapi.api.client.render.model.BakedQuad; -import net.modificationstation.stationapi.api.client.texture.Sprite; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.ArsenicRenderer; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.RenderMaterialImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.helper.NormalHelper; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.helper.TextureHelper; - -import static net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.EncodingFormat.*; - -/** - * Almost-concrete implementation of a mutable quad. The only missing part is {@link #emit()}, - * because that depends on where/how it is used. (Mesh encoding vs. render-time transformation). - */ -public abstract class MutableQuadViewImpl extends QuadViewImpl implements QuadEmitter { - public final void begin(int[] data, int baseIndex) { - this.data = data; - this.baseIndex = baseIndex; - clear(); - } - - public void clear() { - System.arraycopy(EMPTY, 0, data, baseIndex, EncodingFormat.TOTAL_STRIDE); - isGeometryInvalid = true; - nominalFace = null; - normalFlags(0); - tag(0); - colorIndex(-1); - cullFace(null); - material(ArsenicRenderer.MATERIAL_STANDARD); - } - - @Override - public final MutableQuadViewImpl material(RenderMaterial material) { - if (material == null) { - material = ArsenicRenderer.MATERIAL_STANDARD; - } - - data[baseIndex + HEADER_BITS] = EncodingFormat.material(data[baseIndex + HEADER_BITS], (RenderMaterialImpl.Value) material); - return this; - } - - @Override - public final MutableQuadViewImpl cullFace(Direction face) { - data[baseIndex + HEADER_BITS] = EncodingFormat.cullFace(data[baseIndex + HEADER_BITS], face); - nominalFace(face); - return this; - } - - @Override - public final MutableQuadViewImpl nominalFace(Direction face) { - nominalFace = face; - return this; - } - - @Override - public final MutableQuadViewImpl colorIndex(int colourIndex) { - data[baseIndex + HEADER_COLOR_INDEX] = colourIndex; - return this; - } - - @Override - public final MutableQuadViewImpl tag(int tag) { - data[baseIndex + HEADER_TAG] = tag; - return this; - } - - @Override - public final MutableQuadViewImpl fromVanilla(BakedQuad quad, RenderMaterial material, Direction cullFace) { - System.arraycopy(quad.getVertexData(), 0, data, baseIndex + HEADER_STRIDE, QUAD_STRIDE); - data[baseIndex + HEADER_BITS] = EncodingFormat.cullFace(0, cullFace); - nominalFace(quad.getFace()); - colorIndex(quad.getColorIndex()); - material(material); - tag(0); - shade(quad.hasShade()); - isGeometryInvalid = true; - return this; - } - - @Override - public MutableQuadViewImpl pos(int vertexIndex, float x, float y, float z) { - final int index = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; - data[index] = Float.floatToRawIntBits(x); - data[index + 1] = Float.floatToRawIntBits(y); - data[index + 2] = Float.floatToRawIntBits(z); - isGeometryInvalid = true; - return this; - } - - protected void normalFlags(int flags) { - data[baseIndex + HEADER_BITS] = EncodingFormat.normalFlags(data[baseIndex + HEADER_BITS], flags); - } - - @Override - public MutableQuadViewImpl normal(int vertexIndex, float x, float y, float z) { - normalFlags(normalFlags() | (1 << vertexIndex)); - data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL] = NormalHelper.packNormal(x, y, z, 0); - return this; - } - - /** - * Internal helper method. Copies face normals to vertex normals lacking one. - */ - public final void populateMissingNormals() { - final int normalFlags = this.normalFlags(); - - if (normalFlags == 0b1111) return; - - final int packedFaceNormal = NormalHelper.packNormal(faceNormal(), 0); - - for (int v = 0; v < 4; v++) { - if ((normalFlags & (1 << v)) == 0) { - data[baseIndex + v * VERTEX_STRIDE + VERTEX_NORMAL] = packedFaceNormal; - } - } - - normalFlags(0b1111); - } - - @Override - public MutableQuadViewImpl spriteColor(int vertexIndex, int spriteIndex, int color) { - Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); - - data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR] = color; - return this; - } - - @Override - public MutableQuadViewImpl sprite(int vertexIndex, int spriteIndex, float u, float v) { - Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); - - final int i = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U; - data[i] = Float.floatToRawIntBits(u); - data[i + 1] = Float.floatToRawIntBits(v); - return this; - } - - @Override - public MutableQuadViewImpl spriteBake(int spriteIndex, Sprite sprite, int bakeFlags) { - Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); - - TextureHelper.bakeSprite(this, spriteIndex, sprite, bakeFlags); - return this; - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/QuadViewImpl.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/QuadViewImpl.java deleted file mode 100644 index dba6c456e..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/mesh/QuadViewImpl.java +++ /dev/null @@ -1,243 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh; - -import com.google.common.base.Preconditions; -import net.modificationstation.stationapi.api.client.render.mesh.MutableQuadView; -import net.modificationstation.stationapi.api.client.render.mesh.QuadView; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.RenderMaterialImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.helper.GeometryHelper; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.helper.NormalHelper; - -import static net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.EncodingFormat.*; - -/** - * Base class for all quads / quad makers. Handles the ugly bits - * of maintaining and encoding the quad state. - */ -public class QuadViewImpl implements QuadView { - protected Direction nominalFace; - /** True when geometry flags or light face may not match geometry. */ - protected boolean isGeometryInvalid = true; - protected final Vec3f faceNormal = new Vec3f(); - private boolean shade = true; - - /** Size and where it comes from will vary in subtypes. But in all cases quad is fully encoded to array. */ - protected int[] data; - - /** Beginning of the quad. Also the header index. */ - protected int baseIndex = 0; - - /** - * Use when subtype is "attached" to a pre-existing array. - * Sets data reference and index and decodes state from array. - */ - final void load(int[] data, int baseIndex) { - this.data = data; - this.baseIndex = baseIndex; - load(); - } - - /** - * Like {@link #load(int[], int)} but assumes array and index already set. - * Only does the decoding part. - */ - public final void load() { - isGeometryInvalid = false; - nominalFace = lightFace(); - - // face normal isn't encoded - NormalHelper.computeFaceNormal(faceNormal, this); - } - - /** Reference to underlying array. Use with caution. Meant for fast renderer access */ - public int[] data() { - return data; - } - - public int normalFlags() { - return EncodingFormat.normalFlags(data[baseIndex + HEADER_BITS]); - } - - /** True if any vertex normal has been set. */ - public boolean hasVertexNormals() { - return normalFlags() != 0; - } - - /** gets flags used for lighting - lazily computed via {@link GeometryHelper#computeShapeFlags(QuadView)}. */ - public int geometryFlags() { - computeGeometry(); - return EncodingFormat.geometryFlags(data[baseIndex + HEADER_BITS]); - } - - protected void computeGeometry() { - if (isGeometryInvalid) { - isGeometryInvalid = false; - - NormalHelper.computeFaceNormal(faceNormal, this); - - // depends on face normal - data[baseIndex + HEADER_BITS] = EncodingFormat.lightFace(data[baseIndex + HEADER_BITS], GeometryHelper.lightFace(this)); - - // depends on light face - data[baseIndex + HEADER_BITS] = EncodingFormat.geometryFlags(data[baseIndex + HEADER_BITS], GeometryHelper.computeShapeFlags(this)); - } - } - - @Override - public final void toVanilla(int textureIndex, int[] target, int targetIndex, boolean isItem) { - System.arraycopy(data, baseIndex + VERTEX_X, target, targetIndex, QUAD_STRIDE); - } - - @Override - public final RenderMaterialImpl.Value material() { - return EncodingFormat.material(data[baseIndex + HEADER_BITS]); - } - - @Override - public final int colorIndex() { - return data[baseIndex + HEADER_COLOR_INDEX]; - } - - @Override - public final int tag() { - return data[baseIndex + HEADER_TAG]; - } - - @Override - public final Direction lightFace() { - computeGeometry(); - return EncodingFormat.lightFace(data[baseIndex + HEADER_BITS]); - } - - @Override - public final Direction cullFace() { - return EncodingFormat.cullFace(data[baseIndex + HEADER_BITS]); - } - - @Override - public final Direction nominalFace() { - return nominalFace; - } - - @Override - public final Vec3f faceNormal() { - computeGeometry(); - return faceNormal; - } - - @Override - public void copyTo(MutableQuadView target) { - computeGeometry(); - - final MutableQuadViewImpl quad = (MutableQuadViewImpl) target; - // copy everything except the material - System.arraycopy(data, baseIndex + 1, quad.data, quad.baseIndex + 1, EncodingFormat.TOTAL_STRIDE - 1); - quad.faceNormal.set(faceNormal.getX(), faceNormal.getY(), faceNormal.getZ()); - quad.nominalFace = this.nominalFace; - quad.isGeometryInvalid = false; - } - - @Override - public Vec3f copyPos(int vertexIndex, Vec3f target) { - if (target == null) { - target = new Vec3f(); - } - - final int index = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; - target.set(Float.intBitsToFloat(data[index]), Float.intBitsToFloat(data[index + 1]), Float.intBitsToFloat(data[index + 2])); - return target; - } - - @Override - public float posByIndex(int vertexIndex, int coordinateIndex) { - return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X + coordinateIndex]); - } - - @Override - public float x(int vertexIndex) { - return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X]); - } - - @Override - public float y(int vertexIndex) { - return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_Y]); - } - - @Override - public float z(int vertexIndex) { - return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_Z]); - } - - @Override - public boolean hasNormal(int vertexIndex) { - return (normalFlags() & (1 << vertexIndex)) != 0; - } - - protected final int normalIndex(int vertexIndex) { - return baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL; - } - - @Override - public Vec3f copyNormal(int vertexIndex, Vec3f target) { - if (hasNormal(vertexIndex)) { - if (target == null) { - target = new Vec3f(); - } - - final int normal = data[normalIndex(vertexIndex)]; - target.set(NormalHelper.getPackedNormalComponent(normal, 0), NormalHelper.getPackedNormalComponent(normal, 1), NormalHelper.getPackedNormalComponent(normal, 2)); - return target; - } else { - return null; - } - } - - @Override - public float normalX(int vertexIndex) { - return hasNormal(vertexIndex) ? NormalHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 0) : Float.NaN; - } - - @Override - public float normalY(int vertexIndex) { - return hasNormal(vertexIndex) ? NormalHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 1) : Float.NaN; - } - - @Override - public float normalZ(int vertexIndex) { - return hasNormal(vertexIndex) ? NormalHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 2) : Float.NaN; - } - - @Override - public int spriteColor(int vertexIndex, int spriteIndex) { - Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); - - return data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR]; - } - - @Override - public float spriteU(int vertexIndex, int spriteIndex) { - Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); - - return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U]); - } - - @Override - public float spriteV(int vertexIndex, int spriteIndex) { - Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); - - return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_V]); - } - - public int vertexStart() { - return baseIndex + HEADER_STRIDE; - } - - public boolean hasShade() { - return shade && !material().disableDiffuse(0); - } - - public void shade(boolean shade) { - this.shade = shade; - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractMeshConsumer.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractMeshConsumer.java deleted file mode 100644 index 0de3985ea..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractMeshConsumer.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.render; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.render.Tessellator; -import net.modificationstation.stationapi.api.client.render.RenderContext; -import net.modificationstation.stationapi.api.client.render.mesh.Mesh; -import net.modificationstation.stationapi.api.client.render.mesh.QuadEmitter; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.ArsenicRenderer; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.RenderMaterialImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.aocalc.LightingCalculatorImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.EncodingFormat; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.MeshImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.MutableQuadViewImpl; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -/** - * Consumer for pre-baked meshes. Works by copying the mesh data to a - * "editor" quad held in the instance, where all transformations are applied before buffering. - */ -public abstract class AbstractMeshConsumer extends AbstractQuadRenderer implements Consumer { - protected AbstractMeshConsumer(BlockRenderInfo blockInfo, Supplier bufferFunc, LightingCalculatorImpl aoCalc, RenderContext.QuadTransform transform) { - super(blockInfo, bufferFunc, aoCalc, transform); - } - - /** - * Where we handle all pre-buffer coloring, lighting, transformation, etc. - * Reused for all mesh quads. Fixed baking array sized to hold largest possible mesh quad. - */ - private class Maker extends MutableQuadViewImpl implements QuadEmitter { - { - data = new int[EncodingFormat.TOTAL_STRIDE]; - material(ArsenicRenderer.MATERIAL_STANDARD); - } - - // only used via RenderContext.getEmitter() - @Override - public Maker emit() { - computeGeometry(); - renderQuad(this); - clear(); - return this; - } - } - - private final Maker editorQuad = new Maker(); - - @Override - public void accept(Mesh mesh) { - final MeshImpl m = (MeshImpl) mesh; - final int[] data = m.data(); - final int limit = data.length; - int index = 0; - - while (index < limit) { - System.arraycopy(data, index, editorQuad.data(), 0, EncodingFormat.TOTAL_STRIDE); - editorQuad.load(); - index += EncodingFormat.TOTAL_STRIDE; - renderQuad(editorQuad); - } - } - - public QuadEmitter getEmitter() { - editorQuad.clear(); - return editorQuad; - } - - private void renderQuad(MutableQuadViewImpl q) { - if (!transform.transform(editorQuad)) { - return; - } - - if (!blockInfo.shouldDrawQuad(q)) { - return; - } - - if (!blockInfo.shouldDrawFace(q.cullFace())) { - return; - } - - final RenderMaterialImpl.Value mat = q.material(); - - if (!mat.disableAo(0) && Minecraft.method_2148()) { - // needs to happen before offsets are applied - aoCalc.calculateForQuad(q); - } - - tesselateQuad(q, mat, 0); - } - - /** - * Determines color index and render layer, then routes to appropriate - * tesselate routine based on material properties. - */ - private void tesselateQuad(MutableQuadViewImpl quad, RenderMaterialImpl.Value mat, int textureIndex) { - final int colorIndex = mat.disableColorIndex(textureIndex) ? -1 : quad.colorIndex(); - - if (blockInfo.defaultAo && !mat.disableAo(textureIndex)) { - if (mat.emissive(textureIndex)) { - tessellateSmoothEmissive(quad, colorIndex); - } else { - tessellateSmooth(quad, colorIndex); - } - } else { - if (mat.emissive(textureIndex)) { - tessellateFlatEmissive(quad, colorIndex); - } else { - tessellateFlat(quad, colorIndex); - } - } - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractQuadRenderer.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractQuadRenderer.java deleted file mode 100644 index 1adff152c..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractQuadRenderer.java +++ /dev/null @@ -1,146 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.render; - -import net.minecraft.client.render.Tessellator; -import net.modificationstation.stationapi.api.client.render.RenderContext; -import net.modificationstation.stationapi.api.util.math.Matrix3f; -import net.modificationstation.stationapi.api.util.math.Matrix4f; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.aocalc.LightingCalculatorImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.helper.ColorHelper; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.MutableQuadViewImpl; - -import java.util.function.Supplier; - -public abstract class AbstractQuadRenderer { - - static final int FULL_BRIGHTNESS = 0xF000F0; - - protected final Supplier bufferFunc; - protected final BlockRenderInfo blockInfo; - protected final LightingCalculatorImpl aoCalc; - protected final RenderContext.QuadTransform transform; - protected final Vec3f normalVec = new Vec3f(); - - protected abstract Matrix4f matrix(); - - protected abstract Matrix3f normalMatrix(); - - protected abstract int overlay(); - - AbstractQuadRenderer(BlockRenderInfo blockInfo, Supplier bufferFunc, LightingCalculatorImpl aoCalc, RenderContext.QuadTransform transform) { - this.blockInfo = blockInfo; - this.bufferFunc = bufferFunc; - this.aoCalc = aoCalc; - this.transform = transform; - } - - /** handles block colour and red-blue swizzle, common to all renders. */ - private void colorizeQuad(MutableQuadViewImpl q, int blockColourIndex) { - if (blockColourIndex == -1) { - for (int i = 0; i < 4; i++) { - q.spriteColor(i, 0, ColorHelper.swapRedBlueIfNeeded(q.spriteColor(i, 0))); - } - } else { - final int blockColour = blockInfo.blockColour(blockColourIndex); - - for (int i = 0; i < 4; i++) { - q.spriteColor(i, 0, ColorHelper.swapRedBlueIfNeeded(ColorHelper.multiplyColour(blockColour, q.spriteColor(i, 0)))); - } - } - } - - private void bufferQuad(MutableQuadViewImpl q) { - bufferQuad(bufferFunc.get(), q, matrix(), overlay(), normalMatrix(), normalVec); - } - - // TODO: make this actually work lol - public static void bufferQuad(Tessellator buff, MutableQuadViewImpl quad, Matrix4f matrix, int overlay, Matrix3f normalMatrix, Vec3f normalVec) { -// final boolean useNormals = quad.hasVertexNormals(); -// -// if (useNormals) { -// quad.populateMissingNormals(); -// } else { -// final Vec3f faceNormal = quad.faceNormal(); -// normalVec.set(faceNormal.getX(), faceNormal.getY(), faceNormal.getZ()); -// normalVec.transform(normalMatrix); -// } -// -// for (int i = 0; i < 4; i++) { -// buff.vertex(matrix, quad.x(i), quad.y(i), quad.z(i)); -// final int colour = quad.spriteColour(i, 0); -// buff.color(colour & 0xFF, (colour >> 8) & 0xFF, (colour >> 16) & 0xFF, (colour >> 24) & 0xFF); -// buff.texture(quad.spriteU(i, 0), quad.spriteV(i, 0)); -// buff.overlay(overlay); -// buff.light(quad.lightmap(i)); -// -// if (useNormals) { -// normalVec.set(quad.normalX(i), quad.normalY(i), quad.normalZ(i)); -// normalVec.transform(normalMatrix); -// } -// -// buff.normal(normalVec.getX(), normalVec.getY(), normalVec.getZ()); -// buff.next(); -// } - } - - // routines below have a bit of copy-paste code reuse to avoid conditional execution inside a hot loop - - /** for non-emissive mesh quads and all fallback quads with smooth lighting. */ - protected void tessellateSmooth(MutableQuadViewImpl q, int blockColorIndex) { - colorizeQuad(q, blockColorIndex); - - for (int i = 0; i < 4; i++) { - q.spriteColor(i, 0, ColorHelper.multiplyRGB(q.spriteColor(i, 0), aoCalc.light[i])); -// q.spriteColor(i, 0, ColourHelper.multiplyRGB(q.spriteColour(i, 0), aoCalc.ao[i])); -// q.lightmap(i, ColourHelper.maxBrightness(q.lightmap(i), aoCalc.light[i])); - } - - bufferQuad(q); - } - - /** for emissive mesh quads with smooth lighting. */ - protected void tessellateSmoothEmissive(MutableQuadViewImpl q, int blockColorIndex) { - colorizeQuad(q, blockColorIndex); - -// for (int i = 0; i < 4; i++) { -// q.spriteColour(i, 0, ColourHelper.multiplyRGB(q.spriteColour(i, 0), aoCalc.ao[i])); -// q.lightmap(i, FULL_BRIGHTNESS); -// } - - bufferQuad(q); - } - - /** for non-emissive mesh quads and all fallback quads with flat lighting. */ - protected void tessellateFlat(MutableQuadViewImpl quad, int blockColorIndex) { - colorizeQuad(quad, blockColorIndex); - - // TODO: implement -// final int brightness = flatBrightness(quad, blockInfo.blockState, blockInfo.blockPos); - - for (int i = 0; i < 4; i++) { - quad.spriteColor(i, 0, ColorHelper.multiplyRGB(quad.spriteColor(i, 0), aoCalc.light[i])); -// quad.lightmap(i, ColourHelper.maxBrightness(quad.lightmap(i), brightness)); - } - - bufferQuad(quad); - } - - /** for emissive mesh quads with flat lighting. */ - protected void tessellateFlatEmissive(MutableQuadViewImpl quad, int blockColorIndex) { - colorizeQuad(quad, blockColorIndex); - shadeFlatQuad(quad); - -// for (int i = 0; i < 4; i++) { -// quad.lightmap(i, FULL_BRIGHTNESS); -// } - - bufferQuad(quad); - } - - private void shadeFlatQuad(MutableQuadViewImpl quad) { - float shade = aoCalc.shadeMultiplier(quad.lightFace()); - for (int i = 0; i < 4; i++) { - quad.spriteColor(i, 0, ColorHelper.multiplyRGB(quad.spriteColor(i, 0), shade)); - } - } -} diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractRenderContext.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractRenderContext.java deleted file mode 100644 index d2f4c4d33..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/AbstractRenderContext.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.render; - -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.modificationstation.stationapi.api.client.render.RenderContext; -import net.modificationstation.stationapi.api.client.render.mesh.MutableQuadView; -import net.modificationstation.stationapi.api.util.math.Matrix3f; -import net.modificationstation.stationapi.api.util.math.Matrix4f; - -abstract class AbstractRenderContext implements RenderContext { - private final ObjectArrayList transformStack = new ObjectArrayList<>(); - private static final RenderContext.QuadTransform NO_TRANSFORM = (q) -> true; - protected Matrix4f matrix; - protected Matrix3f normalMatrix; - protected int overlay; - - private final QuadTransform stackTransform = (q) -> { - int i = transformStack.size() - 1; - - while (i >= 0) { - if (!transformStack.get(i--).transform(q)) { - return false; - } - } - - return true; - }; - - private QuadTransform activeTransform = NO_TRANSFORM; - - protected final boolean transform(MutableQuadView q) { - return activeTransform.transform(q); - } - - protected boolean hasTransform() { - return activeTransform != NO_TRANSFORM; - } - - @Override - public void pushTransform(QuadTransform transform) { - if (transform == null) { - throw new NullPointerException("Renderer received null QuadTransform."); - } - - transformStack.push(transform); - - if (transformStack.size() == 1) { - activeTransform = transform; - } else if (transformStack.size() == 2) { - activeTransform = stackTransform; - } - } - - @Override - public void popTransform() { - transformStack.pop(); - - if (transformStack.size() == 0) { - activeTransform = NO_TRANSFORM; - } else if (transformStack.size() == 1) { - activeTransform = transformStack.get(0); - } - } -} \ No newline at end of file diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BakedModelRendererImpl.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BakedModelRendererImpl.java index ab92bdccf..877bd93d7 100644 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BakedModelRendererImpl.java +++ b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BakedModelRendererImpl.java @@ -23,8 +23,8 @@ import net.modificationstation.stationapi.api.client.render.model.json.Transformation; import net.modificationstation.stationapi.api.client.texture.StationTextureManager; import net.modificationstation.stationapi.api.client.texture.atlas.Atlases; -import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.registry.ItemRegistry; +import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.util.Util; import net.modificationstation.stationapi.api.util.crash.CrashException; import net.modificationstation.stationapi.api.util.crash.CrashReport; @@ -60,8 +60,6 @@ public class BakedModelRendererImpl implements BakedModelRenderer { }); private final BlockColors blockColors = StationRenderAPI.getBlockColors(); private final ItemColors itemColors = StationRenderAPI.getItemColors(); - private final ThreadLocal BLOCK_CONTEXTS = ThreadLocal.withInitial(BlockRenderContext::new); - private final ThreadLocal ITEM_CONTEXTS = ThreadLocal.withInitial(() -> new ItemRenderContext(itemColors)); private boolean damage; @Override @@ -85,29 +83,25 @@ public boolean renderBlock(BlockState state, BlockPos pos, BlockView world, bool public boolean render(BlockView world, BakedModel model, BlockState state, BlockPos pos, boolean cull, Random random, long seed) { boolean rendered = false; model = Objects.requireNonNull(model.getOverrides().apply(model, state, world, pos, (int) seed)); - if (!model.isVanillaAdapter()) { - rendered = BLOCK_CONTEXTS.get().render(world, model, state, pos, random, seed); - } else { - Block block = state.getBlock(); - light.initialize( - block, - world, pos.x, pos.y, pos.z, - Minecraft.method_2148() && model.useAmbientOcclusion() - ); - ImmutableList qs; - BakedQuad q; - float[] qlight = light.light; - for (int quadSet = 0, size = DIRECTIONS.length; quadSet < size; quadSet++) { - Direction face = DIRECTIONS[quadSet]; - random.setSeed(seed); - qs = model.getQuads(state, face, random); - if (!qs.isEmpty() && (face == null || block.isSideVisible(world, pos.x + face.getOffsetX(), pos.y + face.getOffsetY(), pos.z + face.getOffsetZ(), quadSet))) { - rendered = true; - for (int j = 0, quadSize = qs.size(); j < quadSize; j++) { - q = qs.get(j); - light.calculateForQuad(q); - renderQuad(world, state, pos, q, qlight); - } + Block block = state.getBlock(); + light.initialize( + block, + world, pos.x, pos.y, pos.z, + Minecraft.method_2148() && model.useAmbientOcclusion() + ); + ImmutableList qs; + BakedQuad q; + float[] qlight = light.light; + for (int quadSet = 0, size = DIRECTIONS.length; quadSet < size; quadSet++) { + Direction face = DIRECTIONS[quadSet]; + random.setSeed(seed); + qs = model.getQuads(state, face, random); + if (!qs.isEmpty() && (face == null || block.isSideVisible(world, pos.x + face.getOffsetX(), pos.y + face.getOffsetY(), pos.z + face.getOffsetZ(), quadSet))) { + rendered = true; + for (int j = 0, quadSize = qs.size(); j < quadSize; j++) { + q = qs.get(j); + light.calculateForQuad(q); + renderQuad(world, state, pos, q, qlight); } } } @@ -206,29 +200,25 @@ private void renderBakedItemModelFlat(BakedModel model, ItemStack stack, float b @Override public void renderItem(ItemStack stack, ModelTransformation.Mode renderMode, float brightness, BakedModel model) { if (stack == null || stack.itemId == 0) return; - if (model.isVanillaAdapter()) { - Transformation transformation = model.getTransformation().getTransformation(renderMode); - transformation.apply(); - boolean side = model.isSideLit(); - if (side && renderMode == ModelTransformation.Mode.GUI) { - float angle = transformation.rotation.getY() - 315; - if (angle != 0) { - class_583.method_1927(); - glPushMatrix(); - glRotatef(angle, 0, 1, 0); - class_583.method_1930(); - glPopMatrix(); - } + Transformation transformation = model.getTransformation().getTransformation(renderMode); + transformation.apply(); + boolean side = model.isSideLit(); + if (side && renderMode == ModelTransformation.Mode.GUI) { + float angle = transformation.rotation.getY() - 315; + if (angle != 0) { + class_583.method_1927(); + glPushMatrix(); + glRotatef(angle, 0, 1, 0); + class_583.method_1930(); + glPopMatrix(); } - glTranslatef(-0.5F, -0.5F, -0.5F); - if (model.isBuiltin()) return; - if (!side && renderMode == ModelTransformation.Mode.GROUND) - renderBakedItemModelFlat(model, stack, brightness); - else - renderBakedItemModel(model, stack, brightness); - } else { - ITEM_CONTEXTS.get().renderModel(stack, renderMode, model, this::renderBakedItemModel); } + glTranslatef(-0.5F, -0.5F, -0.5F); + if (model.isBuiltin()) return; + if (!side && renderMode == ModelTransformation.Mode.GROUND) + renderBakedItemModelFlat(model, stack, brightness); + else + renderBakedItemModel(model, stack, brightness); } private void renderBakedItemQuads(List quads, ItemStack stack, float brightness) { diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BlockRenderContext.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BlockRenderContext.java deleted file mode 100644 index ba72f7b6e..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BlockRenderContext.java +++ /dev/null @@ -1,97 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.render; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.render.Tessellator; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.modificationstation.stationapi.api.block.BlockState; -import net.modificationstation.stationapi.api.client.render.mesh.Mesh; -import net.modificationstation.stationapi.api.client.render.mesh.QuadEmitter; -import net.modificationstation.stationapi.api.client.render.model.BakedModel; -import net.modificationstation.stationapi.api.util.math.Matrix3f; -import net.modificationstation.stationapi.api.util.math.Matrix4f; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.aocalc.LightingCalculatorImpl; - -import java.util.Random; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class BlockRenderContext extends AbstractRenderContext { - - private final BlockRenderInfo blockInfo = new BlockRenderInfo(); - private final LightingCalculatorImpl aoCalc = new LightingCalculatorImpl(3); - private final MeshConsumer meshConsumer = new MeshConsumer(blockInfo, this::outputBuffer, aoCalc, this::transform); - private Tessellator bufferBuilder; - private boolean didOutput; - private Random random; - private long seed; - private final Supplier randomSupplier = () -> { - random.setSeed(seed); - return random; - }; - - @Override - public Consumer meshConsumer() { - return meshConsumer; - } - - @Override - public Consumer fallbackConsumer() { - return null; - } - - @Override - public QuadEmitter getEmitter() { - return meshConsumer.getEmitter(); - } - - private Tessellator outputBuffer() { - didOutput = true; - return bufferBuilder; - } - - public boolean render(BlockView blockView, BakedModel model, BlockState state, BlockPos pos, Random random, long seed) { - this.bufferBuilder = Tessellator.INSTANCE; -// this.matrix = matrixStack.peek().getPositionMatrix(); -// this.normalMatrix = matrixStack.peek().getNormalMatrix(); - this.random = random; - this.seed = seed; - -// this.overlay = overlay; - this.didOutput = false; - aoCalc.initialize(state.getBlock(), blockView, pos.x, pos.y, pos.z, Minecraft.method_2148() && model.useAmbientOcclusion()); - blockInfo.setBlockView(blockView); - blockInfo.prepareForBlock(state, pos, model.useAmbientOcclusion()); - - model.emitBlockQuads(blockView, state, pos, randomSupplier, this); - - blockInfo.release(); - this.bufferBuilder = null; - this.random = null; - this.seed = seed; - - return didOutput; - } - - private class MeshConsumer extends AbstractMeshConsumer { - - MeshConsumer(BlockRenderInfo blockInfo, Supplier bufferFunc, LightingCalculatorImpl aoCalc, QuadTransform transform) { - super(blockInfo, bufferFunc, aoCalc, transform); - } - - @Override - protected Matrix4f matrix() { - return matrix; - } - - @Override - protected Matrix3f normalMatrix() { - return normalMatrix; - } - - @Override - protected int overlay() { - return overlay; - } - } -} diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BlockRenderInfo.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BlockRenderInfo.java deleted file mode 100644 index 4db2cd56c..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/BlockRenderInfo.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.modificationstation.stationapi.impl.client.arsenic.renderer.render; - -import net.minecraft.client.Minecraft; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -import net.modificationstation.stationapi.api.block.BlockState; -import net.modificationstation.stationapi.api.client.StationRenderAPI; -import net.modificationstation.stationapi.api.client.color.block.BlockColors; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.MutableQuadViewImpl; - -import java.util.Random; -import java.util.function.Supplier; - -/** - * Holds, manages and provides access to the block/world related state - * needed by fallback and mesh consumers. - * - *

Exception: per-block position offsets are tracked in {@link ChunkRenderInfo} - * so they can be applied together with chunk offsets. - */ -public class BlockRenderInfo { - private final BlockColors blockColorMap = StationRenderAPI.getBlockColors(); - public final Random random = new Random(); - public BlockView blockView; - public BlockPos blockPos; - public BlockState blockState; - public long seed; - boolean defaultAo; - - public final Supplier randomSupplier = () -> { - final Random result = random; - long seed = this.seed; - - if (seed == -1L) { - seed = blockState.getRenderingSeed(blockPos); - this.seed = seed; - } - - result.setSeed(seed); - return result; - }; - - public void setBlockView(BlockView blockView) { - this.blockView = blockView; - } - - public void prepareForBlock(BlockState blockState, BlockPos blockPos, boolean modelAO) { - this.blockPos = blockPos; - this.blockState = blockState; - // in the unlikely case seed actually matches this, we'll simply retrieve it more than one - seed = -1L; - defaultAo = modelAO && Minecraft.method_2148() && blockState.getLuminance() == 0; - } - - public void release() { - blockPos = null; - blockState = null; - } - - int blockColour(int colorIndex) { - return 0xFF000000 | blockColorMap.getColor(blockState, blockView, blockPos, colorIndex); - } - - boolean shouldDrawFace(Direction face) { - return true; - } - - boolean shouldDrawQuad(MutableQuadViewImpl quad) { - Direction cull = quad.cullFace(); - return cull == null || blockState.getBlock().isSideVisible(blockView, blockPos.x + cull.getOffsetX(), blockPos.y + cull.getOffsetY(), blockPos.z + cull.getOffsetZ(), cull.ordinal()); - } -} diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/ItemRenderContext.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/ItemRenderContext.java deleted file mode 100644 index 7814d864e..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/ItemRenderContext.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.render; - -import net.minecraft.client.render.Tessellator; -import net.minecraft.item.ItemStack; -import net.modificationstation.stationapi.api.client.color.item.ItemColors; -import net.modificationstation.stationapi.api.client.render.material.BlendMode; -import net.modificationstation.stationapi.api.client.render.mesh.Mesh; -import net.modificationstation.stationapi.api.client.render.mesh.QuadEmitter; -import net.modificationstation.stationapi.api.client.render.model.BakedModel; -import net.modificationstation.stationapi.api.client.render.model.BakedQuad; -import net.modificationstation.stationapi.api.client.render.model.ModelHelper; -import net.modificationstation.stationapi.api.client.render.model.json.ModelTransformation; -import net.modificationstation.stationapi.api.util.math.Direction; -import net.modificationstation.stationapi.api.util.math.Matrix4f; -import net.modificationstation.stationapi.api.util.math.MatrixStack; -import net.modificationstation.stationapi.api.util.math.Vec3f; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.ArsenicRenderer; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.RenderMaterialImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.helper.ColorHelper; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.EncodingFormat; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.MeshImpl; -import net.modificationstation.stationapi.impl.client.arsenic.renderer.mesh.MutableQuadViewImpl; - -import java.util.List; -import java.util.Random; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class ItemRenderContext extends AbstractRenderContext { - - /** Value vanilla uses for item rendering. The only sensible choice, of course. */ - private static final long ITEM_RANDOM_SEED = 42L; - - /** used to accept a method reference from the ItemRenderer. */ - @FunctionalInterface - public interface VanillaQuadHandler { - void accept(BakedModel model, ItemStack stack, float brightness); - } - - private final ItemColors colorMap; - private final Random random = new Random(); - private final Consumer fallbackConsumer; - private final Vec3f normalVec = new Vec3f(); - - private MatrixStack matrixStack; - private Matrix4f matrix; -// private VertexConsumer vertexConsumerProvider; - private Tessellator modelVertexConsumer; - private BlendMode quadBlendMode; - private Tessellator quadVertexConsumer; - private ModelTransformation.Mode transformMode; - private float brightness; - private int lightmap; - private int overlay; - private ItemStack itemStack; - private VanillaQuadHandler vanillaHandler; - - private final Supplier randomSupplier = () -> { - random.setSeed(ITEM_RANDOM_SEED); - return random; - }; - - private final int[] quadData = new int[EncodingFormat.TOTAL_STRIDE]; - - public ItemRenderContext(ItemColors colorMap) { - this.colorMap = colorMap; - fallbackConsumer = this::fallbackConsumer; - } - - public void renderModel(ItemStack itemStack, ModelTransformation.Mode transformMode, BakedModel model, VanillaQuadHandler vanillaHandler) { - this.itemStack = itemStack; -// this.vertexConsumerProvider = vertexConsumerProvider; -// this.matrixStack = matrixStack; - this.transformMode = transformMode; - this.vanillaHandler = vanillaHandler; - quadBlendMode = BlendMode.DEFAULT; -// modelVertexConsumer = selectVertexConsumer(RenderLayers.getItemLayer(itemStack, transformMode != ModelTransformation.Mode.GROUND)); -// modelVertexConsumer = vertexConsumer; - - matrixStack.push(); - model.getTransformation().getTransformation(transformMode).apply(); - matrixStack.translate(-0.5D, -0.5D, -0.5D); - matrix = matrixStack.peek().getPositionMatrix(); - normalMatrix = matrixStack.peek().getNormalMatrix(); - - model.emitItemQuads(itemStack, randomSupplier, this); - - matrixStack.pop(); - - this.matrixStack = null; - this.itemStack = null; - this.vanillaHandler = null; - modelVertexConsumer = null; - } - - /** - * Use non-culling translucent material in GUI to match vanilla behavior. If the item - * is enchanted then also select a dual-output vertex consumer. For models with layered - * coplanar polygons this means we will render the glint more than once. Indigo doesn't - * support sprite layers, so this can't be helped in this implementation. - */ -// private VertexConsumer selectVertexConsumer(RenderLayer layerIn) { -// final RenderLayer layer = transformMode == ModelTransformation.Mode.GUI ? TexturedRenderLayers.getEntityTranslucentCull() : layerIn; -// return ItemRenderer.getArmorGlintConsumer(vertexConsumerProvider, layer, true, itemStack.hasGlint()); -// } - - private class Maker extends MutableQuadViewImpl implements QuadEmitter { - { - data = quadData; - clear(); - } - - @Override - public Maker emit() { - computeGeometry(); - renderQuad(); - clear(); - return this; - } - } - - private final Maker editorQuad = new Maker(); - - private final Consumer meshConsumer = (mesh) -> { - final MeshImpl m = (MeshImpl) mesh; - final int[] data = m.data(); - final int limit = data.length; - int index = 0; - - while (index < limit) { - System.arraycopy(data, index, editorQuad.data(), 0, EncodingFormat.TOTAL_STRIDE); - editorQuad.load(); - index += EncodingFormat.TOTAL_STRIDE; - renderQuad(); - } - }; - - private int indexColor() { - final int colorIndex = editorQuad.colorIndex(); - return colorIndex == -1 ? -1 : (colorMap.getColor(itemStack, colorIndex) | 0xFF000000); - } - - private void renderQuad() { - final MutableQuadViewImpl quad = editorQuad; - - if (!transform(editorQuad)) { - return; - } - - final RenderMaterialImpl.Value mat = quad.material(); - final int quadColor = mat.disableColorIndex(0) ? -1 : indexColor(); - final int lightmap = mat.emissive(0) ? AbstractQuadRenderer.FULL_BRIGHTNESS : this.lightmap; - - for (int i = 0; i < 4; i++) { - int c = quad.spriteColor(i, 0); - c = ColorHelper.multiplyColour(quadColor, c); - quad.spriteColor(i, 0, ColorHelper.swapRedBlueIfNeeded(c)); -// quad.lightmap(i, ColourHelper.maxBrightness(quad.lightmap(i), lightmap)); - } - - AbstractQuadRenderer.bufferQuad(quadVertexConsumer(mat.blendMode(0)), quad, matrix, overlay, normalMatrix, normalVec); - } - - private Tessellator quadVertexConsumer(BlendMode blendMode) { - return quadVertexConsumer = modelVertexConsumer; - } - - @Override - public Consumer meshConsumer() { - return meshConsumer; - } - - private void fallbackConsumer(BakedModel model) { - if (hasTransform()) { - // if there's a transform in effect, convert to mesh-based quads so that we can apply it - for (int i = 0; i <= ModelHelper.NULL_FACE_ID; i++) { - random.setSeed(ITEM_RANDOM_SEED); - final Direction cullFace = ModelHelper.faceFromIndex(i); - renderFallbackWithTransform(model.getQuads(null, cullFace, random), cullFace); - } - } else { - for (int i = 0; i <= ModelHelper.NULL_FACE_ID; i++) { - vanillaHandler.accept(model, itemStack, brightness); - } - } - } - - private void renderFallbackWithTransform(List quads, Direction cullFace) { - if (quads.isEmpty()) { - return; - } - - final Maker editorQuad = this.editorQuad; - - for (final BakedQuad q : quads) { - editorQuad.fromVanilla(q, ArsenicRenderer.MATERIAL_STANDARD, cullFace); - renderQuad(); - } - } - - @Override - public Consumer fallbackConsumer() { - return fallbackConsumer; - } - - @Override - public QuadEmitter getEmitter() { - editorQuad.clear(); - return editorQuad; - } -} diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/VanillaModelsAdapter.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/VanillaModelsAdapter.java deleted file mode 100644 index 865142f24..000000000 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/renderer/render/VanillaModelsAdapter.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.modificationstation.stationapi.impl.client.arsenic.renderer.render; - -import net.mine_diver.unsafeevents.listener.EventListener; -import net.modificationstation.stationapi.api.StationAPI; -import net.modificationstation.stationapi.api.client.event.render.model.LoadUnbakedModelEvent; -import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; -import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; - -@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) -@EventListener(phase = StationAPI.INTERNAL_PHASE) -public class VanillaModelsAdapter { - - // EXPERIMENTAL BACKWARDS COMPATIBILITY WITH VANILLA RENDERER. - // BROKEN, CAN ONLY BAKE FULL-BLOCK MODELS, DOES NOT SUPPORT COLOUR PROVIDERS AND CAN NOT ADJUST RENDERER SIZES AND TEXTURES ON THE FLY (PORTAL, GRASS BLOCK) - // IMPLEMENTING THE LATTER MAY INDUCE LARGE PERFORMANCE DROPS - @EventListener - private static void registerModel(LoadUnbakedModelEvent event) { -// Identifier id = event.getIdentifier(); -// ModelIdentifier modelId = ModelIdentifier.of(id.toString()); -// if (modelId.id.modID == ModID.MINECRAFT) { -// Identifier itemId = modelId.id.id.startsWith("item/") ? Identifier.of(modelId.id.modID, modelId.id.id.substring(5)) : modelId.id; -// ItemRegistry.INSTANCE.get(itemId).ifPresent(itemBase -> event.model = new VanillaUnbakedModel(itemId)); -// } - } -} diff --git a/station-renderer-arsenic/src/main/resources/fabric.mod.json b/station-renderer-arsenic/src/main/resources/fabric.mod.json index eae182c21..9325699d9 100644 --- a/station-renderer-arsenic/src/main/resources/fabric.mod.json +++ b/station-renderer-arsenic/src/main/resources/fabric.mod.json @@ -20,8 +20,7 @@ "environment": "client", "entrypoints": { "stationapi:event_bus_client": [ - "net.modificationstation.stationapi.impl.client.arsenic.Arsenic", - "net.modificationstation.stationapi.impl.client.arsenic.renderer.render.VanillaModelsAdapter" + "net.modificationstation.stationapi.impl.client.arsenic.Arsenic" ] }, "mixins": [ From 324abc7da17d518ec40aaee8fc855c5bf4ebc67d Mon Sep 17 00:00:00 2001 From: mine_diver Date: Sun, 29 Dec 2024 00:38:58 +0500 Subject: [PATCH 04/27] Updated UnsafeEvents --- gradle.properties | 2 +- .../java/net/modificationstation/sltest/block/Blocks.java | 5 +++++ .../sltest/datafixer/DataFixerListener.java | 6 ++++++ .../sltest/dimension/DimensionListener.java | 6 ++++++ .../gui/screen/achievement/AchievementPageImpl.java | 6 ++++++ .../stationapi/impl/mod/DeprecatedInitEventsImpl.java | 7 +++++++ .../stationapi/impl/block/BlockFormOnlyHandler.java | 6 ++++++ .../impl/block/HasCustomBlockItemFactoryImpl.java | 5 +++++ .../stationapi/impl/block/HasMetaBlockItemImpl.java | 6 ++++++ .../stationapi/impl/block/HasMetaNamedBlockItemImpl.java | 6 ++++++ .../impl/client/network/GuiClientNetworkHandler.java | 8 +++++++- .../impl/client/network/EntityClientNetworkHandler.java | 5 +++++ .../stationapi/impl/server/entity/CustomTrackingImpl.java | 6 ++++++ .../impl/server/entity/TrackingParametersImpl.java | 6 ++++++ .../modificationstation/stationapi/api/block/States.java | 5 +++++ .../registry/sync/trackers/vanilla/BlockItemTracker.java | 6 ++++++ .../stationapi/impl/block/BlockInteractionImpl.java | 6 ++++++ .../stationapi/impl/block/PlacementStateImpl.java | 6 ++++++ .../stationapi/impl/world/WorldDataVersionImpl.java | 6 ++++++ .../impl/client/gui/screen/EditWorldScreenImpl.java | 6 ++++++ .../gui/screen/container/CustomTooltipRendererImpl.java | 6 ++++++ .../impl/client/render/item/CustomItemOverlayImpl.java | 7 +++++++ .../impl/dispenser/CustomDispenseBehaviorImpl.java | 7 +++++++ .../impl/entity/player/ItemCustomReachImpl.java | 7 +++++++ .../stationapi/api/resource/language/LanguageManager.java | 6 ++++++ .../impl/network/packet/StationNetworkingInit.java | 7 +++++++ .../stationapi/impl/recipe/JsonRecipeParserInit.java | 5 +++++ .../stationapi/impl/recipe/JsonRecipesLoader.java | 7 ++++++- .../impl/recipe/json/JsonRecipeParserRegisterImpl.java | 6 ++++++ .../api/registry/sync/trackers/BooleanArrayTracker.java | 5 +++++ .../api/registry/sync/trackers/Int2ObjectMapTracker.java | 5 +++++ .../api/registry/sync/trackers/IntArrayTracker.java | 5 +++++ .../api/registry/sync/trackers/ObjectArrayTracker.java | 5 +++++ .../sync/trackers/RemappableEntryArrayTracker.java | 5 +++++ .../api/registry/sync/trackers/StateIdTracker.java | 5 +++++ .../stationapi/impl/registry/TagReloaderImpl.java | 7 +++++++ .../stationapi/impl/registry/WorldRegistryRemapper.java | 6 ++++++ .../impl/client/registry/ClientRegistryRestorer.java | 7 +++++++ .../client/registry/ClientServerRegistryRemapper.java | 5 +++++ .../stationapi/impl/network/RegistryNetworkingInit.java | 7 +++++++ .../impl/server/registry/ServerRegistrySender.java | 5 +++++ .../impl/server/registry/ServerRegistrySynchronizer.java | 7 +++++++ .../stationapi/impl/client/texture/StationRenderImpl.java | 5 +++++ .../stationapi/impl/client/arsenic/Arsenic.java | 4 ++++ .../impl/client/resource/AssetsReloaderImpl.java | 6 ++++++ .../stationapi/impl/resource/DataReloaderImpl.java | 6 ++++++ .../stationapi/impl/item/HijackShearsImplV1.java | 7 +++++++ .../impl/client/network/ClientVanillaChecker.java | 5 +++++ .../stationapi/impl/network/VanillaChecker.java | 6 ++++++ .../impl/server/network/ServerVanillaChecker.java | 5 +++++ .../impl/vanillafix/block/VanillaBlockFixImpl.java | 6 ++++++ .../client/color/block/VanillaBlockColorProviders.java | 7 +++++++ .../vanillafix/client/gui/screen/EditWorldScreenImpl.java | 7 +++++++ .../impl/vanillafix/datafixer/VanillaDataFixerImpl.java | 6 ++++++ .../vanillafix/dimension/VanillaDimensionFixImpl.java | 6 ++++++ .../impl/vanillafix/item/VanillaItemFixImpl.java | 7 +++++++ .../impl/vanillafix/recipe/VanillaFuelItemFixImpl.java | 7 +++++++ 57 files changed, 334 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 368993ac6..4ed8af834 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ fabric.loom.multiProjectOptimisation=true # Library Properties typetools_version = 0.8.3 - unsafeevents_version = 17ac2971 + unsafeevents_version = e31096e fastutil_version = 8.5.8 caffeine_version = 3.0.5 dfu_version = 6.0.6 diff --git a/src/test/java/net/modificationstation/sltest/block/Blocks.java b/src/test/java/net/modificationstation/sltest/block/Blocks.java index 5385bf4f2..a86479b9c 100644 --- a/src/test/java/net/modificationstation/sltest/block/Blocks.java +++ b/src/test/java/net/modificationstation/sltest/block/Blocks.java @@ -1,6 +1,7 @@ package net.modificationstation.sltest.block; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.block.Material; import net.modificationstation.sltest.mixin.BlockBaseAccessor; @@ -8,6 +9,7 @@ import net.modificationstation.stationapi.api.template.block.TemplateBlock; import net.modificationstation.stationapi.api.util.Identifier; +import java.lang.invoke.MethodHandles; import java.util.Arrays; import java.util.function.Function; @@ -37,6 +39,9 @@ public Block get() { } public static class Init { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void registerBlocks(BlockRegistryEvent event) { diff --git a/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java b/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java index e7c9d065e..e98c66547 100644 --- a/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java +++ b/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java @@ -1,14 +1,20 @@ package net.modificationstation.sltest.datafixer; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.nbt.NbtCompound; import net.modificationstation.stationapi.api.event.datafixer.DataFixerRegisterEvent; import net.modificationstation.stationapi.api.util.Util; +import java.lang.invoke.MethodHandles; + import static net.modificationstation.stationapi.api.vanillafix.datafixer.schema.StationFlatteningItemStackSchema.putItem; import static net.modificationstation.stationapi.api.vanillafix.datafixer.schema.StationFlatteningItemStackSchema.putState; public class DataFixerListener { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void registerFixer(DataFixerRegisterEvent event) { diff --git a/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java b/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java index 97af9930a..24e45f194 100644 --- a/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java +++ b/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java @@ -1,14 +1,20 @@ package net.modificationstation.sltest.dimension; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.event.registry.DimensionRegistryEvent; import net.modificationstation.stationapi.api.registry.DimensionContainer; import net.modificationstation.stationapi.api.registry.DimensionRegistry; +import java.lang.invoke.MethodHandles; + import static net.modificationstation.sltest.SLTest.NAMESPACE; import static net.modificationstation.stationapi.api.util.Identifier.of; public class DimensionListener { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void registerDimensions(DimensionRegistryEvent event) { diff --git a/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java b/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java index 33402e443..e9f7fb7ca 100644 --- a/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java +++ b/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java @@ -2,6 +2,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.achievement.Achievement; import net.minecraft.achievement.Achievements; import net.minecraft.client.Minecraft; @@ -12,6 +13,7 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; import java.util.List; import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; @@ -19,6 +21,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class AchievementPageImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void replaceBackgroundTexture(AchievementsScreenEvent.BackgroundTextureRender event) { event.backgroundTexture = AchievementPage.getCurrentPage().getBackgroundTexture(event.random, event.column, event.row, event.randomizedRow, event.backgroundTexture); diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/impl/mod/DeprecatedInitEventsImpl.java b/station-api-base/src/main/java/net/modificationstation/stationapi/impl/mod/DeprecatedInitEventsImpl.java index 1a84aa854..6a11f5591 100644 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/impl/mod/DeprecatedInitEventsImpl.java +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/impl/mod/DeprecatedInitEventsImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.mod; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.mod.InitEvent; import net.modificationstation.stationapi.api.event.mod.PostInitEvent; @@ -8,9 +9,15 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; + @SuppressWarnings("deprecation") @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) public final class DeprecatedInitEventsImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener(phase = InitEvent.PRE_INIT_PHASE) private static void postPreInit(InitEvent event) { StationAPI.EVENT_BUS.post(PreInitEvent.builder().build()); diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockFormOnlyHandler.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockFormOnlyHandler.java index 97f2cf08b..f8e598218 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockFormOnlyHandler.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockFormOnlyHandler.java @@ -2,6 +2,7 @@ import com.google.common.base.Suppliers; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.item.BlockItem; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.block.BlockItemFactoryEvent; @@ -10,11 +11,16 @@ import net.modificationstation.stationapi.api.util.UnsafeProvider; import org.jetbrains.annotations.ApiStatus; +import java.lang.invoke.MethodHandles; import java.util.function.Supplier; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class BlockFormOnlyHandler { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @ApiStatus.Internal public static final Supplier EMPTY_BLOCK_ITEM = Suppliers.memoize(() -> { try { diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java index bacc1f709..466786870 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.item.BlockItem; import net.modificationstation.stationapi.api.StationAPI; @@ -28,6 +29,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class HasCustomBlockItemFactoryImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + /** * Processes {@link HasCustomBlockItemFactory} annotation if present via {@link BlockItemFactoryEvent} hook. * @param event blockitemfactory callback. diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java index 01b5756d7..dd1941dde 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.item.BlockItem; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.block.*; @@ -9,6 +10,7 @@ import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.template.item.MetaBlockItem; +import java.lang.invoke.MethodHandles; import java.util.function.IntFunction; /** @@ -25,6 +27,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class HasMetaBlockItemImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + /** * Handles block's {@link HasMetaBlockItem} annotation if it's present via {@link BlockItemFactoryEvent} hook. * @param event blockitemfactory callback. diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java index 3a773d3d9..47bf2fae2 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.item.BlockItem; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.block.*; @@ -9,6 +10,7 @@ import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.template.item.MetaNamedBlockItem; +import java.lang.invoke.MethodHandles; import java.util.function.IntFunction; /** @@ -25,6 +27,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class HasMetaNamedBlockItemImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + /** * Handles block's {@link HasMetaNamedBlockItem} annotation if it's present via {@link BlockItemFactoryEvent} hook. * @param event blockitemfactory callback. diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java index 20a200524..63b6fa3ce 100644 --- a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java +++ b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java @@ -2,6 +2,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; @@ -13,14 +14,19 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.network.packet.MessagePacket; -import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.registry.Registry; +import net.modificationstation.stationapi.api.util.Identifier; + +import java.lang.invoke.MethodHandles; import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class GuiClientNetworkHandler { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void registerMessageListeners(MessageListenerRegistryEvent event) { diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java index e10171aa8..0a72bede8 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java @@ -2,6 +2,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.class_454; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; @@ -27,6 +28,7 @@ import java.io.ByteArrayInputStream; import java.io.DataInputStream; +import java.lang.invoke.MethodHandles; import java.util.Arrays; import java.util.List; import java.util.function.Function; @@ -37,6 +39,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class EntityClientNetworkHandler { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void registerMessageListeners(MessageListenerRegistryEvent event) { diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java index 969648255..d9fd5a78b 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.server.entity; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.class_488; import net.minecraft.class_80; import net.modificationstation.stationapi.api.StationAPI; @@ -11,6 +12,8 @@ import net.modificationstation.stationapi.api.server.entity.TrackingParametersProvider; import net.modificationstation.stationapi.api.server.event.entity.TrackEntityEvent; +import java.lang.invoke.MethodHandles; + /** * {@link CustomTracking} implementation class. * @author mine_diver @@ -22,6 +25,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class CustomTrackingImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } /** * Invokes {@link CustomTracking#track(class_488, class_80)} in entity if it's instance of {@link CustomTracking} via {@link TrackEntityEvent} hook. diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java index 605f3b594..b61240567 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.server.entity; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.class_488; import net.minecraft.class_80; import net.minecraft.entity.Entity; @@ -13,6 +14,8 @@ import net.modificationstation.stationapi.api.server.event.entity.TrackEntityEvent; import net.modificationstation.stationapi.api.util.TriState; +import java.lang.invoke.MethodHandles; + /** * {@link TrackingParametersProvider} implementation class. * @author mine_diver @@ -24,6 +27,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class TrackingParametersImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } /** * Handles entity's {@link HasTrackingParameters} annotation if it's present via {@link TrackEntityEvent} hook. diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java index 2a5cad7de..a18694d7c 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java @@ -2,6 +2,7 @@ import com.google.common.base.Suppliers; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent; @@ -10,6 +11,7 @@ import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.collection.IdList; +import java.lang.invoke.MethodHandles; import java.util.function.Supplier; import static net.modificationstation.stationapi.api.util.Identifier.of; @@ -17,6 +19,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class States { + static { + Listener.registerLookup(MethodHandles.lookup()); + } private static final Supplier AIR_BLOCK = Suppliers.memoize(() -> new Air(0)); diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java index fcf9613e0..3c89c79f1 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java @@ -8,7 +8,13 @@ import net.modificationstation.stationapi.api.registry.ListenableRegistry; import net.modificationstation.stationapi.api.registry.Registry; +import java.lang.invoke.MethodHandles; + public final class BlockItemTracker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private BlockItemTracker() { } public static & ListenableRegistry> void register(R registry) { diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java index 13ba53a5a..7abf61833 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java @@ -1,15 +1,21 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.block.BeforeBlockRemoved; import net.modificationstation.stationapi.api.event.block.BlockEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class BlockInteractionImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void beforeBlockRemoved(BlockEvent.BeforeRemoved event) { diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java index 9825eebc9..ff5f1b8b1 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.Vec3d; import net.modificationstation.stationapi.api.StationAPI; @@ -10,9 +11,14 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class PlacementStateImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void handleBlockPlacement(BlockEvent.BeforePlacedByItem event) { diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java index 032b9d58e..608abb33a 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java @@ -2,6 +2,7 @@ import com.google.common.collect.Iterators; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.modificationstation.stationapi.api.StationAPI; @@ -11,11 +12,16 @@ import net.modificationstation.stationapi.api.nbt.NbtHelper; import net.modificationstation.stationapi.mixin.nbt.NbtCompoundAccessor; +import java.lang.invoke.MethodHandles; import java.util.Map; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class WorldDataVersionImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void addDataVersions(WorldPropertiesEvent.Save event) { Map.Entry entry = Iterators.getOnlyElement(((NbtCompoundAccessor) NbtHelper.addDataVersions(new NbtCompound())).stationapi$getEntries().entrySet().iterator()); diff --git a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java index 37525ecfb..b573d5cb3 100644 --- a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java +++ b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.client.gui.screen; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.gui.screen.world.EditWorldScreen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.resource.language.I18n; @@ -11,9 +12,14 @@ import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.mixin.gui.client.ScreenAccessor; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class EditWorldScreenImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void registerRenameWorld(EditWorldScreenEvent.ScrollableButtonContextRegister event) { diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java index ac3f3173b..a13663c3b 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.client.gui.screen.container; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.gui.DrawContext; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.TooltipHelper; @@ -10,12 +11,17 @@ import net.modificationstation.stationapi.mixin.item.client.DrawContextAccessor; import net.modificationstation.stationapi.mixin.item.client.HandledScreenAccessor; +import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.stream.IntStream; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class CustomTooltipRendererImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private static final DrawContext CONTEXT = new DrawContext(); @EventListener diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java index cb178cb42..c4cce8b15 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java @@ -1,15 +1,22 @@ package net.modificationstation.stationapi.impl.client.render.item; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.render.item.ItemOverlayRenderEvent; import net.modificationstation.stationapi.api.client.item.CustomItemOverlay; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class CustomItemOverlayImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void renderItemOverlay(ItemOverlayRenderEvent event) { if (event.itemStack != null && event.itemStack.getItem() instanceof CustomItemOverlay itemOverlay) diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java index 972a80e3a..8d7fb3518 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java @@ -1,15 +1,22 @@ package net.modificationstation.stationapi.impl.dispenser; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.dispenser.DispenseEvent; import net.modificationstation.stationapi.api.item.CustomDispenseBehavior; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class CustomDispenseBehaviorImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void implementCustomDispenseBehaviorInterface(DispenseEvent event) { if (event.context.itemStack != null) { diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java index 22710a0eb..338162157 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.entity.player; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.modificationstation.stationapi.api.StationAPI; @@ -9,9 +10,15 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class ItemCustomReachImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void getReach(PlayerEvent.Reach event) { ItemStack stack = event.player.getHand(); diff --git a/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java b/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java index dd306a22c..b93184427 100644 --- a/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java +++ b/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java @@ -6,6 +6,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.resource.language.TranslationStorage; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.resource.AssetsResourceReloaderRegisterEvent; @@ -28,6 +29,7 @@ import java.io.IOException; import java.io.InputStream; +import java.lang.invoke.MethodHandles; import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -41,6 +43,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerStatic = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class LanguageManager extends SinglePreparationResourceReloader> implements IdentifiableResourceReloadListener { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + public static final Identifier LANGUAGES = NAMESPACE.id("languages"); @Entrypoint.Instance private static final LanguageManager INSTANCE = Null.get(); diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingInit.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingInit.java index c6390c92e..7b6523ea4 100644 --- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingInit.java +++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingInit.java @@ -1,15 +1,22 @@ package net.modificationstation.stationapi.impl.network.packet; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.network.packet.PacketRegisterEvent; import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class StationNetworkingInit { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void registerPackets(PacketRegisterEvent event) { StationAPI.EVENT_BUS.post(new MessageListenerRegistryEvent()); diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java index 2ecb2e846..997e47640 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.recipe.RecipeRegisterEvent; import net.modificationstation.stationapi.api.event.registry.JsonRecipeParserRegistryEvent; @@ -18,6 +19,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.lang.invoke.MethodHandles; import java.net.URL; import java.util.Map; import java.util.Set; @@ -29,6 +31,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class JsonRecipeParserInit { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void registerJsonRecipeParsers(JsonRecipeParserRegistryEvent event) { diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipesLoader.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipesLoader.java index 4d9edf322..3930e4c64 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipesLoader.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipesLoader.java @@ -2,19 +2,21 @@ import com.google.gson.Gson; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.mod.PreInitEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; -import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.registry.JsonRecipesRegistry; import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.resource.Filters; import net.modificationstation.stationapi.api.resource.ResourceHelper; +import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.util.exception.MissingModException; import java.io.IOException; import java.io.InputStreamReader; +import java.lang.invoke.MethodHandles; import java.net.URL; import java.util.HashSet; import java.util.Objects; @@ -25,6 +27,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class JsonRecipesLoader { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void loadJsonRecipes(PreInitEvent event) { diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/json/JsonRecipeParserRegisterImpl.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/json/JsonRecipeParserRegisterImpl.java index c77c1fcd8..163e6472b 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/json/JsonRecipeParserRegisterImpl.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/json/JsonRecipeParserRegisterImpl.java @@ -1,12 +1,18 @@ package net.modificationstation.stationapi.impl.recipe.json; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.mod.InitEvent; import net.modificationstation.stationapi.api.event.registry.JsonRecipeParserRegistryEvent; +import java.lang.invoke.MethodHandles; + @EventListener(phase = StationAPI.INTERNAL_PHASE) public class JsonRecipeParserRegisterImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void onInitialization(InitEvent event) { diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/BooleanArrayTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/BooleanArrayTracker.java index 25ddb3397..1cc272a5d 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/BooleanArrayTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/BooleanArrayTracker.java @@ -10,12 +10,17 @@ import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.math.MathHelper; +import java.lang.invoke.MethodHandles; import java.util.Arrays; import java.util.function.Consumer; import java.util.function.Supplier; @EventListener(phase = StationAPI.INTERNAL_PHASE) public class BooleanArrayTracker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private final Supplier arrayGetter; private final Consumer arraySetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/Int2ObjectMapTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/Int2ObjectMapTracker.java index 4b76bfc4c..ea637bf0d 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/Int2ObjectMapTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/Int2ObjectMapTracker.java @@ -14,12 +14,17 @@ import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.Identifier; +import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.List; import static net.modificationstation.stationapi.api.StationAPI.LOGGER; public class Int2ObjectMapTracker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private final String name; private final Int2ObjectMap mappers; private final Reference2ObjectMap removedMapperCache = new Reference2ObjectOpenHashMap<>(); diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IntArrayTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IntArrayTracker.java index 63d9b237e..c26c2ed9e 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IntArrayTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IntArrayTracker.java @@ -10,12 +10,17 @@ import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.math.MathHelper; +import java.lang.invoke.MethodHandles; import java.util.Arrays; import java.util.function.Consumer; import java.util.function.Supplier; @EventListener(phase = StationAPI.INTERNAL_PHASE) public class IntArrayTracker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private final Supplier arrayGetter; private final Consumer arraySetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/ObjectArrayTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/ObjectArrayTracker.java index bc38b7a04..facd5366e 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/ObjectArrayTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/ObjectArrayTracker.java @@ -11,12 +11,17 @@ import net.modificationstation.stationapi.api.registry.RemappableRawIdHolder; import net.modificationstation.stationapi.api.util.math.MathHelper; +import java.lang.invoke.MethodHandles; import java.util.Arrays; import java.util.function.Consumer; import java.util.function.Supplier; @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ObjectArrayTracker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private final Supplier arrayGetter; private final Consumer arraySetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/RemappableEntryArrayTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/RemappableEntryArrayTracker.java index a303d64df..6b1289663 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/RemappableEntryArrayTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/RemappableEntryArrayTracker.java @@ -10,12 +10,17 @@ import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.registry.RemappableRawIdHolder; +import java.lang.invoke.MethodHandles; import java.util.Arrays; import java.util.function.Consumer; import java.util.function.Supplier; @EventListener(phase = StationAPI.INTERNAL_PHASE) public class RemappableEntryArrayTracker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private final Supplier arrayGetter; private final Consumer arraySetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/StateIdTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/StateIdTracker.java index e9f059a22..51539ac2e 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/StateIdTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/StateIdTracker.java @@ -11,6 +11,7 @@ import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.collection.IdList; +import java.lang.invoke.MethodHandles; import java.util.Collection; import java.util.function.Function; @@ -18,6 +19,10 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class StateIdTracker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private final Registry registry; private final IdList stateList; private final Function> stateGetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/TagReloaderImpl.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/TagReloaderImpl.java index 4803900da..1fd092b64 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/TagReloaderImpl.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/TagReloaderImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.registry; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.resource.DataResourceReloaderRegisterEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; @@ -8,9 +9,15 @@ import net.modificationstation.stationapi.api.registry.ServerDynamicRegistryType; import net.modificationstation.stationapi.api.tag.TagManagerLoader; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class TagReloaderImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void registerTagLoader(DataResourceReloaderRegisterEvent event) { event.resourceManager.registerReloader(new TagManagerLoader(ServerDynamicRegistryType.createCombinedDynamicRegistries().getPrecedingRegistryManagers(ServerDynamicRegistryType.RELOADABLE))); diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/WorldRegistryRemapper.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/WorldRegistryRemapper.java index 648b07d12..24412b64f 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/WorldRegistryRemapper.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/WorldRegistryRemapper.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.registry; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.nbt.NbtCompound; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.world.WorldPropertiesEvent; @@ -8,12 +9,17 @@ import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.legacy.WorldLegacyRegistry; +import java.lang.invoke.MethodHandles; + import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; import static net.modificationstation.stationapi.api.util.Identifier.of; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class WorldRegistryRemapper { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void saveProperties(WorldPropertiesEvent.Save event) { diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientRegistryRestorer.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientRegistryRestorer.java index 12657d431..c472262e0 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientRegistryRestorer.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientRegistryRestorer.java @@ -3,6 +3,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.network.MultiplayerLogoutEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; @@ -10,10 +11,16 @@ import net.modificationstation.stationapi.api.registry.RemapException; import net.modificationstation.stationapi.impl.registry.sync.RegistrySyncManager; +import java.lang.invoke.MethodHandles; + @Environment(EnvType.CLIENT) @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class ClientRegistryRestorer { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @Environment(EnvType.CLIENT) @EventListener private static void onDisconnect(MultiplayerLogoutEvent event) throws RemapException { diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java index 9b0785cf1..52fac5baa 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.client.registry; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtIo; import net.modificationstation.stationapi.api.StationAPI; @@ -12,6 +13,7 @@ import net.modificationstation.stationapi.api.registry.legacy.WorldLegacyRegistry; import java.io.ByteArrayInputStream; +import java.lang.invoke.MethodHandles; import static net.modificationstation.stationapi.api.StationAPI.LOGGER; import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; @@ -19,6 +21,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ClientServerRegistryRemapper { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void registerListeners(MessageListenerRegistryEvent event) { diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java index 074c68c72..9d9d89c7f 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.network; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.network.packet.PacketRegisterEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; @@ -9,12 +10,18 @@ import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.impl.network.packet.s2c.play.RemapClientRegistryS2CPacket; +import java.lang.invoke.MethodHandles; + import static net.mine_diver.unsafeevents.listener.ListenerPriority.HIGH; import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE, priority = HIGH) public final class RegistryNetworkingInit { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void onInitialize(PacketRegisterEvent event) { Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("registry/remap_client"), RemapClientRegistryS2CPacket.TYPE); diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySender.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySender.java index 0e13c2125..1ed58a065 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySender.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySender.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.server.registry; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtIo; import net.modificationstation.stationapi.api.StationAPI; @@ -13,6 +14,7 @@ import net.modificationstation.stationapi.api.server.event.network.PlayerPacketHandlerSetEvent; import java.io.ByteArrayOutputStream; +import java.lang.invoke.MethodHandles; import static net.modificationstation.stationapi.api.StationAPI.LOGGER; import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; @@ -21,6 +23,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ServerRegistrySender { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void sendWorldRegistry(PlayerPacketHandlerSetEvent event) { diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySynchronizer.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySynchronizer.java index f214f421d..0e17def8f 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySynchronizer.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySynchronizer.java @@ -1,15 +1,22 @@ package net.modificationstation.stationapi.impl.server.registry; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.server.event.network.PlayerPacketHandlerSetEvent; import net.modificationstation.stationapi.impl.registry.sync.RegistrySyncManager; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ServerRegistrySynchronizer { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void sendWorldRegistry(PlayerPacketHandlerSetEvent event) { // only StAPI clients can join StAPI servers anyway, at least at the moment diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java index 6b089cd29..10dc3ccf2 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java @@ -3,6 +3,7 @@ import com.mojang.datafixers.util.Pair; import net.fabricmc.loader.api.FabricLoader; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.class_285; import net.minecraft.client.Minecraft; import net.modificationstation.stationapi.api.StationAPI; @@ -28,6 +29,7 @@ import net.modificationstation.stationapi.api.util.profiler.Profiler; import org.apache.logging.log4j.Logger; +import java.lang.invoke.MethodHandles; import java.util.Collection; import java.util.Objects; import java.util.Set; @@ -38,6 +40,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class StationRenderImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @Entrypoint.Namespace public static final Namespace NAMESPACE = Null.get(); diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/Arsenic.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/Arsenic.java index 72482c7c1..1d1d67ed3 100644 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/Arsenic.java +++ b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/Arsenic.java @@ -22,12 +22,16 @@ import java.io.IOException; import java.io.InputStream; +import java.lang.invoke.MethodHandles; import java.util.HashMap; import java.util.Map; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class Arsenic { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @Entrypoint.Logger("Arsenic") public static final Logger LOGGER = Null.get(); diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java index 191c1529c..692c000c6 100644 --- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java +++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.client.resource; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.resource.AssetsReloadEvent; import net.modificationstation.stationapi.api.client.event.resource.TexturePackLoadedEvent; @@ -16,6 +17,7 @@ import net.modificationstation.stationapi.impl.resource.TexturePackProvider; import net.modificationstation.stationapi.impl.resource.loader.ModResourcePackCreator; +import java.lang.invoke.MethodHandles; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -24,6 +26,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class AssetsReloaderImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + public static final ResourcePackManager RESOURCE_PACK_MANAGER = new ResourcePackManager( new DefaultResourcePackProvider(), ModResourcePackCreator.CLIENT_RESOURCE_PACK_PROVIDER, diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java index 7d0846b95..471cbab3f 100644 --- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java +++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java @@ -3,6 +3,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.resource.ReloadScreenManager; import net.modificationstation.stationapi.api.event.resource.DataReloadEvent; @@ -16,6 +17,7 @@ import net.modificationstation.stationapi.api.util.Util; import net.modificationstation.stationapi.impl.resource.loader.ModResourcePackCreator; +import java.lang.invoke.MethodHandles; import java.util.Optional; import java.util.Queue; import java.util.concurrent.CompletableFuture; @@ -27,6 +29,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class DataReloaderImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private static final ResourcePackManager DATA_PACK_MANAGER = new ResourcePackManager(consumer -> consumer.accept(ResourcePackProfile.create("vanilla", "fixText", true, name -> new DefaultResourcePack(), ResourceType.SERVER_DATA, ResourcePackProfile.InsertionPosition.BOTTOM, ResourcePackSource.BUILTIN)), new ModResourcePackCreator(ResourceType.SERVER_DATA)); private static final Queue TASKS = new ConcurrentLinkedQueue<>(); private static final CompletableFuture COMPLETED_UNIT_FUTURE = CompletableFuture.completedFuture(Unit.INSTANCE); diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java index 8a59790fc..f44f5f9e8 100644 --- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java +++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java @@ -1,12 +1,19 @@ package net.modificationstation.stationapi.impl.item; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.item.tool.StationTool; import net.modificationstation.stationapi.api.util.Identifier; +import java.lang.invoke.MethodHandles; + @EventListener(phase = StationAPI.INTERNAL_PHASE) public class HijackShearsImplV1 { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + //TODO: Make this match anything that has shear tool properties. Not sure how to go around this at the moment. @EventListener private static void hijackShearsEvent(ShearsOverrideEvent event) { diff --git a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientVanillaChecker.java b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientVanillaChecker.java index 631a2b039..1db74881f 100644 --- a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientVanillaChecker.java +++ b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientVanillaChecker.java @@ -3,6 +3,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.network.ServerLoginSuccessEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; @@ -10,6 +11,7 @@ import net.modificationstation.stationapi.api.network.packet.MessagePacket; import net.modificationstation.stationapi.impl.network.ModdedPacketHandlerSetter; +import java.lang.invoke.MethodHandles; import java.util.*; import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; @@ -18,6 +20,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ClientVanillaChecker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void handleServerLogin(ServerLoginSuccessEvent event) { diff --git a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/network/VanillaChecker.java b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/network/VanillaChecker.java index e9d90bfb5..c3a189bc1 100644 --- a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/network/VanillaChecker.java +++ b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/network/VanillaChecker.java @@ -5,11 +5,13 @@ import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModMetadata; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.mod.PreInitEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; import java.util.HashSet; import java.util.Set; @@ -19,6 +21,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class VanillaChecker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + public static final long MASK = Hashing.sipHash24().hashUnencodedChars(NAMESPACE.toString()).asLong(); /** diff --git a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java index e81b5d34b..934ebd31d 100644 --- a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java +++ b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java @@ -4,6 +4,7 @@ import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModMetadata; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.player.ServerPlayerEntity; import net.modificationstation.stationapi.api.StationAPI; @@ -14,6 +15,7 @@ import net.modificationstation.stationapi.api.server.event.network.PlayerAttemptLoginEvent; import net.modificationstation.stationapi.impl.network.ModdedPacketHandlerSetter; +import java.lang.invoke.MethodHandles; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; @@ -26,6 +28,9 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ServerVanillaChecker { + static { + Listener.registerLookup(MethodHandles.lookup()); + } @EventListener private static void onPlayerLogin(PlayerAttemptLoginEvent event) { diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java index 1fdb8e399..3ba3c55d6 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java @@ -4,6 +4,7 @@ import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import it.unimi.dsi.fastutil.objects.ReferenceSet; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; @@ -18,6 +19,7 @@ import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.Util; +import java.lang.invoke.MethodHandles; import java.util.Objects; import java.util.function.Consumer; import java.util.function.Supplier; @@ -30,6 +32,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaBlockFixImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + public static final Supplier> COLLISION_BLOCKS = Suppliers.memoize(() -> Util.make(new ReferenceOpenHashSet<>(), s -> { s.add(BED); s.add(WHEAT); diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/color/block/VanillaBlockColorProviders.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/color/block/VanillaBlockColorProviders.java index 17fc89f28..4774ada48 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/color/block/VanillaBlockColorProviders.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/color/block/VanillaBlockColorProviders.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.vanillafix.client.color.block; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.class_287; import net.modificationstation.stationapi.api.StationAPI; @@ -9,9 +10,15 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaBlockColorProviders { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void registerBlockColors(BlockColorsRegisterEvent event) { event.blockColors.registerColorProvider( diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/gui/screen/EditWorldScreenImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/gui/screen/EditWorldScreenImpl.java index 4c565ece5..b42642bc4 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/gui/screen/EditWorldScreenImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/gui/screen/EditWorldScreenImpl.java @@ -4,6 +4,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.resource.language.I18n; @@ -20,6 +21,8 @@ import net.modificationstation.stationapi.impl.world.storage.FlattenedWorldStorage; import net.modificationstation.stationapi.mixin.vanillafix.client.ScreenAccessor; +import java.lang.invoke.MethodHandles; + import static net.mine_diver.unsafeevents.listener.ListenerPriority.LOW; import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE; @@ -27,6 +30,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class EditWorldScreenImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + private static final String ROOT_KEY = "selectWorld." + NAMESPACE, CONVERT_TO_MCREGION_KEY = ROOT_KEY + ".convertToMcRegion"; diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/datafixer/VanillaDataFixerImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/datafixer/VanillaDataFixerImpl.java index cc0b09252..fe79277e6 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/datafixer/VanillaDataFixerImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/datafixer/VanillaDataFixerImpl.java @@ -5,6 +5,7 @@ import com.mojang.datafixers.DataFixerBuilder; import com.mojang.datafixers.schemas.Schema; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.datafixer.DataFixers; import net.modificationstation.stationapi.api.datafixer.TypeReferences; @@ -23,6 +24,7 @@ import net.modificationstation.stationapi.api.vanillafix.datafixer.schema.StationFlatteningChunkSchema; import net.modificationstation.stationapi.api.vanillafix.datafixer.schema.StationFlatteningItemStackSchema; +import java.lang.invoke.MethodHandles; import java.util.Set; import java.util.function.Supplier; @@ -31,6 +33,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaDataFixerImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + public static final String STATION_ID = NAMESPACE.id("id").toString(); public static final int CURRENT_VERSION = 69421; public static final int HIGHEST_VERSION = Integer.MAX_VALUE / 10; diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/dimension/VanillaDimensionFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/dimension/VanillaDimensionFixImpl.java index c3a4296b6..891b81175 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/dimension/VanillaDimensionFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/dimension/VanillaDimensionFixImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.vanillafix.dimension; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.world.dimension.Dimension; import net.minecraft.world.dimension.NetherDimension; import net.minecraft.world.dimension.OverworldDimension; @@ -13,6 +14,7 @@ import net.modificationstation.stationapi.api.util.Identifier; import org.jetbrains.annotations.NotNull; +import java.lang.invoke.MethodHandles; import java.util.function.Supplier; import static net.modificationstation.stationapi.api.world.dimension.VanillaDimensions.*; @@ -20,6 +22,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaDimensionFixImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @FunctionalInterface interface DimensionRegister { void accept(final @NotNull Identifier id, final int serialID, final @NotNull Supplier<@NotNull Dimension> factory); } @EventListener diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java index c928be2db..ca0603605 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.vanillafix.item; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.item.Item; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent; @@ -9,6 +10,8 @@ import net.modificationstation.stationapi.api.registry.ItemRegistry; import net.modificationstation.stationapi.api.registry.Registry; +import java.lang.invoke.MethodHandles; + import static net.minecraft.item.Item.*; import static net.modificationstation.stationapi.api.StationAPI.LOGGER; import static net.modificationstation.stationapi.api.util.Identifier.of; @@ -16,6 +19,10 @@ @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaItemFixImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void registerItems(ItemRegistryEvent event) { ItemRegistry registry = event.registry; diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/recipe/VanillaFuelItemFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/recipe/VanillaFuelItemFixImpl.java index e0efa0c5f..c756adb6a 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/recipe/VanillaFuelItemFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/recipe/VanillaFuelItemFixImpl.java @@ -1,6 +1,7 @@ package net.modificationstation.stationapi.impl.vanillafix.recipe; import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.block.Material; import net.minecraft.item.Item; @@ -11,9 +12,15 @@ import net.modificationstation.stationapi.api.recipe.FuelRegistry; import net.modificationstation.stationapi.api.registry.tag.ItemTags; +import java.lang.invoke.MethodHandles; + @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaFuelItemFixImpl { + static { + Listener.registerLookup(MethodHandles.lookup()); + } + @EventListener private static void registerFuel(RecipeRegisterEvent event) { if (RecipeRegisterEvent.Vanilla.SMELTING.type() == event.recipeId) { From c8db80ad67e3f54c5b6899e145daa9bd8891b49e Mon Sep 17 00:00:00 2001 From: mine_diver Date: Wed, 15 Jan 2025 02:09:10 +0500 Subject: [PATCH 05/27] ContextVariable --- .../stationapi/impl/util/ContextVariable.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 station-api-base/src/main/java/net/modificationstation/stationapi/impl/util/ContextVariable.java diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/impl/util/ContextVariable.java b/station-api-base/src/main/java/net/modificationstation/stationapi/impl/util/ContextVariable.java new file mode 100644 index 000000000..b2ba13e27 --- /dev/null +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/impl/util/ContextVariable.java @@ -0,0 +1,57 @@ +package net.modificationstation.stationapi.impl.util; + +import it.unimi.dsi.fastutil.Pair; +import lombok.val; +import org.jetbrains.annotations.ApiStatus; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; + +/** + * A substitute for Java's preview feature "ScopedValue". + *

+ * Part of the internal API, not to be used in other mods. + *

+ */ +@ApiStatus.Internal +public final class ContextVariable { + public interface ContextBuilder { + ContextBuilder where(ContextVariable variable, T value); + + void run(Runnable runnable); + } + + public static ContextBuilder where(ContextVariable variable, T value) { + val builder = new ContextBuilder() { + private final List> binds = new ArrayList<>(); + + @Override + public ContextBuilder where(ContextVariable variable, V value) { + binds.add(Pair.of( + () -> variable.values.get().push(value), + () -> variable.values.get().pop() + )); + return this; + } + + @Override + public void run(Runnable runnable) { + binds.stream().map(Pair::first).forEach(Runnable::run); + try { + runnable.run(); + } finally { + binds.stream().map(Pair::second).forEach(Runnable::run); + } + } + }; + return builder.where(variable, value); + } + + private final ThreadLocal> values = ThreadLocal.withInitial(ArrayDeque::new); + + public T get() { + return values.get().peek(); + } +} From 1ddc433067aa0f4fc64c2ac98dd0dcad00cbf748 Mon Sep 17 00:00:00 2001 From: mine_diver Date: Wed, 15 Jan 2025 02:34:32 +0500 Subject: [PATCH 06/27] ContextVariable#get --- .../stationapi/impl/util/ContextVariable.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/impl/util/ContextVariable.java b/station-api-base/src/main/java/net/modificationstation/stationapi/impl/util/ContextVariable.java index b2ba13e27..143c655e2 100644 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/impl/util/ContextVariable.java +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/impl/util/ContextVariable.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.Deque; import java.util.List; +import java.util.function.Supplier; /** * A substitute for Java's preview feature "ScopedValue". @@ -21,6 +22,8 @@ public interface ContextBuilder { ContextBuilder where(ContextVariable variable, T value); void run(Runnable runnable); + + R get(Supplier supplier); } public static ContextBuilder where(ContextVariable variable, T value) { @@ -45,6 +48,16 @@ public void run(Runnable runnable) { binds.stream().map(Pair::second).forEach(Runnable::run); } } + + @Override + public R get(Supplier supplier) { + binds.stream().map(Pair::first).forEach(Runnable::run); + try { + return supplier.get(); + } finally { + binds.stream().map(Pair::second).forEach(Runnable::run); + } + } }; return builder.where(variable, value); } From 212e775fc9772df21fef5984b997a51ca920029a Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Sun, 9 Feb 2025 18:55:13 +0500 Subject: [PATCH 07/27] Feature/register helper (#146) * Added register helper methods to RegistryEvent * Remove unused BulkConsumer. * Updated all registries to be entry type bound. * Updated all usages of Registry#register to new helper methods where applicable. * Moved bulk registration helpers implementation to Registry interface and redirected event method helpers to that. * Swapped namespace and rawIdGetter placements so they better reflect the original method arguments. --- .../sltest/entity/EntityListener.java | 5 +- .../sltest/gui/GuiListener.java | 5 +- .../sltest/item/ItemListener.java | 5 +- .../packet/MessageListenerListener.java | 10 +- .../api/util/function/BulkBiConsumer.java | 28 +++ .../registry/BlockItemRegistryEvent.java | 3 +- .../registry/GuiHandlerRegistryEvent.java | 3 +- .../network/GuiClientNetworkHandler.java | 3 +- .../registry/DimensionRegistryEvent.java | 3 +- .../registry/EntityHandlerRegistryEvent.java | 3 +- .../registry/MobHandlerRegistryEvent.java | 6 +- .../network/EntityClientNetworkHandler.java | 5 +- .../stationapi/api/block/States.java | 3 +- .../event/registry/BlockRegistryEvent.java | 3 +- .../api/event/registry/ItemRegistryEvent.java | 3 +- .../StationFlatteningNetworkingImpl.java | 9 +- .../packet/StationItemsNetworkingImpl.java | 13 +- .../MessageListenerRegistryEvent.java | 2 +- .../JsonRecipeParserRegistryEvent.java | 5 +- .../impl/recipe/JsonRecipeParserInit.java | 11 +- .../api/event/registry/RegistryEvent.java | 42 +++- .../stationapi/api/registry/Registry.java | 19 ++ .../ClientServerRegistryRemapper.java | 3 +- ...ckModelPredicateProviderRegistryEvent.java | 3 +- ...emModelPredicateProviderRegistryEvent.java | 3 +- .../server/network/ServerVanillaChecker.java | 3 +- .../vanillafix/block/VanillaBlockFixImpl.java | 206 ++++++++-------- .../vanillafix/item/VanillaItemFixImpl.java | 223 +++++++++--------- 28 files changed, 350 insertions(+), 280 deletions(-) create mode 100644 station-api-base/src/main/java/net/modificationstation/stationapi/api/util/function/BulkBiConsumer.java diff --git a/src/test/java/net/modificationstation/sltest/entity/EntityListener.java b/src/test/java/net/modificationstation/sltest/entity/EntityListener.java index a0a36581a..ba6e44c09 100644 --- a/src/test/java/net/modificationstation/sltest/entity/EntityListener.java +++ b/src/test/java/net/modificationstation/sltest/entity/EntityListener.java @@ -4,7 +4,6 @@ import net.modificationstation.stationapi.api.event.entity.EntityRegister; import net.modificationstation.stationapi.api.event.registry.EntityHandlerRegistryEvent; import net.modificationstation.stationapi.api.event.registry.MobHandlerRegistryEvent; -import net.modificationstation.stationapi.api.registry.Registry; import static net.modificationstation.sltest.SLTest.NAMESPACE; import static net.modificationstation.stationapi.api.util.Identifier.of; @@ -19,11 +18,11 @@ public void registerEntities(EntityRegister event) { @EventListener public void registerEntityHandlers(EntityHandlerRegistryEvent event) { - Registry.register(event.registry, TestEntity.ID, TestEntity::new); + event.register(TestEntity.ID, TestEntity::new); } @EventListener public void registerMobHandlers(MobHandlerRegistryEvent event) { - Registry.register(event.registry, of(NAMESPACE, "gpoor"), PoorGuy::new); + event.register(of(NAMESPACE, "gpoor"), PoorGuy::new); } } diff --git a/src/test/java/net/modificationstation/sltest/gui/GuiListener.java b/src/test/java/net/modificationstation/sltest/gui/GuiListener.java index 80446c720..46b6652bf 100644 --- a/src/test/java/net/modificationstation/sltest/gui/GuiListener.java +++ b/src/test/java/net/modificationstation/sltest/gui/GuiListener.java @@ -9,9 +9,7 @@ import net.modificationstation.sltest.SLTest; import net.modificationstation.sltest.tileentity.TileEntityFreezer; import net.modificationstation.stationapi.api.client.gui.screen.GuiHandler; -import net.modificationstation.stationapi.api.client.registry.GuiHandlerRegistry; import net.modificationstation.stationapi.api.event.registry.GuiHandlerRegistryEvent; -import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.Identifier; public class GuiListener { @@ -19,8 +17,7 @@ public class GuiListener { @Environment(EnvType.CLIENT) @EventListener public void registerGuiHandlers(GuiHandlerRegistryEvent event) { - GuiHandlerRegistry registry = event.registry; - Registry.register(registry, Identifier.of(SLTest.NAMESPACE, "freezer"), new GuiHandler((GuiHandler.ScreenFactoryNoMessage) this::openFreezer, TileEntityFreezer::new)); + event.register(Identifier.of(SLTest.NAMESPACE, "freezer"), new GuiHandler((GuiHandler.ScreenFactoryNoMessage) this::openFreezer, TileEntityFreezer::new)); } @Environment(EnvType.CLIENT) diff --git a/src/test/java/net/modificationstation/sltest/item/ItemListener.java b/src/test/java/net/modificationstation/sltest/item/ItemListener.java index 57ef9aaa4..ab1c1c720 100644 --- a/src/test/java/net/modificationstation/sltest/item/ItemListener.java +++ b/src/test/java/net/modificationstation/sltest/item/ItemListener.java @@ -11,7 +11,6 @@ import net.modificationstation.stationapi.api.item.tool.ToolMaterialFactory; import net.modificationstation.stationapi.api.registry.BlockRegistry; import net.modificationstation.stationapi.api.registry.ItemRegistry; -import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.tag.TagKey; import net.modificationstation.stationapi.api.template.item.BlockStateItem; @@ -34,8 +33,8 @@ public void registerItems(ItemRegistryEvent event) { testPickaxe = new ModdedPickaxeItem(NAMESPACE.id("test_pickaxe"), testMaterial).setTranslationKey(NAMESPACE, "testPickaxe"); //8476 testNBTItem = new NBTItem(NAMESPACE.id("nbt_item")).setTranslationKey(NAMESPACE, "nbt_item"); //8477 testModelItem = new ModelItem(NAMESPACE.id("model_item")).setMaxCount(1).setTranslationKey(NAMESPACE, "idkSomething"); - ironOre = Registry.register(event.registry, NAMESPACE.id("ironOre"), new Item(ItemRegistry.AUTO_ID)).setTranslationKey(NAMESPACE.id("ironOre")); - generatedItem = Registry.register(event.registry, NAMESPACE.id("generated_item"), new Item(ItemRegistry.AUTO_ID)).setTranslationKey(NAMESPACE.id("generatedItem")); + ironOre = event.register(NAMESPACE.id("ironOre"), new Item(ItemRegistry.AUTO_ID)).setTranslationKey(NAMESPACE.id("ironOre")); + generatedItem = event.register(NAMESPACE.id("generated_item"), new Item(ItemRegistry.AUTO_ID)).setTranslationKey(NAMESPACE.id("generatedItem")); variationBlockIdle = new BlockStateItem(NAMESPACE.id("variation_block_idle"), Blocks.VARIATION_BLOCK.get().getDefaultState()).setTranslationKey(NAMESPACE, "variationBlockIdle"); variationBlockPassive = new BlockStateItem(NAMESPACE.id("variation_block_passive"), Blocks.VARIATION_BLOCK.get().getDefaultState().with(VariationBlock.VARIANT, VariationBlock.Variant.PASSIVE)).setTranslationKey(NAMESPACE, "variationBlockPassive"); variationBlockActive = new BlockStateItem(NAMESPACE.id("variation_block_active"), Blocks.VARIATION_BLOCK.get().getDefaultState().with(VariationBlock.VARIANT, VariationBlock.Variant.ACTIVE)).setTranslationKey(NAMESPACE, "variationBlockActive"); diff --git a/src/test/java/net/modificationstation/sltest/packet/MessageListenerListener.java b/src/test/java/net/modificationstation/sltest/packet/MessageListenerListener.java index fe8935094..03ec3a1fa 100644 --- a/src/test/java/net/modificationstation/sltest/packet/MessageListenerListener.java +++ b/src/test/java/net/modificationstation/sltest/packet/MessageListenerListener.java @@ -8,18 +8,14 @@ import net.modificationstation.sltest.item.ModdedItem; import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent; import net.modificationstation.stationapi.api.network.packet.MessagePacket; -import net.modificationstation.stationapi.api.registry.Registry; -import net.modificationstation.stationapi.api.util.Identifier; - -import java.util.function.BiConsumer; public class MessageListenerListener { @EventListener public void registerMessageListeners(MessageListenerRegistryEvent event) { - Registry> registry = event.registry; - Registry.register(registry, Identifier.of(SLTest.NAMESPACE, "give_me_diamonds"), this::handleGiveMeDiamonds); - Registry.register(registry, Identifier.of(SLTest.NAMESPACE, "send_an_object"), this::handleSendCoords); + event.register(SLTest.NAMESPACE) + .accept("give_me_diamonds", this::handleGiveMeDiamonds) + .accept("send_an_object", this::handleSendCoords); } public void handleGiveMeDiamonds(PlayerEntity playerBase, MessagePacket message) { diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/function/BulkBiConsumer.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/function/BulkBiConsumer.java new file mode 100644 index 000000000..1082991af --- /dev/null +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/function/BulkBiConsumer.java @@ -0,0 +1,28 @@ +package net.modificationstation.stationapi.api.util.function; + +import org.jetbrains.annotations.Contract; + +import java.util.function.BiConsumer; + +public interface BulkBiConsumer { + @Contract(pure = true) + static BulkBiConsumer of(BiConsumer sink) { + interface BulkBiConsumerImpl extends BulkBiConsumer { + @Contract(pure = true) + private static BulkBiConsumerImpl of(BiConsumer sink) { + return () -> sink; + } + + BiConsumer getSink(); + + @Override + default BulkBiConsumer accept(A a, B b) { + getSink().accept(a, b); + return this; + } + } + return BulkBiConsumerImpl.of(sink); + } + + BulkBiConsumer accept(A a, B b); +} diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/BlockItemRegistryEvent.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/BlockItemRegistryEvent.java index 9bc0e71bb..8dd2c2489 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/BlockItemRegistryEvent.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/BlockItemRegistryEvent.java @@ -1,11 +1,12 @@ package net.modificationstation.stationapi.api.event.registry; import net.mine_diver.unsafeevents.event.EventPhases; +import net.minecraft.item.Item; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.registry.ItemRegistry; @EventPhases(StationAPI.INTERNAL_PHASE) -public class BlockItemRegistryEvent extends RegistryEvent { +public class BlockItemRegistryEvent extends RegistryEvent.EntryTypeBound { public BlockItemRegistryEvent() { super(ItemRegistry.INSTANCE); } diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/GuiHandlerRegistryEvent.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/GuiHandlerRegistryEvent.java index 265602540..0a8db96ef 100644 --- a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/GuiHandlerRegistryEvent.java +++ b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/GuiHandlerRegistryEvent.java @@ -1,8 +1,9 @@ package net.modificationstation.stationapi.api.event.registry; +import net.modificationstation.stationapi.api.client.gui.screen.GuiHandler; import net.modificationstation.stationapi.api.client.registry.GuiHandlerRegistry; -public class GuiHandlerRegistryEvent extends RegistryEvent { +public class GuiHandlerRegistryEvent extends RegistryEvent.EntryTypeBound { public GuiHandlerRegistryEvent() { super(GuiHandlerRegistry.INSTANCE); } diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java index 63b6fa3ce..28d858d6a 100644 --- a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java +++ b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java @@ -14,7 +14,6 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.network.packet.MessagePacket; -import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.Identifier; import java.lang.invoke.MethodHandles; @@ -30,7 +29,7 @@ public final class GuiClientNetworkHandler { @EventListener private static void registerMessageListeners(MessageListenerRegistryEvent event) { - Registry.register(event.registry, NAMESPACE.id("open_gui"), GuiClientNetworkHandler::handleGui); + event.register(NAMESPACE.id("open_gui"), GuiClientNetworkHandler::handleGui); StationAPI.EVENT_BUS.post(new GuiHandlerRegistryEvent()); } diff --git a/station-dimensions-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/DimensionRegistryEvent.java b/station-dimensions-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/DimensionRegistryEvent.java index 28ae90969..81b3a0d39 100644 --- a/station-dimensions-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/DimensionRegistryEvent.java +++ b/station-dimensions-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/DimensionRegistryEvent.java @@ -2,10 +2,11 @@ import net.mine_diver.unsafeevents.event.EventPhases; import net.modificationstation.stationapi.api.StationAPI; +import net.modificationstation.stationapi.api.registry.DimensionContainer; import net.modificationstation.stationapi.api.registry.DimensionRegistry; @EventPhases(StationAPI.INTERNAL_PHASE) -public class DimensionRegistryEvent extends RegistryEvent { +public class DimensionRegistryEvent extends RegistryEvent.EntryTypeBound, DimensionRegistry> { public DimensionRegistryEvent() { super(DimensionRegistry.INSTANCE); } diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/EntityHandlerRegistryEvent.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/EntityHandlerRegistryEvent.java index 8c168c4c7..7dc5c5976 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/EntityHandlerRegistryEvent.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/EntityHandlerRegistryEvent.java @@ -1,8 +1,9 @@ package net.modificationstation.stationapi.api.event.registry; +import net.modificationstation.stationapi.api.client.entity.factory.EntityWorldAndPosFactory; import net.modificationstation.stationapi.api.client.registry.EntityHandlerRegistry; -public class EntityHandlerRegistryEvent extends RegistryEvent { +public class EntityHandlerRegistryEvent extends RegistryEvent.EntryTypeBound { public EntityHandlerRegistryEvent() { super(EntityHandlerRegistry.INSTANCE); } diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MobHandlerRegistryEvent.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MobHandlerRegistryEvent.java index f511823bd..f691641ef 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MobHandlerRegistryEvent.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MobHandlerRegistryEvent.java @@ -1,8 +1,12 @@ package net.modificationstation.stationapi.api.event.registry; +import net.minecraft.entity.LivingEntity; +import net.minecraft.world.World; import net.modificationstation.stationapi.api.client.registry.MobHandlerRegistry; -public class MobHandlerRegistryEvent extends RegistryEvent { +import java.util.function.Function; + +public class MobHandlerRegistryEvent extends RegistryEvent.EntryTypeBound, MobHandlerRegistry> { public MobHandlerRegistryEvent() { super(MobHandlerRegistry.INSTANCE); } diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java index 0a72bede8..384f48122 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java @@ -22,7 +22,6 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.network.packet.MessagePacket; -import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.server.entity.StationSpawnDataProvider; import net.modificationstation.stationapi.mixin.entity.client.ClientNetworkHandlerAccessor; @@ -45,9 +44,9 @@ public final class EntityClientNetworkHandler { @EventListener private static void registerMessageListeners(MessageListenerRegistryEvent event) { - Registry.register(event.registry, NAMESPACE.id("spawn_entity"), EntityClientNetworkHandler::handleEntitySpawn); + event.register(NAMESPACE.id("spawn_entity"), EntityClientNetworkHandler::handleEntitySpawn); StationAPI.EVENT_BUS.post(new EntityHandlerRegistryEvent()); - Registry.register(event.registry, NAMESPACE.id("spawn_mob"), EntityClientNetworkHandler::handleMobSpawn); + event.register(NAMESPACE.id("spawn_mob"), EntityClientNetworkHandler::handleMobSpawn); StationAPI.EVENT_BUS.post(new MobHandlerRegistryEvent()); } diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java index a18694d7c..7fd763f31 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java @@ -8,7 +8,6 @@ import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; -import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.collection.IdList; import java.lang.invoke.MethodHandles; @@ -35,6 +34,6 @@ public final class States { @EventListener private static void registerBlocks(BlockRegistryEvent event) { - Registry.register(event.registry, of("air"), AIR_BLOCK.get()); + event.register(of("air"), AIR_BLOCK.get()); } } diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/BlockRegistryEvent.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/BlockRegistryEvent.java index 97b975082..a7b9cceb4 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/BlockRegistryEvent.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/BlockRegistryEvent.java @@ -1,11 +1,12 @@ package net.modificationstation.stationapi.api.event.registry; import net.mine_diver.unsafeevents.event.EventPhases; +import net.minecraft.block.Block; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.registry.BlockRegistry; @EventPhases(StationAPI.INTERNAL_PHASE) -public class BlockRegistryEvent extends RegistryEvent { +public class BlockRegistryEvent extends RegistryEvent.EntryTypeBound { public BlockRegistryEvent() { super(BlockRegistry.INSTANCE); } diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/ItemRegistryEvent.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/ItemRegistryEvent.java index a43669eee..5c5e580b3 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/ItemRegistryEvent.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/ItemRegistryEvent.java @@ -1,11 +1,12 @@ package net.modificationstation.stationapi.api.event.registry; import net.mine_diver.unsafeevents.event.EventPhases; +import net.minecraft.item.Item; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.registry.ItemRegistry; @EventPhases(StationAPI.INTERNAL_PHASE) -public class ItemRegistryEvent extends RegistryEvent { +public class ItemRegistryEvent extends RegistryEvent.EntryTypeBound { public ItemRegistryEvent() { super(ItemRegistry.INSTANCE); } diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/StationFlatteningNetworkingImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/StationFlatteningNetworkingImpl.java index 25379bd1d..9ba7af6ac 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/StationFlatteningNetworkingImpl.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/StationFlatteningNetworkingImpl.java @@ -12,9 +12,10 @@ public class StationFlatteningNetworkingImpl implements ModInitializer { public void onInitialize() { // Registering packets for flattened save format - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("flattening/chunk_data"), FlattenedChunkDataS2CPacket.TYPE); - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("flattening/multi_block_change"), FlattenedMultiBlockChangeS2CPacket.TYPE); - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("flattening/block_change"), FlattenedBlockChangeS2CPacket.TYPE); - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("flattening/chunk_section_data"), FlattenedChunkSectionDataS2CPacket.TYPE); + Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE) + .accept("flattening/chunk_data", FlattenedChunkDataS2CPacket.TYPE) + .accept("flattening/multi_block_change", FlattenedMultiBlockChangeS2CPacket.TYPE) + .accept("flattening/block_change", FlattenedBlockChangeS2CPacket.TYPE) + .accept("flattening/chunk_section_data", FlattenedChunkSectionDataS2CPacket.TYPE); } } diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java index 5216d3085..17db9c561 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java @@ -15,11 +15,12 @@ public class StationItemsNetworkingImpl implements ModInitializer { @Override public void onInitialize() { - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/slot"), StationClickSlotC2SPacket.TYPE); - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/equipment"), StationEntityEquipmentUpdateS2CPacket.TYPE); - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/inventory"), StationInventoryS2CPacket.TYPE); - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/entity_spawn"), StationItemEntitySpawnS2CPacket.TYPE); - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/interact"), StationPlayerInteractBlockC2SPacket.TYPE); - Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/slot_update"), StationScreenHandlerSlotUpdateS2CPacket.TYPE); + Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE) + .accept("items/slot", StationClickSlotC2SPacket.TYPE) + .accept("items/equipment", StationEntityEquipmentUpdateS2CPacket.TYPE) + .accept("items/inventory", StationInventoryS2CPacket.TYPE) + .accept("items/entity_spawn", StationItemEntitySpawnS2CPacket.TYPE) + .accept("items/interact", StationPlayerInteractBlockC2SPacket.TYPE) + .accept("items/slot_update", StationScreenHandlerSlotUpdateS2CPacket.TYPE); } } diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MessageListenerRegistryEvent.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MessageListenerRegistryEvent.java index 3b172c229..a58b452c6 100644 --- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MessageListenerRegistryEvent.java +++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MessageListenerRegistryEvent.java @@ -15,7 +15,7 @@ * @author mine_diver */ @EventPhases(StationAPI.INTERNAL_PHASE) -public class MessageListenerRegistryEvent extends RegistryEvent>> { +public class MessageListenerRegistryEvent extends RegistryEvent.EntryTypeBound, Registry>> { public MessageListenerRegistryEvent() { super(MessageListenerRegistry.INSTANCE); } diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/JsonRecipeParserRegistryEvent.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/JsonRecipeParserRegistryEvent.java index d61a4b9de..177dc197d 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/JsonRecipeParserRegistryEvent.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/JsonRecipeParserRegistryEvent.java @@ -4,8 +4,11 @@ import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.registry.JsonRecipeParserRegistry; +import java.net.URL; +import java.util.function.Consumer; + @EventPhases(StationAPI.INTERNAL_PHASE) -public class JsonRecipeParserRegistryEvent extends RegistryEvent { +public class JsonRecipeParserRegistryEvent extends RegistryEvent.EntryTypeBound, JsonRecipeParserRegistry> { public JsonRecipeParserRegistryEvent() { super(JsonRecipeParserRegistry.INSTANCE); } diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java index 997e47640..c6fde79a4 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java @@ -14,7 +14,7 @@ import net.modificationstation.stationapi.api.recipe.SmeltingRegistry; import net.modificationstation.stationapi.api.registry.JsonRecipeParserRegistry; import net.modificationstation.stationapi.api.registry.JsonRecipesRegistry; -import net.modificationstation.stationapi.api.registry.Registry; +import net.modificationstation.stationapi.api.util.Namespace; import java.io.BufferedReader; import java.io.IOException; @@ -26,8 +26,6 @@ import java.util.function.Consumer; import java.util.function.Function; -import static net.modificationstation.stationapi.api.util.Identifier.of; - @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) public class JsonRecipeParserInit { @@ -37,9 +35,10 @@ public class JsonRecipeParserInit { @EventListener private static void registerJsonRecipeParsers(JsonRecipeParserRegistryEvent event) { - Registry.register(event.registry, of("crafting_shaped"), JsonRecipeParserInit::parseCraftingShaped); - Registry.register(event.registry, of("crafting_shapeless"), JsonRecipeParserInit::parseCraftingShapeless); - Registry.register(event.registry, of("smelting"), JsonRecipeParserInit::parseSmelting); + event.register(Namespace.MINECRAFT) + .accept("crafting_shaped", JsonRecipeParserInit::parseCraftingShaped) + .accept("crafting_shapeless", JsonRecipeParserInit::parseCraftingShapeless) + .accept("smelting", JsonRecipeParserInit::parseSmelting); } @EventListener diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/RegistryEvent.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/RegistryEvent.java index 91637fb36..ce6958523 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/RegistryEvent.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/RegistryEvent.java @@ -4,18 +4,52 @@ import lombok.RequiredArgsConstructor; import net.mine_diver.unsafeevents.Event; import net.modificationstation.stationapi.api.registry.Registry; +import net.modificationstation.stationapi.api.util.Identifier; +import net.modificationstation.stationapi.api.util.Namespace; +import net.modificationstation.stationapi.api.util.function.BulkBiConsumer; +import org.jetbrains.annotations.Contract; + +import java.util.function.ToIntFunction; /** * A superclass for events involving registries. * - * @param the type of the registry involved in this event. + * @param the type of the registry involved in this event. * @author mine_diver */ @RequiredArgsConstructor(access = AccessLevel.PROTECTED) -public abstract class RegistryEvent> extends Event { - +public abstract class RegistryEvent> extends Event { /** * The instance of the event's registry. */ - public final T registry; + public final REGISTRY registry; + + public static abstract class EntryTypeBound> extends RegistryEvent { + protected EntryTypeBound(REGISTRY registry) { + super(registry); + } + + public ENTRY register(Identifier id, ENTRY entry) { + return Registry.register(registry, id, entry); + } + + public ENTRY register(int rawId, Identifier id, ENTRY entry) { + return Registry.register(registry, rawId, id, entry); + } + + @Contract(pure = true) + public BulkBiConsumer register() { + return Registry.register(registry); + } + + @Contract(pure = true) + public BulkBiConsumer register(Namespace namespace) { + return Registry.register(registry, namespace); + } + + @Contract(pure = true) + public BulkBiConsumer register(ToIntFunction rawIdGetter, Namespace namespace) { + return Registry.register(registry, rawIdGetter, namespace); + } + } } diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/Registry.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/Registry.java index 64228b6ca..b7f9f512e 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/Registry.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/Registry.java @@ -7,12 +7,16 @@ import net.minecraft.item.Item; import net.modificationstation.stationapi.api.tag.TagKey; import net.modificationstation.stationapi.api.util.Identifier; +import net.modificationstation.stationapi.api.util.Namespace; import net.modificationstation.stationapi.api.util.collection.IndexedIterable; import net.modificationstation.stationapi.api.util.dynamic.Codecs; +import net.modificationstation.stationapi.api.util.function.BulkBiConsumer; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Function; +import java.util.function.ToIntFunction; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -343,6 +347,21 @@ static T register(Registry registry, int rawId, Identifier i return entry; } + @Contract(pure = true) + static BulkBiConsumer register(Registry registry) { + return BulkBiConsumer.of((id, entry) -> register(registry, id, entry)); + } + + @Contract(pure = true) + static BulkBiConsumer register(Registry registry, Namespace namespace) { + return BulkBiConsumer.of((id, entry) -> register(registry, namespace.id(id), entry)); + } + + @Contract(pure = true) + static BulkBiConsumer register(Registry registry, ToIntFunction rawIdGetter, Namespace namespace) { + return BulkBiConsumer.of((id, entry) -> register(registry, rawIdGetter.applyAsInt(entry), namespace.id(id), entry)); + } + Registry freeze(); RegistryEntry.Reference createEntry(T var1); diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java index 52fac5baa..cda912ed2 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java @@ -9,7 +9,6 @@ import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.network.packet.MessagePacket; -import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.registry.legacy.WorldLegacyRegistry; import java.io.ByteArrayInputStream; @@ -27,7 +26,7 @@ public class ClientServerRegistryRemapper { @EventListener private static void registerListeners(MessageListenerRegistryEvent event) { - Registry.register(event.registry, NAMESPACE.id("server_registry_sync"), ClientServerRegistryRemapper::remapRegistries); + event.register(NAMESPACE.id("server_registry_sync"), ClientServerRegistryRemapper::remapRegistries); } private static void remapRegistries(PlayerEntity player, MessagePacket message) { diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/BlockModelPredicateProviderRegistryEvent.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/BlockModelPredicateProviderRegistryEvent.java index 690dd692a..c750c09b9 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/BlockModelPredicateProviderRegistryEvent.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/BlockModelPredicateProviderRegistryEvent.java @@ -1,9 +1,10 @@ package net.modificationstation.stationapi.api.client.event.render.model; +import net.modificationstation.stationapi.api.client.model.block.BlockModelPredicateProvider; import net.modificationstation.stationapi.api.client.registry.BlockModelPredicateProviderRegistry; import net.modificationstation.stationapi.api.event.registry.RegistryEvent; -public final class BlockModelPredicateProviderRegistryEvent extends RegistryEvent { +public final class BlockModelPredicateProviderRegistryEvent extends RegistryEvent.EntryTypeBound { public BlockModelPredicateProviderRegistryEvent() { super(BlockModelPredicateProviderRegistry.INSTANCE); } diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/ItemModelPredicateProviderRegistryEvent.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/ItemModelPredicateProviderRegistryEvent.java index e80d31ef8..d8e59b450 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/ItemModelPredicateProviderRegistryEvent.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/ItemModelPredicateProviderRegistryEvent.java @@ -1,9 +1,10 @@ package net.modificationstation.stationapi.api.client.event.render.model; +import net.modificationstation.stationapi.api.client.model.item.ItemModelPredicateProvider; import net.modificationstation.stationapi.api.client.registry.ItemModelPredicateProviderRegistry; import net.modificationstation.stationapi.api.event.registry.RegistryEvent; -public class ItemModelPredicateProviderRegistryEvent extends RegistryEvent { +public class ItemModelPredicateProviderRegistryEvent extends RegistryEvent.EntryTypeBound { public ItemModelPredicateProviderRegistryEvent() { super(ItemModelPredicateProviderRegistry.INSTANCE); } diff --git a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java index 934ebd31d..3c7d4e10f 100644 --- a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java +++ b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java @@ -11,7 +11,6 @@ import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; -import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.server.event.network.PlayerAttemptLoginEvent; import net.modificationstation.stationapi.impl.network.ModdedPacketHandlerSetter; @@ -47,7 +46,7 @@ else if (!CLIENT_REQUIRED_MODS.isEmpty()) { @EventListener private static void registerMessages(MessageListenerRegistryEvent event) { - Registry.register(event.registry, NAMESPACE.id("modlist"), (player, message) -> { + event.register(NAMESPACE.id("modlist"), (player, message) -> { if (!CLIENT_REQUIRED_MODS.isEmpty()) { LOGGER.info("Received a list of mods from player \"" + player.name + "\", verifying..."); ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player; diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java index 3ba3c55d6..8c40bb81e 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java @@ -16,7 +16,7 @@ import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.BlockRegistry; import net.modificationstation.stationapi.api.registry.ItemRegistry; -import net.modificationstation.stationapi.api.registry.Registry; +import net.modificationstation.stationapi.api.util.Namespace; import net.modificationstation.stationapi.api.util.Util; import java.lang.invoke.MethodHandles; @@ -27,7 +27,6 @@ import static net.mine_diver.unsafeevents.listener.ListenerPriority.LOW; import static net.minecraft.block.Block.*; import static net.modificationstation.stationapi.api.StationAPI.LOGGER; -import static net.modificationstation.stationapi.api.util.Identifier.of; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) @@ -49,112 +48,107 @@ public final class VanillaBlockFixImpl { @EventListener private static void registerBlocks(BlockRegistryEvent event) { - BlockRegistry registry = event.registry; - - register(registry, "stone", STONE); - register(registry, "grass_block", GRASS_BLOCK); - register(registry, "dirt", DIRT); - register(registry, "cobblestone", COBBLESTONE); - register(registry, "oak_planks", PLANKS); - register(registry, "sapling", SAPLING); - register(registry, "bedrock", BEDROCK); - register(registry, "flowing_water", FLOWING_WATER); - register(registry, "water", WATER); - register(registry, "flowing_lava", FLOWING_LAVA); - register(registry, "lava", LAVA); - register(registry, "sand", SAND); - register(registry, "gravel", GRAVEL); - register(registry, "gold_ore", GOLD_ORE); - register(registry, "iron_ore", IRON_ORE); - register(registry, "coal_ore", COAL_ORE); - register(registry, "log", LOG); - register(registry, "leaves", LEAVES); - register(registry, "sponge", SPONGE); - register(registry, "glass", GLASS); - register(registry, "lapis_ore", LAPIS_ORE); - register(registry, "lapis_block", LAPIS_BLOCK); - register(registry, "dispenser", DISPENSER); - register(registry, "sandstone", SANDSTONE); - register(registry, "note_block", NOTE_BLOCK); - register(registry, "red_bed", BED); - register(registry, "powered_rail", POWERED_RAIL); - register(registry, "detector_rail", DETECTOR_RAIL); - register(registry, "sticky_piston", STICKY_PISTON); - register(registry, "cobweb", COBWEB); - register(registry, "grass", GRASS); - register(registry, "dead_bush", DEAD_BUSH); - register(registry, "piston", PISTON); - register(registry, "piston_head", PISTON_HEAD); - register(registry, "wool", WOOL); - register(registry, "moving_piston", MOVING_PISTON); - register(registry, "dandelion", DANDELION); - register(registry, "rose", ROSE); - register(registry, "brown_mushroom", BROWN_MUSHROOM); - register(registry, "red_mushroom", RED_MUSHROOM); - register(registry, "gold_block", GOLD_BLOCK); - register(registry, "iron_block", IRON_BLOCK); - register(registry, "double_slab", DOUBLE_SLAB); - register(registry, "slab", SLAB); - register(registry, "bricks", BRICKS); - register(registry, "tnt", TNT); - register(registry, "bookshelf", BOOKSHELF); - register(registry, "mossy_cobblestone", MOSSY_COBBLESTONE); - register(registry, "obsidian", OBSIDIAN); - register(registry, "torch", TORCH); - register(registry, "fire", FIRE); - register(registry, "spawner", SPAWNER); - register(registry, "oak_stairs", WOODEN_STAIRS); - register(registry, "chest", CHEST); - register(registry, "redstone_wire", REDSTONE_WIRE); - register(registry, "diamond_ore", DIAMOND_ORE); - register(registry, "diamond_block", DIAMOND_BLOCK); - register(registry, "crafting_table", CRAFTING_TABLE); - register(registry, "wheat", WHEAT); - register(registry, "farmland", FARMLAND); - register(registry, "furnace", FURNACE); - register(registry, "furnace_lit", LIT_FURNACE); - register(registry, "oak_sign", SIGN); - register(registry, "oak_door", DOOR); - register(registry, "ladder", LADDER); - register(registry, "rail", RAIL); - register(registry, "cobblestone_stairs", COBBLESTONE_STAIRS); - register(registry, "oak_wall_sign", WALL_SIGN); - register(registry, "lever", LEVER); - register(registry, "oak_pressure_plate", STONE_PRESSURE_PLATE); - register(registry, "iron_door", IRON_DOOR); - register(registry, "stone_pressure_plate", WOODEN_PRESSURE_PLATE); - register(registry, "redstone_ore", REDSTONE_ORE); - register(registry, "redstone_ore_lit", LIT_REDSTONE_ORE); - register(registry, "redstone_torch", REDSTONE_TORCH); - register(registry, "redstone_torch_lit", LIT_REDSTONE_TORCH); - register(registry, "stone_button", BUTTON); - register(registry, "snow", SNOW); - register(registry, "ice", ICE); - register(registry, "snow_block", SNOW_BLOCK); - register(registry, "cactus", CACTUS); - register(registry, "clay", CLAY); - register(registry, "sugar_cane", SUGAR_CANE); - register(registry, "jukebox", JUKEBOX); - register(registry, "oak_fence", FENCE); - register(registry, "carved_pumpkin", PUMPKIN); - register(registry, "netherrack", NETHERRACK); - register(registry, "soul_sand", SOUL_SAND); - register(registry, "glowstone", GLOWSTONE); - register(registry, "nether_portal", NETHER_PORTAL); - register(registry, "jack_o_lantern", JACK_O_LANTERN); - register(registry, "cake", CAKE); - register(registry, "repeater", REPEATER); - register(registry, "repeater_lit", POWERED_REPEATER); - register(registry, "locked_chest", LOCKED_CHEST); - register(registry, "oak_trapdoor", TRAPDOOR); + event.register(block -> block.id, Namespace.MINECRAFT) + .accept("stone", STONE) + .accept("grass_block", GRASS_BLOCK) + .accept("dirt", DIRT) + .accept("cobblestone", COBBLESTONE) + .accept("oak_planks", PLANKS) + .accept("sapling", SAPLING) + .accept("bedrock", BEDROCK) + .accept("flowing_water", FLOWING_WATER) + .accept("water", WATER) + .accept("flowing_lava", FLOWING_LAVA) + .accept("lava", LAVA) + .accept("sand", SAND) + .accept("gravel", GRAVEL) + .accept("gold_ore", GOLD_ORE) + .accept("iron_ore", IRON_ORE) + .accept("coal_ore", COAL_ORE) + .accept("log", LOG) + .accept("leaves", LEAVES) + .accept("sponge", SPONGE) + .accept("glass", GLASS) + .accept("lapis_ore", LAPIS_ORE) + .accept("lapis_block", LAPIS_BLOCK) + .accept("dispenser", DISPENSER) + .accept("sandstone", SANDSTONE) + .accept("note_block", NOTE_BLOCK) + .accept("red_bed", BED) + .accept("powered_rail", POWERED_RAIL) + .accept("detector_rail", DETECTOR_RAIL) + .accept("sticky_piston", STICKY_PISTON) + .accept("cobweb", COBWEB) + .accept("grass", GRASS) + .accept("dead_bush", DEAD_BUSH) + .accept("piston", PISTON) + .accept("piston_head", PISTON_HEAD) + .accept("wool", WOOL) + .accept("moving_piston", MOVING_PISTON) + .accept("dandelion", DANDELION) + .accept("rose", ROSE) + .accept("brown_mushroom", BROWN_MUSHROOM) + .accept("red_mushroom", RED_MUSHROOM) + .accept("gold_block", GOLD_BLOCK) + .accept("iron_block", IRON_BLOCK) + .accept("double_slab", DOUBLE_SLAB) + .accept("slab", SLAB) + .accept("bricks", BRICKS) + .accept("tnt", TNT) + .accept("bookshelf", BOOKSHELF) + .accept("mossy_cobblestone", MOSSY_COBBLESTONE) + .accept("obsidian", OBSIDIAN) + .accept("torch", TORCH) + .accept("fire", FIRE) + .accept("spawner", SPAWNER) + .accept("oak_stairs", WOODEN_STAIRS) + .accept("chest", CHEST) + .accept("redstone_wire", REDSTONE_WIRE) + .accept("diamond_ore", DIAMOND_ORE) + .accept("diamond_block", DIAMOND_BLOCK) + .accept("crafting_table", CRAFTING_TABLE) + .accept("wheat", WHEAT) + .accept("farmland", FARMLAND) + .accept("furnace", FURNACE) + .accept("furnace_lit", LIT_FURNACE) + .accept("oak_sign", SIGN) + .accept("oak_door", DOOR) + .accept("ladder", LADDER) + .accept("rail", RAIL) + .accept("cobblestone_stairs", COBBLESTONE_STAIRS) + .accept("oak_wall_sign", WALL_SIGN) + .accept("lever", LEVER) + .accept("oak_pressure_plate", STONE_PRESSURE_PLATE) + .accept("iron_door", IRON_DOOR) + .accept("stone_pressure_plate", WOODEN_PRESSURE_PLATE) + .accept("redstone_ore", REDSTONE_ORE) + .accept("redstone_ore_lit", LIT_REDSTONE_ORE) + .accept("redstone_torch", REDSTONE_TORCH) + .accept("redstone_torch_lit", LIT_REDSTONE_TORCH) + .accept("stone_button", BUTTON) + .accept("snow", SNOW) + .accept("ice", ICE) + .accept("snow_block", SNOW_BLOCK) + .accept("cactus", CACTUS) + .accept("clay", CLAY) + .accept("sugar_cane", SUGAR_CANE) + .accept("jukebox", JUKEBOX) + .accept("oak_fence", FENCE) + .accept("carved_pumpkin", PUMPKIN) + .accept("netherrack", NETHERRACK) + .accept("soul_sand", SOUL_SAND) + .accept("glowstone", GLOWSTONE) + .accept("nether_portal", NETHER_PORTAL) + .accept("jack_o_lantern", JACK_O_LANTERN) + .accept("cake", CAKE) + .accept("repeater", REPEATER) + .accept("repeater_lit", POWERED_REPEATER) + .accept("locked_chest", LOCKED_CHEST) + .accept("oak_trapdoor", TRAPDOOR); LOGGER.info("Added vanilla blocks to the registry."); } - private static void register(Registry registry, String id, Block block) { - Registry.register(registry, block.id, of(id), block); - } - @EventListener(priority = LOW) private static void disableAutomaticBlockItemRegistration(BlockRegistryEvent event) { Consumer c = StationBlockItemsBlock::disableAutoItemRegistration; @@ -164,7 +158,7 @@ private static void disableAutomaticBlockItemRegistration(BlockRegistryEvent eve @EventListener private static void registerBlockItems(BlockItemRegistryEvent event) { - Consumer c = block -> Registry.register(ItemRegistry.INSTANCE, BlockRegistry.INSTANCE.getId(block), Item.ITEMS[block.id]); + Consumer c = block -> event.register(BlockRegistry.INSTANCE.getId(block), Item.ITEMS[block.id]); c.accept(Block.WOOL); c.accept(Block.LOG); @@ -174,6 +168,6 @@ private static void registerBlockItems(BlockItemRegistryEvent event) { c.accept(Block.PISTON); c.accept(Block.STICKY_PISTON); - COLLISION_BLOCKS.get().forEach(block -> Registry.register(ItemRegistry.INSTANCE, Objects.requireNonNull(BlockRegistry.INSTANCE.getId(block)).withSuffixedPath("_unobtainable"), new BlockItem(ItemRegistry.SHIFTED_ID.get(block.id)))); + COLLISION_BLOCKS.get().forEach(block -> event.register(Objects.requireNonNull(BlockRegistry.INSTANCE.getId(block)).withSuffixedPath("_unobtainable"), new BlockItem(ItemRegistry.SHIFTED_ID.get(block.id)))); } } diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java index ca0603605..faf3e271f 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java @@ -2,19 +2,16 @@ import net.mine_diver.unsafeevents.listener.EventListener; import net.mine_diver.unsafeevents.listener.Listener; -import net.minecraft.item.Item; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; -import net.modificationstation.stationapi.api.registry.ItemRegistry; -import net.modificationstation.stationapi.api.registry.Registry; +import net.modificationstation.stationapi.api.util.Namespace; import java.lang.invoke.MethodHandles; import static net.minecraft.item.Item.*; import static net.modificationstation.stationapi.api.StationAPI.LOGGER; -import static net.modificationstation.stationapi.api.util.Identifier.of; @Entrypoint(eventBus = @EventBusPolicy(registerInstance = false)) @EventListener(phase = StationAPI.INTERNAL_PHASE) @@ -25,119 +22,115 @@ public final class VanillaItemFixImpl { @EventListener private static void registerItems(ItemRegistryEvent event) { - ItemRegistry registry = event.registry; - - register(registry, "iron_shovel", IRON_SHOVEL); - register(registry, "iron_pickaxe", IRON_PICKAXE); - register(registry, "iron_axe", IRON_AXE); - register(registry, "flint_and_steel", FLINT_AND_STEEL); - register(registry, "apple", APPLE); - register(registry, "bow", BOW); - register(registry, "arrow", ARROW); - register(registry, "coal", COAL); - register(registry, "diamond", DIAMOND); - register(registry, "iron_ingot", IRON_INGOT); - register(registry, "gold_ingot", GOLD_INGOT); - register(registry, "iron_sword", IRON_SWORD); - register(registry, "wooden_sword", WOODEN_SWORD); - register(registry, "wooden_shovel", WOODEN_SHOVEL); - register(registry, "wooden_pickaxe", WOODEN_PICKAXE); - register(registry, "wooden_axe", WOODEN_AXE); - register(registry, "stone_sword", STONE_SWORD); - register(registry, "stone_shovel", STONE_SHOVEL); - register(registry, "stone_pickaxe", STONE_PICKAXE); - register(registry, "stone_axe", STONE_HATCHET); - register(registry, "diamond_sword", DIAMOND_SWORD); - register(registry, "diamond_shovel", DIAMOND_SHOVEL); - register(registry, "diamond_pickaxe", DIAMOND_PICKAXE); - register(registry, "diamond_axe", DIAMOND_AXE); - register(registry, "stick", STICK); - register(registry, "bowl", BOWL); - register(registry, "mushroom_stew", MUSHROOM_STEW); - register(registry, "golden_sword", GOLDEN_SWORD); - register(registry, "golden_shovel", GOLDEN_SHOVEL); - register(registry, "golden_pickaxe", GOLDEN_PICKAXE); - register(registry, "golden_axe", GOLDEN_AXE); - register(registry, "string", STRING); - register(registry, "feather", FEATHER); - register(registry, "gunpowder", GUNPOWDER); - register(registry, "wooden_hoe", WOODEN_HOE); - register(registry, "stone_hoe", STONE_HOE); - register(registry, "iron_hoe", IRON_HOE); - register(registry, "diamond_hoe", DIAMOND_HOE); - register(registry, "golden_hoe", GOLDEN_HOE); - register(registry, "wheat_seeds", SEEDS); - register(registry, "wheat", WHEAT); - register(registry, "bread", BREAD); - register(registry, "leather_helmet", LEATHER_HELMET); - register(registry, "leather_chestplate", LEATHER_CHESTPLATE); - register(registry, "leather_leggings", LEATHER_LEGGINGS); - register(registry, "leather_boots", LEATHER_BOOTS); - register(registry, "chainmail_helmet", CHAIN_HELMET); - register(registry, "chainmail_chestplate", CHAIN_CHESTPLATE); - register(registry, "chainmail_leggings", CHAIN_LEGGINGS); - register(registry, "chainmail_boots", CHAIN_BOOTS); - register(registry, "iron_helmet", IRON_HELMET); - register(registry, "iron_chestplate", IRON_CHESTPLATE); - register(registry, "iron_leggings", IRON_LEGGINGS); - register(registry, "iron_boots", IRON_BOOTS); - register(registry, "diamond_helmet", DIAMOND_HELMET); - register(registry, "diamond_chestplate", DIAMOND_CHESTPLATE); - register(registry, "diamond_leggings", DIAMOND_LEGGINGS); - register(registry, "diamond_boots", DIAMOND_BOOTS); - register(registry, "golden_helmet", GOLDEN_HELMET); - register(registry, "golden_chestplate", GOLDEN_CHESTPLATE); - register(registry, "golden_leggings", GOLDEN_LEGGINGS); - register(registry, "golden_boots", GOLDEN_BOOTS); - register(registry, "flint", FLINT); - register(registry, "porkchop", RAW_PORKCHOP); - register(registry, "cooked_porkchop", COOKED_PORKCHOP); - register(registry, "painting", PAINTING); - register(registry, "golden_apple", GOLDEN_APPLE); - register(registry, "oak_sign", SIGN); - register(registry, "oak_door", WOODEN_DOOR); - register(registry, "bucket", BUCKET); - register(registry, "water_bucket", WATER_BUCKET); - register(registry, "lava_bucket", LAVA_BUCKET); - register(registry, "minecart", MINECART); - register(registry, "saddle", SADDLE); - register(registry, "iron_door", IRON_DOOR); - register(registry, "redstone", REDSTONE); - register(registry, "snowball", SNOWBALL); - register(registry, "oak_boat", BOAT); - register(registry, "leather", LEATHER); - register(registry, "milk_bucket", MILK_BUCKET); - register(registry, "brick", BRICK); - register(registry, "clay_ball", CLAY); - register(registry, "sugar_cane", SUGAR_CANE); - register(registry, "paper", PAPER); - register(registry, "book", BOOK); - register(registry, "slime_ball", SLIMEBALL); - register(registry, "chest_minecart", CHEST_MINECART); - register(registry, "furnace_minecart", FURNACE_MINECART); - register(registry, "egg", EGG); - register(registry, "compass", COMPASS); - register(registry, "fishing_rod", FISHING_ROD); - register(registry, "clock", CLOCK); - register(registry, "glowstone_dust", GLOWSTONE_DUST); - register(registry, "cod", RAW_FISH); - register(registry, "cooked_cod", COOKED_FISH); - register(registry, "dye", DYE); - register(registry, "bone", BONE); - register(registry, "sugar", SUGAR); - register(registry, "cake", CAKE); - register(registry, "red_bed", BED); - register(registry, "repeater", REPEATER); - register(registry, "cookie", COOKIE); - register(registry, "map", MAP); - register(registry, "shears", SHEARS); - register(registry, "music_disc_13", RECORD_THIRTEEN); - register(registry, "music_disc_cat", RECORD_CAT); + event.register(item -> item.id, Namespace.MINECRAFT) + .accept("iron_shovel", IRON_SHOVEL) + .accept("iron_pickaxe", IRON_PICKAXE) + .accept("iron_axe", IRON_AXE) + .accept("flint_and_steel", FLINT_AND_STEEL) + .accept("apple", APPLE) + .accept("bow", BOW) + .accept("arrow", ARROW) + .accept("coal", COAL) + .accept("diamond", DIAMOND) + .accept("iron_ingot", IRON_INGOT) + .accept("gold_ingot", GOLD_INGOT) + .accept("iron_sword", IRON_SWORD) + .accept("wooden_sword", WOODEN_SWORD) + .accept("wooden_shovel", WOODEN_SHOVEL) + .accept("wooden_pickaxe", WOODEN_PICKAXE) + .accept("wooden_axe", WOODEN_AXE) + .accept("stone_sword", STONE_SWORD) + .accept("stone_shovel", STONE_SHOVEL) + .accept("stone_pickaxe", STONE_PICKAXE) + .accept("stone_axe", STONE_HATCHET) + .accept("diamond_sword", DIAMOND_SWORD) + .accept("diamond_shovel", DIAMOND_SHOVEL) + .accept("diamond_pickaxe", DIAMOND_PICKAXE) + .accept("diamond_axe", DIAMOND_AXE) + .accept("stick", STICK) + .accept("bowl", BOWL) + .accept("mushroom_stew", MUSHROOM_STEW) + .accept("golden_sword", GOLDEN_SWORD) + .accept("golden_shovel", GOLDEN_SHOVEL) + .accept("golden_pickaxe", GOLDEN_PICKAXE) + .accept("golden_axe", GOLDEN_AXE) + .accept("string", STRING) + .accept("feather", FEATHER) + .accept("gunpowder", GUNPOWDER) + .accept("wooden_hoe", WOODEN_HOE) + .accept("stone_hoe", STONE_HOE) + .accept("iron_hoe", IRON_HOE) + .accept("diamond_hoe", DIAMOND_HOE) + .accept("golden_hoe", GOLDEN_HOE) + .accept("wheat_seeds", SEEDS) + .accept("wheat", WHEAT) + .accept("bread", BREAD) + .accept("leather_helmet", LEATHER_HELMET) + .accept("leather_chestplate", LEATHER_CHESTPLATE) + .accept("leather_leggings", LEATHER_LEGGINGS) + .accept("leather_boots", LEATHER_BOOTS) + .accept("chainmail_helmet", CHAIN_HELMET) + .accept("chainmail_chestplate", CHAIN_CHESTPLATE) + .accept("chainmail_leggings", CHAIN_LEGGINGS) + .accept("chainmail_boots", CHAIN_BOOTS) + .accept("iron_helmet", IRON_HELMET) + .accept("iron_chestplate", IRON_CHESTPLATE) + .accept("iron_leggings", IRON_LEGGINGS) + .accept("iron_boots", IRON_BOOTS) + .accept("diamond_helmet", DIAMOND_HELMET) + .accept("diamond_chestplate", DIAMOND_CHESTPLATE) + .accept("diamond_leggings", DIAMOND_LEGGINGS) + .accept("diamond_boots", DIAMOND_BOOTS) + .accept("golden_helmet", GOLDEN_HELMET) + .accept("golden_chestplate", GOLDEN_CHESTPLATE) + .accept("golden_leggings", GOLDEN_LEGGINGS) + .accept("golden_boots", GOLDEN_BOOTS) + .accept("flint", FLINT) + .accept("porkchop", RAW_PORKCHOP) + .accept("cooked_porkchop", COOKED_PORKCHOP) + .accept("painting", PAINTING) + .accept("golden_apple", GOLDEN_APPLE) + .accept("oak_sign", SIGN) + .accept("oak_door", WOODEN_DOOR) + .accept("bucket", BUCKET) + .accept("water_bucket", WATER_BUCKET) + .accept("lava_bucket", LAVA_BUCKET) + .accept("minecart", MINECART) + .accept("saddle", SADDLE) + .accept("iron_door", IRON_DOOR) + .accept("redstone", REDSTONE) + .accept("snowball", SNOWBALL) + .accept("oak_boat", BOAT) + .accept("leather", LEATHER) + .accept("milk_bucket", MILK_BUCKET) + .accept("brick", BRICK) + .accept("clay_ball", CLAY) + .accept("sugar_cane", SUGAR_CANE) + .accept("paper", PAPER) + .accept("book", BOOK) + .accept("slime_ball", SLIMEBALL) + .accept("chest_minecart", CHEST_MINECART) + .accept("furnace_minecart", FURNACE_MINECART) + .accept("egg", EGG) + .accept("compass", COMPASS) + .accept("fishing_rod", FISHING_ROD) + .accept("clock", CLOCK) + .accept("glowstone_dust", GLOWSTONE_DUST) + .accept("cod", RAW_FISH) + .accept("cooked_cod", COOKED_FISH) + .accept("dye", DYE) + .accept("bone", BONE) + .accept("sugar", SUGAR) + .accept("cake", CAKE) + .accept("red_bed", BED) + .accept("repeater", REPEATER) + .accept("cookie", COOKIE) + .accept("map", MAP) + .accept("shears", SHEARS) + .accept("music_disc_13", RECORD_THIRTEEN) + .accept("music_disc_cat", RECORD_CAT); LOGGER.info("Added vanilla items to the registry."); } - private static void register(Registry registry, String id, Item item) { - Registry.register(registry, item.id, of(id), item); - } } From 1b21426de3ceb4850798d8f239775e294fae9d2e Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Sun, 9 Feb 2025 19:02:51 +0500 Subject: [PATCH 08/27] cleanup/java-hacks (#145) * Cleaned up Java hacks related to entrypoints * Removed EnumFactory. * Removed NativeImage Unsafe buffer cleaner invocation. * Replaced fake BlockItem with null, since MixinExtras allows that, unlike vanilla Mixin's Redirect. * Removed UnsafeProvider. * Updated javadoc for EntrypointManager#registerLookup --- src/main/resources/fabric.mod.json | 2 +- .../modificationstation/sltest/SLTest.java | 12 +- .../sltest/block/Blocks.java | 4 +- .../sltest/datafixer/DataFixerListener.java | 4 +- .../sltest/dimension/DimensionListener.java | 4 +- .../achievement/AchievementPageImpl.java | 4 +- .../stationapi/api/StationAPI.java | 12 +- .../stationapi/api/factory/EnumFactory.java | 138 ------------------ .../api/mod/entrypoint/EntrypointManager.java | 60 ++++++-- .../stationapi/api/util/Namespace.java | 124 ++++++++++++++++ .../stationapi/api/util/ReflectionHelper.java | 58 ++------ .../stationapi/api/util/UnsafeProvider.java | 20 --- .../impl/mod/DeprecatedInitEventsImpl.java | 4 +- .../impl/block/BlockFormOnlyHandler.java | 18 +-- .../block/HasCustomBlockItemFactoryImpl.java | 4 +- .../impl/block/HasMetaBlockItemImpl.java | 4 +- .../impl/block/HasMetaNamedBlockItemImpl.java | 4 +- .../mixin/blockitem/BlockMixin.java | 3 +- .../network/GuiClientNetworkHandler.java | 4 +- .../api/entity/EntityTypeFactory.java | 9 +- .../network/EntityClientNetworkHandler.java | 4 +- .../server/entity/CustomTrackingImpl.java | 4 +- .../server/entity/TrackingParametersImpl.java | 4 +- .../mixin/entity/EntityTypeAccessor.java | 16 ++ .../resources/station-entities-v0.mixins.json | 3 +- .../stationapi/api/block/States.java | 4 +- .../trackers/vanilla/BlockItemTracker.java | 3 +- .../impl/block/BlockInteractionImpl.java | 4 +- .../impl/block/PlacementStateImpl.java | 4 +- .../impl/world/WorldDataVersionImpl.java | 4 +- .../gui/screen/EditWorldScreenImpl.java | 4 +- .../container/CustomTooltipRendererImpl.java | 4 +- .../render/item/CustomItemOverlayImpl.java | 4 +- .../dispenser/CustomDispenseBehaviorImpl.java | 4 +- .../entity/player/ItemCustomReachImpl.java | 4 +- .../api/client/option/OptionFactory.java | 10 +- .../keybinding/client/OptionAccessor.java | 14 ++ .../station-keybindings-v0.mixins.json | 1 + .../resource/language/LanguageManager.java | 13 +- .../network/packet/StationNetworkingInit.java | 4 +- .../impl/recipe/JsonRecipeParserInit.java | 4 +- .../impl/recipe/JsonRecipesLoader.java | 4 +- .../json/JsonRecipeParserRegisterImpl.java | 4 +- .../sync/trackers/BooleanArrayTracker.java | 3 +- .../sync/trackers/Int2ObjectMapTracker.java | 3 +- .../sync/trackers/IntArrayTracker.java | 3 +- .../sync/trackers/ObjectArrayTracker.java | 3 +- .../trackers/RemappableEntryArrayTracker.java | 3 +- .../sync/trackers/StateIdTracker.java | 3 +- .../impl/registry/TagReloaderImpl.java | 4 +- .../impl/registry/WorldRegistryRemapper.java | 4 +- .../registry/ClientRegistryRestorer.java | 4 +- .../ClientServerRegistryRemapper.java | 4 +- .../impl/network/RegistryNetworkingInit.java | 4 +- .../server/registry/ServerRegistrySender.java | 4 +- .../registry/ServerRegistrySynchronizer.java | 4 +- .../api/client/texture/NativeImage.java | 8 +- .../client/texture/StationRenderImpl.java | 11 +- .../impl/client/arsenic/Arsenic.java | 8 +- .../client/resource/AssetsReloaderImpl.java | 4 +- .../impl/resource/DataReloaderImpl.java | 4 +- .../api/item/tool/ToolMaterialFactory.java | 10 +- .../impl/item/HijackShearsImplV1.java | 4 +- .../mixin/tools/ToolMaterialAccessor.java | 14 ++ .../station-tools-api-v1.mixins.json | 1 + .../client/network/ClientVanillaChecker.java | 4 +- .../impl/network/VanillaChecker.java | 4 +- .../server/network/ServerVanillaChecker.java | 4 +- .../vanillafix/block/VanillaBlockFixImpl.java | 4 +- .../block/VanillaBlockColorProviders.java | 4 +- .../gui/screen/EditWorldScreenImpl.java | 4 +- .../datafixer/VanillaDataFixerImpl.java | 4 +- .../dimension/VanillaDimensionFixImpl.java | 4 +- .../vanillafix/item/VanillaItemFixImpl.java | 4 +- .../recipe/VanillaFuelItemFixImpl.java | 4 +- 75 files changed, 368 insertions(+), 398 deletions(-) delete mode 100644 station-api-base/src/main/java/net/modificationstation/stationapi/api/factory/EnumFactory.java delete mode 100644 station-api-base/src/main/java/net/modificationstation/stationapi/api/util/UnsafeProvider.java create mode 100644 station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/EntityTypeAccessor.java create mode 100644 station-keybindings-v0/src/main/java/net/modificationstation/stationapi/mixin/keybinding/client/OptionAccessor.java create mode 100644 station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialAccessor.java diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index fac17cc49..b180c0782 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -20,7 +20,7 @@ "environment": "*", "depends": { - "java": "17", + "java": ">=17", "fabricloader": "*", "minecraft": "1.0.0-beta.7.3", "station-registry-api-v0": "*", diff --git a/src/test/java/net/modificationstation/sltest/SLTest.java b/src/test/java/net/modificationstation/sltest/SLTest.java index 1c7c4c9df..4d4d96d59 100644 --- a/src/test/java/net/modificationstation/sltest/SLTest.java +++ b/src/test/java/net/modificationstation/sltest/SLTest.java @@ -6,21 +6,13 @@ import net.mine_diver.unsafeevents.listener.EventListener; import net.mine_diver.unsafeevents.listener.ListenerPriority; import net.modificationstation.stationapi.api.event.mod.InitEvent; -import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; import net.modificationstation.stationapi.api.util.Namespace; -import net.modificationstation.stationapi.api.util.Null; import org.apache.logging.log4j.Logger; public class SLTest { + public static final Namespace NAMESPACE = Namespace.resolve(); - @Entrypoint.Logger - public static final Logger LOGGER = Null.get(); - - @Entrypoint.Instance - public static final SLTest INSTANCE = Null.get(); - - @Entrypoint.Namespace - public static final Namespace NAMESPACE = Null.get(); + public static final Logger LOGGER = NAMESPACE.getLogger(); @EventListener public void init(InitEvent event) { diff --git a/src/test/java/net/modificationstation/sltest/block/Blocks.java b/src/test/java/net/modificationstation/sltest/block/Blocks.java index a86479b9c..882fd7902 100644 --- a/src/test/java/net/modificationstation/sltest/block/Blocks.java +++ b/src/test/java/net/modificationstation/sltest/block/Blocks.java @@ -1,11 +1,11 @@ package net.modificationstation.sltest.block; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.block.Material; import net.modificationstation.sltest.mixin.BlockBaseAccessor; import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.template.block.TemplateBlock; import net.modificationstation.stationapi.api.util.Identifier; @@ -40,7 +40,7 @@ public Block get() { public static class Init { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java b/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java index e98c66547..de17ef907 100644 --- a/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java +++ b/src/test/java/net/modificationstation/sltest/datafixer/DataFixerListener.java @@ -1,9 +1,9 @@ package net.modificationstation.sltest.datafixer; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.nbt.NbtCompound; import net.modificationstation.stationapi.api.event.datafixer.DataFixerRegisterEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.util.Util; import java.lang.invoke.MethodHandles; @@ -13,7 +13,7 @@ public class DataFixerListener { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java b/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java index 24e45f194..23e4e20de 100644 --- a/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java +++ b/src/test/java/net/modificationstation/sltest/dimension/DimensionListener.java @@ -1,8 +1,8 @@ package net.modificationstation.sltest.dimension; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.event.registry.DimensionRegistryEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.registry.DimensionContainer; import net.modificationstation.stationapi.api.registry.DimensionRegistry; @@ -13,7 +13,7 @@ public class DimensionListener { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java b/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java index e9f7fb7ca..e8f06c59d 100644 --- a/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java +++ b/station-achievements-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/achievement/AchievementPageImpl.java @@ -2,7 +2,6 @@ import net.fabricmc.loader.api.FabricLoader; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.achievement.Achievement; import net.minecraft.achievement.Achievements; import net.minecraft.client.Minecraft; @@ -11,6 +10,7 @@ import net.modificationstation.stationapi.api.client.gui.screen.achievement.AchievementPage; import net.modificationstation.stationapi.api.event.achievement.AchievementRegisterEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -22,7 +22,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class AchievementPageImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/StationAPI.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/StationAPI.java index 9224c750a..d3a8fd949 100644 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/StationAPI.java +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/StationAPI.java @@ -10,7 +10,6 @@ import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.util.Namespace; -import net.modificationstation.stationapi.api.util.Null; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.config.Configurator; @@ -25,20 +24,12 @@ registerStatic = false )) public class StationAPI implements PreLaunchEntrypoint { - /** - * StationAPI's instance. - */ - @Entrypoint.Instance - public static final StationAPI INSTANCE = Null.get(); - /** * StationAPI's namespace. */ - @Entrypoint.Namespace public static final Namespace NAMESPACE = Namespace.of("stationapi"); - @Entrypoint.Logger("Station|API") - public static final Logger LOGGER = Null.get(); + public static final Logger LOGGER = NAMESPACE.getLogger("Station|API"); @ApiStatus.Internal public static final String INTERNAL_PHASE = "stationapi:internal"; @@ -53,7 +44,6 @@ public class StationAPI implements PreLaunchEntrypoint { */ @Override public void onPreLaunch() { - FabricLoader.getInstance().getModContainer("stationapi").ifPresent(modContainer -> EntrypointManager.setup(this, modContainer)); String name = NAMESPACE.getName(); LOGGER.info("Initializing " + name + "..."); Configurator.setLevel("mixin", Level.TRACE); diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/factory/EnumFactory.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/factory/EnumFactory.java deleted file mode 100644 index 511938b98..000000000 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/factory/EnumFactory.java +++ /dev/null @@ -1,138 +0,0 @@ -package net.modificationstation.stationapi.api.factory; - -import sun.reflect.ReflectionFactory; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Array; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.function.BiFunction; -import java.util.function.Function; - -import static net.modificationstation.stationapi.api.util.UnsafeProvider.theUnsafe; - -public class EnumFactory { - private static final Function, Object> NEW_CONSTRUCTOR_ACCESSOR; - private static final BiFunction NEW_INSTANCE; - - static { - try { - Field implLookupField = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP"); - MethodHandles.Lookup implLookup = (MethodHandles.Lookup) theUnsafe.getObject(theUnsafe.staticFieldBase(implLookupField), theUnsafe.staticFieldOffset(implLookupField)); - Field rfDelegateField = ReflectionFactory.class.getDeclaredField("delegate"); - Class rfClass = rfDelegateField.getType(); - rfDelegateField.setAccessible(true); - Object reflectionFactory = rfDelegateField.get(null); - Class constructorAccessorClass = Class.forName("jdk.internal.reflect.ConstructorAccessor"); - MethodHandle newConstructorAccessorHandle = implLookup.findVirtual(rfClass, "newConstructorAccessor", MethodType.methodType(constructorAccessorClass, Constructor.class)); - MethodHandle newInstanceHandle = implLookup.findVirtual(constructorAccessorClass, "newInstance", MethodType.methodType(Object.class, Object[].class)); - NEW_CONSTRUCTOR_ACCESSOR = constructor -> { - try { - return newConstructorAccessorHandle.invoke(reflectionFactory, constructor); - } catch (Throwable e) { - throw new RuntimeException(e); - } - }; - NEW_INSTANCE = (constructorAccessor, params) -> { - try { - return newInstanceHandle.invoke(constructorAccessor, params); - } catch (Throwable e) { - throw new RuntimeException(e); - } - }; - } catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException | NoSuchMethodException e) { - throw new RuntimeException(e); - } - } - - private static Object getConstructorAccessor(Class enumClass, Class[] additionalParameterTypes) throws Exception { - Class[] parameterTypes = new Class[additionalParameterTypes.length + 2]; - parameterTypes[0] = String.class; - parameterTypes[1] = int.class; - System.arraycopy(additionalParameterTypes, 0, parameterTypes, 2, additionalParameterTypes.length); - return NEW_CONSTRUCTOR_ACCESSOR.apply(enumClass.getDeclaredConstructor(parameterTypes)); - } - - private static > T makeEnum(Class enumClass, String value, int ordinal, Class[] additionalTypes, Object... additionalValues) throws Exception { - Object[] parms = new Object[additionalValues.length + 2]; - parms[0] = value; - parms[1] = ordinal; - System.arraycopy(additionalValues, 0, parms, 2, additionalValues.length); - return enumClass.cast(NEW_INSTANCE.apply(getConstructorAccessor(enumClass, additionalTypes), parms)); - } - - private static void setFailsafeFieldValue(Field field, Object target, Object value) { - Object fieldBase; - long fieldOffset; - if (Modifier.isStatic(field.getModifiers())) { - fieldBase = theUnsafe.staticFieldBase(field); - fieldOffset = theUnsafe.staticFieldOffset(field); - } else { - fieldBase = target; - fieldOffset = theUnsafe.objectFieldOffset(field); - } - theUnsafe.putObject(fieldBase, fieldOffset, value); - } - - private static void blankField(Class enumClass, String fieldName) { - for (Field field : Class.class.getDeclaredFields()) - if (field.getName().contains(fieldName)) { - setFailsafeFieldValue(field, enumClass, null); - break; - } - } - - private static void cleanEnumCache(Class enumClass) { - blankField(enumClass, "enumConstantDirectory"); - blankField(enumClass, "enumConstants"); - } - - public static > T addEnum(Class enumType, String enumName, Class[] paramTypes, Object... paramValues) { - Field valuesField = null; - Field[] fields = enumType.getDeclaredFields(); - - for (Field field : fields) { - String name = field.getName(); - if (name.equals("$VALUES") || name.equals("ENUM$VALUES")) { //Added 'ENUM$VALUES' because Eclipse's internal compiler doesn't follow standards - valuesField = field; - break; - } - } - - int flags = Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL | 0x1000 /*SYNTHETIC*/; - if (valuesField == null) { - String valueType = String.format("[L%s;", enumType.getName().replace('.', '/')); - - for (Field field : fields) - if ((field.getModifiers() & flags) == flags && - field.getType().getName().replace('.', '/').equals(valueType)) { //Apparently some JVMs return .'s and some don't.. - valuesField = field; - break; - } - } - - Objects.requireNonNull(valuesField).setAccessible(true); - - try { - Object[] previousValues = (Object[]) valuesField.get(enumType); - List values = new ArrayList<>(); - for (Object previousValue : previousValues) - values.add(enumType.cast(previousValue)); - T newValue = makeEnum(enumType, enumName, values.size(), paramTypes, paramValues); - values.add(newValue); - @SuppressWarnings("unchecked") - T[] valuesArray = values.toArray((T[]) Array.newInstance(enumType, 0)); - setFailsafeFieldValue(valuesField, null, valuesArray); - cleanEnumCache(enumType); - return enumType.cast(newValue); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/mod/entrypoint/EntrypointManager.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/mod/entrypoint/EntrypointManager.java index 0afd32b2f..7be2debae 100644 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/mod/entrypoint/EntrypointManager.java +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/mod/entrypoint/EntrypointManager.java @@ -1,5 +1,8 @@ package net.modificationstation.stationapi.api.mod.entrypoint; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; +import lombok.val; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.entrypoint.EntrypointContainer; import net.mine_diver.unsafeevents.Event; @@ -7,11 +10,8 @@ import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.util.Namespace; import net.modificationstation.stationapi.api.util.ReflectionHelper; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.config.Configurator; -import org.apache.logging.log4j.message.ParameterizedMessageFactory; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; import java.util.function.Consumer; @@ -20,6 +20,41 @@ * @author mine_diver */ public class EntrypointManager { + private static final Reference2ReferenceMap, MethodHandles.Lookup> LOOKUPS = new Reference2ReferenceOpenHashMap<>(); + + /** + * By registering a lookup via this method, an entrypoint class gives StationAPI and UnsafeEvents safe access to + * its non-public fields and methods. + * + *

+ * This is useful if you wish to keep your + * {@link net.mine_diver.unsafeevents.listener.EventListener listener methods} or utility fields + * (such as {@link net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint.Instance}, + * {@link net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint.Namespace}, + * and {@link net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint.Logger}) private. + *

+ * + *

+ * It's best to perform the registration as soon as possible in the static initializer of the class, + * for example: + *


+     *         public class ExampleEntrypoint {
+     *             static {
+     *                 EntrypointManager.registerLookup(MethodHandles.lookup());
+     *             }
+     *
+     *             // ... the rest of the entrypoint code ...
+     *         }
+     *     
+ *

+ * + * @param lookup an entrypoint class's lookup obtained via {@link MethodHandles#lookup()}. + */ + public static void registerLookup(MethodHandles.Lookup lookup) { + Listener.registerLookup(lookup); + LOOKUPS.put(lookup.lookupClass(), lookup); + } + /** * Performs the setup of entrypoint, such as: * - Registration of EventBus listeners. @@ -79,19 +114,18 @@ else if (o instanceof Method listener) .listener(o) .build() ); + val lookup = LOOKUPS.getOrDefault(o.getClass(), MethodHandles.publicLookup()); try { - ReflectionHelper.setFieldsWithAnnotation(o, Entrypoint.Instance.class, o); - ReflectionHelper.setFieldsWithAnnotation(o, Entrypoint.Namespace.class, namespace -> namespace.value().isEmpty() ? Namespace.of(modContainer) : Namespace.of(namespace.value())); - ReflectionHelper.setFieldsWithAnnotation(o, Entrypoint.Logger.class, logger -> { - String name = logger.value().isEmpty() ? modContainer.getMetadata().getId() + "|Mod" : logger.value(); - org.apache.logging.log4j.Logger log = LogManager.getLogger(name, ParameterizedMessageFactory.INSTANCE); - Configurator.setLevel(name, Level.INFO); - return log; + ReflectionHelper.setFieldsWithAnnotation(lookup, o, Entrypoint.Instance.class, o); + ReflectionHelper.setFieldsWithAnnotation(lookup, o, Entrypoint.Namespace.class, namespace -> namespace.value().isEmpty() ? Namespace.of(modContainer) : Namespace.of(namespace.value())); + ReflectionHelper.setFieldsWithAnnotation(lookup, o, Entrypoint.Logger.class, logger -> { + val namespace = Namespace.of(modContainer); + val name = logger.value(); + return name.isEmpty() ? namespace.getLogger() : namespace.getLogger(name); }); - } catch (IllegalAccessException e) { + } catch (IllegalAccessException | NoSuchFieldException e) { throw new RuntimeException(e); } } } - } \ No newline at end of file diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java index 1ce30760e..a8dfb178d 100644 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java @@ -2,15 +2,38 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import com.google.common.base.Suppliers; +import it.unimi.dsi.fastutil.objects.Object2ReferenceMap; +import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; +import lombok.extern.slf4j.Slf4j; +import lombok.val; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.Version; import net.fabricmc.loader.api.metadata.ModMetadata; import net.modificationstation.stationapi.api.util.exception.MissingModException; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.Configurator; +import org.apache.logging.log4j.message.ParameterizedMessageFactory; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Stream; +@Slf4j public final class Namespace implements Comparable<@NotNull Namespace> { private static final boolean CHECK_MISSING_MODS = false; @@ -19,6 +42,8 @@ public final class Namespace implements Comparable<@NotNull Namespace> { @NotNull private static final Function<@NotNull String, @NotNull Namespace> NAMESPACE_FACTORY = Namespace::new; + private static final Reference2ReferenceMap, Namespace> CLASS_CACHE = new Reference2ReferenceOpenHashMap<>(); + @NotNull public static final Namespace MINECRAFT = of("minecraft"); @@ -34,15 +59,102 @@ public final class Namespace implements Comparable<@NotNull Namespace> { return CACHE.get(namespace, NAMESPACE_FACTORY); } + @ApiStatus.Experimental + public static @NotNull Namespace resolve() { + return CLASS_CACHE.computeIfAbsent( + StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass(), + (Class caller) -> { + final Path callerPath; + try { + callerPath = Paths.get(caller.getProtectionDomain().getCodeSource().getLocation().toURI()); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + + val mods = FabricLoader.getInstance().getAllMods().stream(); + final Stream candidates; + + // i'm so sorry + if (Files.isRegularFile(callerPath)) { // regular case + final URI callerRoot; + try (val fs = FileSystems.newFileSystem(callerPath)) { + callerRoot = fs.getPath("/").toUri(); + } catch (IOException e) { + throw new RuntimeException(e); + } + candidates = mods + .filter(modContainer -> modContainer.getRootPaths() + .stream() + .filter(Files::isDirectory) + .map(Path::toUri) + .anyMatch(callerRoot::equals) + ); + } else if (Files.isDirectory(callerPath)) { // most likely a development environment + candidates = mods + .filter(modContainer -> modContainer.getRootPaths() + .stream() + .filter(Files::isDirectory) + .anyMatch(path -> { + Path pathName; + val nameCount = path.getNameCount(); + + // IntelliJ build path test + if (nameCount > 0) { + pathName = path.getFileName(); + if (pathName.toString().equals("resources")) + return path.getParent().resolve("classes").equals(callerPath); + } + + // Gradle build path test + if (nameCount > 2) { + val resources = path.getParent(); + pathName = resources.getFileName(); + if (pathName.toString().equals("resources")) { + try (val walk = Files.walk( + resources.getParent().resolve("classes"), 2 + )) { + if (walk.anyMatch(callerPath::equals)) return true; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + return false; + }) + ); + } else candidates = Stream.empty(); + + return of(candidates + .findAny() + .orElseThrow(() -> new IllegalCallerException(""" + Class "%s" has attempted to resolve its namespace, \ + but it's either not a part of a mod, \ + or was loaded in an unusual way. \ + Class's location resolves to "%s".\ + """ + .formatted( + caller.getName(), + callerPath.toUri() + ) + )) + .getMetadata() + .getId() + ); + }); + } + @NotNull private final String namespace; private final int hashCode; + private final Supplier> loggers; private Namespace(@NotNull final String namespace) { if (CHECK_MISSING_MODS && !FabricLoader.getInstance().isModLoaded(namespace)) throw new MissingModException(namespace); this.namespace = namespace; hashCode = toString().hashCode(); + loggers = Suppliers.memoize(Object2ReferenceOpenHashMap::new); } public @NotNull ModContainer getContainer() { @@ -65,6 +177,18 @@ private Namespace(@NotNull final String namespace) { return Identifier.of(this, id); } + public @NotNull Logger getLogger() { + return getLogger(namespace + "|Mod"); + } + + public @NotNull Logger getLogger(String name) { + return loggers.get().computeIfAbsent(name, (String s) -> { + val log = LogManager.getLogger(s, ParameterizedMessageFactory.INSTANCE); + Configurator.setLevel(s, Level.INFO); + return log; + }); + } + @Override public boolean equals(@NotNull final Object other) { if (this == other) return true; diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/ReflectionHelper.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/ReflectionHelper.java index 87468fc7f..4a665dde0 100644 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/ReflectionHelper.java +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/ReflectionHelper.java @@ -1,44 +1,31 @@ package net.modificationstation.stationapi.api.util; -import sun.misc.Unsafe; - import java.lang.annotation.Annotation; import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.function.Function; public class ReflectionHelper { - private static final VarHandle modifiers; - - static { - try { - Unsafe unsafe = UnsafeProvider.theUnsafe; - Field implLookupField = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP"); - MethodHandles.Lookup lookup = (MethodHandles.Lookup) unsafe.getObject(unsafe.staticFieldBase(implLookupField), unsafe.staticFieldOffset(implLookupField)); - modifiers = lookup.findVarHandle(Field.class, "modifiers", int.class); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } + public static void setFieldsWithAnnotation(MethodHandles.Lookup lookup, Object target, Class annotation, Object value) throws IllegalAccessException, NoSuchFieldException { + setFieldsWithAnnotation(lookup, target.getClass(), target, annotation, value); } - public static void setFieldsWithAnnotation(Object target, Class annotation, Object value) throws IllegalAccessException { - setFieldsWithAnnotation(target.getClass(), target, annotation, value); + public static void setFieldsWithAnnotation(MethodHandles.Lookup lookup, Class targetClass, Object target, Class annotation, Object value) throws IllegalAccessException, NoSuchFieldException { + setFieldsWithAnnotation(lookup, targetClass, target, annotation, annotation1 -> value); } - public static void setFieldsWithAnnotation(Class targetClass, Object target, Class annotation, Object value) throws IllegalAccessException { - setFieldsWithAnnotation(targetClass, target, annotation, annotation1 -> value); + public static void setFieldsWithAnnotation(MethodHandles.Lookup lookup, Object target, Class annotation, Function processor) throws IllegalAccessException, NoSuchFieldException { + setFieldsWithAnnotation(lookup, target.getClass(), target, annotation, processor); } - public static void setFieldsWithAnnotation(Object target, Class annotation, Function processor) throws IllegalAccessException { - setFieldsWithAnnotation(target.getClass(), target, annotation, processor); - } - - public static void setFieldsWithAnnotation(Class targetClass, Object target, Class annotation, Function processor) throws IllegalAccessException { - for (Field field : ReflectionHelper.getFieldsWithAnnotation(targetClass, annotation)) - ReflectionHelper.setPrivateFinalField(field, target, processor.apply(field.getAnnotation(annotation))); + public static void setFieldsWithAnnotation(MethodHandles.Lookup lookup, Class targetClass, Object target, Class annotation, Function processor) throws IllegalAccessException, NoSuchFieldException { + for (Field field : getFieldsWithAnnotation(targetClass, annotation)) + if (Modifier.isStatic(field.getModifiers())) + lookup.findStaticVarHandle(targetClass, field.getName(), field.getType()).set(processor.apply(field.getAnnotation(annotation))); + else + lookup.findVarHandle(targetClass, field.getName(), field.getType()).set(target, processor.apply(field.getAnnotation(annotation))); } public static Field[] getFieldsWithAnnotation(Class targetClass, Class annotationClass) { @@ -50,25 +37,4 @@ public static Field[] getFieldsWithAnnotation(Class targetClass, Class EMPTY_BLOCK_ITEM = Suppliers.memoize(() -> { - try { - return (BlockItem) UnsafeProvider.theUnsafe.allocateInstance(BlockItem.class); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } - }); - @EventListener private static void registerBlockItem(BlockItemFactoryEvent event) { if (event.block.isAutoItemRegistrationDisabled()) event.cancel(); diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java index 466786870..7c52ed3c0 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasCustomBlockItemFactoryImpl.java @@ -1,13 +1,13 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.item.BlockItem; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.block.*; import net.modificationstation.stationapi.api.event.block.BlockItemFactoryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.LambdaMetafactory; @@ -30,7 +30,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class HasCustomBlockItemFactoryImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } /** diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java index dd1941dde..2ed62d8b6 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaBlockItemImpl.java @@ -1,12 +1,12 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.item.BlockItem; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.block.*; import net.modificationstation.stationapi.api.event.block.BlockItemFactoryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.template.item.MetaBlockItem; @@ -28,7 +28,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class HasMetaBlockItemImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } /** diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java index 47bf2fae2..700a2f5ef 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/impl/block/HasMetaNamedBlockItemImpl.java @@ -1,12 +1,12 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.item.BlockItem; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.block.*; import net.modificationstation.stationapi.api.event.block.BlockItemFactoryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.template.item.MetaNamedBlockItem; @@ -28,7 +28,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class HasMetaNamedBlockItemImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } /** diff --git a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/mixin/blockitem/BlockMixin.java b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/mixin/blockitem/BlockMixin.java index 7fef77cda..b2ee4da68 100644 --- a/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/mixin/blockitem/BlockMixin.java +++ b/station-blockitems-v0/src/main/java/net/modificationstation/stationapi/mixin/blockitem/BlockMixin.java @@ -13,7 +13,6 @@ import net.modificationstation.stationapi.api.registry.BlockRegistry; import net.modificationstation.stationapi.api.registry.ItemRegistry; import net.modificationstation.stationapi.api.registry.Registry; -import net.modificationstation.stationapi.impl.block.BlockFormOnlyHandler; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -65,7 +64,7 @@ private static BlockItem stationapi_getBlockItem(int blockId, Operation typeSuperClass, int unusedInt, Material spawnMaterial, boolean unusedBoolean) { - return EnumFactory.addEnum( - class_238.class, typeName, - new Class[] { Class.class, int.class, Material.class, boolean.class }, - typeSuperClass, unusedInt, spawnMaterial, unusedBoolean - ); + return EntityTypeAccessor.stationapi_create(typeName, nextId++, typeSuperClass, unusedInt, spawnMaterial, unusedBoolean); } } diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java index 384f48122..46db9080e 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java @@ -2,7 +2,6 @@ import net.fabricmc.loader.api.FabricLoader; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.class_454; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; @@ -20,6 +19,7 @@ import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent; import net.modificationstation.stationapi.api.event.registry.MobHandlerRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.network.packet.MessagePacket; import net.modificationstation.stationapi.api.server.entity.StationSpawnDataProvider; @@ -39,7 +39,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class EntityClientNetworkHandler { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java index d9fd5a78b..0a5d97771 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/CustomTrackingImpl.java @@ -1,11 +1,11 @@ package net.modificationstation.stationapi.impl.server.entity; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.class_488; import net.minecraft.class_80; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.server.entity.CustomTracking; import net.modificationstation.stationapi.api.server.entity.HasTrackingParameters; @@ -26,7 +26,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class CustomTrackingImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } /** diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java index b61240567..8bb4299e0 100644 --- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/server/entity/TrackingParametersImpl.java @@ -1,12 +1,12 @@ package net.modificationstation.stationapi.impl.server.entity; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.class_488; import net.minecraft.class_80; import net.minecraft.entity.Entity; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.server.entity.CustomTracking; import net.modificationstation.stationapi.api.server.entity.HasTrackingParameters; @@ -28,7 +28,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class TrackingParametersImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } /** diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/EntityTypeAccessor.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/EntityTypeAccessor.java new file mode 100644 index 000000000..e3a8a07ce --- /dev/null +++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/EntityTypeAccessor.java @@ -0,0 +1,16 @@ +package net.modificationstation.stationapi.mixin.entity; + +import net.minecraft.block.Material; +import net.minecraft.class_238; +import net.minecraft.entity.Entity; +import net.modificationstation.stationapi.api.util.Util; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(class_238.class) +public interface EntityTypeAccessor { + @Invoker("") + static class_238 stationapi_create(String typeName, int id, Class typeSuperClass, int unusedInt, Material spawnMaterial, boolean unusedBoolean) { + return Util.assertMixin(); + } +} diff --git a/station-entities-v0/src/main/resources/station-entities-v0.mixins.json b/station-entities-v0/src/main/resources/station-entities-v0.mixins.json index 61f9769cf..4c0a4f7c4 100644 --- a/station-entities-v0/src/main/resources/station-entities-v0.mixins.json +++ b/station-entities-v0/src/main/resources/station-entities-v0.mixins.json @@ -4,7 +4,8 @@ "package": "net.modificationstation.stationapi.mixin.entity", "compatibilityLevel": "JAVA_17", "mixins": [ - "EntityRegistryMixin" + "EntityRegistryMixin", + "EntityTypeAccessor" ], "server": [ "server.ServerEntityTrackerMixin", diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java index 7fd763f31..f25adad64 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/States.java @@ -2,11 +2,11 @@ import com.google.common.base.Suppliers; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.util.collection.IdList; @@ -19,7 +19,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class States { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private static final Supplier AIR_BLOCK = Suppliers.memoize(() -> new Air(0)); diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java index 3c89c79f1..d9f66164e 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/vanilla/BlockItemTracker.java @@ -5,6 +5,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.registry.ListenableRegistry; import net.modificationstation.stationapi.api.registry.Registry; @@ -12,7 +13,7 @@ public final class BlockItemTracker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private BlockItemTracker() { } diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java index 7abf61833..f713d1712 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/BlockInteractionImpl.java @@ -1,11 +1,11 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.block.BeforeBlockRemoved; import net.modificationstation.stationapi.api.event.block.BlockEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -14,7 +14,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class BlockInteractionImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java index ff5f1b8b1..e7aa309ea 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/block/PlacementStateImpl.java @@ -1,7 +1,6 @@ package net.modificationstation.stationapi.impl.block; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.Vec3d; import net.modificationstation.stationapi.api.StationAPI; @@ -9,6 +8,7 @@ import net.modificationstation.stationapi.api.event.block.BlockEvent; import net.modificationstation.stationapi.api.item.ItemPlacementContext; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -17,7 +17,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class PlacementStateImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java index 608abb33a..5502f59c8 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/WorldDataVersionImpl.java @@ -2,12 +2,12 @@ import com.google.common.collect.Iterators; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.world.WorldPropertiesEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.nbt.NbtHelper; import net.modificationstation.stationapi.mixin.nbt.NbtCompoundAccessor; @@ -19,7 +19,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class WorldDataVersionImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java index b573d5cb3..88d94a2bc 100644 --- a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java +++ b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/EditWorldScreenImpl.java @@ -1,7 +1,6 @@ package net.modificationstation.stationapi.impl.client.gui.screen; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.gui.screen.world.EditWorldScreen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.resource.language.I18n; @@ -9,6 +8,7 @@ import net.modificationstation.stationapi.api.client.event.gui.screen.EditWorldScreenEvent; import net.modificationstation.stationapi.api.client.gui.widget.ButtonWidgetDetachedContext; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.mixin.gui.client.ScreenAccessor; @@ -18,7 +18,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class EditWorldScreenImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java index a13663c3b..ae1a575f4 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java @@ -1,12 +1,12 @@ package net.modificationstation.stationapi.impl.client.gui.screen.container; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.gui.DrawContext; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.TooltipHelper; import net.modificationstation.stationapi.api.client.event.gui.screen.container.TooltipRenderEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.mixin.item.client.DrawContextAccessor; import net.modificationstation.stationapi.mixin.item.client.HandledScreenAccessor; @@ -19,7 +19,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class CustomTooltipRendererImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private static final DrawContext CONTEXT = new DrawContext(); diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java index c4cce8b15..4fdcbcfdb 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/item/CustomItemOverlayImpl.java @@ -1,11 +1,11 @@ package net.modificationstation.stationapi.impl.client.render.item; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.render.item.ItemOverlayRenderEvent; import net.modificationstation.stationapi.api.client.item.CustomItemOverlay; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -14,7 +14,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class CustomItemOverlayImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java index 8d7fb3518..1aa32364f 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/dispenser/CustomDispenseBehaviorImpl.java @@ -1,11 +1,11 @@ package net.modificationstation.stationapi.impl.dispenser; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.dispenser.DispenseEvent; import net.modificationstation.stationapi.api.item.CustomDispenseBehavior; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -14,7 +14,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class CustomDispenseBehaviorImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java index 338162157..1654a89b1 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/entity/player/ItemCustomReachImpl.java @@ -1,13 +1,13 @@ package net.modificationstation.stationapi.impl.entity.player; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.entity.player.PlayerEvent; import net.modificationstation.stationapi.api.item.CustomReachProvider; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -16,7 +16,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class ItemCustomReachImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/api/client/option/OptionFactory.java b/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/api/client/option/OptionFactory.java index de59d51de..481dc3b94 100644 --- a/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/api/client/option/OptionFactory.java +++ b/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/api/client/option/OptionFactory.java @@ -3,15 +3,13 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import net.minecraft.client.option.Option; -import net.modificationstation.stationapi.api.factory.EnumFactory; +import net.modificationstation.stationapi.mixin.keybinding.client.OptionAccessor; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class OptionFactory { + private static int nextId = Option.values().length; + public static Option create(String optionName, String translationKey, boolean slider, boolean toggle) { - return EnumFactory.addEnum( - Option.class, optionName, - new Class[] { String.class, boolean.class, boolean.class }, - translationKey, slider, toggle - ); + return OptionAccessor.stationapi_create(optionName, nextId++, translationKey, slider, toggle); } } diff --git a/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/mixin/keybinding/client/OptionAccessor.java b/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/mixin/keybinding/client/OptionAccessor.java new file mode 100644 index 000000000..b98ca0716 --- /dev/null +++ b/station-keybindings-v0/src/main/java/net/modificationstation/stationapi/mixin/keybinding/client/OptionAccessor.java @@ -0,0 +1,14 @@ +package net.modificationstation.stationapi.mixin.keybinding.client; + +import net.minecraft.client.option.Option; +import net.modificationstation.stationapi.api.util.Util; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Option.class) +public interface OptionAccessor { + @Invoker("") + static Option stationapi_create(String optionName, int id, String translationKey, boolean slider, boolean toggle) { + return Util.assertMixin(); + } +} diff --git a/station-keybindings-v0/src/main/resources/station-keybindings-v0.mixins.json b/station-keybindings-v0/src/main/resources/station-keybindings-v0.mixins.json index e08db3268..6b4bad74b 100644 --- a/station-keybindings-v0/src/main/resources/station-keybindings-v0.mixins.json +++ b/station-keybindings-v0/src/main/resources/station-keybindings-v0.mixins.json @@ -8,6 +8,7 @@ "client": [ "client.GameOptionsMixin", "client.MinecraftMixin", + "client.OptionAccessor", "client.ScreenMixin" ], "injectors": { diff --git a/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java b/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java index b93184427..4ba6e6f35 100644 --- a/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java +++ b/station-localization-api-v0/src/main/java/net/modificationstation/stationapi/api/resource/language/LanguageManager.java @@ -6,7 +6,6 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.resource.language.TranslationStorage; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.resource.AssetsResourceReloaderRegisterEvent; @@ -14,13 +13,13 @@ import net.modificationstation.stationapi.api.event.resource.DataReloadEvent; import net.modificationstation.stationapi.api.event.resource.language.TranslationInvalidationEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.resource.IdentifiableResourceReloadListener; import net.modificationstation.stationapi.api.resource.ResourceManager; import net.modificationstation.stationapi.api.resource.SinglePreparationResourceReloader; import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.util.Namespace; -import net.modificationstation.stationapi.api.util.Null; import net.modificationstation.stationapi.api.util.Util; import net.modificationstation.stationapi.api.util.profiler.DummyProfiler; import net.modificationstation.stationapi.api.util.profiler.Profiler; @@ -44,12 +43,12 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class LanguageManager extends SinglePreparationResourceReloader> implements IdentifiableResourceReloadListener { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } public static final Identifier LANGUAGES = NAMESPACE.id("languages"); @Entrypoint.Instance - private static final LanguageManager INSTANCE = Null.get(); + private static LanguageManager instance; @NotNull private static Predicate pathPredicate = buildPathPredicate("en_US"); private static final Object2ReferenceMap LANG_PATHS = Util.make(new Object2ReferenceOpenHashMap<>(), paths -> { @@ -66,7 +65,7 @@ private static Predicate buildPathPredicate(String langDef) { public static void changeLanguage(String langDef) { pathPredicate = buildPathPredicate(langDef); - INSTANCE.reload(); + instance.reload(); } public static void addPath(String path) { @@ -90,8 +89,8 @@ private void loadOnServer(DataReloadEvent event) { } private void reload() { - INSTANCE.apply( - INSTANCE.prepare( + instance.apply( + instance.prepare( ReloadableAssetsManager.INSTANCE, DummyProfiler.INSTANCE ), diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingInit.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingInit.java index 7b6523ea4..03e18e87e 100644 --- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingInit.java +++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingInit.java @@ -1,11 +1,11 @@ package net.modificationstation.stationapi.impl.network.packet; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.network.packet.PacketRegisterEvent; import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -14,7 +14,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class StationNetworkingInit { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java index c6fde79a4..d3d3dd91d 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipeParserInit.java @@ -3,12 +3,12 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.recipe.RecipeRegisterEvent; import net.modificationstation.stationapi.api.event.registry.JsonRecipeParserRegistryEvent; import net.modificationstation.stationapi.api.item.json.JsonItemKey; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.recipe.CraftingRegistry; import net.modificationstation.stationapi.api.recipe.SmeltingRegistry; @@ -30,7 +30,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class JsonRecipeParserInit { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipesLoader.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipesLoader.java index 3930e4c64..28938eb73 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipesLoader.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/JsonRecipesLoader.java @@ -2,10 +2,10 @@ import com.google.gson.Gson; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.mod.PreInitEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.JsonRecipesRegistry; import net.modificationstation.stationapi.api.registry.Registry; @@ -28,7 +28,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class JsonRecipesLoader { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/json/JsonRecipeParserRegisterImpl.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/json/JsonRecipeParserRegisterImpl.java index 163e6472b..128d38f9b 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/json/JsonRecipeParserRegisterImpl.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/json/JsonRecipeParserRegisterImpl.java @@ -1,17 +1,17 @@ package net.modificationstation.stationapi.impl.recipe.json; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.mod.InitEvent; import net.modificationstation.stationapi.api.event.registry.JsonRecipeParserRegistryEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import java.lang.invoke.MethodHandles; @EventListener(phase = StationAPI.INTERNAL_PHASE) public class JsonRecipeParserRegisterImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/BooleanArrayTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/BooleanArrayTracker.java index 1cc272a5d..d68b3348a 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/BooleanArrayTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/BooleanArrayTracker.java @@ -6,6 +6,7 @@ import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent; import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.registry.ListenableRegistry; import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.math.MathHelper; @@ -18,7 +19,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class BooleanArrayTracker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private final Supplier arrayGetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/Int2ObjectMapTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/Int2ObjectMapTracker.java index ea637bf0d..4e0f4c94a 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/Int2ObjectMapTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/Int2ObjectMapTracker.java @@ -10,6 +10,7 @@ import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent; import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.registry.ListenableRegistry; import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.Identifier; @@ -22,7 +23,7 @@ public class Int2ObjectMapTracker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private final String name; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IntArrayTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IntArrayTracker.java index c26c2ed9e..b63a17c6b 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IntArrayTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IntArrayTracker.java @@ -6,6 +6,7 @@ import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent; import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.registry.ListenableRegistry; import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.math.MathHelper; @@ -18,7 +19,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class IntArrayTracker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private final Supplier arrayGetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/ObjectArrayTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/ObjectArrayTracker.java index facd5366e..c18059018 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/ObjectArrayTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/ObjectArrayTracker.java @@ -6,6 +6,7 @@ import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent; import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.registry.ListenableRegistry; import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.registry.RemappableRawIdHolder; @@ -19,7 +20,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ObjectArrayTracker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private final Supplier arrayGetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/RemappableEntryArrayTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/RemappableEntryArrayTracker.java index 6b1289663..94ff9e198 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/RemappableEntryArrayTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/RemappableEntryArrayTracker.java @@ -6,6 +6,7 @@ import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent; import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.registry.ListenableRegistry; import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.registry.RemappableRawIdHolder; @@ -18,7 +19,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class RemappableEntryArrayTracker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private final Supplier arrayGetter; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/StateIdTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/StateIdTracker.java index 51539ac2e..c0caaae96 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/StateIdTracker.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/StateIdTracker.java @@ -7,6 +7,7 @@ import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent; import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.registry.ListenableRegistry; import net.modificationstation.stationapi.api.registry.Registry; import net.modificationstation.stationapi.api.util.collection.IdList; @@ -20,7 +21,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class StateIdTracker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private final Registry registry; diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/TagReloaderImpl.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/TagReloaderImpl.java index 1fd092b64..328818fc5 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/TagReloaderImpl.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/TagReloaderImpl.java @@ -1,10 +1,10 @@ package net.modificationstation.stationapi.impl.registry; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.resource.DataResourceReloaderRegisterEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.ServerDynamicRegistryType; import net.modificationstation.stationapi.api.tag.TagManagerLoader; @@ -15,7 +15,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class TagReloaderImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/WorldRegistryRemapper.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/WorldRegistryRemapper.java index 24412b64f..98db4047a 100644 --- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/WorldRegistryRemapper.java +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/impl/registry/WorldRegistryRemapper.java @@ -1,11 +1,11 @@ package net.modificationstation.stationapi.impl.registry; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.nbt.NbtCompound; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.world.WorldPropertiesEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.legacy.WorldLegacyRegistry; @@ -18,7 +18,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class WorldRegistryRemapper { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientRegistryRestorer.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientRegistryRestorer.java index c472262e0..495dced59 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientRegistryRestorer.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientRegistryRestorer.java @@ -3,10 +3,10 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.network.MultiplayerLogoutEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.RemapException; import net.modificationstation.stationapi.impl.registry.sync.RegistrySyncManager; @@ -18,7 +18,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class ClientRegistryRestorer { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @Environment(EnvType.CLIENT) diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java index cda912ed2..0bfab1a18 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/registry/ClientServerRegistryRemapper.java @@ -1,12 +1,12 @@ package net.modificationstation.stationapi.impl.client.registry; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtIo; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.network.packet.MessagePacket; import net.modificationstation.stationapi.api.registry.legacy.WorldLegacyRegistry; @@ -21,7 +21,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ClientServerRegistryRemapper { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java index 9d9d89c7f..b8dfc071c 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java @@ -1,10 +1,10 @@ package net.modificationstation.stationapi.impl.network; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.network.packet.PacketRegisterEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.PacketTypeRegistry; import net.modificationstation.stationapi.api.registry.Registry; @@ -19,7 +19,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE, priority = HIGH) public final class RegistryNetworkingInit { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySender.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySender.java index 1ed58a065..67eb436c4 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySender.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySender.java @@ -1,11 +1,11 @@ package net.modificationstation.stationapi.impl.server.registry; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtIo; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.network.ModdedPacketHandler; import net.modificationstation.stationapi.api.network.packet.MessagePacket; @@ -24,7 +24,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ServerRegistrySender { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySynchronizer.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySynchronizer.java index 0e17def8f..dd9635fd3 100644 --- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySynchronizer.java +++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/server/registry/ServerRegistrySynchronizer.java @@ -1,9 +1,9 @@ package net.modificationstation.stationapi.impl.server.registry; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.server.event.network.PlayerPacketHandlerSetEvent; import net.modificationstation.stationapi.impl.registry.sync.RegistrySyncManager; @@ -14,7 +14,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ServerRegistrySynchronizer { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/NativeImage.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/NativeImage.java index ac24097e8..213e1d122 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/NativeImage.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/NativeImage.java @@ -10,14 +10,12 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.option.GameOptions; import net.minecraft.client.util.GlAllocationUtils; -import net.modificationstation.stationapi.api.util.UnsafeProvider; import net.modificationstation.stationapi.api.util.Util; import org.apache.commons.io.IOUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.MemoryUtil; import org.lwjgl.opengl.GL11; -import sun.misc.Unsafe; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -39,9 +37,6 @@ @Environment(EnvType.CLIENT) public final class NativeImage implements AutoCloseable { - - private static final Unsafe UNSAFE = UnsafeProvider.theUnsafe; - private static final Int2IntMap BUFFERED_TO_NATIVE = Int2IntMaps.unmodifiable(Util.make(new Int2IntOpenHashMap(), map -> { map.defaultReturnValue(-1); map.put(BufferedImage.TYPE_INT_ARGB, 0); @@ -171,8 +166,7 @@ private void checkAllocated() { @Override public void close() { - if (buffer != null) - UNSAFE.invokeCleaner(buffer); + // GC should be able to take care of this buffer = null; } diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java index 10dc3ccf2..0d98ffa6d 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java @@ -3,7 +3,6 @@ import com.mojang.datafixers.util.Pair; import net.fabricmc.loader.api.FabricLoader; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.class_285; import net.minecraft.client.Minecraft; import net.modificationstation.stationapi.api.StationAPI; @@ -21,11 +20,11 @@ import net.modificationstation.stationapi.api.client.texture.atlas.Atlases; import net.modificationstation.stationapi.api.client.texture.atlas.ExpandableAtlas; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.resource.*; import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.util.Namespace; -import net.modificationstation.stationapi.api.util.Null; import net.modificationstation.stationapi.api.util.profiler.Profiler; import org.apache.logging.log4j.Logger; @@ -41,14 +40,12 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class StationRenderImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } - @Entrypoint.Namespace - public static final Namespace NAMESPACE = Null.get(); + public static final Namespace NAMESPACE = Namespace.resolve(); - @Entrypoint.Logger("StationRenderer|API") - public static final Logger LOGGER = Null.get(); + public static final Logger LOGGER = NAMESPACE.getLogger("StationRenderer|API"); public static ExpandableAtlas getTerrain() { return TERRAIN; diff --git a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/Arsenic.java b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/Arsenic.java index 1d1d67ed3..fd42ada67 100644 --- a/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/Arsenic.java +++ b/station-renderer-arsenic/src/main/java/net/modificationstation/stationapi/impl/client/arsenic/Arsenic.java @@ -12,8 +12,9 @@ import net.modificationstation.stationapi.api.client.texture.atlas.ExpandableAtlas; import net.modificationstation.stationapi.api.event.mod.InitEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; -import net.modificationstation.stationapi.api.util.Null; +import net.modificationstation.stationapi.api.util.Namespace; import net.modificationstation.stationapi.impl.client.arsenic.renderer.ArsenicRenderer; import net.modificationstation.stationapi.impl.client.arsenic.renderer.render.binder.*; import net.modificationstation.stationapi.mixin.render.client.TextureManagerAccessor; @@ -30,11 +31,10 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class Arsenic { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } - @Entrypoint.Logger("Arsenic") - public static final Logger LOGGER = Null.get(); + public static final Logger LOGGER = Namespace.resolve().getLogger("Arsenic"); @EventListener private static void init(InitEvent event) { diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java index 692c000c6..650341258 100644 --- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java +++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java @@ -1,13 +1,13 @@ package net.modificationstation.stationapi.impl.client.resource; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.resource.AssetsReloadEvent; import net.modificationstation.stationapi.api.client.event.resource.TexturePackLoadedEvent; import net.modificationstation.stationapi.api.client.resource.ReloadScreenManager; import net.modificationstation.stationapi.api.client.resource.ReloadableAssetsManager; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.resource.CompositeResourceReload; import net.modificationstation.stationapi.api.util.Unit; @@ -27,7 +27,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class AssetsReloaderImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } public static final ResourcePackManager RESOURCE_PACK_MANAGER = new ResourcePackManager( diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java index 471cbab3f..e83005f9c 100644 --- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java +++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java @@ -3,11 +3,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.resource.ReloadScreenManager; import net.modificationstation.stationapi.api.event.resource.DataReloadEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.resource.CompositeResourceReload; import net.modificationstation.stationapi.api.resource.DataManager; @@ -30,7 +30,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class DataReloaderImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private static final ResourcePackManager DATA_PACK_MANAGER = new ResourcePackManager(consumer -> consumer.accept(ResourcePackProfile.create("vanilla", "fixText", true, name -> new DefaultResourcePack(), ResourceType.SERVER_DATA, ResourcePackProfile.InsertionPosition.BOTTOM, ResourcePackSource.BUILTIN)), new ModResourcePackCreator(ResourceType.SERVER_DATA)); diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolMaterialFactory.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolMaterialFactory.java index 8ecfecadd..73701ab88 100644 --- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolMaterialFactory.java +++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolMaterialFactory.java @@ -1,14 +1,12 @@ package net.modificationstation.stationapi.api.item.tool; import net.minecraft.item.ToolMaterial; -import net.modificationstation.stationapi.api.factory.EnumFactory; +import net.modificationstation.stationapi.mixin.tools.ToolMaterialAccessor; public class ToolMaterialFactory { + private static int nextId = ToolMaterial.values().length; + public static ToolMaterial create(String materialName, int miningLevel, int durability, float miningSpeed, int attackDamage) { - return EnumFactory.addEnum( - ToolMaterial.class, materialName, - new Class[] { int.class, int.class, float.class, int.class }, - miningLevel, durability, miningSpeed, attackDamage - ); + return ToolMaterialAccessor.stationapi_create(materialName, nextId++, miningLevel, durability, miningSpeed, attackDamage); } } diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java index f44f5f9e8..42982cdad 100644 --- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java +++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java @@ -1,9 +1,9 @@ package net.modificationstation.stationapi.impl.item; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.item.tool.StationTool; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.util.Identifier; import java.lang.invoke.MethodHandles; @@ -11,7 +11,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class HijackShearsImplV1 { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } //TODO: Make this match anything that has shear tool properties. Not sure how to go around this at the moment. diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialAccessor.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialAccessor.java new file mode 100644 index 000000000..3896d4d31 --- /dev/null +++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialAccessor.java @@ -0,0 +1,14 @@ +package net.modificationstation.stationapi.mixin.tools; + +import net.minecraft.item.ToolMaterial; +import net.modificationstation.stationapi.api.util.Util; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(ToolMaterial.class) +public interface ToolMaterialAccessor { + @Invoker("") + static ToolMaterial stationapi_create(String materialName, int id, int miningLevel, int itemDurability, float miningSpeed, int attackDamage) { + return Util.assertMixin(); + } +} diff --git a/station-tools-api-v1/src/main/resources/station-tools-api-v1.mixins.json b/station-tools-api-v1/src/main/resources/station-tools-api-v1.mixins.json index f97415b04..465657227 100644 --- a/station-tools-api-v1/src/main/resources/station-tools-api-v1.mixins.json +++ b/station-tools-api-v1/src/main/resources/station-tools-api-v1.mixins.json @@ -12,6 +12,7 @@ "ShovelItemMixin", "SwordItemMixin", "ToolItemMixin", + "ToolMaterialAccessor", "ToolMaterialMixin" ], "server": [ diff --git a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientVanillaChecker.java b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientVanillaChecker.java index 1db74881f..7dacb49ae 100644 --- a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientVanillaChecker.java +++ b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientVanillaChecker.java @@ -3,10 +3,10 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.network.ServerLoginSuccessEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.network.packet.MessagePacket; import net.modificationstation.stationapi.impl.network.ModdedPacketHandlerSetter; @@ -21,7 +21,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ClientVanillaChecker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/network/VanillaChecker.java b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/network/VanillaChecker.java index c3a189bc1..eb295d441 100644 --- a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/network/VanillaChecker.java +++ b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/network/VanillaChecker.java @@ -5,10 +5,10 @@ import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModMetadata; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.mod.PreInitEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -22,7 +22,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class VanillaChecker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } public static final long MASK = Hashing.sipHash24().hashUnencodedChars(NAMESPACE.toString()).asLong(); diff --git a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java index 3c7d4e10f..6720fea60 100644 --- a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java +++ b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java @@ -4,12 +4,12 @@ import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModMetadata; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.player.ServerPlayerEntity; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.server.event.network.PlayerAttemptLoginEvent; import net.modificationstation.stationapi.impl.network.ModdedPacketHandlerSetter; @@ -28,7 +28,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public class ServerVanillaChecker { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java index 8c40bb81e..31128650c 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/block/VanillaBlockFixImpl.java @@ -4,7 +4,6 @@ import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import it.unimi.dsi.fastutil.objects.ReferenceSet; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; @@ -13,6 +12,7 @@ import net.modificationstation.stationapi.api.event.registry.BlockItemRegistryEvent; import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.BlockRegistry; import net.modificationstation.stationapi.api.registry.ItemRegistry; @@ -32,7 +32,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaBlockFixImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } public static final Supplier> COLLISION_BLOCKS = Suppliers.memoize(() -> Util.make(new ReferenceOpenHashSet<>(), s -> { diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/color/block/VanillaBlockColorProviders.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/color/block/VanillaBlockColorProviders.java index 4774ada48..0bb015f3c 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/color/block/VanillaBlockColorProviders.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/color/block/VanillaBlockColorProviders.java @@ -1,13 +1,13 @@ package net.modificationstation.stationapi.impl.vanillafix.client.color.block; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.class_287; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.color.world.BiomeColors; import net.modificationstation.stationapi.api.client.event.color.block.BlockColorsRegisterEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import java.lang.invoke.MethodHandles; @@ -16,7 +16,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaBlockColorProviders { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/gui/screen/EditWorldScreenImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/gui/screen/EditWorldScreenImpl.java index b42642bc4..fe79b1073 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/gui/screen/EditWorldScreenImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/client/gui/screen/EditWorldScreenImpl.java @@ -4,7 +4,6 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.resource.language.I18n; @@ -14,6 +13,7 @@ import net.modificationstation.stationapi.api.client.gui.widget.ButtonWidgetDetachedContext; import net.modificationstation.stationapi.api.datafixer.DataFixers; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.nbt.NbtHelper; import net.modificationstation.stationapi.api.nbt.NbtOps; @@ -31,7 +31,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class EditWorldScreenImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } private static final String diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/datafixer/VanillaDataFixerImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/datafixer/VanillaDataFixerImpl.java index fe79277e6..647482e83 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/datafixer/VanillaDataFixerImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/datafixer/VanillaDataFixerImpl.java @@ -5,12 +5,12 @@ import com.mojang.datafixers.DataFixerBuilder; import com.mojang.datafixers.schemas.Schema; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.datafixer.DataFixers; import net.modificationstation.stationapi.api.datafixer.TypeReferences; import net.modificationstation.stationapi.api.event.datafixer.DataFixerRegisterEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.util.Util; import net.modificationstation.stationapi.api.vanillafix.datadamager.damage.StationFlatteningToMcRegionChunkDamage; @@ -34,7 +34,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaDataFixerImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } public static final String STATION_ID = NAMESPACE.id("id").toString(); diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/dimension/VanillaDimensionFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/dimension/VanillaDimensionFixImpl.java index 891b81175..1859aaded 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/dimension/VanillaDimensionFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/dimension/VanillaDimensionFixImpl.java @@ -1,7 +1,6 @@ package net.modificationstation.stationapi.impl.vanillafix.dimension; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.world.dimension.Dimension; import net.minecraft.world.dimension.NetherDimension; import net.minecraft.world.dimension.OverworldDimension; @@ -9,6 +8,7 @@ import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.DimensionRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.registry.DimensionContainer; import net.modificationstation.stationapi.api.util.Identifier; @@ -23,7 +23,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaDimensionFixImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @FunctionalInterface diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java index faf3e271f..f45ec0ddd 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/VanillaItemFixImpl.java @@ -1,10 +1,10 @@ package net.modificationstation.stationapi.impl.vanillafix.item; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.util.Namespace; @@ -17,7 +17,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaItemFixImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/recipe/VanillaFuelItemFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/recipe/VanillaFuelItemFixImpl.java index c756adb6a..7b09d1d72 100644 --- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/recipe/VanillaFuelItemFixImpl.java +++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/recipe/VanillaFuelItemFixImpl.java @@ -1,13 +1,13 @@ package net.modificationstation.stationapi.impl.vanillafix.recipe; import net.mine_diver.unsafeevents.listener.EventListener; -import net.mine_diver.unsafeevents.listener.Listener; import net.minecraft.block.Block; import net.minecraft.block.Material; import net.minecraft.item.Item; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.recipe.RecipeRegisterEvent; import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy; import net.modificationstation.stationapi.api.recipe.FuelRegistry; import net.modificationstation.stationapi.api.registry.tag.ItemTags; @@ -18,7 +18,7 @@ @EventListener(phase = StationAPI.INTERNAL_PHASE) public final class VanillaFuelItemFixImpl { static { - Listener.registerLookup(MethodHandles.lookup()); + EntrypointManager.registerLookup(MethodHandles.lookup()); } @EventListener From 622c50ed811ac06dd0f1d5d1712e9a5a271054f6 Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Sun, 9 Feb 2025 19:25:14 +0500 Subject: [PATCH 09/27] Fix a NPE in shears override --- .../stationapi/impl/item/HijackShearsImplV1.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java index 42982cdad..81ccf0a40 100644 --- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java +++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java @@ -1,5 +1,6 @@ package net.modificationstation.stationapi.impl.item; +import lombok.val; import net.mine_diver.unsafeevents.listener.EventListener; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.item.tool.StationTool; @@ -17,7 +18,10 @@ public class HijackShearsImplV1 { //TODO: Make this match anything that has shear tool properties. Not sure how to go around this at the moment. @EventListener private static void hijackShearsEvent(ShearsOverrideEvent event) { - if(!event.overrideShears && event.itemStack.getItem() instanceof StationTool) - event.overrideShears = ((StationTool) event.itemStack.getItem()).getEffectiveBlocks(event.itemStack).id().equals(Identifier.of("mineable/shears")); + if (!event.overrideShears && event.itemStack.getItem() instanceof StationTool tool) { + val effectiveBlocks = tool.getEffectiveBlocks(event.itemStack); + if (effectiveBlocks != null) + event.overrideShears = effectiveBlocks.id().equals(Identifier.of("mineable/shears")); + } } } From 82dff33d5760a5dc681f420e84b36f24b45d1eed Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Sun, 9 Feb 2025 19:46:03 +0500 Subject: [PATCH 10/27] Fix a NPE in FuelRegistry --- .../stationapi/api/recipe/FuelRegistry.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/recipe/FuelRegistry.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/recipe/FuelRegistry.java index c778c77fa..6aa83f079 100644 --- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/recipe/FuelRegistry.java +++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/recipe/FuelRegistry.java @@ -1,7 +1,9 @@ package net.modificationstation.stationapi.api.recipe; -import it.unimi.dsi.fastutil.ints.*; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.*; +import lombok.val; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.modificationstation.stationapi.api.registry.ItemRegistry; @@ -34,13 +36,18 @@ public static int getFuelTime(ItemStack stack) { if (foundKey.isPresent()) return foundKey.getAsInt(); - // Then check if the item has a specific entry - int fuelTime = ITEM_FUEL_TIME.get(stack.getItem()).getOrDefault(stack.getDamage(), 0); + // Then check if the item has an entry + val metaToFuel = ITEM_FUEL_TIME.get(stack.getItem()); + if (metaToFuel == null) + return 0; + + // And then check if there's a meta-specific entry + int fuelTime = metaToFuel.get(stack.getDamage()); if (fuelTime != 0) return fuelTime; // Finally check if there's a wildcard - return ITEM_FUEL_TIME.get(stack.getItem()).getOrDefault(-1, 0); + return metaToFuel.get(-1); } @API From 1fe0abbd6e349430d6433f689c1492bb5d9f8756 Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Mon, 10 Feb 2025 21:20:17 +0500 Subject: [PATCH 11/27] Added StationFlatteningBlock#onStateReplaced --- .../stationapi/api/block/AbstractBlockState.java | 5 +++++ .../stationapi/api/block/StationFlatteningBlock.java | 4 ++++ .../stationapi/impl/world/chunk/FlattenedChunk.java | 6 ++++-- .../stationapi/mixin/flattening/BlockMixin.java | 9 +++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/AbstractBlockState.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/AbstractBlockState.java index 2e2a1d7cb..8046c71ea 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/AbstractBlockState.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/AbstractBlockState.java @@ -10,6 +10,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; +import net.minecraft.world.World; import net.modificationstation.stationapi.api.item.ItemPlacementContext; import net.modificationstation.stationapi.api.registry.RegistryEntryList; import net.modificationstation.stationapi.api.state.State; @@ -75,6 +76,10 @@ public boolean isOpaque() { return this.opaque; } + public void onStateReplaced(World world, BlockPos pos, BlockState state) { + this.getBlock().onStateReplaced(this.asBlockState(), world, pos, state); + } + public boolean canReplace(ItemPlacementContext context) { return this.getBlock().canReplace(this.asBlockState(), context); } diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/StationFlatteningBlock.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/StationFlatteningBlock.java index 01d6804ca..17034e239 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/StationFlatteningBlock.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/block/StationFlatteningBlock.java @@ -108,4 +108,8 @@ default void onBlockPlaced(World world, int x, int y, int z, BlockState replaced default Block setLuminance(ToIntFunction provider) { return Util.assertImpl(); } + + default void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState) { + Util.assertImpl(); + } } diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/chunk/FlattenedChunk.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/chunk/FlattenedChunk.java index 4665b878c..c62ad1a03 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/chunk/FlattenedChunk.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/chunk/FlattenedChunk.java @@ -17,12 +17,14 @@ import net.modificationstation.stationapi.api.event.block.BlockEvent; import net.modificationstation.stationapi.api.event.world.BlockSetEvent; import net.modificationstation.stationapi.api.event.world.MetaSetEvent; +import net.modificationstation.stationapi.api.util.math.MutableBlockPos; import net.modificationstation.stationapi.mixin.flattening.ChunkAccessor; import java.util.ArrayList; import java.util.List; public class FlattenedChunk extends Chunk { + private static final ThreadLocal CACHED_BLOCK_POS = ThreadLocal.withInitial(MutableBlockPos::new); public final ChunkSection[] sections; public final short firstBlock; @@ -389,7 +391,7 @@ public BlockState setBlockStateWithMetadata(int x, int y, int z, BlockState stat ) return null; section.setBlockState(x, y & 15, z, state); if (!world.isRemote) - oldBlock.onBreak(this.world, worldX, y, worldZ); + oldState.onStateReplaced(world, CACHED_BLOCK_POS.get().set(worldX, y, worldZ), state); section.setMeta(x, y & 15, z, meta); if (!this.world.dimension.field_2177) { @@ -440,7 +442,7 @@ public BlockState setBlockState(int x, int y, int z, BlockState state) { ).isCanceled() ) return null; section.setBlockState(x, y & 15, z, state); - oldBlock.onBreak(this.world, worldX, y, worldZ); + oldState.onStateReplaced(world, CACHED_BLOCK_POS.get().set(worldX, y, worldZ), state); section.setMeta(x, y & 15, z, 0); if (Block.BLOCKS_LIGHT_OPACITY[state.getBlock().id] != 0) { if (y >= topY) diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BlockMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BlockMixin.java index bb8ebebce..521c49bfa 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BlockMixin.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BlockMixin.java @@ -76,6 +76,8 @@ abstract class BlockMixin implements StationFlatteningBlock, StationFlatteningBl @Mutable @Shadow @Final public int id; + @Shadow public abstract void onBreak(World world, int x, int y, int z); + @Unique private RegistryEntry.Reference stationapi_registryEntry; @@ -370,4 +372,11 @@ private void stationapi_temporalStatFix(World world, PlayerEntity player, int x, this.dropStacks(world, x, y, z, meta); info.cancel(); } + + @Override + @Unique + public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState) { + if (!newState.isOf((Block) (Object) this)) + onBreak(world, pos.x, pos.y, pos.z); + } } From 10d73c3251e112ec33c1f8db0b12fbff3a7d25af Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Mon, 10 Feb 2025 23:31:01 +0500 Subject: [PATCH 12/27] Fixed #159 --- .../mixin/flattening/BucketItemMixin.java | 29 +++++++++++ .../station-flattening-v0.mixins.json | 1 + .../registry/sync/trackers/IdListTracker.java | 49 +++++++++++++++++++ .../api/client/color/block/BlockColors.java | 5 ++ .../api/client/color/item/ItemColors.java | 5 ++ 5 files changed, 89 insertions(+) create mode 100644 station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BucketItemMixin.java create mode 100644 station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IdListTracker.java diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BucketItemMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BucketItemMixin.java new file mode 100644 index 000000000..579fba6ea --- /dev/null +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BucketItemMixin.java @@ -0,0 +1,29 @@ +package net.modificationstation.stationapi.mixin.flattening; + +import net.mine_diver.unsafeevents.listener.Listener; +import net.minecraft.block.Block; +import net.minecraft.item.BucketItem; +import net.modificationstation.stationapi.api.StationAPI; +import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent; +import net.modificationstation.stationapi.api.registry.BlockRegistry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(BucketItem.class) +class BucketItemMixin { + @Shadow private int field_842; + + @Inject( + method = "", + at = @At("RETURN") + ) + private void stationapi_registerCallback(int i, int par2, CallbackInfo ci) { + BlockRegistry.INSTANCE.getEventBus().register(Listener.>simple() + .listener(event -> field_842 = event.state.getRawIdChangeMap().getOrDefault(field_842, field_842)) + .phase(StationAPI.INTERNAL_PHASE) + .build()); + } +} diff --git a/station-flattening-v0/src/main/resources/station-flattening-v0.mixins.json b/station-flattening-v0/src/main/resources/station-flattening-v0.mixins.json index 8e650b7ba..f023595c5 100644 --- a/station-flattening-v0/src/main/resources/station-flattening-v0.mixins.json +++ b/station-flattening-v0/src/main/resources/station-flattening-v0.mixins.json @@ -7,6 +7,7 @@ "BlockItemMixin", "BlockMixin", "BlockWithEntityMixin", + "BucketItemMixin", "CaveGenBaseMixin", "CaveGenMixin", "ChunkAccessor", diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IdListTracker.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IdListTracker.java new file mode 100644 index 000000000..7077cc73e --- /dev/null +++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/sync/trackers/IdListTracker.java @@ -0,0 +1,49 @@ +package net.modificationstation.stationapi.api.registry.sync.trackers; + +import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; +import net.mine_diver.unsafeevents.listener.EventListener; +import net.mine_diver.unsafeevents.listener.Listener; +import net.modificationstation.stationapi.api.StationAPI; +import net.modificationstation.stationapi.api.event.registry.RegistryEntryAddedEvent; +import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent; +import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; +import net.modificationstation.stationapi.api.registry.ListenableRegistry; +import net.modificationstation.stationapi.api.registry.Registry; +import net.modificationstation.stationapi.api.util.Identifier; +import net.modificationstation.stationapi.api.util.collection.IdList; + +import java.lang.invoke.MethodHandles; + +@EventListener(phase = StationAPI.INTERNAL_PHASE) +public final class IdListTracker { + static { + EntrypointManager.registerLookup(MethodHandles.lookup()); + } + + private final String name; + private final IdList mappers; + private final Reference2ReferenceMap removedMapperCache = new Reference2ReferenceOpenHashMap<>(); + + private IdListTracker(String name, IdList mappers) { + this.name = name; + this.mappers = mappers; + } + + public static & ListenableRegistry> void register(R registry, String name, IdList mappers) { + IdListTracker tracker = new IdListTracker<>(name, mappers); + registry.getEventBus().register(Listener.object() + .listener(tracker) + .build()); + } + + @EventListener + private void onEntryAdded(RegistryEntryAddedEvent event) { + if (removedMapperCache.containsKey(event.id)) mappers.set(removedMapperCache.get(event.id), event.rawId); + } + + @EventListener + private void onRemap(RegistryIdRemapEvent event) { + mappers.remapIds(event.state.getRawIdChangeMap()); + } +} \ No newline at end of file diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/color/block/BlockColors.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/color/block/BlockColors.java index e61df504d..f5b0785b4 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/color/block/BlockColors.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/color/block/BlockColors.java @@ -11,6 +11,7 @@ import net.modificationstation.stationapi.api.block.BlockState; import net.modificationstation.stationapi.api.client.event.color.block.BlockColorsRegisterEvent; import net.modificationstation.stationapi.api.registry.BlockRegistry; +import net.modificationstation.stationapi.api.registry.sync.trackers.IdListTracker; import net.modificationstation.stationapi.api.state.property.Property; import net.modificationstation.stationapi.api.util.collection.IdList; import org.jetbrains.annotations.Nullable; @@ -30,6 +31,10 @@ public static BlockColors create() { return blockColors; } + public BlockColors() { + IdListTracker.register(BlockRegistry.INSTANCE, "BlockColors.providers", providers); + } + public int getColor(BlockState state, BlockView world, BlockPos pos) { BlockColorProvider blockColorProvider = this.providers.get(BlockRegistry.INSTANCE.getRawId(state.getBlock())); if (blockColorProvider != null) { diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/color/item/ItemColors.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/color/item/ItemColors.java index ab7b4a29c..06c463760 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/color/item/ItemColors.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/color/item/ItemColors.java @@ -8,6 +8,7 @@ import net.modificationstation.stationapi.api.client.event.color.item.ItemColorsRegisterEvent; import net.modificationstation.stationapi.api.item.ItemConvertible; import net.modificationstation.stationapi.api.registry.ItemRegistry; +import net.modificationstation.stationapi.api.registry.sync.trackers.IdListTracker; import net.modificationstation.stationapi.api.util.collection.IdList; @Environment(value=EnvType.CLIENT) @@ -26,6 +27,10 @@ public static ItemColors create(BlockColors blockColors) { return itemColors; } + public ItemColors() { + IdListTracker.register(ItemRegistry.INSTANCE, "ItemColors.providers", providers); + } + public int getColor(ItemStack item, int tintIndex) { ItemColorProvider itemColorProvider = this.providers.get(ItemRegistry.INSTANCE.getRawId(item.getItem())); return itemColorProvider == null ? -1 : itemColorProvider.getColor(item, tintIndex); From eeb31eb36a7c92071d318666415e8e027f4f9044 Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Mon, 10 Feb 2025 23:50:03 +0500 Subject: [PATCH 13/27] Change version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4ed8af834..c96b861c6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ fabric.loom.multiProjectOptimisation=true spasm_version = 0.2.2 # Mod Properties - mod_version = 2.0.0-alpha.3 + mod_version = 2.0.0-alpha.4 maven_group = net.modificationstation archives_base_name = StationAPI From 2d3c03704f1cacf8dc1707dcb45b858292d2a127 Mon Sep 17 00:00:00 2001 From: Nico Mexis Date: Tue, 25 Feb 2025 10:31:31 +0100 Subject: [PATCH 14/27] Merge pull request #165 from ThexXTURBOXx/develop Don't close filesystems when resolving mod namespaces --- .../modificationstation/stationapi/api/util/Namespace.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java index a8dfb178d..28fbdc7b6 100644 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java @@ -13,6 +13,7 @@ import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.Version; import net.fabricmc.loader.api.metadata.ModMetadata; +import net.fabricmc.loader.impl.util.FileSystemUtil; import net.modificationstation.stationapi.api.util.exception.MissingModException; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -25,7 +26,6 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; -import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -77,7 +77,9 @@ public final class Namespace implements Comparable<@NotNull Namespace> { // i'm so sorry if (Files.isRegularFile(callerPath)) { // regular case final URI callerRoot; - try (val fs = FileSystems.newFileSystem(callerPath)) { + try { + // do NOT close - the same FileSystem may be used by Fabric Loader! + val fs = FileSystemUtil.getJarFileSystem(callerPath, false).get(); callerRoot = fs.getPath("/").toUri(); } catch (IOException e) { throw new RuntimeException(e); From 746d5deb28b560ecde13a4bd798344a910dc11c4 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Thu, 20 Mar 2025 15:50:01 +0000 Subject: [PATCH 15/27] Update modmenu --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c96b861c6..9fd09defc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,5 +27,5 @@ fabric.loom.multiProjectOptimisation=true archives_base_name = StationAPI # Test properties - modmenu_version = 1.8.5-beta.9 + modmenu_version = 1.8.5-beta.11 rc_version = 0.5.4 \ No newline at end of file From c10cd34238b96561e234d80600849f63a1016473 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Sat, 17 May 2025 08:05:22 +0100 Subject: [PATCH 16/27] Merge pull request #168 * Yeet * Wait this is wrong * Merge branch 'develop' into namespace-change --- .../stationapi/api/util/Namespace.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java index 28fbdc7b6..b1fc1d339 100644 --- a/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java +++ b/station-api-base/src/main/java/net/modificationstation/stationapi/api/util/Namespace.java @@ -13,7 +13,6 @@ import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.Version; import net.fabricmc.loader.api.metadata.ModMetadata; -import net.fabricmc.loader.impl.util.FileSystemUtil; import net.modificationstation.stationapi.api.util.exception.MissingModException; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -26,16 +25,18 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; +import java.nio.file.*; +import java.util.Collections; +import java.util.Map; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Stream; +import java.util.zip.ZipError; @Slf4j public final class Namespace implements Comparable<@NotNull Namespace> { private static final boolean CHECK_MISSING_MODS = false; + private static final Map CREATE_FILESYSTEM_ARGS = Collections.singletonMap("create", "true"); @NotNull private static final Cache<@NotNull String, @NotNull Namespace> CACHE = Caffeine.newBuilder().softValues().build(); @@ -77,11 +78,24 @@ public final class Namespace implements Comparable<@NotNull Namespace> { // i'm so sorry if (Files.isRegularFile(callerPath)) { // regular case final URI callerRoot; + val uri = callerPath.toUri(); try { - // do NOT close - the same FileSystem may be used by Fabric Loader! - val fs = FileSystemUtil.getJarFileSystem(callerPath, false).get(); + FileSystem fs; + boolean created = false; + val jarUri = new URI("jar:" + uri.getScheme(), uri.getHost(), uri.getPath(), uri.getFragment()); + try { + fs = FileSystems.newFileSystem(jarUri, CREATE_FILESYSTEM_ARGS); + created = true; + } catch (FileSystemAlreadyExistsException ignore2) { + fs = FileSystems.getFileSystem(jarUri); + } catch (IOException | ZipError e) { + throw new IOException("Error accessing " + uri + ": " + e, e); + } callerRoot = fs.getPath("/").toUri(); - } catch (IOException e) { + if (created) { + fs.close(); + } + } catch (IOException | URISyntaxException e) { throw new RuntimeException(e); } candidates = mods From effa191eebf7d65848e2b442f1f4ec76eab5087b Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Sat, 17 May 2025 08:07:14 +0100 Subject: [PATCH 17/27] Make stapi get angree (#169) --- .../stationapi/mixin/flattening/CaveGenBaseMixin.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/CaveGenBaseMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/CaveGenBaseMixin.java index 995e6f6ed..7af267dce 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/CaveGenBaseMixin.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/CaveGenBaseMixin.java @@ -20,6 +20,9 @@ public void stationapi_setWorld(World world) { @Override @Unique public World stationapi_getWorld() { + if (stationapi_world == null) { + throw new RuntimeException("stationapi_world is null, use CaveGenBaseImpl.stationapi_setWorld in your custom ChunkSource constructor to fix."); + } return stationapi_world; } } From a7c56335acc71812cdd9fa95b152a5c315288828 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Mon, 19 May 2025 16:19:30 +0100 Subject: [PATCH 18/27] Update BiomeMixin.java (#196) --- .../stationapi/mixin/worldgen/BiomeMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/mixin/worldgen/BiomeMixin.java b/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/mixin/worldgen/BiomeMixin.java index a732a4b37..2a873d112 100644 --- a/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/mixin/worldgen/BiomeMixin.java +++ b/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/mixin/worldgen/BiomeMixin.java @@ -136,7 +136,7 @@ public List getFeatures() { @Override public void setNoDimensionFeatures(boolean noDimensionFeatures) { - this.noDimensionFeatures = false; + this.noDimensionFeatures = noDimensionFeatures; } @Override From 5c048d220f1775436951dff7c37626cefd039095 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Sun, 1 Jun 2025 15:40:30 +0100 Subject: [PATCH 19/27] Add Block Support to CustomTooltipProvider (#187) * Add Block support to CustomTooltipProvider * Add some documentation to the interface --- .../stationapi/api/client/TooltipHelper.java | 11 ++++++++++- .../api/client/item/CustomTooltipProvider.java | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/TooltipHelper.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/TooltipHelper.java index ac23c182c..951d0f716 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/TooltipHelper.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/TooltipHelper.java @@ -2,6 +2,7 @@ import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.client.event.gui.screen.container.TooltipBuildEvent; @@ -16,8 +17,16 @@ public class TooltipHelper { */ public static ArrayList getTooltipForItemStack(String originalTooltip, ItemStack itemStack, PlayerInventory playerInventory, HandledScreen container) { ArrayList newTooltip; + CustomTooltipProvider provider = null; - if (itemStack.getItem() instanceof CustomTooltipProvider provider) { + if (itemStack.getItem() instanceof CustomTooltipProvider itemProvider) { + provider = itemProvider; + } + else if (itemStack.getItem() instanceof BlockItem blockItem && blockItem.getBlock() instanceof CustomTooltipProvider blockProvider) { + provider = blockProvider; + } + + if (provider != null) { newTooltip = new ArrayList<>(Arrays.asList(provider.getTooltip(itemStack, originalTooltip))); } else { diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/item/CustomTooltipProvider.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/item/CustomTooltipProvider.java index 5f74e43a2..9bc1c495e 100644 --- a/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/item/CustomTooltipProvider.java +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/item/CustomTooltipProvider.java @@ -1,7 +1,16 @@ package net.modificationstation.stationapi.api.client.item; import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.NotNull; +/** + * Can be implemented on Items, BlockItems and Blocks. + * BlockItems take precedence over Blocks if both have this implemented. + */ public interface CustomTooltipProvider { - String[] getTooltip(ItemStack stack, String originalTooltip); + + /** + * @return An array of Strings, each new array entry is a new line. Supports formatting codes. + */ + @NotNull String[] getTooltip(ItemStack stack, String originalTooltip); } From 866b19be34e5eee7c706a7e0f7c8405689d6a40f Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Sun, 1 Jun 2025 15:41:21 +0100 Subject: [PATCH 20/27] Make Leaves' Log Check Work With Modded Logs and Leaves (#186) * Fix * And comment this out cause it's ugly --- .../sltest/block/Blocks.java | 6 +++- .../sltest/level/gen/ChunkListener.java | 7 +++++ .../api/registry/tag/BlockTags.java | 1 + .../mixin/block/LeavesBlockMixin.java | 28 +++++++++++++++++++ .../resources/station-blocks-v0.mixins.json | 1 + 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 station-blocks-v0/src/main/java/net/modificationstation/stationapi/mixin/block/LeavesBlockMixin.java diff --git a/src/test/java/net/modificationstation/sltest/block/Blocks.java b/src/test/java/net/modificationstation/sltest/block/Blocks.java index 882fd7902..3c2929a01 100644 --- a/src/test/java/net/modificationstation/sltest/block/Blocks.java +++ b/src/test/java/net/modificationstation/sltest/block/Blocks.java @@ -7,6 +7,8 @@ import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent; import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager; import net.modificationstation.stationapi.api.template.block.TemplateBlock; +import net.modificationstation.stationapi.api.template.block.TemplateLeavesBlock; +import net.modificationstation.stationapi.api.template.block.TemplateLogBlock; import net.modificationstation.stationapi.api.util.Identifier; import java.lang.invoke.MethodHandles; @@ -25,7 +27,9 @@ public enum Blocks { ALTAR("altar", "altar", id -> new BlockAltar(id, Material.STONE).setHardness(3)), VARIATION_BLOCK("variation_block", "variationBlock", id -> new VariationBlock(id, Material.STONE).setHardness(.5F).setSoundGroup(Block.DEFAULT_SOUND_GROUP).disableAutoItemRegistration()), EMISSION_CHECKER("emission_checker", "emissionChecker", LampBlock::new), - INDISPENSABLE_BLOCK("indispensable_block", "indispensableBlock", IndispensableBlock::new); + INDISPENSABLE_BLOCK("indispensable_block", "indispensableBlock", IndispensableBlock::new), + MODDED_LEAVES("modded_leaves", "moddedLeaves", id -> new TemplateLeavesBlock(id, 52)), + MODDED_LOG("modded_log", "moddedLog", TemplateLogBlock::new); private final Runnable register; private Block block; diff --git a/src/test/java/net/modificationstation/sltest/level/gen/ChunkListener.java b/src/test/java/net/modificationstation/sltest/level/gen/ChunkListener.java index f636ae32a..a344ea74c 100644 --- a/src/test/java/net/modificationstation/sltest/level/gen/ChunkListener.java +++ b/src/test/java/net/modificationstation/sltest/level/gen/ChunkListener.java @@ -1,6 +1,8 @@ package net.modificationstation.sltest.level.gen; import net.mine_diver.unsafeevents.listener.EventListener; +import net.minecraft.block.Block; +import net.modificationstation.sltest.block.Blocks; import net.modificationstation.stationapi.api.event.world.gen.WorldGenEvent; public class ChunkListener { @@ -11,5 +13,10 @@ public void populate(WorldGenEvent.ChunkDecoration event) { // for (int z = 0; z < 16; z++) // if ((event.biome == Biome.FOREST || event.biome == Biome.SEASONAL_FOREST) && event.random.nextBoolean()) // event.level.setTile(event.x + x, 90, event.z + z, BlockBase.DIAMOND_BLOCK.id); + // Modded leaves and log test + event.world.setBlock(event.x, 100, event.z, Blocks.MODDED_LOG.get().id); +// event.world.setBlock(event.x + 1, 100, event.z, Block.LEAVES.id); +// event.world.setBlock(event.x + 2, 100, event.z, Blocks.MODDED_LEAVES.get().id); +// event.world.setBlock(event.x + 3, 100, event.z, Block.LEAVES.id); } } diff --git a/station-blocks-v0/src/main/java/net/modificationstation/stationapi/api/registry/tag/BlockTags.java b/station-blocks-v0/src/main/java/net/modificationstation/stationapi/api/registry/tag/BlockTags.java index 19722b49c..e0169befa 100644 --- a/station-blocks-v0/src/main/java/net/modificationstation/stationapi/api/registry/tag/BlockTags.java +++ b/station-blocks-v0/src/main/java/net/modificationstation/stationapi/api/registry/tag/BlockTags.java @@ -11,6 +11,7 @@ public final class BlockTags { public static final TagKey LOGS = of("logs"), + LEAVES = of("leaves"), PLANKS = of("planks"), INFINIBURN = of("infiniburn"); diff --git a/station-blocks-v0/src/main/java/net/modificationstation/stationapi/mixin/block/LeavesBlockMixin.java b/station-blocks-v0/src/main/java/net/modificationstation/stationapi/mixin/block/LeavesBlockMixin.java new file mode 100644 index 000000000..cc5bbf2ff --- /dev/null +++ b/station-blocks-v0/src/main/java/net/modificationstation/stationapi/mixin/block/LeavesBlockMixin.java @@ -0,0 +1,28 @@ +package net.modificationstation.stationapi.mixin.block; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.block.Block; +import net.minecraft.block.LeavesBlock; +import net.minecraft.world.World; +import net.modificationstation.stationapi.api.block.BlockState; +import net.modificationstation.stationapi.api.registry.tag.BlockTags; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(LeavesBlock.class) +public class LeavesBlockMixin { + + @WrapOperation(method = "onTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getBlockId(III)I")) + private int makeModdedLogsAndLeavesWork(World instance, int x, int y, int z, Operation original) { + BlockState state = instance.getBlockState(x, y, z); + if (state.isIn(BlockTags.LOGS)) { + return Block.LOG.id; + } + if (state.isIn(BlockTags.LEAVES)) { + return Block.LEAVES.id; + } + + return original.call(instance, x, y, z); + } +} diff --git a/station-blocks-v0/src/main/resources/station-blocks-v0.mixins.json b/station-blocks-v0/src/main/resources/station-blocks-v0.mixins.json index 018fece12..109b74423 100644 --- a/station-blocks-v0/src/main/resources/station-blocks-v0.mixins.json +++ b/station-blocks-v0/src/main/resources/station-blocks-v0.mixins.json @@ -7,6 +7,7 @@ "BlockItemMixin", "BlockMixin", "FireBlockMixin", + "LeavesBlockMixin", "SecondaryBlockItemMixin", "StatsMixin" ], From 466818fc5c35dc0291b8fa6cab9ad70aacd67bd6 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Sun, 1 Jun 2025 15:41:30 +0100 Subject: [PATCH 21/27] Fix (#185) --- .../impl/world/StationClientWorld.java | 5 +++++ .../flattening/client/ClientWorldMixin.java | 17 ++++++++++++++++- .../client/MultiplayerChunkCacheMixin.java | 4 ++-- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/StationClientWorld.java diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/StationClientWorld.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/StationClientWorld.java new file mode 100644 index 000000000..e172fcc99 --- /dev/null +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/StationClientWorld.java @@ -0,0 +1,5 @@ +package net.modificationstation.stationapi.impl.world; + +public interface StationClientWorld { + boolean stationAPI$isModded(); +} diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/ClientWorldMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/ClientWorldMixin.java index de7741532..ebf3952fa 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/ClientWorldMixin.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/ClientWorldMixin.java @@ -2,11 +2,14 @@ import net.minecraft.block.Block; import net.minecraft.class_454; +import net.minecraft.client.network.ClientNetworkHandler; import net.minecraft.world.World; import net.minecraft.world.dimension.Dimension; import net.minecraft.world.dimension.DimensionData; import net.modificationstation.stationapi.api.block.BlockState; +import net.modificationstation.stationapi.api.network.ModdedPacketHandler; import net.modificationstation.stationapi.impl.client.world.ClientBlockChange; +import net.modificationstation.stationapi.impl.world.StationClientWorld; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -17,13 +20,25 @@ import java.util.LinkedList; @Mixin(class_454.class) -abstract class ClientWorldMixin extends World { +abstract class ClientWorldMixin extends World implements StationClientWorld { + @Unique boolean isModded = false; + @Shadow private LinkedList field_1722; private ClientWorldMixin(DimensionData arg, String string, Dimension arg2, long l) { super(arg, string, arg2, l); } + @Inject(method = "", at = @At("RETURN")) + void mpCrashWorkaround(ClientNetworkHandler handler, long l, int i, CallbackInfo ci) { + isModded = ((ModdedPacketHandler) handler).isModded(); + } + + @Override + public boolean stationAPI$isModded() { + return isModded; + } + @ModifyConstant(method = "method_1494(IIZ)V", constant = @Constant(intValue = 0)) private int stationapi_changeMinHeight(int value) { return getBottomY(); diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/MultiplayerChunkCacheMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/MultiplayerChunkCacheMixin.java index d4501fa00..892bebd0f 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/MultiplayerChunkCacheMixin.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/MultiplayerChunkCacheMixin.java @@ -7,6 +7,7 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.modificationstation.stationapi.api.network.ModdedPacketHandler; +import net.modificationstation.stationapi.impl.world.StationClientWorld; import net.modificationstation.stationapi.impl.world.chunk.FlattenedChunk; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -28,8 +29,7 @@ class MultiplayerChunkCacheMixin { cancellable = true ) public void stationapi_loadChunk(int i, int j, CallbackInfoReturnable cir) { - //noinspection deprecation - if (!((ModdedPacketHandler) ((Minecraft) FabricLoader.getInstance().getGameInstance()).getNetworkHandler()).isModded()) + if (!((StationClientWorld) field_2555).stationAPI$isModded()) return; ChunkPos vec2i = new ChunkPos(i, j); FlattenedChunk chunk = new FlattenedChunk(this.field_2555, i, j); From 5f05015fba5bb5c5e827fdbf27baded6f3af76e4 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Tue, 17 Jun 2025 11:30:24 +0100 Subject: [PATCH 22/27] FUCK (#200) --- .../stationapi/impl/server/network/ServerVanillaChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java index 6720fea60..cea80072b 100644 --- a/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java +++ b/station-vanilla-checker-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/ServerVanillaChecker.java @@ -35,7 +35,7 @@ public class ServerVanillaChecker { private static void onPlayerLogin(PlayerAttemptLoginEvent event) { if ((event.loginHelloPacket.worldSeed & MASK) == MASK) { Map mods = new HashMap<>(); - FabricLoader.getInstance().getAllMods().forEach(modContainer -> mods.put(modContainer.getMetadata().getName(), modContainer.getMetadata().getVersion().getFriendlyString())); + FabricLoader.getInstance().getAllMods().forEach(modContainer -> mods.put(modContainer.getMetadata().getId(), modContainer.getMetadata().getVersion().getFriendlyString())); ((ModdedPacketHandlerSetter) event.serverLoginNetworkHandler).setModded(mods); } else if (!CLIENT_REQUIRED_MODS.isEmpty()) { From 6dd8364c1efe8aff70f825680a719ff8a434dba8 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Tue, 17 Jun 2025 11:59:43 +0100 Subject: [PATCH 23/27] Why mine (#197) --- .../stationapi/api/util/math/Direction.java | 2 +- .../stationapi/api/util/math/Vec3f.java | 2 +- .../util/math/{Vector4f.java => Vec4f.java} | 12 +++++----- .../stationapi/api/util/math/Vector2f.java | 23 ------------------- .../client/render/model/BakedQuadFactory.java | 6 ++--- .../client/render/StationTessellatorImpl.java | 4 ++-- 6 files changed, 13 insertions(+), 36 deletions(-) rename station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/{Vector4f.java => Vec4f.java} (93%) delete mode 100644 station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vector2f.java diff --git a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Direction.java b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Direction.java index a88c0aab5..3846a6585 100644 --- a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Direction.java +++ b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Direction.java @@ -93,7 +93,7 @@ private static Direction[] listClosest(Direction first, Direction second, Direct public static Direction transform(Matrix4f matrix, Direction direction) { Vec3i vec3i = direction.getVector(); - Vector4f vector4f = new Vector4f(vec3i.getX(), vec3i.getY(), vec3i.getZ(), 0.0f); + Vec4f vector4f = new Vec4f(vec3i.getX(), vec3i.getY(), vec3i.getZ(), 0.0f); vector4f.transform(matrix); return Direction.getFacing(vector4f.getX(), vector4f.getY(), vector4f.getZ()); } diff --git a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vec3f.java b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vec3f.java index fc75d2ac6..d590082f5 100644 --- a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vec3f.java +++ b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vec3f.java @@ -23,7 +23,7 @@ public Vec3f(float x, float y, float z) { this.z = z; } - public Vec3f(Vector4f vec) { + public Vec3f(Vec4f vec) { this(vec.getX(), vec.getY(), vec.getZ()); } diff --git a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vector4f.java b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vec4f.java similarity index 93% rename from station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vector4f.java rename to station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vec4f.java index e6a51b124..60407584d 100644 --- a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vector4f.java +++ b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vec4f.java @@ -1,21 +1,21 @@ package net.modificationstation.stationapi.api.util.math; -public class Vector4f { +public class Vec4f { private float x; private float y; private float z; private float w; - public Vector4f() {} + public Vec4f() {} - public Vector4f(float x, float y, float z, float w) { + public Vec4f(float x, float y, float z, float w) { this.x = x; this.y = y; this.z = z; this.w = w; } - public Vector4f(Vec3f vector) { + public Vec4f(Vec3f vector) { this(vector.getX(), vector.getY(), vector.getZ(), 1.0F); } @@ -23,7 +23,7 @@ public boolean equals(Object o) { if (this == o) { return true; } else if (o != null && this.getClass() == o.getClass()) { - Vector4f vector4f = (Vector4f)o; + Vec4f vector4f = (Vec4f)o; if (Float.compare(vector4f.x, this.x) != 0) { return false; } else if (Float.compare(vector4f.y, this.y) != 0) { @@ -75,7 +75,7 @@ public void set(float x, float y, float z, float w) { this.w = w; } - public float dotProduct(Vector4f other) { + public float dotProduct(Vec4f other) { return this.x * other.x + this.y * other.y + this.z * other.z + this.w * other.w; } diff --git a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vector2f.java b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vector2f.java deleted file mode 100644 index 0afe79ebd..000000000 --- a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Vector2f.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.modificationstation.stationapi.api.util.math; - -public class Vector2f { - public static final Vector2f ZERO = new Vector2f(0.0F, 0.0F); - public static final Vector2f SOUTH_EAST_UNIT = new Vector2f(1.0F, 1.0F); - public static final Vector2f EAST_UNIT = new Vector2f(1.0F, 0.0F); - public static final Vector2f WEST_UNIT = new Vector2f(-1.0F, 0.0F); - public static final Vector2f SOUTH_UNIT = new Vector2f(0.0F, 1.0F); - public static final Vector2f NORTH_UNIT = new Vector2f(0.0F, -1.0F); - public static final Vector2f MAX_SOUTH_EAST = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE); - public static final Vector2f MIN_SOUTH_EAST = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE); - public final float x; - public final float y; - - public Vector2f(float x, float y) { - this.x = x; - this.y = y; - } - - public boolean equals(Vector2f other) { - return this.x == other.x && this.y == other.y; - } -} diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/BakedQuadFactory.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/BakedQuadFactory.java index 146337c3e..ce7d42962 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/BakedQuadFactory.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/BakedQuadFactory.java @@ -45,13 +45,13 @@ public static ModelElementTexture uvLock(ModelElementTexture texture, Direction Matrix4f matrix4f = AffineTransformations.uvLock(rotation, orientation, () -> "Unable to resolve UVLock for model: " + modelId).getMatrix(); float f = texture.getU(texture.getDirectionIndex(0)); float g = texture.getV(texture.getDirectionIndex(0)); - Vector4f vector4f = new Vector4f(f / 16.0F, g / 16.0F, 0.0F, 1.0F); + Vec4f vector4f = new Vec4f(f / 16.0F, g / 16.0F, 0.0F, 1.0F); vector4f.transform(matrix4f); float h = 16.0F * vector4f.getX(); float i = 16.0F * vector4f.getY(); float j = texture.getU(texture.getDirectionIndex(2)); float k = texture.getV(texture.getDirectionIndex(2)); - Vector4f vector4f2 = new Vector4f(j / 16.0F, k / 16.0F, 0.0F, 1.0F); + Vec4f vector4f2 = new Vec4f(j / 16.0F, k / 16.0F, 0.0F, 1.0F); vector4f2.transform(matrix4f); float l = 16.0F * vector4f2.getX(); float m = 16.0F * vector4f2.getY(); @@ -166,7 +166,7 @@ public void transformVertex(Vec3f vertex, AffineTransformation transformation) { } private void transformVertex(Vec3f vertex, Vec3f origin, Matrix4f transformationMatrix, Vec3f scale) { - Vector4f vector4f = new Vector4f(vertex.getX() - origin.getX(), vertex.getY() - origin.getY(), vertex.getZ() - origin.getZ(), 1.0F); + Vec4f vector4f = new Vec4f(vertex.getX() - origin.getX(), vertex.getY() - origin.getY(), vertex.getZ() - origin.getZ(), 1.0F); vector4f.transform(transformationMatrix); vector4f.multiplyComponentwise(scale); vertex.set(vector4f.getX() + origin.getX(), vector4f.getY() + origin.getY(), vector4f.getZ() + origin.getZ()); diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/StationTessellatorImpl.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/StationTessellatorImpl.java index b4b9c75ee..b7ebc8567 100644 --- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/StationTessellatorImpl.java +++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/render/StationTessellatorImpl.java @@ -7,7 +7,7 @@ import net.modificationstation.stationapi.api.util.math.Direction; import net.modificationstation.stationapi.api.util.math.Matrix4f; import net.modificationstation.stationapi.api.util.math.Vec3f; -import net.modificationstation.stationapi.api.util.math.Vector4f; +import net.modificationstation.stationapi.api.util.math.Vec4f; import net.modificationstation.stationapi.mixin.render.client.TessellatorAccessor; import java.nio.ByteBuffer; @@ -20,7 +20,7 @@ public class StationTessellatorImpl implements StationTessellator { private final Tessellator self; private final TessellatorAccessor access; private final int[] fastVertexData = new int[32]; - private final Vector4f damageUV = new Vector4f(); + private final Vec4f damageUV = new Vec4f(); public StationTessellatorImpl(Tessellator tessellator) { self = tessellator; From 10ddd853be6384bc7f81240423da7c25049796d3 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Tue, 17 Jun 2025 12:10:07 +0100 Subject: [PATCH 24/27] Potentially make mine scream (#188) --- .../stationapi/impl/world/chunk/FlattenedChunk.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/chunk/FlattenedChunk.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/chunk/FlattenedChunk.java index c62ad1a03..0b28e0e3a 100644 --- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/chunk/FlattenedChunk.java +++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/world/chunk/FlattenedChunk.java @@ -11,6 +11,7 @@ import net.minecraft.world.LightType; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.dimension.Dimension; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.block.BlockState; import net.modificationstation.stationapi.api.block.States; @@ -144,7 +145,7 @@ public void setLight(LightType type, int x, int y, int z, int light) { @Override public int getLight(int x, int y, int z, int light) { ChunkSection section = getSection(y); - int lightLevel = section == null ? 15 : section.getLight(LightType.SKY, x, y & 15, z); + int lightLevel = section == null ? (world.dimension.field_2177 /* hasCeiling */ ? 0 : 15) : section.getLight(LightType.SKY, x, y & 15, z); if (lightLevel > 0) { field_953 = true; } From 8dd3a5c0e71b95fe7acbead18fb4aeebb2356e0b Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Tue, 17 Jun 2025 18:11:56 +0100 Subject: [PATCH 25/27] Implement onBonemealUse on Vanilla Crops (#170) * Yeet * Also do sapling, also fix multiplayer * Use the appropriate random --------- Co-authored-by: mineLdiver --- .../stationapi/mixin/item/CropBlockMixin.java | 22 ++++++++++++++++++ .../mixin/item/SaplingBlockMixin.java | 23 +++++++++++++++++++ .../resources/station-items-v0.mixins.json | 2 ++ 3 files changed, 47 insertions(+) create mode 100644 station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/CropBlockMixin.java create mode 100644 station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/SaplingBlockMixin.java diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/CropBlockMixin.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/CropBlockMixin.java new file mode 100644 index 000000000..2d02b8a9d --- /dev/null +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/CropBlockMixin.java @@ -0,0 +1,22 @@ +package net.modificationstation.stationapi.mixin.item; + +import net.minecraft.block.CropBlock; +import net.minecraft.world.World; +import net.modificationstation.stationapi.api.block.BlockState; +import net.modificationstation.stationapi.api.block.StationBlock; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(CropBlock.class) +public abstract class CropBlockMixin implements StationBlock { + + @Shadow public abstract void method_996(World world, int i, int j, int k); + + @Override + public boolean onBonemealUse(World world, int x, int y, int z, BlockState state) { + if (!world.isRemote) { + method_996(world, x, y, z); // Full grows crop. + } + return true; + } +} diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/SaplingBlockMixin.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/SaplingBlockMixin.java new file mode 100644 index 000000000..6ff61d71b --- /dev/null +++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/SaplingBlockMixin.java @@ -0,0 +1,23 @@ +package net.modificationstation.stationapi.mixin.item; + +import net.minecraft.block.SaplingBlock; +import net.minecraft.world.World; +import net.modificationstation.stationapi.api.block.BlockState; +import net.modificationstation.stationapi.api.block.StationBlock; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Random; + +@Mixin(SaplingBlock.class) +public abstract class SaplingBlockMixin implements StationBlock { + @Shadow public abstract void method_533(World world, int x, int y, int z, Random random); + + @Override + public boolean onBonemealUse(World world, int x, int y, int z, BlockState state) { + if (!world.isRemote) { + method_533(world, x, y, z, world.field_214); + } + return true; + } +} diff --git a/station-items-v0/src/main/resources/station-items-v0.mixins.json b/station-items-v0/src/main/resources/station-items-v0.mixins.json index 2fd54f374..a014b3d47 100644 --- a/station-items-v0/src/main/resources/station-items-v0.mixins.json +++ b/station-items-v0/src/main/resources/station-items-v0.mixins.json @@ -5,6 +5,7 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "BlockMixin", + "CropBlockMixin", "DyeItemMixin", "EntityAccessor", "EntityMixin", @@ -13,6 +14,7 @@ "ItemStackMixin", "PlayerEntityMixin", "PlayerInventoryMixin", + "SaplingBlockMixin", "ScreenHandlerMixin", "StatsMixin", "dispenser.block.DispenserBlockMixin", From abc361281d1422ec6084ba51f28e6539a3bb0a66 Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Thu, 19 Jun 2025 00:13:34 +0500 Subject: [PATCH 26/27] Fixed cal L moment (cascaded test worldgen) --- .../net/modificationstation/sltest/level/gen/ChunkListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/net/modificationstation/sltest/level/gen/ChunkListener.java b/src/test/java/net/modificationstation/sltest/level/gen/ChunkListener.java index a344ea74c..8d68171e9 100644 --- a/src/test/java/net/modificationstation/sltest/level/gen/ChunkListener.java +++ b/src/test/java/net/modificationstation/sltest/level/gen/ChunkListener.java @@ -14,7 +14,7 @@ public void populate(WorldGenEvent.ChunkDecoration event) { // if ((event.biome == Biome.FOREST || event.biome == Biome.SEASONAL_FOREST) && event.random.nextBoolean()) // event.level.setTile(event.x + x, 90, event.z + z, BlockBase.DIAMOND_BLOCK.id); // Modded leaves and log test - event.world.setBlock(event.x, 100, event.z, Blocks.MODDED_LOG.get().id); + event.world.setBlock(event.x + 8, 100, event.z + 8, Blocks.MODDED_LOG.get().id); // event.world.setBlock(event.x + 1, 100, event.z, Block.LEAVES.id); // event.world.setBlock(event.x + 2, 100, event.z, Blocks.MODDED_LEAVES.get().id); // event.world.setBlock(event.x + 3, 100, event.z, Block.LEAVES.id); From 02bb43aa2ee85d892a10b7e5d455b3f5a0868aee Mon Sep 17 00:00:00 2001 From: mineLdiver Date: Thu, 19 Jun 2025 00:17:55 +0500 Subject: [PATCH 27/27] Change version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 9fd09defc..b24d636d3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ fabric.loom.multiProjectOptimisation=true spasm_version = 0.2.2 # Mod Properties - mod_version = 2.0.0-alpha.4 + mod_version = 2.0.0-alpha.4.1 maven_group = net.modificationstation archives_base_name = StationAPI