Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions libraries/entities-rendering/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Entities Rendering API

The Entities Rendering API provides events and utilities for registering and working with entity renderers.

## Registering Custom Entity Renderers

Entity renderer registration should be done in a listener to the `REGISTER_ENTITY_RENDERERS` event.

An example is shown below.

```java
package com.example;

import net.ornithemc.osl.entities.api.client.EntityRenderingEvents;
import net.ornithemc.osl.entrypoints.api.client.ClientModInitializer;

public class ExampleInitializer implements ClientModInitializer {

@Override
public void initClient() {
EntityRenderingEvents.REGISTER_ENTITY_RENDERERS.register(registry -> {
registry.register(CookieMonsterEntity.class, CookieMonsterRenderer::new);
});
}
}
```
1 change: 1 addition & 0 deletions libraries/entities-rendering/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
setUpLibrary(project)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
setUpModule(project)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
environment = client
min_mc_version = 14w05a
max_mc_version = 1.14.4

minecraft_version = 1.12.2
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package net.ornithemc.osl.entities.api.client;

import java.util.function.Function;

import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.entity.Entity;

/**
* A wrapper around the {@linkplain EntityRenderDispatcher} renderers map.
*/
@FunctionalInterface
public interface EntityRendererRegistry {

/**
* Registers the given entity renderer for the given entity type.
*
* @param <T> the entity type for which to register the renderer.
* @param type the entity type class.
* @param factory the factory for the entity renderer to register.
*/
<T extends Entity> void register(Class<T> type, Function<EntityRenderDispatcher, EntityRenderer<? super T>> factory);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package net.ornithemc.osl.entities.api.client;

import java.util.function.Consumer;

import net.ornithemc.osl.core.api.events.Event;

/**
* Events related to the entities rendering lifecycle.
*/
public final class EntityRenderingEvents {

/**
* This event is invoked upon client start-up, after Vanilla entity renderer registration is finished.
*
* <p>
* Custom entity renderer registration should be done in a listener of this event.
*
* <p>
* Listeners to this event should be registered in your mod's entrypoint,
* and can be done as follows:
*
* <pre>
* {@code
* EntityRenderingEvents.REGISTER_ENTITY_RENDERERS.register(registry -> {
* registry.register(CookieMonsterEntity.class, CookieMonsterRenderer::new);
* });
* }
* </pre>
*
* @see EntityRendererRegistry
*/
public static final Event<Consumer<EntityRendererRegistry>> REGISTER_ENTITY_RENDERERS = Event.consumer();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package net.ornithemc.osl.entities.impl;

import java.util.List;
import java.util.Set;

import org.objectweb.asm.tree.ClassNode;

import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;

import net.ornithemc.osl.core.impl.util.MinecraftVersion;

public class EntitiesRenderingMixinPlugin implements IMixinConfigPlugin {

@Override
public void onLoad(String mixinPackage) {
}

@Override
public String getRefMapperConfig() {
return null;
}

@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
if ("net.ornithemc.osl.entities.impl.mixin.client.EntityRenderDispatcherMixinNew".equals(mixinClassName)) {
return MinecraftVersion.resolve().compareTo("18w50a") >= 0;
}
if ("net.ornithemc.osl.entities.impl.mixin.client.EntityRenderDispatcherMixinOld".equals(mixinClassName)) {
return MinecraftVersion.resolve().compareTo("18w50a") < 0;
}

return true;
}

@Override
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
}

@Override
public List<String> getMixins() {
return null;
}

@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}

@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package net.ornithemc.osl.entities.impl.mixin.client;

import java.util.function.Function;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.entity.Entity;

import net.ornithemc.osl.entities.api.client.EntityRenderingEvents;

@Mixin(EntityRenderDispatcher.class)
public class EntityRenderDispatcherMixinNew {

@Shadow
private <T extends Entity> void m_74922622(Class<T> type, EntityRenderer<? super T> renderer) { }

@Inject(
method = "<init>",
at = @At(
value = "TAIL"
)
)
private void osl$entities$registerEntityRenderers(CallbackInfo ci) {
EntityRenderingEvents.REGISTER_ENTITY_RENDERERS.invoker().accept(this::register);
}

@Unique
private <T extends Entity> void register(Class<T> type, Function<EntityRenderDispatcher, EntityRenderer<? super T>> factory) {
this.m_74922622(type, factory.apply((EntityRenderDispatcher) (Object) this));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package net.ornithemc.osl.entities.impl.mixin.client;

import java.util.Map;
import java.util.function.Function;

import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.entity.Entity;

import net.ornithemc.osl.entities.api.client.EntityRenderingEvents;

@Mixin(EntityRenderDispatcher.class)
public class EntityRenderDispatcherMixinOld {

@Shadow @Final
private Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> renderers;

@Inject(
method = "<init>",
at = @At(
value = "TAIL"
)
)
private void osl$entities$registerEntityRenderers(CallbackInfo ci) {
EntityRenderingEvents.REGISTER_ENTITY_RENDERERS.invoker().accept(this::register);
}

@Unique
private <T extends Entity> void register(Class<T> type, Function<EntityRenderDispatcher, EntityRenderer<? super T>> factory) {
this.renderers.put(type, factory.apply((EntityRenderDispatcher) (Object) this));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"schemaVersion": 1,
"id": "osl-entities-rendering",
"version": "0.1.0+mc14w05a-mc1.14.4",
"environment": "client",
"mixins": [
"osl.entities-rendering.mixins.json"
],
"depends": {
"fabricloader": "\u003e\u003d0.18.0",
"minecraft": "\u003e\u003d1.8-alpha.14.5.a \u003c\u003d1.14.4",
"osl-core": "\u003e\u003d0.9.0",
"osl-entrypoints": "\u003e\u003d0.5.0"
},
"name": "OSL Entities Rendering",
"description": "Entities Rendering API and events.",
"authors": [
"OrnitheMC"
],
"contact": {
"homepage": "https://ornithemc.net/",
"issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues",
"sources": "https://github.com/OrnitheMC/ornithe-standard-libraries"
},
"license": "Apache-2.0"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"required": true,
"minVersion": "0.8",
"package": "net.ornithemc.osl.entities.impl.mixin",
"compatibilityLevel": "JAVA_8",
"plugin": "net.ornithemc.osl.entities.impl.EntitiesRenderingMixinPlugin",
"mixins": [
],
"client": [
"client.EntityRenderDispatcherMixinNew",
"client.EntityRenderDispatcherMixinOld"
],
"server": [
],
"injectors": {
"defaultRequire": 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
setUpModule(project)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
environment = client
min_mc_version = a1.0.1_01
max_mc_version = 14w04b

minecraft_version = 1.7.2
raven_build = 1
sparrow_build = 1
nests_build = 3
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package net.ornithemc.osl.entities.api.client;

import java.util.function.Supplier;

import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.entity.Entity;

/**
* A wrapper around the {@linkplain EntityRenderDispatcher} renderers map.
*/
@FunctionalInterface
public interface EntityRendererRegistry {

/**
* Registers the given entity renderer for the given entity type.
*
* @param <T> the entity type for which to register the renderer.
* @param type the entity type class.
* @param factory the factory for the entity renderer to register.
*/
<T extends Entity> void register(Class<T> type, Supplier<EntityRenderer<? super T>> factory);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package net.ornithemc.osl.entities.api.client;

import java.util.function.Consumer;

import net.ornithemc.osl.core.api.events.Event;

/**
* Events related to the entities rendering lifecycle.
*/
public final class EntityRenderingEvents {

/**
* This event is invoked upon client start-up, after Vanilla entity renderer registration is finished.
*
* <p>
* Custom entity renderer registration should be done in a listener of this event.
*
* <p>
* Listeners to this event should be registered in your mod's entrypoint,
* and can be done as follows:
*
* <pre>
* {@code
* EntityRenderingEvents.REGISTER_ENTITY_RENDERERS.register(registry -> {
* registry.register(CookieMonsterEntity.class, CookieMonsterRenderer::new);
* });
* }
* </pre>
*
* @see EntityRendererRegistry
*/
public static final Event<Consumer<EntityRendererRegistry>> REGISTER_ENTITY_RENDERERS = Event.consumer();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package net.ornithemc.osl.entities.impl.mixin.client;

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

import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.entity.Entity;

import net.ornithemc.osl.entities.api.client.EntityRenderingEvents;

@Mixin(EntityRenderDispatcher.class)
public class EntityRenderDispatcherMixin {

@Shadow @Final
private Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> renderers;

@Inject(
method = "<init>",
at = @At(
value = "INVOKE",
target = "Ljava/util/Map;values()Ljava/util/Collection;"
)
)
private void osl$entities$registerEntityRenderers(CallbackInfo ci) {
EntityRenderingEvents.REGISTER_ENTITY_RENDERERS.invoker().accept(this::register);
}

@Unique
private <T extends Entity> void register(Class<T> type, Supplier<EntityRenderer<? super T>> factory) {
this.renderers.put(type, factory.get());
}
}
Loading
Loading