From c4bdedd3f7a22547709d5c65c4012db4aea7befb Mon Sep 17 00:00:00 2001 From: acikek Date: Wed, 19 Oct 2022 10:58:14 -0700 Subject: [PATCH 01/27] funny draft --- build.gradle | 4 ++ .../render/EntityRenderDispatcherMixin.java | 22 ++++++++ .../mixin/render/EntityRendererMixin.java | 26 ++++++++++ ...ientizenAttachedEntityFeatureRenderer.java | 20 ++++++++ .../scripts/commands/AttachCommand.java | 40 +++++++++++++++ .../commands/ClientizenCommandRegistry.java | 3 +- .../clientizen/tags/ClientTagBase.java | 29 +++++++++++ .../tags/ClientizenTagRegistry.java | 8 ++- .../clientizen/tags/EntityTag.java | 51 +++++++++++++++++++ src/main/resources/clientizen.accesswidener | 3 ++ src/main/resources/clientizen.mixins.json | 4 +- src/main/resources/fabric.mod.json | 1 + 12 files changed, 208 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java create mode 100644 src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java create mode 100644 src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java create mode 100644 src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java create mode 100644 src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java create mode 100644 src/main/java/com/denizenscript/clientizen/tags/EntityTag.java create mode 100644 src/main/resources/clientizen.accesswidener diff --git a/build.gradle b/build.gradle index 413ca89..24ce847 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,10 @@ archivesBaseName = project.archives_base_name version = project.version group = project.maven_group +loom { + accessWidenerPath = file("src/main/resources/clientizen.accesswidener") +} + repositories { mavenCentral() maven { diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java new file mode 100644 index 0000000..5dc2880 --- /dev/null +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java @@ -0,0 +1,22 @@ +package com.denizenscript.clientizen.mixin.render; + +import com.denizenscript.clientizen.scripts.commands.AttachCommand; +import net.minecraft.client.render.Frustum; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +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.CallbackInfoReturnable; + +@Mixin(EntityRenderDispatcher.class) +public class EntityRenderDispatcherMixin { + + /*@Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) + private static void clientizen$cancelRenderIfAttached( + E entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable cir) { + if (AttachCommand.attachedEntities.containsKey(entity.getUuid())) { + cir.setReturnValue(false); + } + }*/ +} diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java new file mode 100644 index 0000000..46d5efc --- /dev/null +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java @@ -0,0 +1,26 @@ +package com.denizenscript.clientizen.mixin.render; + +import com.denizenscript.clientizen.scripts.commands.AttachCommand; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.Vec3d; +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.CallbackInfoReturnable; + +@Mixin(EntityRenderer.class) +public class EntityRendererMixin { + + /*@Inject(method = "", at = @At("TAIL")) + private void clientizen$addAttachFeatureRenderer(EntityRendererFactory.Context ctx, CallbackInfo ci) { + add + }*/ + + @Inject(method = "getPositionOffset", cancellable = true, at = @At("HEAD")) + private void clientizen$getAttachedOffset(T entity, float tickDelta, CallbackInfoReturnable cir) { + if (AttachCommand.attachedEntities.containsKey(entity.getUuid())) { + cir.setReturnValue(AttachCommand.attachedEntities.get(entity.getUuid()).getEntity().getPos().subtract(entity.getPos())); + } + } +} diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java new file mode 100644 index 0000000..3f40439 --- /dev/null +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -0,0 +1,20 @@ +package com.denizenscript.clientizen.render; + +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; + +public class ClientizenAttachedEntityFeatureRenderer extends FeatureRenderer> { + + public ClientizenAttachedEntityFeatureRenderer(FeatureRendererContext> context) { + super(context); + } + + @Override + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, Entity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + + } +} diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java new file mode 100644 index 0000000..360ad3c --- /dev/null +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java @@ -0,0 +1,40 @@ +package com.denizenscript.clientizen.scripts.commands; + +import com.denizenscript.clientizen.tags.EntityTag; +import com.denizenscript.denizencore.scripts.ScriptEntry; +import com.denizenscript.denizencore.scripts.commands.AbstractCommand; +import com.denizenscript.denizencore.scripts.commands.generator.ArgLinear; +import com.denizenscript.denizencore.scripts.commands.generator.ArgName; +import com.denizenscript.denizencore.scripts.commands.generator.ArgPrefixed; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class AttachCommand extends AbstractCommand { + + public static Map attachedEntities = new HashMap<>(); + + public AttachCommand() { + setName("attach"); + setSyntax("attach [|...] [to:] (cancel)"); + setRequiredArguments(2, 2); + isProcedural = false; + autoCompile(); + } + + public static void autoExecute(ScriptEntry scriptEntry, + @ArgLinear @ArgName("entities") List attachingEntities, + @ArgPrefixed @ArgName("to") EntityTag entity, + @ArgName("cancel") boolean cancel) { + for (EntityTag attachingEntity : attachingEntities) { + if (cancel) { + attachedEntities.remove(attachingEntity.uuid); + } + else { + attachedEntities.put(attachingEntity.uuid, entity); + } + } + } +} diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/ClientizenCommandRegistry.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/ClientizenCommandRegistry.java index c8e9a65..b045b52 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/ClientizenCommandRegistry.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/ClientizenCommandRegistry.java @@ -6,8 +6,9 @@ public class ClientizenCommandRegistry { public static void registerCommands() { - registerCommand(NarrateCommand.class); + registerCommand(AttachCommand.class); registerCommand(GuiCommand.class); + registerCommand(NarrateCommand.class); registerCommand(ServerEventCommand.class); } diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java new file mode 100644 index 0000000..3c6fff4 --- /dev/null +++ b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java @@ -0,0 +1,29 @@ +package com.denizenscript.clientizen.tags; + +import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.tags.PseudoObjectTagBase; +import com.denizenscript.denizencore.tags.TagManager; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.Entity; + +public class ClientTagBase extends PseudoObjectTagBase { + + public static ClientTagBase instance; + + public static void register() { + instance = new ClientTagBase(); + TagManager.registerStaticTagBaseHandler(ClientTagBase.class, "client", t -> instance); + } + + @Override + public void registerTags() { + + tagProcessor.registerTag(ListTag.class, "loaded_entities", (attribute, object) -> { + ListTag list = new ListTag(); + for (Entity entity : MinecraftClient.getInstance().world.getEntities()) { + list.addObject(new EntityTag(entity)); + } + return list; + }); + } +} diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java b/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java index a9bba87..88791e2 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java +++ b/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java @@ -1,8 +1,14 @@ package com.denizenscript.clientizen.tags; +import com.denizenscript.denizencore.objects.ObjectFetcher; +import com.denizenscript.denizencore.objects.ObjectType; + public class ClientizenTagRegistry { - public static void registerTagHandlers() { + public static ObjectType TYPE_ENTITY; + public static void registerTagHandlers() { + ClientTagBase.register(); + TYPE_ENTITY = ObjectFetcher.registerWithObjectFetcher(EntityTag.class, EntityTag.tagProcessor).setAsNOtherCode().generateBaseTag(); } } diff --git a/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java b/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java new file mode 100644 index 0000000..e9eda41 --- /dev/null +++ b/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java @@ -0,0 +1,51 @@ +package com.denizenscript.clientizen.tags; + +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.tags.ObjectTagProcessor; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.Entity; + +import java.util.UUID; + +public class EntityTag implements ObjectTag { + + public UUID uuid; + + public EntityTag(Entity entity) { + uuid = entity.getUuid(); + } + + public Entity getEntity() { + return MinecraftClient.getInstance().world.getEntityLookup().get(uuid); + } + + public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); + + private String prefix = "Entity"; + + @Override + public String getPrefix() { + return prefix; + } + + @Override + public boolean isUnique() { + return true; + } + + @Override + public String identify() { + return "e@" + uuid; + } + + @Override + public String identifySimple() { + return identify(); + } + + @Override + public ObjectTag setPrefix(String prefix) { + this.prefix = prefix; + return this; + } +} diff --git a/src/main/resources/clientizen.accesswidener b/src/main/resources/clientizen.accesswidener new file mode 100644 index 0000000..c17e954 --- /dev/null +++ b/src/main/resources/clientizen.accesswidener @@ -0,0 +1,3 @@ +accessWidener v2 named + +accessible method net/minecraft/client/world/ClientWorld getEntityLookup ()Lnet/minecraft/world/entity/EntityLookup; diff --git a/src/main/resources/clientizen.mixins.json b/src/main/resources/clientizen.mixins.json index 41433f1..2d05612 100644 --- a/src/main/resources/clientizen.mixins.json +++ b/src/main/resources/clientizen.mixins.json @@ -6,7 +6,9 @@ "mixins": [], "client": [ "KeyBindingMixin", - "MinecraftClientMixin" + "MinecraftClientMixin", + "render.EntityRenderDispatcherMixin", + "render.EntityRendererMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 957a70f..075c9e9 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,6 +23,7 @@ "mixins": [ "clientizen.mixins.json" ], + "accessWidener": "clientizen.accesswidener", "depends": { "fabricloader": ">=0.14.9", "fabric-api": "*", From b9b1a0a71d3141cc878a279ea4407b2d676ff01f Mon Sep 17 00:00:00 2001 From: acikek Date: Wed, 19 Oct 2022 12:05:50 -0700 Subject: [PATCH 02/27] g --- .../clientizen/tags/ClientTagBase.java | 5 +++ .../clientizen/tags/EntityTag.java | 31 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java index 3c6fff4..48e573c 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java +++ b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java @@ -25,5 +25,10 @@ public void registerTags() { } return list; }); + + tagProcessor.registerTag(EntityTag.class, "target", (attribute, object) -> { + System.out.println(MinecraftClient.getInstance().targetedEntity); + return new EntityTag(MinecraftClient.getInstance().targetedEntity); + }); } } diff --git a/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java b/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java index e9eda41..21786fd 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java +++ b/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java @@ -1,7 +1,11 @@ package com.denizenscript.clientizen.tags; +import com.denizenscript.denizencore.objects.Fetchable; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.tags.ObjectTagProcessor; +import com.denizenscript.denizencore.tags.TagContext; +import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; @@ -11,8 +15,26 @@ public class EntityTag implements ObjectTag { public UUID uuid; + public EntityTag(UUID uuid) { + this.uuid = uuid; + } + public EntityTag(Entity entity) { - uuid = entity.getUuid(); + this(entity.getUuid()); + } + + @Fetchable("e") + public static EntityTag valueOf(String string, TagContext tagContext) { + if (string == null) { + return null; + } + if (string.startsWith("e@")) { + return new EntityTag(UUID.fromString(string.substring(2))); + } + if (tagContext == null || tagContext.showErrors()) { + Debug.log("valueOf EntityTag returning null: " + string); + } + return null; } public Entity getEntity() { @@ -21,6 +43,13 @@ public Entity getEntity() { public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); + public static void registerTags() { + + tagProcessor.registerTag(ElementTag.class, "entity_type", (attribute, object) -> { + return new ElementTag(object.getEntity().getType().getUntranslatedName(), true); + }); + } + private String prefix = "Entity"; @Override From 5a90ace4adb9c9aa698d71f37743824521577997 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 4 Dec 2022 01:24:56 +0000 Subject: [PATCH 03/27] `EntityTag` to `objects` , update `ClientTagBase` --- .../objects/ClientizenObjectRegistry.java | 14 +++++--------- .../clientizen/{tags => objects}/EntityTag.java | 2 +- .../clientizen/scripts/commands/AttachCommand.java | 2 +- .../clientizen/tags/ClientTagBase.java | 13 ++++++------- .../clientizen/tags/ClientizenTagRegistry.java | 6 ++---- 5 files changed, 15 insertions(+), 22 deletions(-) rename src/main/java/com/denizenscript/clientizen/{tags => objects}/EntityTag.java (97%) diff --git a/src/main/java/com/denizenscript/clientizen/objects/ClientizenObjectRegistry.java b/src/main/java/com/denizenscript/clientizen/objects/ClientizenObjectRegistry.java index 4adfb46..f0dd2fb 100644 --- a/src/main/java/com/denizenscript/clientizen/objects/ClientizenObjectRegistry.java +++ b/src/main/java/com/denizenscript/clientizen/objects/ClientizenObjectRegistry.java @@ -1,17 +1,13 @@ package com.denizenscript.clientizen.objects; -public class ClientizenObjectRegistry { +import com.denizenscript.denizencore.objects.ObjectFetcher; +import com.denizenscript.denizencore.objects.ObjectType; - public static void registerTagHandlers() { +public class ClientizenObjectRegistry { - } + public static ObjectType TYPE_ENTITY; public static void registerObjects() { - registerObjectTypes(); - registerTagHandlers(); - } - - public static void registerObjectTypes() { - + TYPE_ENTITY = ObjectFetcher.registerWithObjectFetcher(EntityTag.class, EntityTag.tagProcessor).setAsNOtherCode().generateBaseTag(); } } diff --git a/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java similarity index 97% rename from src/main/java/com/denizenscript/clientizen/tags/EntityTag.java rename to src/main/java/com/denizenscript/clientizen/objects/EntityTag.java index 21786fd..9a822fc 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/EntityTag.java +++ b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java @@ -1,4 +1,4 @@ -package com.denizenscript.clientizen.tags; +package com.denizenscript.clientizen.objects; import com.denizenscript.denizencore.objects.Fetchable; import com.denizenscript.denizencore.objects.ObjectTag; diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java index 360ad3c..651656c 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java @@ -1,6 +1,6 @@ package com.denizenscript.clientizen.scripts.commands; -import com.denizenscript.clientizen.tags.EntityTag; +import com.denizenscript.clientizen.objects.EntityTag; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import com.denizenscript.denizencore.scripts.commands.generator.ArgLinear; diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java index 48e573c..f2a944d 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java +++ b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java @@ -1,5 +1,6 @@ package com.denizenscript.clientizen.tags; +import com.denizenscript.clientizen.objects.EntityTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.tags.PseudoObjectTagBase; import com.denizenscript.denizencore.tags.TagManager; @@ -10,14 +11,13 @@ public class ClientTagBase extends PseudoObjectTagBase { public static ClientTagBase instance; - public static void register() { - instance = new ClientTagBase(); + public ClientTagBase() { + instance = this; TagManager.registerStaticTagBaseHandler(ClientTagBase.class, "client", t -> instance); } @Override - public void registerTags() { - + public void register() { tagProcessor.registerTag(ListTag.class, "loaded_entities", (attribute, object) -> { ListTag list = new ListTag(); for (Entity entity : MinecraftClient.getInstance().world.getEntities()) { @@ -25,10 +25,9 @@ public void registerTags() { } return list; }); - tagProcessor.registerTag(EntityTag.class, "target", (attribute, object) -> { - System.out.println(MinecraftClient.getInstance().targetedEntity); - return new EntityTag(MinecraftClient.getInstance().targetedEntity); + Entity target = MinecraftClient.getInstance().targetedEntity; + return target != null ? new EntityTag(target) : null; }); } } diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java b/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java index 88791e2..b3597af 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java +++ b/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java @@ -1,14 +1,12 @@ package com.denizenscript.clientizen.tags; +import com.denizenscript.clientizen.objects.EntityTag; import com.denizenscript.denizencore.objects.ObjectFetcher; import com.denizenscript.denizencore.objects.ObjectType; public class ClientizenTagRegistry { - public static ObjectType TYPE_ENTITY; - public static void registerTagHandlers() { - ClientTagBase.register(); - TYPE_ENTITY = ObjectFetcher.registerWithObjectFetcher(EntityTag.class, EntityTag.tagProcessor).setAsNOtherCode().generateBaseTag(); + new ClientTagBase(); } } From 047a355ed20fe1fb83380ebaaa89a25fbf581fce Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 4 Dec 2022 20:27:35 +0000 Subject: [PATCH 04/27] `EntityTag` cleanup and fixes --- .../clientizen/objects/EntityTag.java | 74 +++++++++++++------ 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java index 9a822fc..1bba7cf 100644 --- a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java +++ b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java @@ -3,63 +3,78 @@ import com.denizenscript.denizencore.objects.Fetchable; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.tags.Attribute; import com.denizenscript.denizencore.tags.ObjectTagProcessor; import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import java.util.UUID; public class EntityTag implements ObjectTag { public UUID uuid; - - public EntityTag(UUID uuid) { - this.uuid = uuid; - } + public Entity entity; public EntityTag(Entity entity) { - this(entity.getUuid()); + this.entity = entity; + this.uuid = entity.getUuid(); } @Fetchable("e") - public static EntityTag valueOf(String string, TagContext tagContext) { + public static EntityTag valueOf(String string, TagContext context) { if (string == null) { return null; } if (string.startsWith("e@")) { - return new EntityTag(UUID.fromString(string.substring(2))); + string = string.substring("e@".length()); + } + try { + Entity found = MinecraftClient.getInstance().world.getEntityLookup().get(UUID.fromString(string)); + if (found != null) { + return new EntityTag(found); + } } - if (tagContext == null || tagContext.showErrors()) { + catch (Exception ignored) {} + if (context == null || context.showErrors()) { Debug.log("valueOf EntityTag returning null: " + string); } return null; } - public Entity getEntity() { - return MinecraftClient.getInstance().world.getEntityLookup().get(uuid); + public static boolean matches(String string) { + return string.startsWith("e@"); } - public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); - - public static void registerTags() { + public Entity getEntity() { + if (entity == null || entity.isRemoved()) { + Entity found = MinecraftClient.getInstance().world.getEntityLookup().get(uuid); + if (found != null) { + entity = found; + } + } + return entity; + } + public static void register() { tagProcessor.registerTag(ElementTag.class, "entity_type", (attribute, object) -> { return new ElementTag(object.getEntity().getType().getUntranslatedName(), true); }); + tagProcessor.registerTag(ElementTag.class, "health", (attribute, object) -> { + if (object.getEntity() instanceof LivingEntity livingEntity) { + return new ElementTag(livingEntity.getHealth()); + } + return null; + }); } - private String prefix = "Entity"; - - @Override - public String getPrefix() { - return prefix; - } + public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); @Override - public boolean isUnique() { - return true; + public ObjectTag getObjectAttribute(Attribute attribute) { + return tagProcessor.getObjectAttribute(this, attribute); } @Override @@ -72,6 +87,23 @@ public String identifySimple() { return identify(); } + @Override + public String toString() { + return identify(); + } + + private String prefix = "Entity"; + + @Override + public String getPrefix() { + return prefix; + } + + @Override + public boolean isUnique() { + return true; + } + @Override public ObjectTag setPrefix(String prefix) { this.prefix = prefix; From ec01f1f7fe5eeea91871976ee380438e932c4b26 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 4 Dec 2022 20:36:53 +0000 Subject: [PATCH 05/27] Fix `AttachCommand` param --- .../clientizen/scripts/commands/AttachCommand.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java index 651656c..50232c6 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java @@ -1,6 +1,7 @@ package com.denizenscript.clientizen.scripts.commands; import com.denizenscript.clientizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import com.denizenscript.denizencore.scripts.commands.generator.ArgLinear; @@ -25,10 +26,10 @@ public AttachCommand() { } public static void autoExecute(ScriptEntry scriptEntry, - @ArgLinear @ArgName("entities") List attachingEntities, + @ArgLinear @ArgName("entities") ListTag attachingEntities, @ArgPrefixed @ArgName("to") EntityTag entity, @ArgName("cancel") boolean cancel) { - for (EntityTag attachingEntity : attachingEntities) { + for (EntityTag attachingEntity : attachingEntities.filter(EntityTag.class, scriptEntry.context)) { if (cancel) { attachedEntities.remove(attachingEntity.uuid); } From ceee24571fad5ccb35201d9e9a5597a9d942b73b Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 5 Dec 2022 10:36:22 +0000 Subject: [PATCH 06/27] Cleanup imports --- .../denizenscript/clientizen/tags/ClientizenTagRegistry.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java b/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java index b3597af..ec08244 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java +++ b/src/main/java/com/denizenscript/clientizen/tags/ClientizenTagRegistry.java @@ -1,9 +1,5 @@ package com.denizenscript.clientizen.tags; -import com.denizenscript.clientizen.objects.EntityTag; -import com.denizenscript.denizencore.objects.ObjectFetcher; -import com.denizenscript.denizencore.objects.ObjectType; - public class ClientizenTagRegistry { public static void registerTagHandlers() { From b35468c4c0c7af5092929efc66abf9909e6b53b6 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 5 Dec 2022 23:13:57 +0000 Subject: [PATCH 07/27] `client.self_entity` --- .../java/com/denizenscript/clientizen/tags/ClientTagBase.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java index f2a944d..22ab219 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java +++ b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java @@ -29,5 +29,8 @@ public void register() { Entity target = MinecraftClient.getInstance().targetedEntity; return target != null ? new EntityTag(target) : null; }); + tagProcessor.registerTag(EntityTag.class, "self_entity", (attribute, object) -> { + return new EntityTag(MinecraftClient.getInstance().player); + }); } } From f88cc7f734252fefefacb8d8f243c0c160b3e46f Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 5 Dec 2022 23:47:39 +0000 Subject: [PATCH 08/27] Fixup `attach` command --- .../clientizen/scripts/commands/AttachCommand.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java index 50232c6..4919ca0 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java @@ -1,9 +1,11 @@ package com.denizenscript.clientizen.scripts.commands; import com.denizenscript.clientizen.objects.EntityTag; +import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; +import com.denizenscript.denizencore.scripts.commands.generator.ArgDefaultNull; import com.denizenscript.denizencore.scripts.commands.generator.ArgLinear; import com.denizenscript.denizencore.scripts.commands.generator.ArgName; import com.denizenscript.denizencore.scripts.commands.generator.ArgPrefixed; @@ -27,14 +29,17 @@ public AttachCommand() { public static void autoExecute(ScriptEntry scriptEntry, @ArgLinear @ArgName("entities") ListTag attachingEntities, - @ArgPrefixed @ArgName("to") EntityTag entity, + @ArgDefaultNull @ArgPrefixed @ArgName("to") EntityTag toEntity, @ArgName("cancel") boolean cancel) { + if (!cancel && toEntity == null) { + throw new InvalidArgumentsRuntimeException("Must specify an entity to attach to"); + } for (EntityTag attachingEntity : attachingEntities.filter(EntityTag.class, scriptEntry.context)) { if (cancel) { attachedEntities.remove(attachingEntity.uuid); } else { - attachedEntities.put(attachingEntity.uuid, entity); + attachedEntities.put(attachingEntity.uuid, toEntity); } } } From 3280c051d4a6afb694d8e5eb447747addd319720 Mon Sep 17 00:00:00 2001 From: acikek Date: Fri, 6 Jan 2023 15:53:34 -0800 Subject: [PATCH 09/27] actually make rendering work well i think --- build.gradle | 4 +++ gradle.properties | 1 + .../render/EntityRenderDispatcherMixin.java | 8 ++--- .../mixin/render/EntityRendererMixin.java | 30 +++++++++++++------ ...ientizenAttachedEntityFeatureRenderer.java | 26 +++++++++++++--- .../scripts/commands/AttachCommand.java | 24 +++++++-------- src/main/resources/clientizen.accesswidener | 2 ++ 7 files changed, 66 insertions(+), 29 deletions(-) diff --git a/build.gradle b/build.gradle index f83bf73..bd83907 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,8 @@ repositories { name = "CottonMC" url = "https://server.bbkr.space/artifactory/libs-release" } + + maven { url = "https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1" } } dependencies { @@ -39,6 +41,8 @@ dependencies { implementation include("com.denizenscript:denizencore:${project.denizencore_version}") implementation include("org.yaml:snakeyaml:${project.snakeyaml_version}") + + modRuntimeOnly("me.djtheredstoner:DevAuth-fabric:${project.devauth_version}") } diff --git a/gradle.properties b/gradle.properties index 0652a89..efe2eae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,3 +17,4 @@ fabric_version=0.69.1+1.19.3 libgui_version=6.5.0+1.19.3 denizencore_version=1.90.2-SNAPSHOT snakeyaml_version=1.33 +devauth_version=1.1.0 diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java index 5dc2880..e9f2a4c 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java @@ -12,11 +12,11 @@ @Mixin(EntityRenderDispatcher.class) public class EntityRenderDispatcherMixin { - /*@Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) - private static void clientizen$cancelRenderIfAttached( + @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) + private void clientizen$cancelRenderIfAttached( E entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable cir) { - if (AttachCommand.attachedEntities.containsKey(entity.getUuid())) { + if (AttachCommand.attachedEntities.contains(entity.getUuid())) { cir.setReturnValue(false); } - }*/ + } } diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java index 46d5efc..ea08102 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java @@ -1,26 +1,38 @@ package com.denizenscript.clientizen.mixin.render; +import com.denizenscript.clientizen.render.ClientizenAttachedEntityFeatureRenderer; import com.denizenscript.clientizen.scripts.commands.AttachCommand; import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import net.minecraft.util.math.Vec3d; 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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(EntityRenderer.class) -public class EntityRendererMixin { +@Mixin(LivingEntityRenderer.class) +public abstract class EntityRendererMixin> { - /*@Inject(method = "", at = @At("TAIL")) - private void clientizen$addAttachFeatureRenderer(EntityRendererFactory.Context ctx, CallbackInfo ci) { - add - }*/ + @Shadow + public abstract boolean addFeature(FeatureRenderer feature); + + @Inject(method = "", at = @At("TAIL")) + private void clientizen$addAttachFeatureRenderer(EntityRendererFactory.Context ctx, EntityModel model, float shadowRadius, CallbackInfo ci) { + LivingEntityRenderer renderer = (LivingEntityRenderer) (Object) this; + addFeature(new ClientizenAttachedEntityFeatureRenderer<>(renderer)); + } - @Inject(method = "getPositionOffset", cancellable = true, at = @At("HEAD")) + /*@Inject(method = "getPositionOffset", cancellable = true, at = @At("HEAD")) private void clientizen$getAttachedOffset(T entity, float tickDelta, CallbackInfoReturnable cir) { if (AttachCommand.attachedEntities.containsKey(entity.getUuid())) { - cir.setReturnValue(AttachCommand.attachedEntities.get(entity.getUuid()).getEntity().getPos().subtract(entity.getPos())); + cir.setReturnValue(AttachCommand.attachedEntities.get(entity.getUuid()).getEntity().getLerpedPos(tickDelta).subtract(entity.getLerpedPos(tickDelta))); } - } + }*/ } diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index 3f40439..21b6160 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -1,20 +1,38 @@ package com.denizenscript.clientizen.render; +import com.denizenscript.clientizen.objects.EntityTag; +import com.denizenscript.clientizen.scripts.commands.AttachCommand; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; +import net.minecraft.util.math.Vec3d; -public class ClientizenAttachedEntityFeatureRenderer extends FeatureRenderer> { +import java.util.List; - public ClientizenAttachedEntityFeatureRenderer(FeatureRendererContext> context) { +public class ClientizenAttachedEntityFeatureRenderer> extends FeatureRenderer { + + public ClientizenAttachedEntityFeatureRenderer(FeatureRendererContext context) { super(context); } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, Entity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + List attached = AttachCommand.attachMap.get(entity.getUuid()); + if (attached == null) { + return; + } + for (EntityTag entityTag : attached) { + //System.out.println(entityTag); + matrices.push(); + matrices.scale(1, -1, 1); + // Empty vector = the client player's center position more or less + Vec3d pos = MinecraftClient.getInstance().player.getPos().subtract(entity.getPos()); + MinecraftClient.getInstance().getEntityRenderDispatcher().render(entityTag.entity, pos.x, pos.y, pos.z, entityTag.entity.getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); + matrices.pop(); + } } } diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java index 4919ca0..3e84a47 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java @@ -10,14 +10,12 @@ import com.denizenscript.denizencore.scripts.commands.generator.ArgName; import com.denizenscript.denizencore.scripts.commands.generator.ArgPrefixed; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; public class AttachCommand extends AbstractCommand { - public static Map attachedEntities = new HashMap<>(); + public static Map> attachMap = new HashMap<>(); + public static List attachedEntities = new ArrayList<>(); public AttachCommand() { setName("attach"); @@ -34,13 +32,15 @@ public static void autoExecute(ScriptEntry scriptEntry, if (!cancel && toEntity == null) { throw new InvalidArgumentsRuntimeException("Must specify an entity to attach to"); } - for (EntityTag attachingEntity : attachingEntities.filter(EntityTag.class, scriptEntry.context)) { - if (cancel) { - attachedEntities.remove(attachingEntity.uuid); - } - else { - attachedEntities.put(attachingEntity.uuid, toEntity); - } + List attaching = attachingEntities.filter(EntityTag.class, scriptEntry.context); + if (attachMap.containsKey(toEntity.uuid)) { + attachMap.get(toEntity.uuid).addAll(attaching); + } + else { + attachMap.put(toEntity.uuid, attaching); + } + for (EntityTag entityTag : attaching) { + attachedEntities.add(entityTag.uuid); } } } diff --git a/src/main/resources/clientizen.accesswidener b/src/main/resources/clientizen.accesswidener index c17e954..86cbc9b 100644 --- a/src/main/resources/clientizen.accesswidener +++ b/src/main/resources/clientizen.accesswidener @@ -1,3 +1,5 @@ accessWidener v2 named accessible method net/minecraft/client/world/ClientWorld getEntityLookup ()Lnet/minecraft/world/entity/EntityLookup; + +accessible method net/minecraft/client/render/entity/LivingEntityRenderer addFeature (Lnet/minecraft/client/render/entity/feature/FeatureRenderer;)Z From abdf37bfceacb2eb8884a0f384760bf04d275338 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 7 Jan 2023 18:24:47 +0000 Subject: [PATCH 10/27] Fix repository order --- build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index bd83907..20f9200 100644 --- a/build.gradle +++ b/build.gradle @@ -22,12 +22,13 @@ repositories { name "Denizen" url "https://maven.citizensnpcs.co/repo" } + maven { + url = "https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1" + } maven { name = "CottonMC" url = "https://server.bbkr.space/artifactory/libs-release" } - - maven { url = "https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1" } } dependencies { From 4d44a6c4e52cc0940d12dea6badda56999f4f153 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 9 Jan 2023 02:29:24 +0000 Subject: [PATCH 11/27] Implement `debuggable` in `EntityTag` --- .../java/com/denizenscript/clientizen/objects/EntityTag.java | 5 +++++ .../render/ClientizenAttachedEntityFeatureRenderer.java | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java index 1bba7cf..78b294b 100644 --- a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java +++ b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java @@ -87,6 +87,11 @@ public String identifySimple() { return identify(); } + @Override + public String debuggable() { + return "e@" + uuid + (getEntity() != null ? " (" + getEntity().getType().getUntranslatedName() + ")" : ""); + } + @Override public String toString() { return identify(); diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index 21b6160..72ca88c 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -30,8 +30,8 @@ public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, matrices.push(); matrices.scale(1, -1, 1); // Empty vector = the client player's center position more or less - Vec3d pos = MinecraftClient.getInstance().player.getPos().subtract(entity.getPos()); - MinecraftClient.getInstance().getEntityRenderDispatcher().render(entityTag.entity, pos.x, pos.y, pos.z, entityTag.entity.getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); + Vec3d pos = entity.getPos().subtract(entity.getPos()); + MinecraftClient.getInstance().getEntityRenderDispatcher().render(entityTag.getEntity(), pos.x, pos.y, pos.z, entityTag.getEntity().getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); matrices.pop(); } } From a21f4bd6dbba76e2155d25ca31131d6b338edc76 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 9 Jan 2023 02:30:02 +0000 Subject: [PATCH 12/27] Revert "Implement `debuggable` in `EntityTag`" This reverts commit 4d44a6c4e52cc0940d12dea6badda56999f4f153. --- .../java/com/denizenscript/clientizen/objects/EntityTag.java | 5 ----- .../render/ClientizenAttachedEntityFeatureRenderer.java | 4 ++-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java index 78b294b..1bba7cf 100644 --- a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java +++ b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java @@ -87,11 +87,6 @@ public String identifySimple() { return identify(); } - @Override - public String debuggable() { - return "e@" + uuid + (getEntity() != null ? " (" + getEntity().getType().getUntranslatedName() + ")" : ""); - } - @Override public String toString() { return identify(); diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index 72ca88c..21b6160 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -30,8 +30,8 @@ public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, matrices.push(); matrices.scale(1, -1, 1); // Empty vector = the client player's center position more or less - Vec3d pos = entity.getPos().subtract(entity.getPos()); - MinecraftClient.getInstance().getEntityRenderDispatcher().render(entityTag.getEntity(), pos.x, pos.y, pos.z, entityTag.getEntity().getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); + Vec3d pos = MinecraftClient.getInstance().player.getPos().subtract(entity.getPos()); + MinecraftClient.getInstance().getEntityRenderDispatcher().render(entityTag.entity, pos.x, pos.y, pos.z, entityTag.entity.getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); matrices.pop(); } } From 417cb32ab968437b91caaaf525bf9ed5591f7923 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 9 Jan 2023 02:30:52 +0000 Subject: [PATCH 13/27] Implement `debuggable` in `EntityTag` --- .../java/com/denizenscript/clientizen/objects/EntityTag.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java index 1bba7cf..78b294b 100644 --- a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java +++ b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java @@ -87,6 +87,11 @@ public String identifySimple() { return identify(); } + @Override + public String debuggable() { + return "e@" + uuid + (getEntity() != null ? " (" + getEntity().getType().getUntranslatedName() + ")" : ""); + } + @Override public String toString() { return identify(); From c9e741fea1b5a497e4c44a377d0bd887e1be9ddc Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 9 Jan 2023 03:04:25 +0000 Subject: [PATCH 14/27] Fix attaching entities to other entities --- .../ClientizenAttachedEntityFeatureRenderer.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index 21b6160..9944c7c 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -9,7 +9,6 @@ import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; -import net.minecraft.util.math.Vec3d; import java.util.List; @@ -21,17 +20,14 @@ public ClientizenAttachedEntityFeatureRenderer(FeatureRendererContext cont @Override public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - List attached = AttachCommand.attachMap.get(entity.getUuid()); - if (attached == null) { + List attachedEntities = AttachCommand.attachMap.get(entity.getUuid()); + if (attachedEntities == null) { return; } - for (EntityTag entityTag : attached) { - //System.out.println(entityTag); + for (EntityTag attached : attachedEntities) { matrices.push(); matrices.scale(1, -1, 1); - // Empty vector = the client player's center position more or less - Vec3d pos = MinecraftClient.getInstance().player.getPos().subtract(entity.getPos()); - MinecraftClient.getInstance().getEntityRenderDispatcher().render(entityTag.entity, pos.x, pos.y, pos.z, entityTag.entity.getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); + MinecraftClient.getInstance().getEntityRenderDispatcher().render(attached.getEntity(), 0, 0, 0, attached.getEntity().getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); matrices.pop(); } } From 055bf154aa65504b224236aee3c4af7e791c46fd Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 9 Jan 2023 04:05:23 +0000 Subject: [PATCH 15/27] Attempted lighting improvment --- .../render/ClientizenAttachedEntityFeatureRenderer.java | 7 +++++++ src/main/resources/clientizen.accesswidener | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index 9944c7c..7f1719e 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -3,12 +3,16 @@ import com.denizenscript.clientizen.objects.EntityTag; import com.denizenscript.clientizen.scripts.commands.AttachCommand; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; import java.util.List; @@ -27,6 +31,9 @@ public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, for (EntityTag attached : attachedEntities) { matrices.push(); matrices.scale(1, -1, 1); + EntityRenderer renderer = MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(attached.getEntity()); + BlockPos blockPos = entity.getBlockPos().add(0, 1, 0); + light = LightmapTextureManager.pack(renderer.getBlockLight(attached.getEntity(), blockPos), entity.world.getLightLevel(LightType.SKY, blockPos)); MinecraftClient.getInstance().getEntityRenderDispatcher().render(attached.getEntity(), 0, 0, 0, attached.getEntity().getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); matrices.pop(); } diff --git a/src/main/resources/clientizen.accesswidener b/src/main/resources/clientizen.accesswidener index 86cbc9b..5811b7e 100644 --- a/src/main/resources/clientizen.accesswidener +++ b/src/main/resources/clientizen.accesswidener @@ -3,3 +3,5 @@ accessWidener v2 named accessible method net/minecraft/client/world/ClientWorld getEntityLookup ()Lnet/minecraft/world/entity/EntityLookup; accessible method net/minecraft/client/render/entity/LivingEntityRenderer addFeature (Lnet/minecraft/client/render/entity/feature/FeatureRenderer;)Z + +accessible method net/minecraft/client/render/entity/EntityRenderer getBlockLight (Lnet/minecraft/entity/Entity;Lnet/minecraft/util/math/BlockPos;)I From 865da19bc632ecf2f668bdc02860227bb088797b Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 9 Jan 2023 16:53:48 +0000 Subject: [PATCH 16/27] Remove leftover --- build.gradle | 3 --- 1 file changed, 3 deletions(-) diff --git a/build.gradle b/build.gradle index 2cd84c9..2a2a812 100644 --- a/build.gradle +++ b/build.gradle @@ -26,9 +26,6 @@ repositories { name = "DevAuth" url = "https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1" } - maven { - url = "https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1" - } maven { name = "CottonMC" url = "https://server.bbkr.space/artifactory/libs-release" From 575cc537f65c579ef42640f62c33ce9df0510735 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 13 Jan 2023 00:54:45 +0000 Subject: [PATCH 17/27] Fix lighting issues with attach --- .../render/ClientizenAttachedEntityFeatureRenderer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index 7f1719e..b2545f8 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -12,6 +12,8 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.LightType; import java.util.List; @@ -30,10 +32,8 @@ public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, } for (EntityTag attached : attachedEntities) { matrices.push(); - matrices.scale(1, -1, 1); - EntityRenderer renderer = MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(attached.getEntity()); - BlockPos blockPos = entity.getBlockPos().add(0, 1, 0); - light = LightmapTextureManager.pack(renderer.getBlockLight(attached.getEntity(), blockPos), entity.world.getLightLevel(LightType.SKY, blockPos)); + matrices.scale(1, 1, 1); + matrices.multiply(Direction.DOWN.getRotationQuaternion()); MinecraftClient.getInstance().getEntityRenderDispatcher().render(attached.getEntity(), 0, 0, 0, attached.getEntity().getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); matrices.pop(); } From 9c477f0ae92907a4dfeb81de8654b544db2913fc Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 13 Jan 2023 01:14:29 +0000 Subject: [PATCH 18/27] Supress unchecked cast warning. remove old code --- .../clientizen/mixin/render/EntityRendererMixin.java | 8 +------- .../render/ClientizenAttachedEntityFeatureRenderer.java | 5 ----- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java index ea08102..43f2b3e 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java @@ -25,14 +25,8 @@ public abstract class EntityRendererMixin model, float shadowRadius, CallbackInfo ci) { + @SuppressWarnings("unchecked") LivingEntityRenderer renderer = (LivingEntityRenderer) (Object) this; addFeature(new ClientizenAttachedEntityFeatureRenderer<>(renderer)); } - - /*@Inject(method = "getPositionOffset", cancellable = true, at = @At("HEAD")) - private void clientizen$getAttachedOffset(T entity, float tickDelta, CallbackInfoReturnable cir) { - if (AttachCommand.attachedEntities.containsKey(entity.getUuid())) { - cir.setReturnValue(AttachCommand.attachedEntities.get(entity.getUuid()).getEntity().getLerpedPos(tickDelta).subtract(entity.getLerpedPos(tickDelta))); - } - }*/ } diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index b2545f8..bbe626a 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -3,18 +3,13 @@ import com.denizenscript.clientizen.objects.EntityTag; import com.denizenscript.clientizen.scripts.commands.AttachCommand; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.LightType; import java.util.List; From 40b7f24721fed50adef6f980e176e55a271408d5 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 13 Jan 2023 01:31:53 +0000 Subject: [PATCH 19/27] Minor `EntityTag` cleanups --- .../com/denizenscript/clientizen/objects/EntityTag.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java index 78b294b..0023ffd 100644 --- a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java +++ b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java @@ -6,6 +6,7 @@ import com.denizenscript.denizencore.tags.Attribute; import com.denizenscript.denizencore.tags.ObjectTagProcessor; import com.denizenscript.denizencore.tags.TagContext; +import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; @@ -39,13 +40,16 @@ public static EntityTag valueOf(String string, TagContext context) { } catch (Exception ignored) {} if (context == null || context.showErrors()) { - Debug.log("valueOf EntityTag returning null: " + string); + Debug.echoError("valueOf EntityTag returning null: " + string); } return null; } public static boolean matches(String string) { - return string.startsWith("e@"); + if (string.startsWith("e@")) { + return true; + } + return valueOf(string, CoreUtilities.noDebugContext) != null; } public Entity getEntity() { From 165eb5f2797deb12cfd08e2997e801d6fb9662cc Mon Sep 17 00:00:00 2001 From: acikek Date: Thu, 12 Jan 2023 21:37:53 -0800 Subject: [PATCH 20/27] experimental args for attach --- .../render/EntityRenderDispatcherMixin.java | 14 ++++- .../mixin/render/EntityRendererMixin.java | 32 ---------- .../render/LivingEntityRendererMixin.java | 59 +++++++++++++++++++ .../scripts/commands/AttachCommand.java | 15 +++-- src/main/resources/clientizen.mixins.json | 6 +- 5 files changed, 85 insertions(+), 41 deletions(-) delete mode 100644 src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java create mode 100644 src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java index e9f2a4c..245ddf9 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java @@ -2,11 +2,15 @@ import com.denizenscript.clientizen.scripts.commands.AttachCommand; import net.minecraft.client.render.Frustum; +import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; +import net.minecraft.world.WorldView; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(EntityRenderDispatcher.class) @@ -15,8 +19,16 @@ public class EntityRenderDispatcherMixin { @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) private void clientizen$cancelRenderIfAttached( E entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable cir) { - if (AttachCommand.attachedEntities.contains(entity.getUuid())) { + if (AttachCommand.attachedEntities.containsKey(entity.getUuid())) { cir.setReturnValue(false); } } + + @Inject(method = "renderShadow", at = @At("HEAD"), cancellable = true) + private static void clientizen$cancelAttachShadow(MatrixStack matrices, VertexConsumerProvider vertexConsumers, Entity entity, float opacity, float tickDelta, WorldView world, float radius, CallbackInfo ci) { + AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); + if (data != null && data.noShadow()) { + ci.cancel(); + } + } } diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java deleted file mode 100644 index 43f2b3e..0000000 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRendererMixin.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.denizenscript.clientizen.mixin.render; - -import com.denizenscript.clientizen.render.ClientizenAttachedEntityFeatureRenderer; -import com.denizenscript.clientizen.scripts.commands.AttachCommand; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.math.Vec3d; -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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(LivingEntityRenderer.class) -public abstract class EntityRendererMixin> { - - @Shadow - public abstract boolean addFeature(FeatureRenderer feature); - - @Inject(method = "", at = @At("TAIL")) - private void clientizen$addAttachFeatureRenderer(EntityRendererFactory.Context ctx, EntityModel model, float shadowRadius, CallbackInfo ci) { - @SuppressWarnings("unchecked") - LivingEntityRenderer renderer = (LivingEntityRenderer) (Object) this; - addFeature(new ClientizenAttachedEntityFeatureRenderer<>(renderer)); - } -} diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java new file mode 100644 index 0000000..9b5853a --- /dev/null +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java @@ -0,0 +1,59 @@ +package com.denizenscript.clientizen.mixin.render; + +import com.denizenscript.clientizen.render.ClientizenAttachedEntityFeatureRenderer; +import com.denizenscript.clientizen.scripts.commands.AttachCommand; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LivingEntityRenderer.class) +public abstract class LivingEntityRendererMixin> { + + private Entity clientizen$renderingEntity; + + @Shadow + public abstract boolean addFeature(FeatureRenderer feature); + + @Inject(method = "", at = @At("TAIL")) + private void clientizen$addAttachFeatureRenderer(EntityRendererFactory.Context ctx, EntityModel model, float shadowRadius, CallbackInfo ci) { + @SuppressWarnings("unchecked") + LivingEntityRenderer renderer = (LivingEntityRenderer) (Object) this; + addFeature(new ClientizenAttachedEntityFeatureRenderer<>(renderer)); + } + + @Inject(method = "setupTransforms", cancellable = true, at = @At("HEAD")) + private void clientizen$cancelAttachAnimation(T entity, MatrixStack matrices, float animationProgress, float bodyYaw, float tickDelta, CallbackInfo ci) { + AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); + if (data != null && data.noAnimation()) { + ci.cancel(); + } + } + + @Inject(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD")) + private void clientizen$captureRenderingEntity(T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { + clientizen$renderingEntity = livingEntity; + } + + // TODO fix this (ordinal wrong maybe) + @ModifyVariable( + method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", + at = @At(value = "STORE"), ordinal = 8) + private float clientizen$cancelAttachAngles(float animationProgress) { + if (clientizen$renderingEntity != null) { + AttachCommand.AttachData data = AttachCommand.attachedEntities.get(clientizen$renderingEntity.getUuid()); + if (data != null && data.noAnimation()) { + return 0.0f; + } + } + return animationProgress; + } +} diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java index 3e84a47..9fe3ccb 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java @@ -14,13 +14,15 @@ public class AttachCommand extends AbstractCommand { + public record AttachData(boolean noShadow, boolean noAnimation) {} + public static Map> attachMap = new HashMap<>(); - public static List attachedEntities = new ArrayList<>(); + public static Map attachedEntities = new HashMap<>(); public AttachCommand() { setName("attach"); - setSyntax("attach [|...] [to:] (cancel)"); - setRequiredArguments(2, 2); + setSyntax("attach [|...] [to:] (cancel) (no_shadow) (no_animation)"); + setRequiredArguments(2, 5); isProcedural = false; autoCompile(); } @@ -28,11 +30,14 @@ public AttachCommand() { public static void autoExecute(ScriptEntry scriptEntry, @ArgLinear @ArgName("entities") ListTag attachingEntities, @ArgDefaultNull @ArgPrefixed @ArgName("to") EntityTag toEntity, - @ArgName("cancel") boolean cancel) { + @ArgName("cancel") boolean cancel, + @ArgName("no_shadow") boolean noShadow, + @ArgName("no_animation") boolean noAnimation) { if (!cancel && toEntity == null) { throw new InvalidArgumentsRuntimeException("Must specify an entity to attach to"); } List attaching = attachingEntities.filter(EntityTag.class, scriptEntry.context); + AttachData attachData = new AttachData(noShadow, noAnimation); if (attachMap.containsKey(toEntity.uuid)) { attachMap.get(toEntity.uuid).addAll(attaching); } @@ -40,7 +45,7 @@ public static void autoExecute(ScriptEntry scriptEntry, attachMap.put(toEntity.uuid, attaching); } for (EntityTag entityTag : attaching) { - attachedEntities.add(entityTag.uuid); + attachedEntities.put(entityTag.uuid, attachData); } } } diff --git a/src/main/resources/clientizen.mixins.json b/src/main/resources/clientizen.mixins.json index 2a76096..caecaff 100644 --- a/src/main/resources/clientizen.mixins.json +++ b/src/main/resources/clientizen.mixins.json @@ -7,10 +7,10 @@ "client": [ "KeyBindingMixin", "MinecraftClientMixin", - "render.EntityRenderDispatcherMixin", - "render.EntityRendererMixin", "gui.WScrollPanelAccessor", - "gui.WTextAccessor" + "gui.WTextAccessor", + "render.EntityRenderDispatcherMixin", + "render.LivingEntityRendererMixin" ], "injectors": { "defaultRequire": 1 From 8f0256527161919c627375f8c6e5171e6cacb833 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 13 Jan 2023 12:40:29 +0000 Subject: [PATCH 21/27] Register `attached` feature renderer using API --- .../denizenscript/clientizen/Clientizen.java | 2 ++ .../render/LivingEntityRendererMixin.java | 18 +++--------------- ...lientizenAttachedEntityFeatureRenderer.java | 7 +++++++ .../scripts/commands/AttachCommand.java | 5 ++++- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/Clientizen.java b/src/main/java/com/denizenscript/clientizen/Clientizen.java index 490913f..56f0a4c 100644 --- a/src/main/java/com/denizenscript/clientizen/Clientizen.java +++ b/src/main/java/com/denizenscript/clientizen/Clientizen.java @@ -4,6 +4,7 @@ import com.denizenscript.clientizen.events.ClientizenScriptEventRegistry; import com.denizenscript.clientizen.network.NetworkManager; import com.denizenscript.clientizen.objects.ClientizenObjectRegistry; +import com.denizenscript.clientizen.render.ClientizenAttachedEntityFeatureRenderer; import com.denizenscript.clientizen.scripts.ClientScriptHandler; import com.denizenscript.clientizen.scripts.commands.ClientizenCommandRegistry; import com.denizenscript.clientizen.scripts.containers.ClientizenContainerRegistry; @@ -76,6 +77,7 @@ public void onInitializeClient() { NetworkManager.init(); ClientizenDebugScreen.register(); ClientScriptHandler.init(); + ClientizenAttachedEntityFeatureRenderer.init(); // Check for the client scripts folder File scriptsFolder = DenizenCore.implementation.getScriptFolder(); diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java index 9b5853a..d6c53f4 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java @@ -1,18 +1,16 @@ package com.denizenscript.clientizen.mixin.render; -import com.denizenscript.clientizen.render.ClientizenAttachedEntityFeatureRenderer; import com.denizenscript.clientizen.scripts.commands.AttachCommand; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LivingEntityRenderer.class) @@ -20,16 +18,6 @@ public abstract class LivingEntityRendererMixin feature); - - @Inject(method = "", at = @At("TAIL")) - private void clientizen$addAttachFeatureRenderer(EntityRendererFactory.Context ctx, EntityModel model, float shadowRadius, CallbackInfo ci) { - @SuppressWarnings("unchecked") - LivingEntityRenderer renderer = (LivingEntityRenderer) (Object) this; - addFeature(new ClientizenAttachedEntityFeatureRenderer<>(renderer)); - } - @Inject(method = "setupTransforms", cancellable = true, at = @At("HEAD")) private void clientizen$cancelAttachAnimation(T entity, MatrixStack matrices, float animationProgress, float bodyYaw, float tickDelta, CallbackInfo ci) { AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index bbe626a..500c2f9 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -2,6 +2,7 @@ import com.denizenscript.clientizen.objects.EntityTag; import com.denizenscript.clientizen.scripts.commands.AttachCommand; +import net.fabricmc.fabric.api.client.rendering.v1.LivingEntityFeatureRendererRegistrationCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.feature.FeatureRenderer; @@ -15,6 +16,12 @@ public class ClientizenAttachedEntityFeatureRenderer> extends FeatureRenderer { + public static void init() { + LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper, context) -> { + registrationHelper.register(new ClientizenAttachedEntityFeatureRenderer<>(entityRenderer)); + }); + } + public ClientizenAttachedEntityFeatureRenderer(FeatureRendererContext context) { super(context); } diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java index 9fe3ccb..68fb8e2 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java @@ -10,7 +10,10 @@ import com.denizenscript.denizencore.scripts.commands.generator.ArgName; import com.denizenscript.denizencore.scripts.commands.generator.ArgPrefixed; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; public class AttachCommand extends AbstractCommand { From d98e620a6ef2b9d242f34aebf223529a0ed0d4fc Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 13 Jan 2023 17:19:16 +0000 Subject: [PATCH 22/27] Prevent rotation for attached entities --- .../mixin/render/LivingEntityRendererMixin.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java index d6c53f4..962b3a6 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java @@ -11,6 +11,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LivingEntityRenderer.class) @@ -44,4 +45,13 @@ public abstract class LivingEntityRendererMixin Date: Fri, 13 Jan 2023 17:22:44 +0000 Subject: [PATCH 23/27] Supress warning in previous commit --- .../clientizen/mixin/render/LivingEntityRendererMixin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java index 962b3a6..3d4e9e4 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java @@ -51,6 +51,7 @@ public abstract class LivingEntityRendererMixin Date: Sun, 15 Jan 2023 14:27:01 +0000 Subject: [PATCH 24/27] Improve `EntityTag#debuggable` --- .../denizenscript/clientizen/objects/EntityTag.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java index 0023ffd..3b04c79 100644 --- a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java +++ b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java @@ -93,7 +93,15 @@ public String identifySimple() { @Override public String debuggable() { - return "e@" + uuid + (getEntity() != null ? " (" + getEntity().getType().getUntranslatedName() + ")" : ""); + String debuggable = "e@" + uuid; + if (getEntity() != null) { + debuggable += " (" + entity.getType().getUntranslatedName(); + if (entity.hasCustomName()) { + debuggable += "/" + entity.getCustomName().getString(); + } + debuggable += ")"; + } + return debuggable; } @Override From feaaa97ec69576adab8f505692d6d7658e7b6cd8 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 15 Jan 2023 14:27:50 +0000 Subject: [PATCH 25/27] Implement `client.flag` tags --- .../denizenscript/clientizen/Clientizen.java | 1 + .../clientizen/tags/ClientTagBase.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/com/denizenscript/clientizen/Clientizen.java b/src/main/java/com/denizenscript/clientizen/Clientizen.java index 56f0a4c..382cd03 100644 --- a/src/main/java/com/denizenscript/clientizen/Clientizen.java +++ b/src/main/java/com/denizenscript/clientizen/Clientizen.java @@ -53,6 +53,7 @@ public void onInitializeClient() { CoreUtilities.basicContext = new ClientizenTagContext(true, null, null); CoreUtilities.errorButNoDebugContext = new ClientizenTagContext(false, null, null); DenizenCore.init(coreImplementation); + DenizenCore.reloadSaves(); // Configure Denizen-Core CoreConfiguration.allowConsoleRedirection = false; diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java index 22ab219..797895c 100644 --- a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java +++ b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java @@ -1,7 +1,12 @@ package com.denizenscript.clientizen.tags; import com.denizenscript.clientizen.objects.EntityTag; +import com.denizenscript.denizencore.DenizenCore; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.objects.core.MapTag; +import com.denizenscript.denizencore.objects.core.TimeTag; import com.denizenscript.denizencore.tags.PseudoObjectTagBase; import com.denizenscript.denizencore.tags.TagManager; import net.minecraft.client.MinecraftClient; @@ -32,5 +37,20 @@ public void register() { tagProcessor.registerTag(EntityTag.class, "self_entity", (attribute, object) -> { return new EntityTag(MinecraftClient.getInstance().player); }); + tagProcessor.registerTag(ElementTag.class, ElementTag.class, "has_flag", (attribute, object, param) -> { + return new ElementTag(DenizenCore.serverFlagMap.hasFlag(param.asString())); + }); + tagProcessor.registerTag(ObjectTag.class, ElementTag.class, "flag", (attribute, object, param) -> { + return DenizenCore.serverFlagMap.doFlagTag(attribute); + }); + tagProcessor.registerTag(TimeTag.class, ElementTag.class, "flag_expiration", (attribute, object, param) -> { + return DenizenCore.serverFlagMap.doFlagExpirationTag(attribute); + }); + tagProcessor.registerTag(ListTag.class, "list_flags", (attribute, object) -> { + return DenizenCore.serverFlagMap.doListFlagsTag(attribute); + }); + tagProcessor.registerTag(MapTag.class, "flag_map", (attribute, object) -> { + return DenizenCore.serverFlagMap.doFlagMapTag(attribute); + }); } } From cb687913e5c319fe42990a976de3b5fa0e111ddc Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 5 Feb 2023 17:57:13 +0000 Subject: [PATCH 26/27] Remove old code --- src/main/java/com/denizenscript/clientizen/Clientizen.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/Clientizen.java b/src/main/java/com/denizenscript/clientizen/Clientizen.java index 0776305..679b80d 100644 --- a/src/main/java/com/denizenscript/clientizen/Clientizen.java +++ b/src/main/java/com/denizenscript/clientizen/Clientizen.java @@ -4,9 +4,8 @@ import com.denizenscript.clientizen.events.ClientizenScriptEventRegistry; import com.denizenscript.clientizen.network.NetworkManager; import com.denizenscript.clientizen.objects.ClientizenObjectRegistry; -import com.denizenscript.clientizen.render.ClientizenAttachedEntityFeatureRenderer; -import com.denizenscript.clientizen.scripts.ClientScriptHandler; import com.denizenscript.clientizen.objects.properties.PropertyRegistry; +import com.denizenscript.clientizen.render.ClientizenAttachedEntityFeatureRenderer; import com.denizenscript.clientizen.scripts.commands.ClientizenCommandRegistry; import com.denizenscript.clientizen.scripts.containers.ClientizenContainerRegistry; import com.denizenscript.clientizen.tags.ClientizenTagContext; @@ -81,7 +80,6 @@ public void onInitializeClient() { // Initialize Clientizen systems NetworkManager.init(); ClientizenDebugScreen.register(); - ClientScriptHandler.init(); ClientizenAttachedEntityFeatureRenderer.init(); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> new ClientExecuteCommand(dispatcher)); From 65ebf1a4f6afae5c2eef35b88ecd67cfb0413a9f Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 5 Feb 2023 18:19:17 +0000 Subject: [PATCH 27/27] Replace Tabs --- .../denizenscript/clientizen/Clientizen.java | 8 +-- .../render/EntityRenderDispatcherMixin.java | 28 ++++---- .../render/LivingEntityRendererMixin.java | 68 +++++++++---------- ...ientizenAttachedEntityFeatureRenderer.java | 44 ++++++------ .../scripts/commands/AttachCommand.java | 62 ++++++++--------- .../commands/ClientizenCommandRegistry.java | 8 +-- 6 files changed, 109 insertions(+), 109 deletions(-) diff --git a/src/main/java/com/denizenscript/clientizen/Clientizen.java b/src/main/java/com/denizenscript/clientizen/Clientizen.java index 679b80d..ef8ae2e 100644 --- a/src/main/java/com/denizenscript/clientizen/Clientizen.java +++ b/src/main/java/com/denizenscript/clientizen/Clientizen.java @@ -77,10 +77,10 @@ public void onInitializeClient() { ClientizenTagRegistry.registerTagHandlers(); PropertyRegistry.register(); - // Initialize Clientizen systems - NetworkManager.init(); - ClientizenDebugScreen.register(); - ClientizenAttachedEntityFeatureRenderer.init(); + // Initialize Clientizen systems + NetworkManager.init(); + ClientizenDebugScreen.register(); + ClientizenAttachedEntityFeatureRenderer.init(); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> new ClientExecuteCommand(dispatcher)); // Check for the client scripts folder diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java index 245ddf9..c6f08db 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/EntityRenderDispatcherMixin.java @@ -16,19 +16,19 @@ @Mixin(EntityRenderDispatcher.class) public class EntityRenderDispatcherMixin { - @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) - private void clientizen$cancelRenderIfAttached( - E entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable cir) { - if (AttachCommand.attachedEntities.containsKey(entity.getUuid())) { - cir.setReturnValue(false); - } - } + @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) + private void clientizen$cancelRenderIfAttached( + E entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable cir) { + if (AttachCommand.attachedEntities.containsKey(entity.getUuid())) { + cir.setReturnValue(false); + } + } - @Inject(method = "renderShadow", at = @At("HEAD"), cancellable = true) - private static void clientizen$cancelAttachShadow(MatrixStack matrices, VertexConsumerProvider vertexConsumers, Entity entity, float opacity, float tickDelta, WorldView world, float radius, CallbackInfo ci) { - AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); - if (data != null && data.noShadow()) { - ci.cancel(); - } - } + @Inject(method = "renderShadow", at = @At("HEAD"), cancellable = true) + private static void clientizen$cancelAttachShadow(MatrixStack matrices, VertexConsumerProvider vertexConsumers, Entity entity, float opacity, float tickDelta, WorldView world, float radius, CallbackInfo ci) { + AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); + if (data != null && data.noShadow()) { + ci.cancel(); + } + } } diff --git a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java index 3d4e9e4..13c2300 100644 --- a/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java +++ b/src/main/java/com/denizenscript/clientizen/mixin/render/LivingEntityRendererMixin.java @@ -17,42 +17,42 @@ @Mixin(LivingEntityRenderer.class) public abstract class LivingEntityRendererMixin> { - private Entity clientizen$renderingEntity; + private Entity clientizen$renderingEntity; - @Inject(method = "setupTransforms", cancellable = true, at = @At("HEAD")) - private void clientizen$cancelAttachAnimation(T entity, MatrixStack matrices, float animationProgress, float bodyYaw, float tickDelta, CallbackInfo ci) { - AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); - if (data != null && data.noAnimation()) { - ci.cancel(); - } - } + @Inject(method = "setupTransforms", cancellable = true, at = @At("HEAD")) + private void clientizen$cancelAttachAnimation(T entity, MatrixStack matrices, float animationProgress, float bodyYaw, float tickDelta, CallbackInfo ci) { + AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); + if (data != null && data.noAnimation()) { + ci.cancel(); + } + } - @Inject(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD")) - private void clientizen$captureRenderingEntity(T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { - clientizen$renderingEntity = livingEntity; - } + @Inject(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD")) + private void clientizen$captureRenderingEntity(T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { + clientizen$renderingEntity = livingEntity; + } - // TODO fix this (ordinal wrong maybe) - @ModifyVariable( - method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", - at = @At(value = "STORE"), ordinal = 8) - private float clientizen$cancelAttachAngles(float animationProgress) { - if (clientizen$renderingEntity != null) { - AttachCommand.AttachData data = AttachCommand.attachedEntities.get(clientizen$renderingEntity.getUuid()); - if (data != null && data.noAnimation()) { - return 0.0f; - } - } - return animationProgress; - } + // TODO fix this (ordinal wrong maybe) + @ModifyVariable( + method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", + at = @At(value = "STORE"), ordinal = 8) + private float clientizen$cancelAttachAngles(float animationProgress) { + if (clientizen$renderingEntity != null) { + AttachCommand.AttachData data = AttachCommand.attachedEntities.get(clientizen$renderingEntity.getUuid()); + if (data != null && data.noAnimation()) { + return 0.0f; + } + } + return animationProgress; + } - @Redirect(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/EntityModel;setAngles(Lnet/minecraft/entity/Entity;FFFFF)V")) - private void clienizen$disableAnimations(M instance, Entity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); - if (data == null || !data.noAnimation()) { - //noinspection unchecked - instance.setAngles((T) entity, limbAngle, limbDistance, animationProgress, headYaw, headPitch); - } - } + @Redirect(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/EntityModel;setAngles(Lnet/minecraft/entity/Entity;FFFFF)V")) + private void clienizen$disableAnimations(M instance, Entity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + AttachCommand.AttachData data = AttachCommand.attachedEntities.get(entity.getUuid()); + if (data == null || !data.noAnimation()) { + //noinspection unchecked + instance.setAngles((T) entity, limbAngle, limbDistance, animationProgress, headYaw, headPitch); + } + } } diff --git a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java index 500c2f9..f3a5f9c 100644 --- a/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java +++ b/src/main/java/com/denizenscript/clientizen/render/ClientizenAttachedEntityFeatureRenderer.java @@ -16,28 +16,28 @@ public class ClientizenAttachedEntityFeatureRenderer> extends FeatureRenderer { - public static void init() { - LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper, context) -> { - registrationHelper.register(new ClientizenAttachedEntityFeatureRenderer<>(entityRenderer)); - }); - } + public static void init() { + LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper, context) -> { + registrationHelper.register(new ClientizenAttachedEntityFeatureRenderer<>(entityRenderer)); + }); + } - public ClientizenAttachedEntityFeatureRenderer(FeatureRendererContext context) { - super(context); - } + public ClientizenAttachedEntityFeatureRenderer(FeatureRendererContext context) { + super(context); + } - @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - List attachedEntities = AttachCommand.attachMap.get(entity.getUuid()); - if (attachedEntities == null) { - return; - } - for (EntityTag attached : attachedEntities) { - matrices.push(); - matrices.scale(1, 1, 1); - matrices.multiply(Direction.DOWN.getRotationQuaternion()); - MinecraftClient.getInstance().getEntityRenderDispatcher().render(attached.getEntity(), 0, 0, 0, attached.getEntity().getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); - matrices.pop(); - } - } + @Override + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + List attachedEntities = AttachCommand.attachMap.get(entity.getUuid()); + if (attachedEntities == null) { + return; + } + for (EntityTag attached : attachedEntities) { + matrices.push(); + matrices.scale(1, 1, 1); + matrices.multiply(Direction.DOWN.getRotationQuaternion()); + MinecraftClient.getInstance().getEntityRenderDispatcher().render(attached.getEntity(), 0, 0, 0, attached.getEntity().getYaw(tickDelta), tickDelta, matrices, vertexConsumers, light); + matrices.pop(); + } + } } diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java index 68fb8e2..f25ca9b 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/AttachCommand.java @@ -17,38 +17,38 @@ public class AttachCommand extends AbstractCommand { - public record AttachData(boolean noShadow, boolean noAnimation) {} + public record AttachData(boolean noShadow, boolean noAnimation) {} - public static Map> attachMap = new HashMap<>(); - public static Map attachedEntities = new HashMap<>(); + public static Map> attachMap = new HashMap<>(); + public static Map attachedEntities = new HashMap<>(); - public AttachCommand() { - setName("attach"); - setSyntax("attach [|...] [to:] (cancel) (no_shadow) (no_animation)"); - setRequiredArguments(2, 5); - isProcedural = false; - autoCompile(); - } + public AttachCommand() { + setName("attach"); + setSyntax("attach [|...] [to:] (cancel) (no_shadow) (no_animation)"); + setRequiredArguments(2, 5); + isProcedural = false; + autoCompile(); + } - public static void autoExecute(ScriptEntry scriptEntry, - @ArgLinear @ArgName("entities") ListTag attachingEntities, - @ArgDefaultNull @ArgPrefixed @ArgName("to") EntityTag toEntity, - @ArgName("cancel") boolean cancel, - @ArgName("no_shadow") boolean noShadow, - @ArgName("no_animation") boolean noAnimation) { - if (!cancel && toEntity == null) { - throw new InvalidArgumentsRuntimeException("Must specify an entity to attach to"); - } - List attaching = attachingEntities.filter(EntityTag.class, scriptEntry.context); - AttachData attachData = new AttachData(noShadow, noAnimation); - if (attachMap.containsKey(toEntity.uuid)) { - attachMap.get(toEntity.uuid).addAll(attaching); - } - else { - attachMap.put(toEntity.uuid, attaching); - } - for (EntityTag entityTag : attaching) { - attachedEntities.put(entityTag.uuid, attachData); - } - } + public static void autoExecute(ScriptEntry scriptEntry, + @ArgLinear @ArgName("entities") ListTag attachingEntities, + @ArgDefaultNull @ArgPrefixed @ArgName("to") EntityTag toEntity, + @ArgName("cancel") boolean cancel, + @ArgName("no_shadow") boolean noShadow, + @ArgName("no_animation") boolean noAnimation) { + if (!cancel && toEntity == null) { + throw new InvalidArgumentsRuntimeException("Must specify an entity to attach to"); + } + List attaching = attachingEntities.filter(EntityTag.class, scriptEntry.context); + AttachData attachData = new AttachData(noShadow, noAnimation); + if (attachMap.containsKey(toEntity.uuid)) { + attachMap.get(toEntity.uuid).addAll(attaching); + } + else { + attachMap.put(toEntity.uuid, attaching); + } + for (EntityTag entityTag : attaching) { + attachedEntities.put(entityTag.uuid, attachData); + } + } } diff --git a/src/main/java/com/denizenscript/clientizen/scripts/commands/ClientizenCommandRegistry.java b/src/main/java/com/denizenscript/clientizen/scripts/commands/ClientizenCommandRegistry.java index a25106f..92827d4 100644 --- a/src/main/java/com/denizenscript/clientizen/scripts/commands/ClientizenCommandRegistry.java +++ b/src/main/java/com/denizenscript/clientizen/scripts/commands/ClientizenCommandRegistry.java @@ -5,11 +5,11 @@ public class ClientizenCommandRegistry { - public static void registerCommands() { + public static void registerCommands() { registerCommand(AttachCommand.class); - registerCommand(GuiCommand.class); - registerCommand(NarrateCommand.class); - registerCommand(ServerEventCommand.class); + registerCommand(GuiCommand.class); + registerCommand(NarrateCommand.class); + registerCommand(ServerEventCommand.class); } private static void registerCommand(Class command) {