mirror of
https://github.com/FabricMC/fabric.git
synced 2025-04-21 11:20:55 -04:00
20w45a
Added FabricBlockEntityTypeBuilder Reworked EntityRendererRegistry Ported BlockEntityRendererRegistry
This commit is contained in:
parent
9cb915787f
commit
fd6e7547e7
32 changed files with 253 additions and 218 deletions
build.gradle
fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/event/interaction
fabric-lifecycle-events-v1/src
main/java/net/fabricmc/fabric/mixin/event/lifecycle
testmod/java/net/fabricmc/fabric/test/event/lifecycle/client
fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networking/blockentity
fabric-object-builder-api-v1/src/main
java/net/fabricmc/fabric/api/object/builder/v1/block/entity
resources
fabric-renderer-indigo/src/main/java/net/fabricmc/fabric/impl/client/indigo/renderer/render
fabric-renderer-registries-v1/src
main
java/net/fabricmc/fabric
api/client/rendereregistry/v1
BlockEntityRendererRegistry.javaEntityRendererRegistry.javaLivingEntityFeatureRendererRegistrationCallback.java
impl/client/renderer/registry
mixin/client/renderer/registry
resources
testmod/java/net/fabricmc/fabric/test/renderer/registry
fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader
fabric-screen-handler-api-v1
build.gradle
src
main/java/net/fabricmc/fabric/impl/screenhandler/client
testmod/java/net/fabricmc/fabric/test/screenhandler
fabric-structure-api-v1/src/main/java/net/fabricmc/fabric/mixin/structure
fabric-tag-extensions-v0/src/main/resources
fabric-tool-attribute-api-v1/src/main/java/net/fabricmc/fabric/impl/tool/attribute
src/main/resources
|
@ -20,7 +20,7 @@ def ENV = System.getenv()
|
|||
class Globals {
|
||||
static def baseVersion = "0.25.1"
|
||||
static def mcVersion = "20w45a"
|
||||
static def yarnVersion = "+build.1"
|
||||
static def yarnVersion = "+build.6"
|
||||
static def loaderVersion = "0.10.5+build.213"
|
||||
}
|
||||
|
||||
|
|
|
@ -66,9 +66,9 @@ public abstract class MixinMinecraftClient {
|
|||
info.cancel();
|
||||
|
||||
// I don't like that we clone vanilla logic here, but it's our best bet for now.
|
||||
PlayerInventory playerInventory = client.player.inventory;
|
||||
PlayerInventory playerInventory = client.player.method_31548();
|
||||
|
||||
if (client.player.abilities.creativeMode && Screen.hasControlDown() && client.crosshairTarget.getType() == HitResult.Type.BLOCK) {
|
||||
if (client.player.method_31549().creativeMode && Screen.hasControlDown() && client.crosshairTarget.getType() == HitResult.Type.BLOCK) {
|
||||
BlockEntity be = client.world.getBlockEntity(((BlockHitResult) client.crosshairTarget).getBlockPos());
|
||||
|
||||
if (be != null) {
|
||||
|
@ -82,7 +82,7 @@ public abstract class MixinMinecraftClient {
|
|||
return;
|
||||
}
|
||||
|
||||
if (client.player.abilities.creativeMode) {
|
||||
if (client.player.method_31549().creativeMode) {
|
||||
playerInventory.addPickBlock(stack);
|
||||
client.interactionManager.clickCreativeStack(client.player.getStackInHand(Hand.MAIN_HAND), 36 + playerInventory.selectedSlot);
|
||||
} else {
|
||||
|
|
|
@ -29,6 +29,7 @@ import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket;
|
|||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.hit.EntityHitResult;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
|
||||
import net.fabricmc.fabric.api.event.player.UseEntityCallback;
|
||||
|
||||
|
@ -40,7 +41,7 @@ public class MixinServerPlayNetworkHandler {
|
|||
@Inject(method = "onPlayerInteractEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;interactAt(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/Hand;)Lnet/minecraft/util/ActionResult;"), cancellable = true)
|
||||
public void onPlayerInteractEntity(PlayerInteractEntityC2SPacket packet, CallbackInfo info) {
|
||||
World world = player.getEntityWorld();
|
||||
Entity entity = packet.getEntity(world);
|
||||
Entity entity = packet.getEntity((ServerWorld) world);
|
||||
|
||||
if (entity != null) {
|
||||
EntityHitResult hitResult = new EntityHitResult(entity, packet.getHitPosition().add(entity.getX(), entity.getY(), entity.getZ()));
|
||||
|
|
|
@ -31,12 +31,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.resource.ServerResourceManager;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
|
||||
|
|
|
@ -20,15 +20,12 @@ import java.util.function.BooleanSupplier;
|
|||
|
||||
import org.objectweb.asm.Opcodes;
|
||||
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;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerEntityEvents;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
|
||||
@Mixin(ServerWorld.class)
|
||||
|
|
|
@ -19,16 +19,9 @@ package net.fabricmc.fabric.test.event.lifecycle.client;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientBlockEntityEvents;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
||||
import net.fabricmc.fabric.test.event.lifecycle.ServerLifecycleTests;
|
||||
|
||||
public class ClientBlockEntityLifecycleTests implements ClientModInitializer {
|
||||
private static boolean PRINT_CLIENT_BLOCKENTITY_MESSAGES = System.getProperty("fabric-lifecycle-events-testmod.printClientBlockEntityMessages") != null;
|
||||
|
|
|
@ -32,7 +32,6 @@ import net.minecraft.client.network.ClientPlayNetworkHandler;
|
|||
import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable;
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* 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.fabricmc.fabric.api.object.builder.v1.block.entity;
|
||||
|
||||
import com.mojang.datafixers.types.Type;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.block.entity.BlockEntityType;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
/**
|
||||
* Fabric's version of BlockEntityType.Builder.
|
||||
* Removes the need to use an access widener on the BlockEntityFactory
|
||||
*
|
||||
*/
|
||||
public final class FabricBlockEntityTypeBuilder<T extends BlockEntity> {
|
||||
private final Factory<? extends T> factory;
|
||||
private final Block[] blocks;
|
||||
|
||||
private FabricBlockEntityTypeBuilder(Factory<? extends T> factory, Block[] blocks) {
|
||||
this.factory = factory;
|
||||
this.blocks = blocks;
|
||||
}
|
||||
|
||||
public static <T extends BlockEntity> FabricBlockEntityTypeBuilder<T> create(Factory<? extends T> factory, Block... blocks) {
|
||||
return new FabricBlockEntityTypeBuilder<>(factory, blocks);
|
||||
}
|
||||
|
||||
public BlockEntityType<T> build() {
|
||||
return build(null);
|
||||
}
|
||||
|
||||
public BlockEntityType<T> build(Type<?> type) {
|
||||
return BlockEntityType.Builder.<T>create(factory::create, blocks)
|
||||
.build(type);
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface Factory<T extends BlockEntity> {
|
||||
T create(BlockPos blockPos, BlockState blockState);
|
||||
}
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
accessWidener v1 named
|
||||
extendable method net/minecraft/block/AbstractBlock$Settings <init> (Lnet/minecraft/block/Material;Ljava/util/function/Function;)V
|
||||
extendable method net/minecraft/block/AbstractBlock$Settings <init> (Lnet/minecraft/block/Material;Lnet/minecraft/block/MaterialColor;)V
|
||||
|
||||
extendable class net/minecraft/block/entity/BlockEntityType$class_5559
|
||||
|
|
|
@ -43,7 +43,7 @@ public class TerrainBlockRenderInfo extends BlockRenderInfo {
|
|||
if ((cullCompletionFlags & mask) == 0) {
|
||||
cullCompletionFlags |= mask;
|
||||
|
||||
if (Block.shouldDrawSide(blockState, blockView, blockPos, face)) {
|
||||
if (Block.shouldDrawSide(blockState, blockView, blockPos, face, blockPos.offset(face))) {
|
||||
cullResultFlags |= mask;
|
||||
return true;
|
||||
} else {
|
||||
|
|
|
@ -106,7 +106,7 @@ public class TerrainRenderContext extends AbstractRenderContext implements Rende
|
|||
} catch (Throwable var9) {
|
||||
CrashReport crashReport_1 = CrashReport.create(var9, "Tesselating block in world - Indigo Renderer");
|
||||
CrashReportSection crashReportElement_1 = crashReport_1.addElement("Block being tesselated");
|
||||
CrashReportSection.addBlockInfo(crashReportElement_1, blockPos, blockState);
|
||||
CrashReportSection.addBlockInfo(crashReportElement_1, chunkInfo.blockView, blockPos, blockState);
|
||||
throw new CrashException(crashReport_1);
|
||||
}
|
||||
|
||||
|
|
|
@ -16,10 +16,9 @@
|
|||
|
||||
package net.fabricmc.fabric.api.client.rendereregistry.v1;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.block.entity.BlockEntityType;
|
||||
import net.minecraft.class_5614;
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
|
||||
|
||||
|
@ -35,10 +34,10 @@ public interface BlockEntityRendererRegistry {
|
|||
* Register a BlockEntityRenderer for a BlockEntityType. Can be called clientside before the world is rendered.
|
||||
*
|
||||
* @param blockEntityType the {@link BlockEntityType} to register a renderer for
|
||||
* @param blockEntityRenderer a function that returns a {@link BlockEntityRenderer}, called
|
||||
* @param blockEntityRendererFactory a {@link class_5614} that creates a {@link BlockEntityRenderer}, called
|
||||
* when {@link BlockEntityRenderDispatcher} is initialized or immediately if the dispatcher
|
||||
* class is already loaded
|
||||
* @param <E> the {@link BlockEntity}
|
||||
*/
|
||||
<E extends BlockEntity> void register(BlockEntityType<E> blockEntityType, Function<BlockEntityRenderDispatcher, BlockEntityRenderer<E>> blockEntityRenderer);
|
||||
<E extends BlockEntity> void register(BlockEntityType<E> blockEntityType, class_5614<E> blockEntityRendererFactory);
|
||||
}
|
||||
|
|
|
@ -16,82 +16,26 @@
|
|||
|
||||
package net.fabricmc.fabric.api.client.rendereregistry.v1;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.WeakHashMap;
|
||||
|
||||
import net.minecraft.client.render.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.render.entity.EntityRenderer;
|
||||
import net.minecraft.client.render.item.ItemRenderer;
|
||||
import net.minecraft.client.texture.TextureManager;
|
||||
import net.minecraft.class_5617;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.resource.ReloadableResourceManager;
|
||||
|
||||
import net.fabricmc.fabric.impl.client.renderer.registry.EntityRendererRegistryImpl;
|
||||
|
||||
/**
|
||||
* Helper class for registering EntityRenderers.
|
||||
*/
|
||||
public class EntityRendererRegistry {
|
||||
@FunctionalInterface
|
||||
public interface Factory {
|
||||
EntityRenderer<? extends Entity> create(EntityRenderDispatcher manager, EntityRendererRegistry.Context context);
|
||||
}
|
||||
public interface EntityRendererRegistry {
|
||||
EntityRendererRegistry INSTANCE = new EntityRendererRegistryImpl();
|
||||
|
||||
public static final class Context {
|
||||
private final TextureManager textureManager;
|
||||
private final ReloadableResourceManager resourceManager;
|
||||
private final ItemRenderer itemRenderer;
|
||||
private final Map<EntityType<?>, EntityRenderer<?>> rendererMap;
|
||||
|
||||
private Context(TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer, Map<EntityType<?>, EntityRenderer<?>> rendererMap) {
|
||||
this.textureManager = textureManager;
|
||||
this.resourceManager = resourceManager;
|
||||
this.itemRenderer = itemRenderer;
|
||||
this.rendererMap = rendererMap;
|
||||
}
|
||||
|
||||
public TextureManager getTextureManager() {
|
||||
return textureManager;
|
||||
}
|
||||
|
||||
public ReloadableResourceManager getResourceManager() {
|
||||
return resourceManager;
|
||||
}
|
||||
|
||||
public ItemRenderer getItemRenderer() {
|
||||
return itemRenderer;
|
||||
}
|
||||
}
|
||||
|
||||
public static final EntityRendererRegistry INSTANCE = new EntityRendererRegistry();
|
||||
private final Map<EntityRenderDispatcher, Context> renderManagerMap = new WeakHashMap<>();
|
||||
private final Map<EntityType<?>, EntityRendererRegistry.Factory> renderSupplierMap = new HashMap<>();
|
||||
|
||||
private EntityRendererRegistry() { }
|
||||
|
||||
public void initialize(EntityRenderDispatcher manager, TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer, Map<EntityType<?>, EntityRenderer<?>> renderers) {
|
||||
synchronized (renderSupplierMap) {
|
||||
if (renderManagerMap.containsKey(manager)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Context context = new Context(textureManager, resourceManager, itemRenderer, renderers);
|
||||
renderManagerMap.put(manager, context);
|
||||
|
||||
for (EntityType<?> c : renderSupplierMap.keySet()) {
|
||||
renderers.put(c, renderSupplierMap.get(c).create(manager, context));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void register(EntityType<?> entityType, EntityRendererRegistry.Factory factory) {
|
||||
synchronized (renderSupplierMap) {
|
||||
// TODO: warn on duplicate
|
||||
renderSupplierMap.put(entityType, factory);
|
||||
|
||||
for (EntityRenderDispatcher manager : renderManagerMap.keySet()) {
|
||||
renderManagerMap.get(manager).rendererMap.put(entityType, factory.create(manager, renderManagerMap.get(manager)));
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Register a BlockEntityRenderer for a BlockEntityType. Can be called clientside before the world is rendered.
|
||||
*
|
||||
* @param entityType the {@link EntityType} to register a renderer for
|
||||
* @param entityRendererFactory a {@link class_5617} that creates a {@link EntityRenderer}, called
|
||||
* when {@link EntityRenderDispatcher} is initialized or immediately if the dispatcher
|
||||
* class is already loaded
|
||||
* @param <E> the {@link Entity}
|
||||
*/
|
||||
<E extends Entity> void register(EntityType<? extends E> entityType, class_5617<E> entityRendererFactory);
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package net.fabricmc.fabric.api.client.rendereregistry.v1;
|
||||
|
||||
import net.minecraft.class_5617;
|
||||
import net.minecraft.client.render.entity.LivingEntityRenderer;
|
||||
import net.minecraft.client.render.entity.feature.Deadmau5FeatureRenderer;
|
||||
import net.minecraft.client.render.entity.feature.FeatureRenderer;
|
||||
|
@ -48,9 +49,9 @@ import net.fabricmc.fabric.api.event.EventFactory;
|
|||
@FunctionalInterface
|
||||
@Environment(EnvType.CLIENT)
|
||||
public interface LivingEntityFeatureRendererRegistrationCallback {
|
||||
Event<LivingEntityFeatureRendererRegistrationCallback> EVENT = EventFactory.createArrayBacked(LivingEntityFeatureRendererRegistrationCallback.class, callbacks -> (entityType, entityRenderer, registrationHelper) -> {
|
||||
Event<LivingEntityFeatureRendererRegistrationCallback> EVENT = EventFactory.createArrayBacked(LivingEntityFeatureRendererRegistrationCallback.class, callbacks -> (entityType, entityRenderer, registrationHelper, context) -> {
|
||||
for (LivingEntityFeatureRendererRegistrationCallback callback : callbacks) {
|
||||
callback.registerRenderers(entityType, entityRenderer, registrationHelper);
|
||||
callback.registerRenderers(entityType, entityRenderer, registrationHelper, context);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -60,7 +61,7 @@ public interface LivingEntityFeatureRendererRegistrationCallback {
|
|||
* @param entityType the entity type of the renderer
|
||||
* @param entityRenderer the entity renderer
|
||||
*/
|
||||
void registerRenderers(EntityType<? extends LivingEntity> entityType, LivingEntityRenderer<?, ?> entityRenderer, RegistrationHelper registrationHelper);
|
||||
void registerRenderers(EntityType<? extends LivingEntity> entityType, LivingEntityRenderer<?, ?> entityRenderer, RegistrationHelper registrationHelper, class_5617.class_5618 context);
|
||||
|
||||
/**
|
||||
* A delegate object used to help register feature renderers for an entity renderer.
|
||||
|
|
|
@ -18,25 +18,23 @@ package net.fabricmc.fabric.impl.client.renderer.registry;
|
|||
|
||||
import java.util.HashMap;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.block.entity.BlockEntityType;
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
|
||||
import net.minecraft.class_5614;
|
||||
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry;
|
||||
|
||||
public class BlockEntityRendererRegistryImpl implements BlockEntityRendererRegistry {
|
||||
private static HashMap<BlockEntityType<?>, Function<BlockEntityRenderDispatcher, ? extends BlockEntityRenderer<?>>> map = new HashMap<>();
|
||||
private static BiConsumer<BlockEntityType<?>, Function<BlockEntityRenderDispatcher, ? extends BlockEntityRenderer<?>>> handler = (type, function) -> map.put(type, function);
|
||||
private static HashMap<BlockEntityType<?>, class_5614<?>> map = new HashMap<>();
|
||||
private static BiConsumer<BlockEntityType<?>, class_5614<?>> handler = (type, function) -> map.put(type, function);
|
||||
|
||||
@Override
|
||||
public <E extends BlockEntity> void register(BlockEntityType<E> blockEntityType, Function<BlockEntityRenderDispatcher, BlockEntityRenderer<E>> blockEntityRenderer) {
|
||||
handler.accept(blockEntityType, blockEntityRenderer);
|
||||
public <E extends BlockEntity> void register(BlockEntityType<E> blockEntityType, class_5614<E> blockEntityRendererFactory) {
|
||||
handler.accept(blockEntityType, blockEntityRendererFactory);
|
||||
}
|
||||
|
||||
public static void setup(BiConsumer<BlockEntityType<?>, Function<BlockEntityRenderDispatcher, ? extends BlockEntityRenderer<?>>> vanillaHandler) {
|
||||
public static void setup(BiConsumer<BlockEntityType<?>, class_5614<?>> vanillaHandler) {
|
||||
map.forEach(vanillaHandler);
|
||||
handler = vanillaHandler;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* 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.fabricmc.fabric.impl.client.renderer.registry;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
import net.minecraft.class_5617;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityType;
|
||||
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
|
||||
|
||||
/**
|
||||
* Helper class for registering EntityRenderers.
|
||||
*/
|
||||
public final class EntityRendererRegistryImpl implements EntityRendererRegistry {
|
||||
private static HashMap<EntityType<?>, class_5617<?>> map = new HashMap<>();
|
||||
private static BiConsumer<EntityType<?>, class_5617<?>> handler = (type, function) -> map.put(type, function);
|
||||
|
||||
public <T extends Entity> void register(EntityType<? extends T> entityType, class_5617<T> factory) {
|
||||
handler.accept(entityType, factory);
|
||||
}
|
||||
|
||||
public static void setup(BiConsumer<EntityType<?>, class_5617<?>> vanillaHandler) {
|
||||
map.forEach(vanillaHandler);
|
||||
handler = vanillaHandler;
|
||||
}
|
||||
}
|
|
@ -25,20 +25,20 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.class_5614;
|
||||
import net.minecraft.class_5616;
|
||||
import net.minecraft.block.entity.BlockEntityType;
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
|
||||
|
||||
import net.fabricmc.fabric.impl.client.renderer.registry.BlockEntityRendererRegistryImpl;
|
||||
|
||||
@Mixin(BlockEntityRenderDispatcher.class)
|
||||
public abstract class MixinBlockEntityRenderDispatcher {
|
||||
@Shadow
|
||||
@Mixin(class_5616.class)
|
||||
public abstract class MixinBlockEntityRenderers {
|
||||
@Shadow()
|
||||
@Final
|
||||
private Map<BlockEntityType<?>, BlockEntityRenderer<?>> renderers;
|
||||
private static Map<BlockEntityType<?>, class_5614<?>> field_27752;
|
||||
|
||||
@Inject(at = @At("RETURN"), method = "<init>")
|
||||
private void init(CallbackInfo ci) {
|
||||
BlockEntityRendererRegistryImpl.setup(((t, function) -> renderers.put(t, function.apply((BlockEntityRenderDispatcher) (Object) this))));
|
||||
@Inject(at = @At("RETURN"), method = "<clinit>*")
|
||||
private static void init(CallbackInfo ci) {
|
||||
BlockEntityRendererRegistryImpl.setup(((t, factory) -> field_27752.put(t, factory)));
|
||||
}
|
||||
}
|
|
@ -1,77 +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.fabricmc.fabric.mixin.client.renderer.registry;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
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;
|
||||
|
||||
import net.minecraft.client.render.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.render.entity.EntityRenderer;
|
||||
import net.minecraft.client.render.entity.LivingEntityRenderer;
|
||||
import net.minecraft.client.render.entity.PlayerEntityRenderer;
|
||||
import net.minecraft.client.render.item.ItemRenderer;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.resource.ReloadableResourceManager;
|
||||
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.LivingEntityFeatureRendererRegistrationCallback;
|
||||
import net.fabricmc.fabric.impl.client.renderer.registry.RegistrationHelperImpl;
|
||||
|
||||
@Mixin(EntityRenderDispatcher.class)
|
||||
public abstract class MixinEntityRenderDispatcher {
|
||||
@Shadow
|
||||
@Final
|
||||
private Map<EntityType<?>, EntityRenderer<?>> renderers;
|
||||
|
||||
@Shadow
|
||||
@Final
|
||||
private Map<String, PlayerEntityRenderer> modelRenderers;
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@Inject(method = "registerRenderers", at = @At(value = "TAIL"))
|
||||
public void onRegisterRenderers(ItemRenderer itemRenderer, ReloadableResourceManager manager, CallbackInfo info) {
|
||||
final EntityRenderDispatcher me = (EntityRenderDispatcher) (Object) this;
|
||||
EntityRendererRegistry.INSTANCE.initialize(me, me.textureManager, manager, itemRenderer, renderers);
|
||||
|
||||
// Dispatch events to register feature renderers.
|
||||
for (Map.Entry<EntityType<?>, EntityRenderer<?>> entry : this.renderers.entrySet()) {
|
||||
if (entry.getValue() instanceof LivingEntityRenderer) { // Must be living for features
|
||||
LivingEntityRendererAccessor accessor = (LivingEntityRendererAccessor) entry.getValue();
|
||||
|
||||
LivingEntityFeatureRendererRegistrationCallback.EVENT.invoker().registerRenderers((EntityType<? extends LivingEntity>) entry.getKey(), (LivingEntityRenderer) entry.getValue(), new RegistrationHelperImpl(accessor::callAddFeature));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@Inject(method = "<init>", at = @At("TAIL"))
|
||||
private void afterRegisterPlayerModels(CallbackInfo ci) {
|
||||
// Players are a fun case, we need to do these separately and per model type
|
||||
for (Map.Entry<String, PlayerEntityRenderer> entry : this.modelRenderers.entrySet()) {
|
||||
LivingEntityRendererAccessor accessor = (LivingEntityRendererAccessor) entry.getValue();
|
||||
|
||||
LivingEntityFeatureRendererRegistrationCallback.EVENT.invoker().registerRenderers(EntityType.PLAYER, entry.getValue(), new RegistrationHelperImpl(accessor::callAddFeature));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* 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.fabricmc.fabric.mixin.client.renderer.registry;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
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.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.class_5617;
|
||||
import net.minecraft.class_5619;
|
||||
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
||||
import net.minecraft.client.render.entity.EntityRenderer;
|
||||
import net.minecraft.client.render.entity.LivingEntityRenderer;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.LivingEntityFeatureRendererRegistrationCallback;
|
||||
import net.fabricmc.fabric.impl.client.renderer.registry.RegistrationHelperImpl;
|
||||
import net.fabricmc.fabric.impl.client.renderer.registry.EntityRendererRegistryImpl;
|
||||
|
||||
@Mixin(class_5619.class)
|
||||
public abstract class MixinEntityRenderers {
|
||||
@Shadow()
|
||||
@Final
|
||||
private static Map<EntityType<?>, class_5617<?>> field_27768;
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@Inject(method = "<clinit>*", at = @At(value = "RETURN"))
|
||||
private static void onRegisterRenderers(CallbackInfo info) {
|
||||
EntityRendererRegistryImpl.setup(((t, factory) -> field_27768.put(t, factory)));
|
||||
}
|
||||
|
||||
// synthetic lambda in method_32176
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@Redirect(method = "method_32174", at = @At(value = "INVOKE", target = "Lnet/minecraft/class_5617;create(Lnet/minecraft/class_5617$class_5618;)Lnet/minecraft/client/render/entity/EntityRenderer;"))
|
||||
private static EntityRenderer<?> createEntityRenderer(class_5617<?> entityRendererFactory, class_5617.class_5618 context, ImmutableMap.Builder builder, class_5617.class_5618 context2, EntityType<?> entityType) {
|
||||
EntityRenderer<?> entityRenderer = entityRendererFactory.create(context);
|
||||
|
||||
if (entityRenderer instanceof LivingEntityRenderer) { // Must be living for features
|
||||
LivingEntityRendererAccessor accessor = (LivingEntityRendererAccessor) entityRenderer;
|
||||
LivingEntityFeatureRendererRegistrationCallback.EVENT.invoker().registerRenderers((EntityType<? extends LivingEntity>) entityType, (LivingEntityRenderer) entityRenderer, new RegistrationHelperImpl(accessor::callAddFeature), context);
|
||||
}
|
||||
|
||||
return entityRenderer;
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@Redirect(method = "method_32175", at = @At(value = "INVOKE", target = "Lnet/minecraft/class_5617;create(Lnet/minecraft/class_5617$class_5618;)Lnet/minecraft/client/render/entity/EntityRenderer;"))
|
||||
private static EntityRenderer<? extends PlayerEntity> createPlayerEntityRenderer(class_5617<AbstractClientPlayerEntity> playerEntityRendererFactory, class_5617.class_5618 context, ImmutableMap.Builder builder, class_5617.class_5618 context2, String str, class_5617<AbstractClientPlayerEntity> playerEntityRendererFactory2) {
|
||||
EntityRenderer<? extends PlayerEntity> entityRenderer = playerEntityRendererFactory.create(context);
|
||||
|
||||
LivingEntityRendererAccessor accessor = (LivingEntityRendererAccessor) entityRenderer;
|
||||
LivingEntityFeatureRendererRegistrationCallback.EVENT.invoker().registerRenderers(EntityType.PLAYER, (LivingEntityRenderer) entityRenderer, new RegistrationHelperImpl(accessor::callAddFeature), context);
|
||||
|
||||
return entityRenderer;
|
||||
}
|
||||
}
|
|
@ -4,8 +4,8 @@
|
|||
"compatibilityLevel": "JAVA_8",
|
||||
"client": [
|
||||
"LivingEntityRendererAccessor",
|
||||
"MixinBlockEntityRenderDispatcher",
|
||||
"MixinEntityRenderDispatcher"
|
||||
"MixinBlockEntityRenderers",
|
||||
"MixinEntityRenderers"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package net.fabricmc.fabric.test.renderer.registry;
|
||||
|
||||
import net.minecraft.class_5617;
|
||||
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
||||
import net.minecraft.client.render.VertexConsumerProvider;
|
||||
import net.minecraft.client.render.entity.ArmorStandEntityRenderer;
|
||||
|
@ -44,7 +45,7 @@ public class FeatureRendererGenericTests implements ClientModInitializer {
|
|||
@Override
|
||||
public void onInitializeClient() {
|
||||
// These aren't tests in the normal sense. These exist to test that generics are sane.
|
||||
LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper) -> {
|
||||
LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper, context) -> {
|
||||
if (entityRenderer instanceof PlayerEntityRenderer) {
|
||||
registrationHelper.register(new TestPlayerFeature((PlayerEntityRenderer) entityRenderer));
|
||||
|
||||
|
@ -57,7 +58,7 @@ public class FeatureRendererGenericTests implements ClientModInitializer {
|
|||
}
|
||||
|
||||
// Obviously not recommended, just used for testing generics
|
||||
registrationHelper.register(new ElytraFeatureRenderer<>(entityRenderer));
|
||||
registrationHelper.register(new ElytraFeatureRenderer<>(entityRenderer, context.method_32170()));
|
||||
|
||||
if (entityRenderer instanceof BipedEntityRenderer) {
|
||||
// It works, method ref is encouraged
|
||||
|
@ -68,7 +69,7 @@ public class FeatureRendererGenericTests implements ClientModInitializer {
|
|||
LivingEntityFeatureRendererRegistrationCallback.EVENT.register(this::registerFeatures);
|
||||
}
|
||||
|
||||
private void registerFeatures(EntityType<? extends LivingEntity> entityType, LivingEntityRenderer<?, ?> entityRenderer, LivingEntityFeatureRendererRegistrationCallback.RegistrationHelper registrationHelper) {
|
||||
private void registerFeatures(EntityType<? extends LivingEntity> entityType, LivingEntityRenderer<?, ?> entityRenderer, LivingEntityFeatureRendererRegistrationCallback.RegistrationHelper registrationHelper, class_5617.class_5618 context) {
|
||||
if (entityRenderer instanceof PlayerEntityRenderer) {
|
||||
registrationHelper.register(new TestPlayerFeature((PlayerEntityRenderer) entityRenderer));
|
||||
|
||||
|
@ -81,7 +82,7 @@ public class FeatureRendererGenericTests implements ClientModInitializer {
|
|||
}
|
||||
|
||||
// Obviously not recommended, just used for testing generics.
|
||||
registrationHelper.register(new ElytraFeatureRenderer<>(entityRenderer));
|
||||
registrationHelper.register(new ElytraFeatureRenderer<>(entityRenderer, context.method_32170()));
|
||||
|
||||
if (entityRenderer instanceof BipedEntityRenderer) {
|
||||
// It works, method ref is encouraged
|
||||
|
|
|
@ -33,8 +33,8 @@ import net.minecraft.entity.EntityType;
|
|||
import net.minecraft.util.registry.Registry;
|
||||
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.LivingEntityFeatureRendererRegistrationCallback;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
|
||||
|
||||
public final class FeatureRendererTest implements ClientModInitializer {
|
||||
private static final Logger LOGGER = LogManager.getLogger(FeatureRendererTest.class);
|
||||
|
@ -43,7 +43,7 @@ public final class FeatureRendererTest implements ClientModInitializer {
|
|||
@Override
|
||||
public void onInitializeClient() {
|
||||
LOGGER.info("Registering test feature renderer");
|
||||
LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper) -> {
|
||||
LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper, context) -> {
|
||||
// minecraft:player SHOULD be printed twice
|
||||
LOGGER.info(String.format("Received registration for %s", Registry.ENTITY_TYPE.getId(entityType)));
|
||||
|
||||
|
|
|
@ -19,15 +19,12 @@ package net.fabricmc.fabric.impl.resource.loader;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import net.minecraft.resource.ResourcePack;
|
||||
import net.minecraft.resource.ResourcePackProfile;
|
||||
import net.minecraft.resource.ResourcePackProvider;
|
||||
import net.minecraft.resource.ResourcePackSource;
|
||||
import net.minecraft.resource.ResourceType;
|
||||
import net.minecraft.resource.metadata.PackResourceMetadata;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
|
||||
import net.fabricmc.fabric.api.resource.ModResourcePack;
|
||||
|
|
|
@ -8,5 +8,6 @@ minecraft {
|
|||
dependencies {
|
||||
compile(project(path: ':fabric-api-base', configuration: 'dev'))
|
||||
compile(project(path: ':fabric-networking-v0', configuration: 'dev'))
|
||||
testmodCompile(project(path: ':fabric-object-builder-api-v1', configuration: 'dev'))
|
||||
testmodRuntimeOnly(project(path: ':fabric-resource-loader-v0', configuration: 'dev'))
|
||||
}
|
||||
|
|
|
@ -73,8 +73,8 @@ public final class ClientNetworking implements ClientModInitializer {
|
|||
PlayerEntity player = client.player;
|
||||
|
||||
Screen screen = screenFactory.create(
|
||||
((ExtendedScreenHandlerType<?>) type).create(syncId, player.inventory, buf),
|
||||
player.inventory,
|
||||
((ExtendedScreenHandlerType<?>) type).create(syncId, player.method_31548(), buf),
|
||||
player.method_31548(),
|
||||
title
|
||||
);
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ import net.fabricmc.fabric.test.screenhandler.item.PositionedBagItem;
|
|||
import net.fabricmc.fabric.test.screenhandler.screen.BagScreenHandler;
|
||||
import net.fabricmc.fabric.test.screenhandler.screen.BoxScreenHandler;
|
||||
import net.fabricmc.fabric.test.screenhandler.screen.PositionedBagScreenHandler;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
|
||||
|
||||
public class ScreenHandlerTest implements ModInitializer {
|
||||
public static final String ID = "fabric-screen-handler-api-v1-testmod";
|
||||
|
@ -44,7 +45,7 @@ public class ScreenHandlerTest implements ModInitializer {
|
|||
public static final Item POSITIONED_BAG = new PositionedBagItem(new Item.Settings().group(ItemGroup.TOOLS).maxCount(1));
|
||||
public static final Block BOX = new BoxBlock(AbstractBlock.Settings.copy(Blocks.OAK_WOOD));
|
||||
public static final Item BOX_ITEM = new BlockItem(BOX, new Item.Settings().group(ItemGroup.DECORATIONS));
|
||||
public static final BlockEntityType<BoxBlockEntity> BOX_ENTITY = BlockEntityType.Builder.create(BoxBlockEntity::new, BOX).build(null);
|
||||
public static final BlockEntityType<BoxBlockEntity> BOX_ENTITY = FabricBlockEntityTypeBuilder.create(BoxBlockEntity::new, BOX).build();
|
||||
public static final ScreenHandlerType<BagScreenHandler> BAG_SCREEN_HANDLER = ScreenHandlerRegistry.registerSimple(id("bag"), BagScreenHandler::new);
|
||||
public static final ScreenHandlerType<PositionedBagScreenHandler> POSITIONED_BAG_SCREEN_HANDLER = ScreenHandlerRegistry.registerExtended(id("positioned_bag"), PositionedBagScreenHandler::new);
|
||||
public static final ScreenHandlerType<BoxScreenHandler> BOX_SCREEN_HANDLER = ScreenHandlerRegistry.registerExtended(id("box"), BoxScreenHandler::new);
|
||||
|
|
|
@ -29,7 +29,6 @@ import net.minecraft.util.Hand;
|
|||
import net.minecraft.util.ItemScatterer;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BoxBlock extends BlockWithEntity {
|
||||
|
@ -51,8 +50,8 @@ public class BoxBlock extends BlockWithEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockEntity createBlockEntity(BlockView world) {
|
||||
return new BoxBlockEntity();
|
||||
public BlockEntity createBlockEntity(BlockPos blockPos, BlockState blockState) {
|
||||
return new BoxBlockEntity(blockPos, blockState);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package net.fabricmc.fabric.test.screenhandler.block;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.entity.LootableContainerBlockEntity;
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
@ -25,6 +26,7 @@ import net.minecraft.server.network.ServerPlayerEntity;
|
|||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
import net.minecraft.util.collection.DefaultedList;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory;
|
||||
import net.fabricmc.fabric.test.screenhandler.ScreenHandlerTest;
|
||||
|
@ -33,8 +35,8 @@ import net.fabricmc.fabric.test.screenhandler.screen.BoxScreenHandler;
|
|||
public class BoxBlockEntity extends LootableContainerBlockEntity implements ExtendedScreenHandlerFactory {
|
||||
private DefaultedList<ItemStack> items = DefaultedList.ofSize(size(), ItemStack.EMPTY);
|
||||
|
||||
public BoxBlockEntity() {
|
||||
super(ScreenHandlerTest.BOX_ENTITY);
|
||||
public BoxBlockEntity(BlockPos blockPos, BlockState blockState) {
|
||||
super(ScreenHandlerTest.BOX_ENTITY, blockPos, blockState);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -28,10 +28,10 @@ import net.minecraft.world.gen.feature.StructureFeature;
|
|||
|
||||
@Mixin(Biome.class)
|
||||
public interface BiomeAccessor {
|
||||
@Accessor("field_26634")
|
||||
@Accessor("structures")
|
||||
Map<Integer, List<StructureFeature<?>>> getStructureLists();
|
||||
|
||||
@Mutable
|
||||
@Accessor("field_26634")
|
||||
@Accessor("structures")
|
||||
void setStructureLists(Map<Integer, List<StructureFeature<?>>> field_26634);
|
||||
}
|
||||
|
|
|
@ -18,8 +18,7 @@
|
|||
"depends": {
|
||||
"fabricloader": ">=0.4.0",
|
||||
"fabric-api-base": "*",
|
||||
"fabric-resource-loader-v0": "*",
|
||||
"minecraft": "~1.16-alpha.20.14.a"
|
||||
"fabric-resource-loader-v0": "*"
|
||||
},
|
||||
"description": "Hooks for tags.",
|
||||
"mixins": [
|
||||
|
|
|
@ -175,7 +175,7 @@ public final class ToolManagerImpl {
|
|||
*/
|
||||
public static boolean handleIsEffectiveOnIgnoresVanilla(BlockState state, ItemStack stack, @Nullable LivingEntity user, boolean vanillaResult) {
|
||||
for (Map.Entry<Tag<Item>, Event<ToolHandler>> eventEntry : HANDLER_MAP.entrySet()) {
|
||||
if (stack.getItem().isIn(eventEntry.getKey())) {
|
||||
if (stack.method_31573(eventEntry.getKey())) {
|
||||
ActionResult effective = eventEntry.getValue().invoker().isEffectiveOn(eventEntry.getKey(), state, stack, user);
|
||||
if (effective.isAccepted()) return true;
|
||||
effective = general().invoker().isEffectiveOn(eventEntry.getKey(), state, stack, user);
|
||||
|
@ -194,7 +194,7 @@ public final class ToolManagerImpl {
|
|||
boolean handled = false;
|
||||
|
||||
for (Map.Entry<Tag<Item>, Event<ToolHandler>> eventEntry : HANDLER_MAP.entrySet()) {
|
||||
if (stack.getItem().isIn(eventEntry.getKey())) {
|
||||
if (stack.method_31573(eventEntry.getKey())) {
|
||||
TypedActionResult<Float> speedMultiplier = Objects.requireNonNull(eventEntry.getValue().invoker().getMiningSpeedMultiplier(eventEntry.getKey(), state, stack, user));
|
||||
|
||||
if (speedMultiplier.getResult().isAccepted()) {
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
],
|
||||
"depends": {
|
||||
"fabricloader": ">=0.8.9",
|
||||
"minecraft": "~1.16.2-alpha.20.28.a"
|
||||
"minecraft": "~1.17-alpha.20.45.a"
|
||||
},
|
||||
"description": "Core API module providing key hooks and intercompatibility features."
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue