Skip to content

Commit f3420ac

Browse files
committed
I fought the RenderQueue and won
1 parent b446599 commit f3420ac

File tree

10 files changed

+124
-30
lines changed

10 files changed

+124
-30
lines changed

src/main/java/survivalblock/crossbow_scoping/client/ScopeRenderer.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,37 @@
99
import net.minecraft.client.Minecraft;
1010
import net.minecraft.client.multiplayer.ClientLevel;
1111
import net.minecraft.client.renderer.MultiBufferSource;
12+
//? if >1.21.8
13+
import net.minecraft.client.renderer.SubmitNodeCollector;
1214
import net.minecraft.client.renderer.entity.ItemRenderer;
1315
//? if >1.21.1
1416
import net.minecraft.client.renderer.item.ItemStackRenderState;
17+
//? if >1.21.8
18+
import net.minecraft.world.entity.ItemOwner;
1519
import net.minecraft.world.item.ItemDisplayContext;
1620
import net.minecraft.world.item.ItemStack;
1721
import survivalblock.crossbow_scoping.common.CrossbowScoping;
18-
import survivalblock.crossbow_scoping.common.init.CrossbowScopingDataComponentTypes;
19-
//? if >1.21.1
20-
import survivalblock.crossbow_scoping.mixin.crossbow.client.ItemRendererAccessor;
21-
22-
import java.util.Arrays;
22+
//? if >1.21.1 && <1.21.9
23+
/*import survivalblock.crossbow_scoping.mixin.crossbow.client.ItemRendererAccessor;*/
2324

2425
@Environment(EnvType.CLIENT)
2526
public final class ScopeRenderer {
2627

2728
//? if >1.21.1 {
2829
public static final RenderStateDataKey<ItemStack> SCOPE = RenderStateDataKey.create(CrossbowScoping.id("scope")::toString);
2930
public static final RenderStateDataKey<ItemStack> REVERSE_REFERENCE = RenderStateDataKey.create(CrossbowScoping.id("reverse_reference")::toString);
30-
31-
private static final ItemStackRenderState SCOPE_RENDER_STATE = new ItemStackRenderState();
3231
//?}
3332

33+
//? if <1.21.9
34+
/*private static final ItemStackRenderState SCOPE_RENDER_STATE = new ItemStackRenderState();*/
35+
36+
//? if >=1.21.10
37+
public static final RenderStateDataKey<ItemStackRenderState> CROSSBOW_TO_HEAD = RenderStateDataKey.create(CrossbowScoping.id("crossbow_to_head")::toString);
38+
3439
private ScopeRenderer() {
3540
}
3641

37-
public static void renderScopeOnCrossbow(ItemStack /*? <=1.21.1 {*/ /*stack *//*?} else {*/ scope /*?}*/, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay, ItemRenderer itemRenderer, Object... data) {
42+
public static void renderScopeOnCrossbow(ItemStack /*? <=1.21.1 {*/ /*stack *//*?} else {*/ scope /*?}*/, PoseStack matrices, /*? <=1.21.8 {*/ /*MultiBufferSource vertexConsumers *//*?} else {*/ SubmitNodeCollector renderQueue /*?}*/, int light, int overlay, ItemRenderer itemRenderer /*? >1.21.8 {*/, int outlineColor /*?}*/) {
3843
//? if <=1.21.1 {
3944
/*if (!(CrossbowScoping.isValidCrossbow(stack))) {
4045
return;
@@ -53,11 +58,15 @@ public static void renderScopeOnCrossbow(ItemStack /*? <=1.21.1 {*/ /*stack *//*
5358
itemRenderer.renderStatic(scope, displayContext, light, overlay, matrices, vertexConsumers, world, 0);
5459
*///?} else {
5560
matrices.translate(0, 0.1, 0.1);
56-
((ItemRendererAccessor) itemRenderer).crossbow_scoping$getItemModelManager().updateForTopItem(SCOPE_RENDER_STATE, scope, displayContext, world, null, 0);
61+
//? if >1.21.8
62+
final ItemStackRenderState SCOPE_RENDER_STATE = new ItemStackRenderState();
63+
/*? <=1.21.8 {*/ /*((ItemRendererAccessor) itemRenderer).crossbow_scoping$getItemModelManager() *//*?} else {*/ Minecraft.getInstance().getItemModelResolver() /*?}*/
64+
.updateForTopItem(SCOPE_RENDER_STATE, scope, displayContext, world, null, 0);
5765
SCOPE_RENDER_STATE.setAnimated();
5866
SCOPE_RENDER_STATE.appendModelIdentityElement("crossbow_scoping:scope");
59-
SCOPE_RENDER_STATE.render(matrices, vertexConsumers, light, overlay);
60-
SCOPE_RENDER_STATE.clear();
67+
SCOPE_RENDER_STATE./*? <=1.21.8 {*/ /*render *//*?} else {*/ submit /*?}*/(matrices, /*? <=1.21.8 {*/ /*vertexConsumers *//*?} else {*/ renderQueue /*?}*/, light, overlay /*? >1.21.8 {*/, outlineColor /*?}*/);
68+
//? if <1.21.9
69+
/*SCOPE_RENDER_STATE.clear();*/
6170
//?}
6271
matrices.popPose();
6372
}

src/main/java/survivalblock/crossbow_scoping/common/init/CrossbowScopingGameRules.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88

99
public class CrossbowScopingGameRules {
1010

11+
//? if <1.21.11 {
1112
public static final GameRules.Key<GameRules.BooleanValue> HIGHER_PRECISION = GameRuleRegistry.register("crossbow_scoping:higherPrecision", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(true));
1213
public static final GameRules.Key<GameRules.BooleanValue> HIGHER_VELOCITY = GameRuleRegistry.register("crossbow_scoping:higherVelocity", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(true));
1314
public static final GameRules.Key<DoubleRule> VELOCITY_MULTIPLIER = GameRuleRegistry.register("crossbow_scoping:velocityMultiplier", GameRules.Category.MISC, GameRuleFactory.createDoubleRule(2.5, 1.0, 45));
1415
public static final GameRules.Key<GameRules.BooleanValue> NO_GRAVITY_PROJECTILES = GameRuleRegistry.register("crossbow_scoping:noGravityProjectiles", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(false));
16+
//?}
1517

1618
public static void init() {
1719

src/main/java/survivalblock/crossbow_scoping/mixin/crossbow/client/ItemModelManagerMixin.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import net.minecraft.client.renderer.item.ItemModelResolver;
55
import net.minecraft.client.renderer.item.ItemStackRenderState;
6+
//? if >1.21.8
7+
import net.minecraft.world.entity.ItemOwner;
68
import net.minecraft.world.entity.LivingEntity;
79
import net.minecraft.world.entity.player.Player;
810
import net.minecraft.world.item.ItemDisplayContext;
@@ -21,7 +23,7 @@
2123
public class ItemModelManagerMixin {
2224

2325
@Inject(method = "appendItemLayers", at = @At("HEAD"))
24-
private void addCrossbowScopingData(ItemStackRenderState renderState, ItemStack stack, ItemDisplayContext displayContext, Level level, LivingEntity entity, int seed, CallbackInfo ci) {
26+
private void addCrossbowScopingData(ItemStackRenderState renderState, ItemStack stack, ItemDisplayContext displayContext, Level level, /*? <=1.21.8 {*/ /*LivingEntity *//*?} else {*/ ItemOwner /*?}*/ entity, int seed, CallbackInfo ci) {
2527
if (CrossbowScoping.isASpyglass(stack)) {
2628
if (entity instanceof Player player && !stack.isEmpty()) {
2729
player.crossbow_scoping$setAttacking(true);

src/main/java/survivalblock/crossbow_scoping/mixin/crossbow/client/ItemRenderStateMixin.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import net.fabricmc.fabric.api.client.rendering.v1.FabricRenderState;
66
import net.minecraft.client.Minecraft;
77
import net.minecraft.client.renderer.MultiBufferSource;
8+
//? if >1.21.8
9+
import net.minecraft.client.renderer.SubmitNodeCollector;
810
import net.minecraft.client.renderer.block.model.ItemTransform;
911
import net.minecraft.client.renderer.item.ItemStackRenderState;
1012
import net.minecraft.world.item.ItemDisplayContext;
@@ -31,21 +33,23 @@ public abstract class ItemRenderStateMixin implements FabricRenderState {
3133
@Shadow
3234
public abstract boolean isEmpty();
3335

34-
@Inject(method = "render", at = @At("RETURN"))
35-
private void renderScope(PoseStack matrices, MultiBufferSource bufferSource, int light, int overlay, CallbackInfo ci) {
36+
@Inject(method = /*? <=1.21.8 {*/ /*"render" *//*?} else {*/ "submit" /*?}*/, at = @At("RETURN"))
37+
private void renderScope(PoseStack matrices, /*? <=1.21.8 {*/ /*MultiBufferSource vertexConsumers *//*?} else {*/ SubmitNodeCollector renderQueue /*?}*/, int light, int overlay, /*? >1.21.8 {*/ int outlineColor, /*?}*/ CallbackInfo ci) {
3638
if (this.isEmpty()) {
39+
//? if >=1.21.9
3740
return;
3841
}
3942

4043
ItemStack scope = this.getDataOrDefault(ScopeRenderer.SCOPE, ItemStack.EMPTY);
4144

4245
if (scope.isEmpty()) {
46+
//? if >=1.21.9
4347
return;
4448
}
4549

4650
matrices.pushPose();
4751
this.crossbow_scoping$applyScopeTransforms(matrices);
48-
ScopeRenderer.renderScopeOnCrossbow(scope, matrices, bufferSource, light, overlay, Minecraft.getInstance().getItemRenderer());
52+
ScopeRenderer.renderScopeOnCrossbow(scope, matrices, /*? <=1.21.8 {*/ /*vertexConsumers *//*?} else {*/ renderQueue /*?}*/, light, overlay, Minecraft.getInstance().getItemRenderer() /*? >1.21.8 {*/, outlineColor /*?}*/);
4953
matrices.popPose();
5054
}
5155

src/main/java/survivalblock/crossbow_scoping/mixin/crossbow/client/ItemRendererAccessor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
//? if >1.21.1 {
2-
package survivalblock.crossbow_scoping.mixin.crossbow.client;
1+
//? if >1.21.1 && <1.21.9 {
2+
/*package survivalblock.crossbow_scoping.mixin.crossbow.client;
33
44
import net.minecraft.client.renderer.entity.ItemRenderer;
55
import net.minecraft.client.renderer.item.ItemModelResolver;
@@ -13,4 +13,4 @@ public interface ItemRendererAccessor {
1313
@Accessor("resolver")
1414
ItemModelResolver crossbow_scoping$getItemModelManager();
1515
}
16-
//?}
16+
*///?}

src/main/java/survivalblock/crossbow_scoping/mixin/crossbow/client/PlayerHeldItemFeatureRendererMixin.java

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import net.minecraft.client.model.HeadedModel;
1414
import net.minecraft.client.renderer.ItemInHandRenderer;
1515
import net.minecraft.client.renderer.MultiBufferSource;
16+
//? if >1.21.8
17+
import net.minecraft.client.renderer.SubmitNodeCollector;
1618
import net.minecraft.client.renderer.entity.RenderLayerParent;
1719
import net.minecraft.client.renderer.entity.layers.ItemInHandLayer;
1820
import net.minecraft.client.renderer.entity.layers.PlayerItemInHandLayer;
@@ -46,6 +48,14 @@ public abstract class PlayerHeldItemFeatureRendererMixin<T extends //? if =1.21.
4648
//?}
4749
, M extends EntityModel<T> & ArmedModel & HeadedModel>
4850
extends ItemInHandLayer<T, M> {
51+
//? if >1.21.1 {
52+
@Unique
53+
private final ItemStackRenderState crossbow_scoping$crossbowRenderState = new ItemStackRenderState();
54+
55+
public PlayerHeldItemFeatureRendererMixin(RenderLayerParent<T, M> renderer) {
56+
super(renderer);
57+
}
58+
//?}
4959

5060
//? if <=1.21.1 {
5161
/*public PlayerHeldItemFeatureRendererMixin(RenderLayerParent<T, M> context, ItemInHandRenderer heldItemRenderer) {
@@ -95,15 +105,9 @@ private void fixCrossbowTransforms(LivingEntity entity, ItemStack stack, Humanoi
95105
matrices.translate(0, -0.1, 1);
96106
}
97107
}
98-
*///?} else {
99-
@Unique
100-
private final ItemStackRenderState crossbow_scoping$crossbowRenderState = new ItemStackRenderState();
108+
*///?} else if =1.21.8 {
101109

102-
public PlayerHeldItemFeatureRendererMixin(RenderLayerParent<T, M> renderer) {
103-
super(renderer);
104-
}
105-
106-
@WrapOperation(method = "renderArmWithItem(Lnet/minecraft/client/renderer/entity/state/PlayerRenderState;Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/PlayerItemInHandLayer;renderItemHeldToEye(Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V"))
110+
/*@WrapOperation(method = "renderArmWithItem(Lnet/minecraft/client/renderer/entity/state/PlayerRenderState;Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/PlayerItemInHandLayer;renderItemHeldToEye(Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V"))
107111
private void changeTheRenderState(PlayerItemInHandLayer<T, M> instance, ItemStackRenderState itemStackRenderState, HumanoidArm arm, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, Operation<Void> original, @Local(argsOnly = true) PlayerRenderState playerRenderState) {
108112
ItemStack crossbow = itemStackRenderState.getDataOrDefault(ScopeRenderer.REVERSE_REFERENCE, ItemStack.EMPTY);
109113
@@ -136,12 +140,55 @@ private void fixCrossbowTransforms(ItemStackRenderState renderState, HumanoidArm
136140
if (arm == HumanoidArm.LEFT) {
137141
matrices.mulPose(Axis.YP.rotationDegrees(-90));
138142
}
139-
//? if <=1.21.1 {
140-
/*matrices.translate(0, -0.1, 1);
141-
*///?} else {
142143
matrices.translate(-0.1, 0.1, 0);
143-
//?}
144144
}
145145
}
146+
*///?} else {
147+
@WrapOperation(method = "submitArmWithItem(Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/PlayerItemInHandLayer;renderItemHeldToEye(Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;I)V"))
148+
private void changeTheRenderState(PlayerItemInHandLayer<T, M> instance, AvatarRenderState avatarRenderState, HumanoidArm arm, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int i, Operation<Void> original, @Local(argsOnly = true) ItemStackRenderState itemStackRenderState) {
149+
ItemStack crossbow = itemStackRenderState.getDataOrDefault(ScopeRenderer.REVERSE_REFERENCE, ItemStack.EMPTY);
150+
151+
if (crossbow.isEmpty()) {
152+
this.crossbow_scoping$crossbowRenderState.clear();
153+
} else {
154+
Minecraft client = Minecraft.getInstance();
155+
156+
client.getItemModelResolver().updateForTopItem(
157+
this.crossbow_scoping$crossbowRenderState,
158+
crossbow,
159+
arm == HumanoidArm.RIGHT ? ItemDisplayContext.THIRD_PERSON_RIGHT_HAND : ItemDisplayContext.THIRD_PERSON_LEFT_HAND,
160+
client.level,
161+
null,
162+
0
163+
);
164+
165+
avatarRenderState.setData(ScopeRenderer.CROSSBOW_TO_HEAD, this.crossbow_scoping$crossbowRenderState);
166+
}
167+
168+
original.call(instance, avatarRenderState, arm, poseStack, submitNodeCollector, i);
169+
}
170+
171+
@Inject(method = "renderItemHeldToEye", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V", shift = At.Shift.AFTER))
172+
private void fixCrossbowTransforms(AvatarRenderState renderState, HumanoidArm arm, PoseStack matrices, SubmitNodeCollector nodeCollector, int packedLight, CallbackInfo ci, @Share("scoping") LocalBooleanRef scoping) {
173+
boolean transformSpecial = renderState.getData(ScopeRenderer.CROSSBOW_TO_HEAD) == this.crossbow_scoping$crossbowRenderState;
174+
scoping.set(transformSpecial);
175+
if (transformSpecial) {
176+
// 1.6 / 0.9 = 1.7777...
177+
matrices.scale(1.778f, 1.778f, 1.778f);
178+
matrices.mulPose(Axis.YP.rotationDegrees(15));
179+
if (arm == HumanoidArm.LEFT) {
180+
matrices.mulPose(Axis.YP.rotationDegrees(-90));
181+
}
182+
matrices.translate(-0.1, -0.1, 0);
183+
}
184+
}
185+
186+
@WrapOperation(method = "renderItemHeldToEye", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/item/ItemStackRenderState;submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;III)V"))
187+
private void useCrossbowRenderState(ItemStackRenderState instance, PoseStack matrices, SubmitNodeCollector renderQueue, int light, int overlay, int outlineColor, Operation<Void> original, @Share("scoping") LocalBooleanRef scoping) {
188+
if (scoping.get()) {
189+
instance = this.crossbow_scoping$crossbowRenderState;
190+
}
191+
original.call(instance, matrices, renderQueue, light, overlay, outlineColor);
192+
}
146193
//?}
147194
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"gamerule.crossbow_scoping:higherPrecision": "Crossbow Scoping - Higher Precision",
3+
"gamerule.crossbow_scoping:higherVelocity": "Crossbow Scoping - Higher Velocity",
4+
"gamerule.crossbow_scoping:noGravityProjectiles": "Crossbow Scoping - Allow No Gravity Projectiles",
5+
"gamerule.crossbow_scoping:velocityMultiplier": "Crossbow Scoping - Velocity Multiplier",
6+
"item.crossbow_scoping.crossbow.scope": "Scope - %s"
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"values": [
3+
{
4+
"id": "omnicrossbow:multichambered",
5+
"required": false
6+
}
7+
]
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"values": [
3+
"minecraft:arrow",
4+
"minecraft:spectral_arrow",
5+
"minecraft:firework_rocket"
6+
]
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"values": [
3+
{
4+
"id": "pierced:long_crossbow",
5+
"required": false
6+
}
7+
]
8+
}

0 commit comments

Comments
 (0)