Skip to content
This repository was archived by the owner on May 20, 2025. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
16cf3e1
drop 1.21.1, begin implementing render state data abstractions
celestialfault May 13, 2025
b39f702
more stonecutter statements
celestialfault May 13, 2025
d19542c
make this actually function
celestialfault May 13, 2025
c4ad643
fix 1.21.5 build
celestialfault May 13, 2025
3eb7161
make it hashable
celestialfault May 13, 2025
ee5590e
actually fix 1.21.5 this time
celestialfault May 13, 2025
0997bf5
make overlay use this
celestialfault May 13, 2025
f87a613
rename
celestialfault May 13, 2025
669c2f9
move this up out of its own package
celestialfault May 13, 2025
cee13b1
use render state for bobber timer
celestialfault May 14, 2025
c0ae7d1
add a bunch of docs
celestialfault May 14, 2025
e7b5203
support modifying nearly every entity's nametag visibility
celestialfault May 14, 2025
be3e964
rename these
celestialfault May 14, 2025
ac473e4
fix build yet again
celestialfault May 14, 2025
ac3d30d
xmap
celestialfault May 14, 2025
43ca798
Merge remote-tracking branch 'upstream/main' into refactor/render-sta…
celestialfault May 14, 2025
054ec2d
some assorted changes
celestialfault May 14, 2025
8f01515
cache skyblock item data on the itemstack
celestialfault May 14, 2025
8bfc0a5
clean up copy item
celestialfault May 14, 2025
b5b0470
copy these todos from the hide armor pr
celestialfault May 15, 2025
ae9ef01
back to json this goes
celestialfault May 17, 2025
d2734b7
Merge branch 'main' into refactor/render-state-data
celestialfault May 18, 2025
84c6388
add annotation
celestialfault May 18, 2025
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
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ stonecutter {
centralScript = "build.gradle.kts"

shared {
versions("1.21", "1.21.3", "1.21.4", "1.21.5")
versions("1.21.3", "1.21.4", "1.21.5")
vcsVersion = "1.21.4"
}
create(rootProject)
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package me.nobaboy.nobaaddons.ducks;

import me.nobaboy.nobaaddons.utils.items.SkyBlockItemData;
import net.minecraft.component.ComponentHolder;
import net.minecraft.component.DataComponentTypes;
import org.jetbrains.annotations.NotNull;

public interface ItemSkyblockDataCache extends ComponentHolder {
@SuppressWarnings("unused") // loud incorrect buzzer
@NotNull SkyBlockItemData nobaaddons$getSkyblockData();

default SkyBlockItemData nobaaddons$createSkyblockItemData() {
return new SkyBlockItemData(() -> get(DataComponentTypes.CUSTOM_DATA), () -> get(DataComponentTypes.LORE), this::hashCode);
}
}
13 changes: 13 additions & 0 deletions src/main/java/me/nobaboy/nobaaddons/ducks/StateDataHolder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package me.nobaboy.nobaaddons.ducks;

import me.nobaboy.nobaaddons.utils.render.EntityDataKey;

import java.util.Map;

/**
* @see EntityDataKey
*/
public interface StateDataHolder {
@SuppressWarnings("unused") // incorrect
Map<EntityDataKey<?>, EntityDataKey<?>.Value> nobaaddons$getData();
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

//? if >=1.21.2 {
@Mixin(DrawContext.class)
public interface DrawContextAccessor {
@Accessor VertexConsumerProvider.Immediate getVertexConsumers();
}
//?}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package me.nobaboy.nobaaddons.mixins.duckimpl;

import me.nobaboy.nobaaddons.ducks.ItemSkyblockDataCache;
import me.nobaboy.nobaaddons.utils.items.SkyBlockItemData;
import me.nobaboy.nobaaddons.utils.properties.Holding;
import net.minecraft.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;

@SuppressWarnings("unused")
@Mixin(ItemStack.class)
abstract class ItemSkyblockDataCacheImpl implements ItemSkyblockDataCache {
@Unique
private final Holding<SkyBlockItemData> nobaaddons$skyblockData = new Holding<>();

@Override
public @NotNull SkyBlockItemData nobaaddons$getSkyblockData() {
return nobaaddons$skyblockData.getOrSet(this::nobaaddons$createSkyblockItemData);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.nobaboy.nobaaddons.mixins.duckimpl;

import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap;
import me.nobaboy.nobaaddons.ducks.StateDataHolder;
import me.nobaboy.nobaaddons.utils.render.EntityDataKey;
import net.minecraft.client.render.entity.state.EntityRenderState;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;

import java.util.Map;

@SuppressWarnings("unused")
@Mixin({Entity.class, EntityRenderState.class})
class StateDataHolderImpl implements StateDataHolder {
// TODO it might be worth changing this to an Reference2ObjectOpenHashMap at some point if we start consistently
// adding enough things to this
@Unique
private final Reference2ObjectArrayMap<EntityDataKey<?>, EntityDataKey<?>.Value> nobaaddons$stateData = new Reference2ObjectArrayMap<>(32);

@Override
public Map<EntityDataKey<?>, EntityDataKey<?>.Value> nobaaddons$getData() {
return nobaaddons$stateData;
}
}
Original file line number Diff line number Diff line change
@@ -1,38 +1,37 @@
package me.nobaboy.nobaaddons.mixins.events;

//? if >=1.21.5 {
/*import me.nobaboy.nobaaddons.ducks.EntityStateCaptureDuck;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.entity.state.EntityRenderState;
/*import net.minecraft.client.MinecraftClient;
*///?}

import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
import me.nobaboy.nobaaddons.events.impl.client.EntityEvents;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.state.EntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

//? if >=1.21.2 {
// For whatever reason, the MC Dev plugin complains about this, but only on 1.21.2+.
// This is despite the fact that this is, in fact, a valid injector.
@SuppressWarnings("InvalidInjectorMethodSignature")
//?}
@Mixin(EntityRenderDispatcher.class)
abstract class EntityEventsMixin_EntityRenderDispatcher {
@Inject(
//? if >=1.21.5 {
/*method = "render(Lnet/minecraft/client/render/entity/state/EntityRenderState;DDDLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
*///?} else if >=1.21.2 {
method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
//?} else {
/*method = "render",
*///?}
at = @At("HEAD"),
*///?} else {
method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/render/entity/EntityRenderer;getPositionOffset(Lnet/minecraft/client/render/entity/state/EntityRenderState;)Lnet/minecraft/util/math/Vec3d;"
),
//?}
cancellable = true
)
public void nobaaddons$cancelEntityRender(
Expand All @@ -42,33 +41,27 @@ abstract class EntityEventsMixin_EntityRenderDispatcher {
Entity entity,
//?}
double x, double y, double z,
//? if <1.21.2 {
/*float yaw,
*///?}
//? if <1.21.5 {
float tickDelta,
//?}
MatrixStack matrices,VertexConsumerProvider vertexConsumers,
MatrixStack matrices, VertexConsumerProvider vertexConsumers,
int light,
//? if >=1.21.2 {
EntityRenderer<?, ?> renderer,
CallbackInfo ci /*? if <1.21.5 {*/,
@Local EntityRenderState state
//?}
CallbackInfo ci
) {
//? if >=1.21.5 {
/*Entity entity = ((EntityStateCaptureDuck) state).nobaaddons$getEntity();
*///?}
if(entity != null && EntityEvents.ALLOW_RENDER.dispatch(new EntityEvents.AllowRender(entity))) ci.cancel();
if(EntityEvents.ALLOW_RENDER.dispatch(new EntityEvents.AllowRender(state))) {
ci.cancel();
}
}

@Inject(
//? if >=1.21.5 {
/*method = "render(Lnet/minecraft/client/render/entity/state/EntityRenderState;DDDLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
*///?} else if >=1.21.2 {
*///?} else {
method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
//?} else {
/*method = "render",
*///?}
//?}
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/util/math/MatrixStack;push()V"
Expand All @@ -82,34 +75,31 @@ abstract class EntityEventsMixin_EntityRenderDispatcher {
Entity entity,
//?}
double x, double y, double z,
//? if <1.21.2 {
/*float yaw,
*///?}
//? if <1.21.5 {
float tickDelta,
//?}
MatrixStack matrices,VertexConsumerProvider vertexConsumers,
MatrixStack matrices, VertexConsumerProvider vertexConsumers,
int light,
//? if >=1.21.2 {
EntityRenderer<?, ?> renderer,
CallbackInfo ci /*? if <1.21.5 {*/,
@Local EntityRenderState state,
@Share(value = "renderState", namespace = "nobaaddons") LocalRef<EntityRenderState> stateRef
//?}
CallbackInfo ci
) {
//? if >=1.21.5 {
/*float tickDelta = MinecraftClient.getInstance().getRenderTickCounter().getTickProgress(true);
Entity entity = ((EntityStateCaptureDuck) state).nobaaddons$getEntity();
*///?}
if(entity != null) EntityEvents.PRE_RENDER.dispatch(new EntityEvents.Render(entity, tickDelta));
*///?} else {
stateRef.set(state);
//?}
EntityEvents.PRE_RENDER.dispatch(new EntityEvents.Render(state, tickDelta));
}

@Inject(
//? if >=1.21.5 {
/*method = "render(Lnet/minecraft/client/render/entity/state/EntityRenderState;DDDLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
*///?} else if >=1.21.2 {
*///?} else {
method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
//?} else {
/*method = "render",
*///?}
//?}
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/util/math/MatrixStack;pop()V"
Expand All @@ -123,23 +113,24 @@ abstract class EntityEventsMixin_EntityRenderDispatcher {
Entity entity,
//?}
double x, double y, double z,
//? if <1.21.2 {
/*float yaw,
*///?}
//? if <1.21.5 {
float tickDelta,
//?}
MatrixStack matrices,VertexConsumerProvider vertexConsumers,
int light,
//? if >=1.21.2 {
EntityRenderer<?, ?> renderer,
CallbackInfo ci /*? if <1.21.5 {*/,
// either this mcdev plugin is bullshitting me, or @Local genuinely cannot find the render state
// that's within the same try block as this pop call. i don't know, and it's not that much effort
// to just work around the issue one way or another.
@Share(value = "renderState", namespace = "nobaaddons") LocalRef<EntityRenderState> stateRef
//?}
CallbackInfo ci
) {
//? if >=1.21.5 {
/*float tickDelta = MinecraftClient.getInstance().getRenderTickCounter().getTickProgress(true);
Entity entity = ((EntityStateCaptureDuck) state).nobaaddons$getEntity();
*///?}
if(entity != null) EntityEvents.POST_RENDER.dispatch(new EntityEvents.Render(entity, tickDelta));
*///?} else {
var state = stateRef.get();
//?}
EntityEvents.POST_RENDER.dispatch(new EntityEvents.Render(state, tickDelta));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package me.nobaboy.nobaaddons.mixins.events;

import me.nobaboy.nobaaddons.events.impl.entity.EntityTickEvent;
import net.minecraft.entity.Entity;
import net.minecraft.world.World;
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;

@Mixin(Entity.class)
abstract class EntityTickEventMixin {
@Shadow
public abstract World getEntityWorld();

@Inject(method = "tick", at = @At("TAIL"))
public void nobaaddons$onEntityTick(CallbackInfo ci) {
if(!getEntityWorld().isClient()) return;
EntityTickEvent.EVENT.dispatch(new EntityTickEvent((Entity)(Object)this));
}
}
Loading