Skip to content

Commit 300be08

Browse files
committed
Add EntityTag and entity client tags (from #6)
1 parent 7ecb83a commit 300be08

File tree

6 files changed

+161
-25
lines changed

6 files changed

+161
-25
lines changed

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ archivesBaseName = project.archives_base_name
1010
version = project.version
1111
group = project.maven_group
1212

13+
loom {
14+
accessWidenerPath = file("src/main/resources/clientizen.accesswidener")
15+
}
16+
1317
repositories {
1418
mavenCentral()
1519
// Uncomment to build with local Denizen-Core changes
Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
package com.denizenscript.clientizen.objects;
22

3-
public class ClientizenObjectRegistry {
4-
5-
public static void registerTagHandlers() {
3+
import com.denizenscript.denizencore.objects.ObjectFetcher;
4+
import com.denizenscript.denizencore.objects.ObjectType;
65

7-
}
8-
9-
public static void registerObjects() {
10-
registerObjectTypes();
11-
registerTagHandlers();
12-
}
6+
public class ClientizenObjectRegistry {
137

14-
public static void registerObjectTypes() {
8+
public static ObjectType<EntityTag> TYPE_ENTITY;
159

16-
}
10+
public static void registerObjects() {
11+
TYPE_ENTITY = ObjectFetcher.registerWithObjectFetcher(EntityTag.class, EntityTag.tagProcessor).setAsNOtherCode().generateBaseTag();
12+
}
1713
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package com.denizenscript.clientizen.objects;
2+
3+
import com.denizenscript.denizencore.objects.Fetchable;
4+
import com.denizenscript.denizencore.objects.ObjectTag;
5+
import com.denizenscript.denizencore.objects.core.ElementTag;
6+
import com.denizenscript.denizencore.tags.Attribute;
7+
import com.denizenscript.denizencore.tags.ObjectTagProcessor;
8+
import com.denizenscript.denizencore.tags.TagContext;
9+
import com.denizenscript.denizencore.utilities.CoreUtilities;
10+
import com.denizenscript.denizencore.utilities.debugging.Debug;
11+
import net.minecraft.client.MinecraftClient;
12+
import net.minecraft.entity.Entity;
13+
import net.minecraft.entity.LivingEntity;
14+
15+
import java.util.UUID;
16+
17+
public class EntityTag implements ObjectTag {
18+
19+
public UUID uuid;
20+
public Entity entity;
21+
22+
public EntityTag(Entity entity) {
23+
this.entity = entity;
24+
this.uuid = entity.getUuid();
25+
}
26+
27+
@Fetchable("e")
28+
public static EntityTag valueOf(String string, TagContext context) {
29+
if (string == null) {
30+
return null;
31+
}
32+
if (string.startsWith("e@")) {
33+
string = string.substring("e@".length());
34+
}
35+
try {
36+
Entity found = MinecraftClient.getInstance().world.getEntityLookup().get(UUID.fromString(string));
37+
if (found != null) {
38+
return new EntityTag(found);
39+
}
40+
}
41+
catch (Exception ignored) {}
42+
if (context == null || context.showErrors()) {
43+
Debug.echoError("valueOf EntityTag returning null: " + string);
44+
}
45+
return null;
46+
}
47+
48+
public static boolean matches(String string) {
49+
if (string.startsWith("e@")) {
50+
return true;
51+
}
52+
return valueOf(string, CoreUtilities.noDebugContext) != null;
53+
}
54+
55+
public Entity getEntity() {
56+
if (entity == null || entity.isRemoved()) {
57+
Entity found = MinecraftClient.getInstance().world.getEntityLookup().get(uuid);
58+
if (found != null) {
59+
entity = found;
60+
}
61+
}
62+
return entity;
63+
}
64+
65+
public static void register() {
66+
tagProcessor.registerTag(ElementTag.class, "entity_type", (attribute, object) -> {
67+
return new ElementTag(object.getEntity().getType().getUntranslatedName(), true);
68+
});
69+
tagProcessor.registerTag(ElementTag.class, "health", (attribute, object) -> {
70+
if (object.getEntity() instanceof LivingEntity livingEntity) {
71+
return new ElementTag(livingEntity.getHealth());
72+
}
73+
return null;
74+
});
75+
}
76+
77+
public static ObjectTagProcessor<EntityTag> tagProcessor = new ObjectTagProcessor<>();
78+
79+
@Override
80+
public ObjectTag getObjectAttribute(Attribute attribute) {
81+
return tagProcessor.getObjectAttribute(this, attribute);
82+
}
83+
84+
@Override
85+
public String identify() {
86+
return "e@" + uuid;
87+
}
88+
89+
@Override
90+
public String identifySimple() {
91+
return identify();
92+
}
93+
94+
@Override
95+
public String debuggable() {
96+
String debuggable = "<LG>e@<Y>" + uuid;
97+
if (getEntity() != null) {
98+
debuggable += " <GR>(" + entity.getType().getUntranslatedName();
99+
if (entity.hasCustomName()) {
100+
debuggable += "<Y>/<GR>" + entity.getCustomName().getString();
101+
}
102+
debuggable += ")";
103+
}
104+
return debuggable;
105+
}
106+
107+
@Override
108+
public String toString() {
109+
return identify();
110+
}
111+
112+
private String prefix = "Entity";
113+
114+
@Override
115+
public String getPrefix() {
116+
return prefix;
117+
}
118+
119+
@Override
120+
public boolean isUnique() {
121+
return true;
122+
}
123+
124+
@Override
125+
public ObjectTag setPrefix(String prefix) {
126+
this.prefix = prefix;
127+
return this;
128+
}
129+
}

src/main/java/com/denizenscript/clientizen/tags/ClientTagBase.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.denizenscript.clientizen.tags;
22

3+
import com.denizenscript.clientizen.objects.EntityTag;
34
import com.denizenscript.denizencore.DenizenCore;
45
import com.denizenscript.denizencore.objects.ObjectTag;
56
import com.denizenscript.denizencore.objects.core.ElementTag;
@@ -8,6 +9,8 @@
89
import com.denizenscript.denizencore.objects.core.TimeTag;
910
import com.denizenscript.denizencore.tags.PseudoObjectTagBase;
1011
import com.denizenscript.denizencore.tags.TagManager;
12+
import net.minecraft.client.MinecraftClient;
13+
import net.minecraft.entity.Entity;
1114

1215
public class ClientTagBase extends PseudoObjectTagBase<ClientTagBase> {
1316

@@ -20,20 +23,20 @@ public ClientTagBase() {
2023

2124
@Override
2225
public void register() {
23-
// tagProcessor.registerTag(ListTag.class, "loaded_entities", (attribute, object) -> {
24-
// ListTag list = new ListTag();
25-
// for (Entity entity : MinecraftClient.getInstance().world.getEntities()) {
26-
// list.addObject(new EntityTag(entity));
27-
// }
28-
// return list;
29-
// });
30-
// tagProcessor.registerTag(EntityTag.class, "target", (attribute, object) -> {
31-
// Entity target = MinecraftClient.getInstance().targetedEntity;
32-
// return target != null ? new EntityTag(target) : null;
33-
// });
34-
// tagProcessor.registerTag(EntityTag.class, "self_entity", (attribute, object) -> {
35-
// return new EntityTag(MinecraftClient.getInstance().player);
36-
// });
26+
tagProcessor.registerTag(ListTag.class, "loaded_entities", (attribute, object) -> {
27+
ListTag list = new ListTag();
28+
for (Entity entity : MinecraftClient.getInstance().world.getEntities()) {
29+
list.addObject(new EntityTag(entity));
30+
}
31+
return list;
32+
});
33+
tagProcessor.registerTag(EntityTag.class, "target", (attribute, object) -> {
34+
Entity target = MinecraftClient.getInstance().targetedEntity;
35+
return target != null ? new EntityTag(target) : null;
36+
});
37+
tagProcessor.registerTag(EntityTag.class, "self_entity", (attribute, object) -> {
38+
return new EntityTag(MinecraftClient.getInstance().player);
39+
});
3740
tagProcessor.registerTag(ElementTag.class, ElementTag.class, "has_flag", (attribute, object, param) -> {
3841
return new ElementTag(DenizenCore.serverFlagMap.hasFlag(param.asString()));
3942
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
accessWidener v2 named
2+
3+
accessible method net/minecraft/client/world/ClientWorld getEntityLookup ()Lnet/minecraft/world/entity/EntityLookup;

src/main/resources/fabric.mod.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"mixins": [
2424
"clientizen.mixins.json"
2525
],
26+
"accessWidener": "clientizen.accesswidener",
2627
"depends": {
2728
"fabricloader": ">=0.14.9",
2829
"fabric-api": "*",

0 commit comments

Comments
 (0)