Browse Source

Merge remote-tracking branch 'architectury/1.16' into feature/registry-creation-api

# Conflicts:
#	build.gradle
shedaniel 4 years ago
parent
commit
b69eae29d7

+ 2 - 2
build.gradle

@@ -1,5 +1,5 @@
 plugins {
-    id "architectury-plugin" version "2.0.59"
+    id "architectury-plugin" version "2.0.61"
     id "forgified-fabric-loom" version "0.6.53" apply false
     id "org.cadixdev.licenser" version "0.5.0"
     id "com.jfrog.bintray" version "1.8.4"
@@ -30,7 +30,7 @@ allprojects {
         isSnapshot = System.getenv("PR_NUM") != null
     }
     
-    def runNumber = (System.getenv("GITHUB_RUN_NUMBER") == null ? (((short) new Random().nextInt()).abs() + 1000).toString() : System.getenv("GITHUB_RUN_NUMBER"))
+    def runNumber = (System.getenv("GITHUB_RUN_NUMBER") == null ? "9999" : System.getenv("GITHUB_RUN_NUMBER"))
 
     if (!ext.isSnapshot) {
         version = rootProject.base_version + "." + runNumber

+ 6 - 0
common/src/main/java/me/shedaniel/architectury/event/events/PlayerEvent.java

@@ -24,6 +24,7 @@ import me.shedaniel.architectury.event.EventFactory;
 import me.shedaniel.architectury.utils.IntValue;
 import net.minecraft.advancements.Advancement;
 import net.minecraft.core.BlockPos;
+import net.minecraft.resources.ResourceKey;
 import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.Container;
 import net.minecraft.world.InteractionResult;
@@ -45,6 +46,7 @@ public interface PlayerEvent {
     Event<SmeltItem> SMELT_ITEM = EventFactory.createLoop();
     Event<PickupItemPredicate> PICKUP_ITEM_PRE = EventFactory.createInteractionResult();
     Event<PickupItem> PICKUP_ITEM_POST = EventFactory.createLoop();
+    Event<ChangeDimension> CHANGE_DIMENSION = EventFactory.createLoop();
     Event<DropItem> DROP_ITEM = EventFactory.createLoop();
     Event<OpenMenu> OPEN_MENU = EventFactory.createLoop();
     Event<CloseMenu> CLOSE_MENU = EventFactory.createLoop();
@@ -86,6 +88,10 @@ public interface PlayerEvent {
         void pickup(Player player, ItemEntity entity, ItemStack stack);
     }
     
+    interface ChangeDimension {
+        void change(ServerPlayer player, ResourceKey<Level> oldLevel, ResourceKey<Level> newLevel);
+    }
+    
     interface DropItem {
         InteractionResult drop(Player player, ItemEntity entity);
     }

+ 69 - 0
common/src/main/java/me/shedaniel/architectury/hooks/FluidStackHooks.java

@@ -22,9 +22,18 @@ package me.shedaniel.architectury.hooks;
 import me.shedaniel.architectury.annotations.ExpectPlatform;
 import me.shedaniel.architectury.fluid.FluidStack;
 import me.shedaniel.architectury.utils.Fraction;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.core.BlockPos;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.network.FriendlyByteBuf;
 import net.minecraft.network.chat.Component;
+import net.minecraft.world.level.BlockAndTintGetter;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.level.material.FluidState;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class FluidStackHooks {
     private FluidStackHooks() {}
@@ -80,4 +89,64 @@ public class FluidStackHooks {
     public static Fraction bucketAmount() {
         throw new AssertionError();
     }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        throw new AssertionError();
+    }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@NotNull FluidStack stack) {
+        throw new AssertionError();
+    }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@NotNull Fluid fluid) {
+        throw new AssertionError();
+    }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        throw new AssertionError();
+    }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@NotNull FluidStack stack) {
+        throw new AssertionError();
+    }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@NotNull Fluid fluid) {
+        throw new AssertionError();
+    }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    public static int getColor(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        throw new AssertionError();
+    }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    public static int getColor(@NotNull FluidStack stack) {
+        throw new AssertionError();
+    }
+    
+    @ExpectPlatform
+    @Environment(EnvType.CLIENT)
+    public static int getColor(@NotNull Fluid fluid) {
+        throw new AssertionError();
+    }
 }

+ 56 - 0
common/src/main/java/me/shedaniel/architectury/hooks/ItemStackHooks.java

@@ -0,0 +1,56 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 shedaniel
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package me.shedaniel.architectury.hooks;
+
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.sounds.SoundEvents;
+import net.minecraft.sounds.SoundSource;
+import net.minecraft.world.entity.item.ItemEntity;
+import net.minecraft.world.item.ItemStack;
+
+public final class ItemStackHooks {
+    private ItemStackHooks() {}
+    
+    public static ItemStack copyWithCount(ItemStack stack, int count) {
+        ItemStack copy = stack.copy();
+        copy.setCount(count);
+        return copy;
+    }
+    
+    public static void giveItem(ServerPlayer player, ItemStack stack) {
+        boolean bl = player.inventory.add(stack);
+        if (bl && stack.isEmpty()) {
+            stack.setCount(1);
+            ItemEntity entity = player.drop(stack, false);
+            if (entity != null) {
+                entity.makeFakeItem();
+            }
+            
+            player.level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, 0.2F, ((player.getRandom().nextFloat() - player.getRandom().nextFloat()) * 0.7F + 1.0F) * 2.0F);
+            player.inventoryMenu.broadcastChanges();
+        } else {
+            ItemEntity entity = player.drop(stack, false);
+            if (entity != null) {
+                entity.setNoPickUpDelay();
+                entity.setOwner(player.getUUID());
+            }
+        }
+    }
+}

+ 90 - 0
fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/FluidStackHooksImpl.java

@@ -26,14 +26,22 @@ import me.shedaniel.architectury.utils.Fraction;
 import me.shedaniel.architectury.utils.NbtType;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
+import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler;
+import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.core.BlockPos;
 import net.minecraft.core.Registry;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.network.FriendlyByteBuf;
 import net.minecraft.network.chat.Component;
 import net.minecraft.network.chat.TranslatableComponent;
 import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.level.BlockAndTintGetter;
 import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.level.material.FluidState;
 import net.minecraft.world.level.material.Fluids;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Objects;
 
@@ -103,4 +111,86 @@ public class FluidStackHooksImpl {
     public static Fraction bucketAmount() {
         return Fraction.ofWhole(1);
     }
+    
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        if (state.getType() == Fluids.EMPTY) return null;
+        TextureAtlasSprite[] sprites = FluidRenderHandlerRegistry.INSTANCE.get(state.getType()).getFluidSprites(level, pos, state);
+        if (sprites == null) return null;
+        return sprites[0];
+    }
+    
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@NotNull FluidStack stack) {
+        if (stack.getFluid() == Fluids.EMPTY) return null;
+        TextureAtlasSprite[] sprites = FluidRenderHandlerRegistry.INSTANCE.get(stack.getFluid()).getFluidSprites(null, null, stack.getFluid().defaultFluidState());
+        if (sprites == null) return null;
+        return sprites[0];
+    }
+    
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@NotNull Fluid fluid) {
+        if (fluid == Fluids.EMPTY) return null;
+        TextureAtlasSprite[] sprites = FluidRenderHandlerRegistry.INSTANCE.get(fluid).getFluidSprites(null, null, fluid.defaultFluidState());
+        if (sprites == null) return null;
+        return sprites[0];
+    }
+    
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        if (state.getType() == Fluids.EMPTY) return null;
+        FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(state.getType());
+        if (handler == null) return null;
+        TextureAtlasSprite[] sprites = handler.getFluidSprites(level, pos, state);
+        if (sprites == null) return null;
+        return sprites[1];
+    }
+    
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@NotNull FluidStack stack) {
+        if (stack.getFluid() == Fluids.EMPTY) return null;
+        FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(stack.getFluid());
+        if (handler == null) return null;
+        TextureAtlasSprite[] sprites = handler.getFluidSprites(null, null, stack.getFluid().defaultFluidState());
+        if (sprites == null) return null;
+        return sprites[1];
+    }
+    
+    @Environment(EnvType.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@NotNull Fluid fluid) {
+        if (fluid == Fluids.EMPTY) return null;
+        TextureAtlasSprite[] sprites = FluidRenderHandlerRegistry.INSTANCE.get(fluid).getFluidSprites(null, null, fluid.defaultFluidState());
+        if (sprites == null) return null;
+        return sprites[1];
+    }
+    
+    @Environment(EnvType.CLIENT)
+    public static int getColor(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        if (state.getType() == Fluids.EMPTY) return -1;
+        FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(state.getType());
+        if (handler == null) return -1;
+        return handler.getFluidColor(level, pos, state);
+    }
+    
+    @Environment(EnvType.CLIENT)
+    public static int getColor(@NotNull FluidStack stack) {
+        if (stack.getFluid() == Fluids.EMPTY) return -1;
+        FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(stack.getFluid());
+        if (handler == null) return -1;
+        return handler.getFluidColor(null, null, stack.getFluid().defaultFluidState());
+    }
+    
+    @Environment(EnvType.CLIENT)
+    public static int getColor(@NotNull Fluid fluid) {
+        if (fluid == Fluids.EMPTY) return -1;
+        FluidRenderHandler handler = FluidRenderHandlerRegistry.INSTANCE.get(fluid);
+        if (handler == null) return -1;
+        return handler.getFluidColor(null, null, fluid.defaultFluidState());
+    }
 }

+ 6 - 0
fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinServerPlayer.java

@@ -20,6 +20,7 @@
 package me.shedaniel.architectury.mixin.fabric;
 
 import me.shedaniel.architectury.event.events.PlayerEvent;
+import net.minecraft.server.level.ServerLevel;
 import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.Container;
 import net.minecraft.world.MenuProvider;
@@ -57,4 +58,9 @@ public class MixinServerPlayer {
     private void doCloseContainer(CallbackInfo ci) {
         PlayerEvent.CLOSE_MENU.invoker().close((ServerPlayer) (Object) this, ((ServerPlayer) (Object) this).containerMenu);
     }
+    
+    @Inject(method = "triggerDimensionChangeTriggers", at = @At("HEAD"))
+    private void changeDimension(ServerLevel serverLevel, CallbackInfo ci) {
+        PlayerEvent.CHANGE_DIMENSION.invoker().change((ServerPlayer) (Object) this, serverLevel.dimension(), ((ServerPlayer) (Object) this).level.dimension());
+    }
 }

+ 20 - 1
fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinEffectInstance.java

@@ -1,3 +1,22 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 shedaniel
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
 package me.shedaniel.architectury.mixin.fabric.client;
 
 import com.mojang.blaze3d.shaders.Program;
@@ -10,7 +29,7 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Redirect;
 
 @Unique
-@Mixin(EffectInstance.class)
+@Mixin(value = EffectInstance.class, priority = 1050)
 public class MixinEffectInstance {
     @Redirect(
             method = "<init>",

+ 7 - 0
forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImplCommon.java

@@ -322,6 +322,13 @@ public class EventHandlerImplCommon {
         LifecycleEvent.SERVER_BEFORE_START.invoker().stateChanged(event.getServer());
     }
     
+    @SubscribeEvent
+    public static void event(PlayerChangedDimensionEvent event) {
+        if (event.getPlayer() instanceof ServerPlayer) {
+            PlayerEvent.CHANGE_DIMENSION.invoker().change((ServerPlayer) event.getPlayer(), event.getFrom(), event.getTo());
+        }
+    }
+    
     public static class ModBasedEventHandler {
         
     }

+ 79 - 0
forge/src/main/java/me/shedaniel/architectury/hooks/forge/FluidStackHooksImpl.java

@@ -21,9 +21,22 @@ package me.shedaniel.architectury.hooks.forge;
 
 import me.shedaniel.architectury.fluid.FluidStack;
 import me.shedaniel.architectury.utils.Fraction;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.TextureAtlas;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.core.BlockPos;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.network.FriendlyByteBuf;
 import net.minecraft.network.chat.Component;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.level.BlockAndTintGetter;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.level.material.FluidState;
+import net.minecraft.world.level.material.Fluids;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class FluidStackHooksImpl {
     public static Component getName(FluidStack stack) {
@@ -53,4 +66,70 @@ public class FluidStackHooksImpl {
     public static Fraction bucketAmount() {
         return Fraction.ofWhole(1000);
     }
+    
+    @OnlyIn(Dist.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        if (state.getType() == Fluids.EMPTY) return null;
+        ResourceLocation texture = state.getType().getAttributes().getStillTexture(level, pos);
+        return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture);
+    }
+    
+    @OnlyIn(Dist.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@NotNull FluidStack stack) {
+        if (stack.getFluid() == Fluids.EMPTY) return null;
+        ResourceLocation texture = stack.getFluid().getAttributes().getStillTexture(FluidStackHooksForge.toForge(stack));
+        return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture);
+    }
+    
+    @OnlyIn(Dist.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getStillTexture(@NotNull Fluid fluid) {
+        if (fluid == Fluids.EMPTY) return null;
+        ResourceLocation texture = fluid.getAttributes().getStillTexture();
+        return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture);
+    }
+    
+    @OnlyIn(Dist.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        if (state.getType() == Fluids.EMPTY) return null;
+        ResourceLocation texture = state.getType().getAttributes().getFlowingTexture(level, pos);
+        return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture);
+    }
+    
+    @OnlyIn(Dist.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@NotNull FluidStack stack) {
+        if (stack.getFluid() == Fluids.EMPTY) return null;
+        ResourceLocation texture = stack.getFluid().getAttributes().getFlowingTexture(FluidStackHooksForge.toForge(stack));
+        return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture);
+    }
+    
+    @OnlyIn(Dist.CLIENT)
+    @Nullable
+    public static TextureAtlasSprite getFlowingTexture(@NotNull Fluid fluid) {
+        if (fluid == Fluids.EMPTY) return null;
+        ResourceLocation texture = fluid.getAttributes().getFlowingTexture();
+        return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture);
+    }
+    
+    @OnlyIn(Dist.CLIENT)
+    public static int getColor(@Nullable BlockAndTintGetter level, @Nullable BlockPos pos, @NotNull FluidState state) {
+        if (state.getType() == Fluids.EMPTY) return -1;
+        return state.getType().getAttributes().getColor(level, pos);
+    }
+    
+    @OnlyIn(Dist.CLIENT)
+    public static int getColor(@NotNull FluidStack stack) {
+        if (stack.getFluid() == Fluids.EMPTY) return -1;
+        return stack.getFluid().getAttributes().getColor(FluidStackHooksForge.toForge(stack));
+    }
+    
+    @OnlyIn(Dist.CLIENT)
+    public static int getColor(@NotNull Fluid fluid) {
+        if (fluid == Fluids.EMPTY) return -1;
+        return fluid.getAttributes().getColor();
+    }
 }

+ 3 - 0
testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java

@@ -165,6 +165,9 @@ public class DebugEvents {
         PlayerEvent.CLOSE_MENU.register((player, menu) -> {
             SINK.accept(player.getScoreboardName() + " closes " + toSimpleName(menu) + logSide(player.level));
         });
+        PlayerEvent.CHANGE_DIMENSION.register((player, oldLevel, newLevel) -> {
+            SINK.accept(player.getScoreboardName() + " switched from " + oldLevel.location() + " to " + newLevel.location() + logSide(player.level));
+        });
     }
     
     public static String toShortString(Vec3i pos) {