diff --git a/common/build.gradle b/common/build.gradle index 8ed220e7..a78a333a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -13,7 +13,7 @@ dependencies { } architectury { - common() + common(false) } task sourcesJar(type: Jar, dependsOn: classes) { diff --git a/common/src/main/java/me/shedaniel/architectury/registry/BlockEntityRenderers.java b/common/src/main/java/me/shedaniel/architectury/registry/BlockEntityRenderers.java index e0c18e29..525ebad8 100644 --- a/common/src/main/java/me/shedaniel/architectury/registry/BlockEntityRenderers.java +++ b/common/src/main/java/me/shedaniel/architectury/registry/BlockEntityRenderers.java @@ -24,6 +24,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -33,8 +34,12 @@ import java.util.function.Function; public final class BlockEntityRenderers { private BlockEntityRenderers() {} - @ExpectPlatform public static void registerRenderer(BlockEntityType type, Function> provider) { + registerRenderer(type, (BlockEntityRendererProvider.Context context) -> provider.apply(context.getBlockEntityRenderDispatcher())); + } + + @ExpectPlatform + public static void registerRenderer(BlockEntityType type, BlockEntityRendererProvider provider) { throw new AssertionError(); } } diff --git a/fabric/build.gradle b/fabric/build.gradle index 83353a7a..d416a841 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -82,7 +82,7 @@ curseforge { apiKey = project.hasProperty("curse_api_key") ? project.property("curse_api_key") : System.getenv("curse_api_key") project { id = "419697" - releaseType = "release" + releaseType = "$rootProject.cf_type" changelogType = "html" changelog = releaseChangelog() addGameVersion "1.16-Snapshot" diff --git a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/DyeColorHooksImpl.java b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/DyeColorHooksImpl.java index a7997af7..ad9d62f8 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/DyeColorHooksImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/DyeColorHooksImpl.java @@ -23,6 +23,7 @@ import net.minecraft.world.item.DyeColor; public class DyeColorHooksImpl { public static int getColorValue(DyeColor color) { - return color.textureDiffuseColor; + float[] colors = color.getTextureDiffuseColors(); + return ((int) (colors[0] * 255.0F + 0.5D) & 255) << 16 | ((int) (colors[1] * 255.0F + 0.5D) & 255) << 8 | (int) (colors[2] * 255.0F + 0.5D); } } diff --git a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/PersistentEntitySectionManagerHooks.java b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/PersistentEntitySectionManagerHooks.java new file mode 100644 index 00000000..96cd0636 --- /dev/null +++ b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/PersistentEntitySectionManagerHooks.java @@ -0,0 +1,7 @@ +package me.shedaniel.architectury.hooks.fabric; + +import net.minecraft.server.level.ServerLevel; + +public interface PersistentEntitySectionManagerHooks { + void architectury_attachLevel(ServerLevel level); +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinPersistentEntitySectionManager.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinPersistentEntitySectionManager.java new file mode 100644 index 00000000..637e3dcf --- /dev/null +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinPersistentEntitySectionManager.java @@ -0,0 +1,44 @@ +package me.shedaniel.architectury.mixin.fabric; + +import me.shedaniel.architectury.event.events.EntityEvent; +import me.shedaniel.architectury.hooks.fabric.PersistentEntitySectionManagerHooks; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.entity.EntityAccess; +import net.minecraft.world.level.entity.PersistentEntitySectionManager; +import org.spongepowered.asm.mixin.Mixin; +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.CallbackInfoReturnable; + +import java.lang.ref.WeakReference; + +@Mixin(PersistentEntitySectionManager.class) +public class MixinPersistentEntitySectionManager implements PersistentEntitySectionManagerHooks { + @Unique + private WeakReference levelRef; + + @Override + public void architectury_attachLevel(ServerLevel level) { + levelRef = new WeakReference<>(level); + } + + @Inject(method = "addEntity", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/level/entity/EntitySectionStorage;entityPosToSectionKey(Lnet/minecraft/core/BlockPos;)J"), + cancellable = true) + private void addEntity(T entityAccess, boolean bl, CallbackInfoReturnable cir) { + // TODO: Check if other classes implements EntityAccess as well + if (entityAccess instanceof Entity && levelRef != null) { + ServerLevel level = levelRef.get(); + levelRef = null; + + if (level != null) { + if (EntityEvent.ADD.invoker().add((Entity) entityAccess, level) == InteractionResult.FAIL) { + cir.setReturnValue(false); + } + } + } + } +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinServerLevel.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinServerLevel.java index 82368723..1ed4e62b 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinServerLevel.java +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinServerLevel.java @@ -19,14 +19,15 @@ package me.shedaniel.architectury.mixin.fabric; -import me.shedaniel.architectury.event.events.EntityEvent; import me.shedaniel.architectury.event.events.LifecycleEvent; +import me.shedaniel.architectury.hooks.fabric.PersistentEntitySectionManagerHooks; import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ProgressListener; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.entity.PersistentEntitySectionManager; +import org.spongepowered.asm.mixin.Final; 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; @@ -34,32 +35,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ServerLevel.class) public class MixinServerLevel { + @Shadow @Final private PersistentEntitySectionManager entityManager; + @Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;save(Z)V")) private void save(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) { LifecycleEvent.SERVER_WORLD_SAVE.invoker().act((ServerLevel) (Object) this); } @Inject(method = "addEntity", at = @At(value = "INVOKE", - target = "Lnet/minecraft/server/level/ServerLevel;getChunk(IILnet/minecraft/world/level/chunk/ChunkStatus;Z)Lnet/minecraft/world/level/chunk/ChunkAccess;"), + target = "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;addNewEntity(Lnet/minecraft/world/level/entity/EntityAccess;)Z"), cancellable = true) private void addEntity(Entity entity, CallbackInfoReturnable cir) { - if (EntityEvent.ADD.invoker().add(entity, (ServerLevel) (Object) this) == InteractionResult.FAIL) { - cir.setReturnValue(false); - } - } - - @Inject(method = "addPlayer", at = @At("HEAD"), cancellable = true) - private void addPlayer(ServerPlayer serverPlayer, CallbackInfo ci) { - if (EntityEvent.ADD.invoker().add(serverPlayer, (ServerLevel) (Object) this) == InteractionResult.FAIL) { - ci.cancel(); - } - } - - @Inject(method = "loadFromChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;add(Lnet/minecraft/world/entity/Entity;)V"), - cancellable = true) - private void loadFromChunk(Entity entity, CallbackInfoReturnable cir) { - if (EntityEvent.ADD.invoker().add(entity, (ServerLevel) (Object) this) == InteractionResult.FAIL) { - cir.setReturnValue(false); - } + ((PersistentEntitySectionManagerHooks) this.entityManager).architectury_attachLevel((ServerLevel) (Object) this); } } diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinScreen.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinScreen.java index 017e3eb8..56c88e68 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinScreen.java +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinScreen.java @@ -85,7 +85,7 @@ public abstract class MixinScreen implements ScreenInputDelegate { return message; } - @Inject(method = "renderTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/List;II)V", at = @At("HEAD"), cancellable = true) + @Inject(method = "renderTooltipInternal", at = @At("HEAD"), cancellable = true) private void renderTooltip(PoseStack poseStack, List list, int x, int y, CallbackInfo ci) { if (!list.isEmpty()) { TooltipEventColorContextImpl colorContext = tooltipColorContext.get(); @@ -101,29 +101,29 @@ public abstract class MixinScreen implements ScreenInputDelegate { } } - @ModifyVariable(method = "renderTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/List;II)V", + @ModifyVariable(method = "renderTooltipInternal", at = @At(value = "HEAD"), ordinal = 0) private int modifyTooltipX(int original) { return tooltipPositionContext.get().getTooltipX(); } - @ModifyVariable(method = "renderTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/List;II)V", + @ModifyVariable(method = "renderTooltipInternal", at = @At(value = "HEAD"), ordinal = 1) private int modifyTooltipY(int original) { return tooltipPositionContext.get().getTooltipY(); } - @ModifyConstant(method = "renderTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/List;II)V", constant = @Constant(intValue = 0xf0100010)) + @ModifyConstant(method = "renderTooltipInternal", constant = @Constant(intValue = 0xf0100010)) private int modifyTooltipBackgroundColor(int original) { return tooltipColorContext.get().getBackgroundColor(); } - @ModifyConstant(method = "renderTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/List;II)V", constant = @Constant(intValue = 0x505000ff)) + @ModifyConstant(method = "renderTooltipInternal", constant = @Constant(intValue = 0x505000ff)) private int modifyTooltipOutlineGradientTopColor(int original) { return tooltipColorContext.get().getOutlineGradientTopColor(); } - @ModifyConstant(method = "renderTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/List;II)V", constant = @Constant(intValue = 0x5028007f)) + @ModifyConstant(method = "renderTooltipInternal", constant = @Constant(intValue = 0x5028007f)) private int modifyTooltipOutlineGradientBottomColor(int original) { return tooltipColorContext.get().getOutlineGradientBottomColor(); } diff --git a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/BlockEntityRenderersImpl.java b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/BlockEntityRenderersImpl.java index 22b17f01..4fde2218 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/BlockEntityRenderersImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/BlockEntityRenderersImpl.java @@ -20,15 +20,12 @@ package me.shedaniel.architectury.registry.fabric; import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import java.util.function.Function; - public class BlockEntityRenderersImpl { - public static void registerRenderer(BlockEntityType type, Function> provider) { + public static void registerRenderer(BlockEntityType type, BlockEntityRendererProvider provider) { BlockEntityRendererRegistry.INSTANCE.register(type, provider); } } diff --git a/fabric/src/main/resources/architectury.mixins.json b/fabric/src/main/resources/architectury.mixins.json index 39fd628e..3bd04171 100644 --- a/fabric/src/main/resources/architectury.mixins.json +++ b/fabric/src/main/resources/architectury.mixins.json @@ -10,8 +10,8 @@ ], "mixins": [ "ExplosionPreInvoker", "LivingDeathInvoker", "MixinBlockItem", "MixinCommands", "MixinDedicatedServer", "MixinExplosion", "MixinFurnaceResultSlot", - "MixinItemEntity", "MixinLivingEntity", "MixinPlayer", "MixinPlayerAdvancements", "MixinPlayerList", "MixinResultSlot", "MixinServerGamePacketListenerImpl", - "MixinServerLevel", "MixinServerPlayer", "MixinServerPlayerGameMode", "PlayerAttackInvoker" + "MixinItemEntity", "MixinLivingEntity", "MixinPersistentEntitySectionManager", "MixinPlayer", "MixinPlayerAdvancements", "MixinPlayerList", + "MixinResultSlot", "MixinServerGamePacketListenerImpl", "MixinServerLevel", "MixinServerPlayer", "MixinServerPlayerGameMode", "PlayerAttackInvoker" ], "injectors": { "defaultRequire": 1 diff --git a/forge/build.gradle b/forge/build.gradle index d54cd3a5..380f058d 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -72,7 +72,7 @@ curseforge { apiKey = project.hasProperty("curse_api_key") ? project.property("curse_api_key") : System.getenv("curse_api_key") project { id = "419699" - releaseType = "release" + releaseType = "$rootProject.cf_type" changelogType = "html" changelog = releaseChangelog() addGameVersion "1.16.4" diff --git a/gradle.properties b/gradle.properties index a45ad75e..2958408d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,15 +1,17 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -minecraft_version=1.16.4 -supported_version=1.16.4 +minecraft_version=20w51a +supported_version=20w51a + +cf_type=beta archives_base_name=architectury -mod_version=1.3 +mod_version=2.0 maven_group=me.shedaniel fabric_loader_version=0.10.8 -fabric_api_version=0.29.3+1.16 -mod_menu_version=1.14.6+ +fabric_api_version=0.29.3+1.17 +mod_menu_version=2.0.0-beta.1+build.2 -forge_version=35.1.36 \ No newline at end of file +#forge_version=35.1.36 \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 77a9dc32..0bc5e97a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,6 +10,6 @@ pluginManagement { include("common") include("fabric") -include("forge") +//include("forge") rootProject.name = "architectury"