From 300be087bf51af54f2cda4cae728bc90579a77d6 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 15 Jan 2023 14:48:10 +0000 Subject: [PATCH] Add `EntityTag` and entity `client` tags (from #6) --- build.gradle | 4 + .../objects/ClientizenObjectRegistry.java | 18 +-- .../clientizen/objects/EntityTag.java | 129 ++++++++++++++++++ .../clientizen/tags/ClientTagBase.java | 31 +++-- src/main/resources/clientizen.accesswidener | 3 + src/main/resources/fabric.mod.json | 1 + 6 files changed, 161 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/denizenscript/clientizen/objects/EntityTag.java create mode 100644 src/main/resources/clientizen.accesswidener diff --git a/build.gradle b/build.gradle index d51d119..2a2a812 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() // Uncomment to build with local Denizen-Core changes diff --git a/src/main/java/com/denizenscript/clientizen/objects/ClientizenObjectRegistry.java b/src/main/java/com/denizenscript/clientizen/objects/ClientizenObjectRegistry.java index 4adfb46..a854584 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 { - - public static void registerTagHandlers() { +import com.denizenscript.denizencore.objects.ObjectFetcher; +import com.denizenscript.denizencore.objects.ObjectType; - } - - public static void registerObjects() { - registerObjectTypes(); - registerTagHandlers(); - } +public class ClientizenObjectRegistry { - public static void registerObjectTypes() { + public static ObjectType TYPE_ENTITY; - } + public static void registerObjects() { + TYPE_ENTITY = ObjectFetcher.registerWithObjectFetcher(EntityTag.class, EntityTag.tagProcessor).setAsNOtherCode().generateBaseTag(); + } } diff --git a/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java new file mode 100644 index 0000000..7e95ff4 --- /dev/null +++ b/src/main/java/com/denizenscript/clientizen/objects/EntityTag.java @@ -0,0 +1,129 @@ +package com.denizenscript.clientizen.objects; + +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.CoreUtilities; +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 Entity entity; + + public EntityTag(Entity entity) { + this.entity = entity; + this.uuid = entity.getUuid(); + } + + @Fetchable("e") + public static EntityTag valueOf(String string, TagContext context) { + if (string == null) { + return null; + } + if (string.startsWith("e@")) { + string = string.substring("e@".length()); + } + try { + Entity found = MinecraftClient.getInstance().world.getEntityLookup().get(UUID.fromString(string)); + if (found != null) { + return new EntityTag(found); + } + } + catch (Exception ignored) {} + if (context == null || context.showErrors()) { + Debug.echoError("valueOf EntityTag returning null: " + string); + } + return null; + } + + public static boolean matches(String string) { + if (string.startsWith("e@")) { + return true; + } + return valueOf(string, CoreUtilities.noDebugContext) != null; + } + + 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; + }); + } + + public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); + + @Override + public ObjectTag getObjectAttribute(Attribute attribute) { + return tagProcessor.getObjectAttribute(this, attribute); + } + + @Override + public String identify() { + return "e@" + uuid; + } + + @Override + public String identifySimple() { + return identify(); + } + + @Override + public String debuggable() { + String debuggable = "e@" + uuid; + if (getEntity() != null) { + debuggable += " (" + entity.getType().getUntranslatedName(); + if (entity.hasCustomName()) { + debuggable += "/" + entity.getCustomName().getString(); + } + debuggable += ")"; + } + return debuggable; + } + + @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; + return this; + } +} diff --git a/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java b/src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java index bc743d0..34bab34 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.DenizenCore; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -8,6 +9,8 @@ import com.denizenscript.denizencore.objects.core.TimeTag; 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 { @@ -20,20 +23,20 @@ public ClientTagBase() { @Override public void register() { -// 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; -// }); -// tagProcessor.registerTag(EntityTag.class, "target", (attribute, object) -> { -// 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); -// }); + 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; + }); + tagProcessor.registerTag(EntityTag.class, "target", (attribute, object) -> { + 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); + }); tagProcessor.registerTag(ElementTag.class, ElementTag.class, "has_flag", (attribute, object, param) -> { return new ElementTag(DenizenCore.serverFlagMap.hasFlag(param.asString())); }); 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/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": "*",