Skip to content

Commit

Permalink
delayed Entity render assignment
Browse files Browse the repository at this point in the history
  • Loading branch information
UselessBullets committed May 7, 2024
1 parent 3760fad commit f4fa467
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 5 deletions.
22 changes: 19 additions & 3 deletions src/main/java/turniplabs/halplibe/helper/EntityHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,40 @@
import net.minecraft.core.block.entity.TileEntity;
import net.minecraft.core.entity.Entity;
import net.minecraft.core.entity.EntityDispatcher;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import turniplabs.halplibe.HalpLibe;
import turniplabs.halplibe.mixin.accessors.RenderManagerAccessor;
import turniplabs.halplibe.mixin.accessors.TileEntityAccessor;
import turniplabs.halplibe.mixin.accessors.TileEntityRendererAccessor;
import turniplabs.halplibe.mixin.mixins.models.EntityRenderDispatcherMixin;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;

final public class EntityHelper {
/**
* Used in {@link EntityRenderDispatcherMixin#addQueuedModels(CallbackInfo)}
*/
private static boolean entityRendererDispatcherInitialized = false;
private static final Map<Class<? extends Entity> , Supplier<EntityRenderer<?>>> queuedEntityRenderer = new HashMap<>();
public static void queueEntityRenderer(@NotNull Class<? extends Entity> clazz, @NotNull Supplier<EntityRenderer<?>> rendererSupplier){
if (!HalpLibe.isClient) return;
if (rendererSupplier == null) return;

public static void createEntity(Class<? extends Entity> clazz, int id, String name, Supplier<EntityRenderer<?>> rendererSupplier) {
EntityDispatcher.addMapping(clazz, name, id);
if (HalpLibe.isClient){
if (entityRendererDispatcherInitialized){
Map<Class<? extends Entity>, EntityRenderer<?>> entityRenderMap = ((RenderManagerAccessor) EntityRenderDispatcher.instance).getEntityRenderMap();
EntityRenderer<?> renderer = rendererSupplier.get();
entityRenderMap.put(clazz, renderer);
renderer.setRenderDispatcher(EntityRenderDispatcher.instance);
return;
}
queuedEntityRenderer.put(clazz, rendererSupplier);
}
public static void createEntity(Class<? extends Entity> clazz, int id, String name, @NotNull Supplier<EntityRenderer<?>> rendererSupplier) {
EntityDispatcher.addMapping(clazz, name, id);
queueEntityRenderer(clazz, rendererSupplier);
}

public static void createTileEntity(Class<? extends TileEntity> clazz, String name) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package turniplabs.halplibe.mixin.mixins.models;

import net.minecraft.client.render.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.core.entity.Entity;
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 turniplabs.halplibe.helper.BlockBuilder;
import turniplabs.halplibe.helper.EntityHelper;

import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;

@Mixin(value = EntityRenderDispatcher.class, remap = false)
public abstract class EntityRenderDispatcherMixin {
@Shadow @Final private Map<Class<?>, EntityRenderer<?>> renderers;

@Inject(method = "<init>()V", at = @At("TAIL"))
private void addQueuedModels(CallbackInfo ci){
try {
Set<Map.Entry<Class<? extends Entity> , Supplier<EntityRenderer<?>>>> entries = ((Map<Class<? extends Entity> , Supplier<EntityRenderer<?>>>) EntityHelper.class.getField("queueEntityRenderer").get(null)).entrySet();
for (Map.Entry<Class<? extends Entity> , Supplier<EntityRenderer<?>>> entry : entries){
renderers.put(entry.getKey(), entry.getValue().get());
}
BlockBuilder.class.getField("entityRendererDispatcherInitialized").set(null, true);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
5 changes: 3 additions & 2 deletions src/main/resources/halplibe.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"mixins.ContainerPlayerCreativeMixin",
"mixins.I18nMixin",
"mixins.commands.CommandsCoreMixin",
"mixins.models.EntityRenderDispatcherMixin",
"mixins.network.PacketMixin",
"mixins.registry.BlockMixin",
"mixins.registry.ItemMixin"
Expand All @@ -26,12 +27,12 @@
"mixins.EntityClientPlayerMPMixin",
"mixins.GuiIngameMenuMixin",
"mixins.MinecraftMixin",
"mixins.commands.CommandsClientMixin",
"mixins.network.MinecraftMixin",
"mixins.NetClientHandlerMixin",
"mixins.commands.CommandsClientMixin",
"mixins.models.BlockColorDispatcherMixin",
"mixins.models.BlockModelDispatcherMixin",
"mixins.models.ItemModelDispatcherMixin",
"mixins.network.MinecraftMixin",
"mixins.registry.MinecraftMixin",
"mixins.version.NetClientHandlerMixin"
],
Expand Down

0 comments on commit f4fa467

Please sign in to comment.