Added FabricBlockEntityTypeBuilder
Reworked EntityRendererRegistry
Ported BlockEntityRendererRegistry
This commit is contained in:
modmuss50 2020-11-05 18:05:55 +00:00 committed by GitHub
parent 9cb915787f
commit fd6e7547e7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
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
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

View file

@ -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"
}

View file

@ -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 {

View file

@ -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()));

View file

@ -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;

View file

@ -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)

View file

@ -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;

View file

@ -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;

View file

@ -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);
}
}

View file

@ -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

View file

@ -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 {

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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.

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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)));
}
}

View file

@ -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));
}
}
}

View file

@ -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;
}
}

View file

@ -4,8 +4,8 @@
"compatibilityLevel": "JAVA_8",
"client": [
"LivingEntityRendererAccessor",
"MixinBlockEntityRenderDispatcher",
"MixinEntityRenderDispatcher"
"MixinBlockEntityRenderers",
"MixinEntityRenderers"
],
"injectors": {
"defaultRequire": 1

View file

@ -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

View file

@ -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)));

View file

@ -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;

View file

@ -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'))
}

View file

@ -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
);

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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);
}

View file

@ -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": [

View file

@ -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()) {

View file

@ -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."
}