diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 13d1c14..19d8f43 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,14 +5,19 @@
-
-
+
+
+
-
+
+
+
-
-
+
+
+
+
@@ -275,6 +280,7 @@
+
diff --git a/api/src/main/java/me/tofaa/entitylib/EntityUuidProvider.java b/api/src/main/java/me/tofaa/entitylib/EntityUuidProvider.java
index 4937514..bbd1f85 100644
--- a/api/src/main/java/me/tofaa/entitylib/EntityUuidProvider.java
+++ b/api/src/main/java/me/tofaa/entitylib/EntityUuidProvider.java
@@ -16,6 +16,7 @@ public interface EntityUuidProvider {
public @NotNull UUID provide(EntityType entityType) {
return UUID.randomUUID();
}
+
}
}
diff --git a/api/src/main/java/me/tofaa/entitylib/meta/CompatibilityIndex.java b/api/src/main/java/me/tofaa/entitylib/meta/CompatibilityIndex.java
deleted file mode 100644
index 2683859..0000000
--- a/api/src/main/java/me/tofaa/entitylib/meta/CompatibilityIndex.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package me.tofaa.entitylib.meta;
-
-import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType;
-
-public interface CompatibilityIndex {
-
- byte getOffSet(byte latestOffset, EntityDataType> type);
-
-}
diff --git a/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java b/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java
index d00132f..5150aa5 100644
--- a/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java
+++ b/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java
@@ -97,30 +97,6 @@ public class EntityMeta implements EntityMetadataProvider {
setMaskBit(OFFSET, INVISIBLE_BIT, value);
}
- public short getAirTicks() {
- return this.metadata.getIndex((byte) 1, (short) 300);
- }
-
- public void setAirTicks(short value) {
- this.metadata.setIndex((byte) 1, EntityDataTypes.SHORT, value);
- }
-
- public Component getCustomName() {
- return this.metadata.getIndex(offset(OFFSET, 2), null);
- }
-
- public void setCustomName(Component value) {
- this.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.ADV_COMPONENT, value);
- }
-
- public boolean isCustomNameVisible() {
- return this.metadata.getIndex(offset(OFFSET, 3), false);
- }
-
- public void setCustomNameVisible(boolean value) {
- this.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.BOOLEAN, value);
- }
-
public boolean hasGlowingEffect() {
return getMaskBit(OFFSET, HAS_GLOWING_EFFECT_BIT);
}
@@ -145,6 +121,30 @@ public class EntityMeta implements EntityMetadataProvider {
setMaskBit(OFFSET, FLYING_WITH_ELYTRA_BIT, value);
}
+ public short getAirTicks() {
+ return this.metadata.getIndex((byte) 1, (short) 300);
+ }
+
+ public void setAirTicks(short value) {
+ this.metadata.setIndex((byte) 1, EntityDataTypes.SHORT, value);
+ }
+
+ public Component getCustomName() {
+ return this.metadata.getIndex(offset(OFFSET, 2), null);
+ }
+
+ public void setCustomName(Component value) {
+ this.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.ADV_COMPONENT, value);
+ }
+
+ public boolean isCustomNameVisible() {
+ return this.metadata.getIndex(offset(OFFSET, 3), false);
+ }
+
+ public void setCustomNameVisible(boolean value) {
+ this.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.BOOLEAN, value);
+ }
+
public boolean isSilent() {
return this.metadata.getIndex((byte) 4, false);
}
diff --git a/api/src/main/java/me/tofaa/entitylib/meta/MetaOffsetConverter.java b/api/src/main/java/me/tofaa/entitylib/meta/MetaOffsetConverter.java
new file mode 100644
index 0000000..0848013
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/meta/MetaOffsetConverter.java
@@ -0,0 +1,259 @@
+// This class is generated by code-gen module. Do not edit manually.
+//
+package me.tofaa.entitylib.meta;
+
+import static me.tofaa.entitylib.EntityLib.getApi;
+
+import org.jetbrains.annotations.ApiStatus;
+
+@ApiStatus.Internal
+@SuppressWarnings("unused")
+public final class MetaOffsetConverter {
+ private MetaOffsetConverter() {
+ }
+
+ public static byte airTicksOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 47 && protocolVersion <= 47) {
+ return 1;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte customNameOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 47 && protocolVersion <= 765) {
+ return 2;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte customNameVisibleOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 47 && protocolVersion <= 765) {
+ return 3;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte silentOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 47 && protocolVersion <= 765) {
+ return 4;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte hasNoGravityOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 47 && protocolVersion <= 765) {
+ return 5;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte poseOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 47 && protocolVersion <= 765) {
+ return 6;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte ticksFrozenInPowderedSnowOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 47 && protocolVersion <= 765) {
+ return 7;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte interpolationDelayOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 762 && protocolVersion <= 765) {
+ return 8;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte transformationDurationOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 762 && protocolVersion <= 765) {
+ return 9;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte positionRotationInterpolationDurationOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 10;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte translationOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 11;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 10;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte scaleOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 12;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 11;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte leftRotationOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 13;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 12;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte rightRotationOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 14;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 13;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte billboardConstraintsOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 15;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 14;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte brightnessOverrideOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 16;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 15;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte viewRangeOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 17;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 16;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte shadowRadiusOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 18;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 17;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte shadowStrengthOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 19;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 18;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte widthOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 20;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 19;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte heightOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 21;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 20;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte glowColorOverrideOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 22;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 21;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte blockIdOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 23;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 22;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte itemOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 24;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 23;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+
+ public static byte displayTypeOffset() {
+ int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion();
+ if (protocolVersion >= 764 && protocolVersion <= 765) {
+ return 25;
+ }
+ if (protocolVersion >= 762 && protocolVersion <= 763) {
+ return 24;
+ }
+ throw new RuntimeException("Unknown protocol version for this method");
+ }
+}
diff --git a/code-gen/build.gradle b/code-gen/build.gradle
index f3f728c..e6439d3 100644
--- a/code-gen/build.gradle
+++ b/code-gen/build.gradle
@@ -12,15 +12,6 @@ repositories {
mavenCentral()
}
-// adding autogenerated sources to the main source set
-sourceSets {
- main {
- java {
- srcDirs += 'autogenerated'
- }
- }
-}
-
dependencies {
implementation 'com.google.code.gson:gson:2.10.1'
implementation 'com.squareup:javapoet:1.13.0'
diff --git a/code-gen/src/main/java/me/tofaa/entitylib/codegen/Main.java b/code-gen/src/main/java/me/tofaa/entitylib/codegen/Main.java
index 4a912e7..4567f29 100644
--- a/code-gen/src/main/java/me/tofaa/entitylib/codegen/Main.java
+++ b/code-gen/src/main/java/me/tofaa/entitylib/codegen/Main.java
@@ -1,21 +1,21 @@
package me.tofaa.entitylib.codegen;
-import com.squareup.javapoet.ClassName;
-import com.squareup.javapoet.JavaFile;
-import com.squareup.javapoet.TypeSpec;
+import com.google.gson.FieldNamingPolicy;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.squareup.javapoet.*;
+import org.jetbrains.annotations.ApiStatus;
import javax.lang.model.element.Modifier;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import static me.tofaa.entitylib.codegen.MetadataClass.createMetadataClass;
+import java.io.InputStream;
+import java.io.InputStreamReader;
public final class Main {
private Main() {}
- static final File OUT = new File("./code-gen/autogenerated/");
+ private static final File OUT = new File("./api/src/main/java");
static {
if (!OUT.exists()) {
OUT.mkdirs();
@@ -27,34 +27,50 @@ public final class Main {
}
public static void main(String[] args) throws IOException {
- createMetadataClass();
- List metaClasses = new ArrayList<>();
- // test
- MetaMethod method = new MetaMethod("username", String.class, "\"\"", "EntityDataType.STRING", List.of(new VersionCheck(47, 47, (byte) 0)));
- MetaClass obj = new MetaClass("me.tofaa.entitylib.meta:EntityMeta", null, List.of(method));
+ TypeSpec.Builder baseBuilder = TypeSpec.classBuilder(ClassName.get("me.tofaa.entitylib.meta", "MetaOffsetConverter"))
+ .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
+ .addAnnotation(ApiStatus.Internal.class)
+ .addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "$S", "unused").build())
+ .addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build());
- writeClass(obj);
- }
-
- private static void writeClass(MetaClass metaClass) {
- TypeSpec typeSpec = metaClass.create();
- JavaFile javaFile = JavaFile.builder("me.tofaa.entitylib.meta", typeSpec).build();
- try {
- javaFile.writeToPath(OUT.toPath());
+ Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();
+ InputStream stream = Main.class.getResourceAsStream("/offset-calculator.json");
+ if (stream == null) {
+ throw new RuntimeException("offset-calculator.json not found");
}
- catch (IOException e) {
- throw new RuntimeException(e);
+ InputStreamReader reader = new InputStreamReader(stream);
+ TypeHolder[] types = gson.fromJson(reader, TypeHolder[].class);
+ for (TypeHolder type : types) {
+ System.out.println("Generating type" + type.className());
+
+ for (MetaOffset offset : type.offsets()) {
+
+ MethodSpec.Builder method = MethodSpec.methodBuilder(offset.name() + "Offset")
+ .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
+ .returns(byte.class);
+
+ String version = "int protocolVersion = getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion()";
+ method.addStatement(version);
+ for (VersionCheck check : offset.checks()) {
+ method.beginControlFlow("if (protocolVersion >= $L && protocolVersion <= $L)", check.to(), check.from());
+ method.addStatement("return $L", check.offset());
+ method.endControlFlow();
+ }
+ method.addStatement("throw new RuntimeException(\"Unknown protocol version for this method\")");
+ baseBuilder.addMethod(method.build());
+ }
}
- }
-
- // Include comment in generated code
- public static TypeSpec.Builder builder(String packageName, String className) {
- return TypeSpec.classBuilder(ClassName.get(packageName, className))
- .addModifiers(Modifier.PUBLIC)
- .addJavadoc("AUTOGENERATED CODE BY ENTITYLIB CODEGEN\n")
- .addJavadoc("DO NOT EDIT\n");
+ TypeSpec base = baseBuilder.build();
+ System.out.println("Writing to file");
+ JavaFile file = JavaFile.builder("me.tofaa.entitylib.meta", base)
+ .addStaticImport(ClassName.get("me.tofaa.entitylib", "EntityLib"), "getApi")
+ .addFileComment("This class is generated by code-gen module. Do not edit manually.\n")
+ .indent(" ")
+ .skipJavaLangImports(true)
+ .build();
+ file.writeTo(OUT);
}
diff --git a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaClass.java b/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaClass.java
deleted file mode 100644
index 1755889..0000000
--- a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaClass.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package me.tofaa.entitylib.codegen;
-
-import com.squareup.javapoet.ClassName;
-import com.squareup.javapoet.TypeSpec;
-
-import java.util.List;
-
-import static me.tofaa.entitylib.codegen.Main.builder;
-
-public record MetaClass(
- String name,
- String extendsClass,
- List methods
-) {
-
-
- public TypeSpec create() {
- String split[] = name.split(":");
- String packageName = split[0];
- String className = split[1];
-
- TypeSpec.Builder builder = builder(packageName, className);
- if (extendsClass != null) {
- String[] extendsSplit = extendsClass.split(":");
- builder.superclass(ClassName.get(extendsSplit[0], extendsSplit[1]));
-
- builder.addField(int.class, "entityId");
- builder.addField(ClassName.get("me.tofaa.entitylib.meta", "Metadata"), "metadata");
-
- }
- for (MetaMethod method : methods) {
- builder.addMethods(method.create());
- }
- return builder.build();
- }
-
-
-}
diff --git a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaMethod.java b/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaMethod.java
deleted file mode 100644
index cd82db7..0000000
--- a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaMethod.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package me.tofaa.entitylib.codegen;
-
-import com.squareup.javapoet.MethodSpec;
-import com.squareup.javapoet.TypeName;
-
-import javax.lang.model.element.Modifier;
-import java.lang.reflect.Type;
-import java.util.List;
-
-public record MetaMethod(
- String name,
- Type returnType,
- String defaultReturn,
- String dataType,
- List versionChecks
-) {
-
- public List create() {
-
- String methodBasedName = name.substring(0, 1).toUpperCase() + name.substring(1);
-
- /* offset calculator first */
- MethodSpec.Builder calculator = MethodSpec.methodBuilder(
- "calculate" + methodBasedName + "Offset")
- .returns(byte.class)
- .addModifiers(Modifier.PRIVATE, Modifier.STATIC)
- .addParameter(int.class, "version");
- for (VersionCheck check : versionChecks) {
- calculator.beginControlFlow("if (version >= $L && version <= $L)", check.from(), check.to());
- calculator.addStatement("return $L", check.offset());
- calculator.endControlFlow();
- }
- // throw exception if version is not in range
- calculator.addStatement("throw new IllegalArgumentException(\"Version \" + version + \" is not in range\")");
-
- String versionVariable = "byte offset = calculate" + methodBasedName + "Offset(EntityLib.getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion())";
-
- /* getter method spec. No params */
- String getterName = "get";
- if (returnType == TypeName.BOOLEAN) {
- getterName = "is";
- }
- MethodSpec.Builder getter = MethodSpec.methodBuilder(getterName + methodBasedName)
- .addModifiers(Modifier.PUBLIC)
- .returns(returnType)
- .addStatement(versionVariable)
- .addStatement("return metadata.getIndex(" + "offset," + defaultReturn + ");");
-
- MethodSpec.Builder setter = MethodSpec.methodBuilder("set" + methodBasedName)
- .addModifiers(Modifier.PUBLIC)
- .returns(void.class)
- .addParameter(returnType, "value")
- .addStatement(versionVariable)
- .addStatement("metadata.setIndex(" + "offset, " + dataType + ", " + "value" + ");");
-
- return List.of(
- calculator.build(),
- getter.build(),
- setter.build()
- );
- }
-
-}
diff --git a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaOffset.java b/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaOffset.java
new file mode 100644
index 0000000..5cb106f
--- /dev/null
+++ b/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaOffset.java
@@ -0,0 +1,4 @@
+package me.tofaa.entitylib.codegen;
+
+public record MetaOffset(String name, VersionCheck[] checks) {
+}
diff --git a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetadataClass.java b/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetadataClass.java
deleted file mode 100644
index ad99b37..0000000
--- a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetadataClass.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package me.tofaa.entitylib.codegen;
-
-import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
-import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType;
-import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata;
-import com.google.gson.reflect.TypeToken;
-import com.squareup.javapoet.JavaFile;
-import com.squareup.javapoet.MethodSpec;
-import com.squareup.javapoet.TypeSpec;
-import com.squareup.javapoet.TypeVariableName;
-import org.jetbrains.annotations.NotNull;
-
-import javax.lang.model.element.Modifier;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import static me.tofaa.entitylib.codegen.Main.OUT;
-import static me.tofaa.entitylib.codegen.Main.builder;
-
-public final class MetadataClass {
-
- private MetadataClass() {
-
- }
- public static void createMetadataClass() {
-
- TypeSpec.Builder builder = builder("me.tofaa.entitylib.meta", "Metadata");
- builder.addField(int.class, "entityId", Modifier.PRIVATE, Modifier.FINAL);
- builder.addField(TypeToken.getParameterized(Map.class, Byte.class, EntityData.class).getType(), "metadataMap", Modifier.PRIVATE, Modifier.FINAL);
- MethodSpec.Builder constructor = MethodSpec.constructorBuilder()
- .addModifiers(Modifier.PUBLIC)
- .addCode("this.entityId = entityId;\n")
- .addCode("this.metadataMap = new java.util.concurrent.ConcurrentHashMap<>();\n")
- .addParameter(int.class, "entityId");
-
- MethodSpec.Builder getIndex = MethodSpec.methodBuilder("getIndex")
- .addModifiers(Modifier.PUBLIC)
- .addTypeVariable(TypeVariableName.get("T"))
- .addParameter(byte.class, "index")
- .addParameter(TypeVariableName.get("T"), "defaultValue")
- .returns(TypeVariableName.get("T"))
- .addCode("EntityData entityData = metadataMap.get(index);\n")
- .addCode("if (entityData == null) return defaultValue;\n")
- .addCode("if (entityData.getValue() == null) return defaultValue;\n")
- .addCode("return (T) entityData.getValue();\n");
-
- MethodSpec.Builder setIndex = MethodSpec.methodBuilder("setIndex")
- .addModifiers(Modifier.PUBLIC)
- .addTypeVariable(TypeVariableName.get("T"))
- .addParameter(byte.class, "index")
- .addParameter(EntityDataType.class, "dataType")
- .addParameter(TypeVariableName.get("T"), "value")
- .addCode("EntityData data = new EntityData(index, dataType, value);\n")
- .addCode("this.metadataMap.put(index, data);\n");
-
- MethodSpec.Builder getEntries = MethodSpec.methodBuilder("getEntries")
- .addModifiers(Modifier.PUBLIC)
- .returns(TypeToken.getParameterized(List.class, EntityData.class).getType())
- .addCode("return new java.util.ArrayList<>(metadataMap.values());\n")
- .addAnnotation(NotNull.class);
-
- MethodSpec.Builder createPacket = MethodSpec.methodBuilder("createPacket")
- .addModifiers(Modifier.PUBLIC)
- .returns(WrapperPlayServerEntityMetadata.class)
- .addCode("return new WrapperPlayServerEntityMetadata(entityId, getEntries());\n")
- .addAnnotation(NotNull.class);
-
- builder.addMethod(constructor.build());
- builder.addMethod(getIndex.build());
- builder.addMethod(setIndex.build());
- builder.addMethod(getEntries.build());
- builder.addMethod(createPacket.build());
-
- JavaFile javaFile = JavaFile.builder("me.tofaa.entitylib.meta", builder.build()).build();
- try {
- javaFile.writeToPath(OUT.toPath());
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
-
-
-}
diff --git a/code-gen/src/main/java/me/tofaa/entitylib/codegen/TypeHolder.java b/code-gen/src/main/java/me/tofaa/entitylib/codegen/TypeHolder.java
new file mode 100644
index 0000000..7391f9f
--- /dev/null
+++ b/code-gen/src/main/java/me/tofaa/entitylib/codegen/TypeHolder.java
@@ -0,0 +1,4 @@
+package me.tofaa.entitylib.codegen;
+
+public record TypeHolder(String className, MetaOffset[] offsets) {
+}
diff --git a/code-gen/src/main/resources/EntityMeta.json b/code-gen/src/main/resources/EntityMeta.json
deleted file mode 100644
index a74d07b..0000000
--- a/code-gen/src/main/resources/EntityMeta.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "class-id": "me.tofaa.entitylib.codegen:User",
- "methods": [
-
- {
- "name": "getUsername",
- "return-type": "java.lang.String",
- "parameters": [
-
- ]
- }
-
-
- ]
-}
\ No newline at end of file
diff --git a/code-gen/src/main/resources/offset-calculator.json b/code-gen/src/main/resources/offset-calculator.json
new file mode 100644
index 0000000..414516a
--- /dev/null
+++ b/code-gen/src/main/resources/offset-calculator.json
@@ -0,0 +1,347 @@
+[
+ {
+ "class-name": "EntityMeta",
+ "offsets": [
+ {
+ "name": "airTicks",
+ "checks": [
+ {
+ "from": 47,
+ "to": 47,
+ "offset": 1
+ }
+ ]
+ },
+ {
+ "name": "customName",
+ "checks": [
+ {
+ "from": 765,
+ "to": 47,
+ "offset": 2
+ }
+ ]
+ },
+ {
+ "name": "customNameVisible",
+ "checks": [
+ {
+ "from": 765,
+ "to": 47,
+ "offset": 3
+ }
+ ]
+ },
+ {
+ "name": "silent",
+ "checks": [
+ {
+ "from": 765,
+ "to": 47,
+ "offset": 4
+ }
+ ]
+ },
+ {
+ "name": "hasNoGravity",
+ "checks": [
+ {
+ "from": 765,
+ "to": 47,
+ "offset": 5
+ }
+ ]
+ },
+ {
+ "name": "pose",
+ "checks": [
+ {
+ "from": 765,
+ "to": 47,
+ "offset": 6
+ }
+ ]
+ },
+ {
+ "name": "ticksFrozenInPowderedSnow",
+ "checks": [
+ {
+ "from": 765,
+ "to": 47,
+ "offset": 7
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "class-name": "AbstractDisplayMeta",
+ "offsets": [
+ {
+ "name": "interpolationDelay",
+ "checks": [
+ {
+ "from": 765,
+ "to": 762,
+ "offset": 8
+ }
+ ]
+ },
+ {
+ "name": "transformationDuration",
+ "checks": [
+ {
+ "from": 765,
+ "to": 762,
+ "offset": 9
+ }
+ ]
+ },
+ {
+ "name": "positionRotationInterpolationDuration",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 10
+ }
+ ]
+ },
+ {
+ "name": "translation",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 11
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 10
+ }
+ ]
+ },
+ {
+ "name": "scale",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 12
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 11
+ }
+ ]
+ },
+ {
+ "name": "leftRotation",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 13
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 12
+ }
+ ]
+ },
+ {
+ "name": "rightRotation",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 14
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 13
+ }
+ ]
+ },
+ {
+ "name": "billboardConstraints",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 15
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 14
+ }
+ ]
+ },
+ {
+ "name": "brightnessOverride",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 16
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 15
+ }
+ ]
+ },
+ {
+ "name": "viewRange",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 17
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 16
+ }
+ ]
+ },
+ {
+ "name": "shadowRadius",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 18
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 17
+ }
+ ]
+ },
+ {
+ "name": "shadowStrength",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 19
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 18
+ }
+ ]
+ },
+ {
+ "name": "width",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 20
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 19
+ }
+ ]
+ },
+ {
+ "name": "height",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 21
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 20
+ }
+ ]
+ },
+ {
+ "name": "glowColorOverride",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 22
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 21
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "class-name": "BlockDisplayMeta",
+ "offsets": [
+ {
+ "name": "blockId",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 23
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 22
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "class-name": "ItemDisplay",
+ "offsets": [
+ {
+ "name": "item",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 24
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 23
+ }
+ ]
+ },
+ {
+ "name": "displayType",
+ "checks": [
+ {
+ "from": 765,
+ "to": 764,
+ "offset": 25
+ },
+ {
+ "from": 763,
+ "to": 762,
+ "offset": 24
+ }
+ ]
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/test-plugin/src/main/java/me/tofaa/testentitylib/TestEntityLibPlugin.java b/test-plugin/src/main/java/me/tofaa/testentitylib/TestEntityLibPlugin.java
index 054a5b5..812523d 100644
--- a/test-plugin/src/main/java/me/tofaa/testentitylib/TestEntityLibPlugin.java
+++ b/test-plugin/src/main/java/me/tofaa/testentitylib/TestEntityLibPlugin.java
@@ -8,6 +8,7 @@ import me.tofaa.entitylib.APIConfig;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.EntityLibAPI;
import me.tofaa.entitylib.WorldWrapper;
+import me.tofaa.entitylib.meta.mobs.passive.ChickenMeta;
import me.tofaa.entitylib.spigot.SpigotEntityLibPlatform;
import me.tofaa.entitylib.wrapper.WrapperEntity;
import org.bukkit.World;
@@ -25,7 +26,6 @@ public class TestEntityLibPlugin extends JavaPlugin implements Listener {
private WrapperEntity e;
private WorldWrapper world;
-
@Override
public void onEnable() {
@@ -49,7 +49,9 @@ public class TestEntityLibPlugin extends JavaPlugin implements Listener {
}
world = api.wrapWorld(player.getWorld());
e = world.spawnEntity(EntityTypes.CHICKEN, SpigotConversionUtil.fromBukkitLocation(player.getLocation()));
-
+ ChickenMeta meta = (ChickenMeta) e.getEntityMeta();
+ meta.setBaby(!meta.isBaby());
+ meta.setHasGlowingEffect(!meta.hasGlowingEffect());
}
}