some fixes
This commit is contained in:
parent
e22a057bff
commit
d6c695a353
9 changed files with 178 additions and 139 deletions
|
@ -5,25 +5,14 @@
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="9d5d9b6f-43c8-41a4-bb42-a66ffc96c9b0" name="Changes" comment="">
|
<list default="true" id="9d5d9b6f-43c8-41a4-bb42-a66ffc96c9b0" name="Changes" comment="">
|
||||||
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/hologram/Hologram.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetadataClass.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/VersionCheck.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/Main.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaClass.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaMethod.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/code-gen/src/main/resources/EntityMeta.json" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/gradle.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/gradle.xml" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/EntityLib.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/EntityLib.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/WorldWrapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/WorldWrapper.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/ai/goals/RandomHeadMovementGoal.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/ai/goals/RandomHeadMovementGoal.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/code-gen/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/code-gen/build.gradle" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/Main.java" beforeDir="false" afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/Main.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractWorldWrapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractWorldWrapper.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaClass.java" beforeDir="false" afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaClass.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/settings.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/settings.gradle" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaMethod.java" beforeDir="false" afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaMethod.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/main/java/me/tofaa/entitylib/EntityLib.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/me/tofaa/entitylib/EntityLib.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/test-plugin/src/main/java/me/tofaa/testentitylib/TestEntityLibPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/test-plugin/src/main/java/me/tofaa/testentitylib/TestEntityLibPlugin.java" afterDir="false" />
|
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
@ -86,36 +75,36 @@
|
||||||
<option name="showExcludedFiles" value="false" />
|
<option name="showExcludedFiles" value="false" />
|
||||||
<option name="showLibraryContents" value="true" />
|
<option name="showLibraryContents" value="true" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent"><![CDATA[{
|
<component name="PropertiesComponent">{
|
||||||
"keyToString": {
|
"keyToString": {
|
||||||
"Downloaded.Files.Path.Enabled": "false",
|
"Downloaded.Files.Path.Enabled": "false",
|
||||||
"Gradle.Build EntityLib.executor": "Run",
|
"Gradle.Build EntityLib.executor": "Run",
|
||||||
"Gradle.EntityLib [dependencies].executor": "Run",
|
"Gradle.EntityLib [dependencies].executor": "Run",
|
||||||
"Gradle.EntityLib:code-gen [:code-gen:Main.main()].executor": "Run",
|
"Gradle.EntityLib:code-gen [:code-gen:Main.main()].executor": "Run",
|
||||||
"Gradle.EntityLib:test-plugin [runServer].executor": "Run",
|
"Gradle.EntityLib:test-plugin [runServer].executor": "Run",
|
||||||
"Repository.Attach.Annotations": "false",
|
"Repository.Attach.Annotations": "false",
|
||||||
"Repository.Attach.JavaDocs": "false",
|
"Repository.Attach.JavaDocs": "false",
|
||||||
"Repository.Attach.Sources": "false",
|
"Repository.Attach.Sources": "false",
|
||||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
"WebServerToolWindowFactoryState": "false",
|
"WebServerToolWindowFactoryState": "false",
|
||||||
"git-widget-placeholder": "feat/platform-api",
|
"git-widget-placeholder": "feat/platform-api",
|
||||||
"ignore.virus.scanning.warn.message": "true",
|
"ignore.virus.scanning.warn.message": "true",
|
||||||
"jdk.selected.JAVA_MODULE": "corretto-17",
|
"jdk.selected.JAVA_MODULE": "corretto-17",
|
||||||
"kotlin-language-version-configured": "true",
|
"kotlin-language-version-configured": "true",
|
||||||
"last_opened_file_path": "D:/Github/EntityLib/api/src/main/java/me/tofaa/entitylib/meta",
|
"last_opened_file_path": "D:/Github/EntityLib/api/src/main/java/me/tofaa/entitylib/meta",
|
||||||
"node.js.detected.package.eslint": "true",
|
"node.js.detected.package.eslint": "true",
|
||||||
"node.js.detected.package.tslint": "true",
|
"node.js.detected.package.tslint": "true",
|
||||||
"node.js.selected.package.eslint": "(autodetect)",
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
"node.js.selected.package.tslint": "(autodetect)",
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
"nodejs_package_manager_path": "npm",
|
"nodejs_package_manager_path": "npm",
|
||||||
"project.structure.last.edited": "Project",
|
"project.structure.last.edited": "Project",
|
||||||
"project.structure.proportion": "0.15",
|
"project.structure.proportion": "0.15",
|
||||||
"project.structure.side.proportion": "0.2",
|
"project.structure.side.proportion": "0.2",
|
||||||
"settings.editor.selected.configurable": "preferences.pluginManager",
|
"settings.editor.selected.configurable": "preferences.pluginManager",
|
||||||
"vue.rearranger.settings.migration": "true"
|
"vue.rearranger.settings.migration": "true"
|
||||||
}
|
}
|
||||||
}]]></component>
|
}</component>
|
||||||
<component name="RecentsManager">
|
<component name="RecentsManager">
|
||||||
<key name="CopyFile.RECENT_KEYS">
|
<key name="CopyFile.RECENT_KEYS">
|
||||||
<recent name="D:\Github\EntityLib\api\src\main\java\me\tofaa\entitylib\meta" />
|
<recent name="D:\Github\EntityLib\api\src\main\java\me\tofaa\entitylib\meta" />
|
||||||
|
|
|
@ -12,7 +12,7 @@ public interface EntityIdProvider {
|
||||||
|
|
||||||
class DefaultEntityIdProvider implements EntityIdProvider {
|
class DefaultEntityIdProvider implements EntityIdProvider {
|
||||||
|
|
||||||
private final AtomicInteger integer = new AtomicInteger();
|
private final AtomicInteger integer = new AtomicInteger(100000);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int provide(@NotNull UUID entityUUID, @NotNull EntityType entityType) {
|
public int provide(@NotNull UUID entityUUID, @NotNull EntityType entityType) {
|
||||||
|
|
|
@ -117,11 +117,14 @@ public class WrapperEntity implements Tickable {
|
||||||
teleport(world, location, onGround);
|
teleport(world, location, onGround);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addViewer(UUID uuid) {
|
/**
|
||||||
|
* Adds a viewer to the viewers set. The viewer will receive all packets and be informed of this addition
|
||||||
|
* @param uuid the uuid of the user to add
|
||||||
|
*/
|
||||||
|
public void addViewer(UUID uuid) {
|
||||||
if (!viewers.add(uuid)) {
|
if (!viewers.add(uuid)) {
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
if (!spawned) return false;
|
|
||||||
WrapperPlayServerSpawnEntity packet = new WrapperPlayServerSpawnEntity(
|
WrapperPlayServerSpawnEntity packet = new WrapperPlayServerSpawnEntity(
|
||||||
entityId,
|
entityId,
|
||||||
Optional.of(this.uuid),
|
Optional.of(this.uuid),
|
||||||
|
@ -135,7 +138,6 @@ public class WrapperEntity implements Tickable {
|
||||||
);
|
);
|
||||||
sendPacket(uuid, packet);
|
sendPacket(uuid, packet);
|
||||||
sendPacket(uuid, entityMeta.createPacket());
|
sendPacket(uuid, entityMeta.createPacket());
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addViewer(User user) {
|
public void addViewer(User user) {
|
||||||
|
|
|
@ -12,6 +12,15 @@ repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// adding autogenerated sources to the main source set
|
||||||
|
sourceSets {
|
||||||
|
main {
|
||||||
|
java {
|
||||||
|
srcDirs += 'autogenerated'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.google.code.gson:gson:2.10.1'
|
implementation 'com.google.code.gson:gson:2.10.1'
|
||||||
implementation 'com.squareup:javapoet:1.13.0'
|
implementation 'com.squareup:javapoet:1.13.0'
|
||||||
|
|
|
@ -1,106 +1,53 @@
|
||||||
package me.tofaa.entitylib.codegen;
|
package me.tofaa.entitylib.codegen;
|
||||||
|
|
||||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
|
import com.squareup.javapoet.ClassName;
|
||||||
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType;
|
import com.squareup.javapoet.JavaFile;
|
||||||
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata;
|
import com.squareup.javapoet.TypeSpec;
|
||||||
import com.google.gson.reflect.TypeToken;
|
|
||||||
import com.squareup.javapoet.*;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.Modifier;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
import static me.tofaa.entitylib.codegen.MetadataClass.createMetadataClass;
|
||||||
|
|
||||||
public final class Main {
|
public final class Main {
|
||||||
|
|
||||||
private Main() {}
|
private Main() {}
|
||||||
|
static final File OUT = new File("./code-gen/autogenerated/");
|
||||||
|
static {
|
||||||
|
if (!OUT.exists()) {
|
||||||
|
OUT.mkdirs();
|
||||||
|
}
|
||||||
|
if (!OUT.isDirectory()) {
|
||||||
|
OUT.delete();
|
||||||
|
OUT.mkdirs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws IOException {
|
||||||
createMetadataClass();
|
createMetadataClass();
|
||||||
List<MetaClass> metaClasses = new ArrayList<>();
|
List<MetaClass> metaClasses = new ArrayList<>();
|
||||||
|
|
||||||
// test
|
// 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));
|
||||||
|
|
||||||
|
writeClass(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeClass(MetaClass metaClass) {
|
private static void writeClass(MetaClass metaClass) {
|
||||||
File file = new File("src/main/java");
|
|
||||||
TypeSpec typeSpec = metaClass.create();
|
TypeSpec typeSpec = metaClass.create();
|
||||||
JavaFile javaFile = JavaFile.builder("me.tofaa.entitylib.meta", typeSpec).build();
|
JavaFile javaFile = JavaFile.builder("me.tofaa.entitylib.meta", typeSpec).build();
|
||||||
try {
|
try {
|
||||||
FileWriter fileWriter = new FileWriter(file);
|
javaFile.writeToPath(OUT.toPath());
|
||||||
javaFile.writeTo(fileWriter);
|
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private 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, EntityDataType.class).getType(), "metadataMap", Modifier.PRIVATE, Modifier.FINAL);
|
|
||||||
|
|
||||||
MethodSpec.Builder constructor = MethodSpec.constructorBuilder()
|
|
||||||
.addModifiers(Modifier.PUBLIC)
|
|
||||||
.addCode("this.entityId = entityId;\n")
|
|
||||||
.addCode("this.metadataMap = new 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 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());
|
|
||||||
|
|
||||||
File file = new File("src/main/java");
|
|
||||||
JavaFile javaFile = JavaFile.builder("me.tofaa.entitylib.meta", builder.build()).build();
|
|
||||||
try {
|
|
||||||
FileWriter fileWriter = new FileWriter(file);
|
|
||||||
javaFile.writeTo(fileWriter);
|
|
||||||
}
|
|
||||||
catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Include comment in generated code
|
// Include comment in generated code
|
||||||
public static TypeSpec.Builder builder(String packageName, String className) {
|
public static TypeSpec.Builder builder(String packageName, String className) {
|
||||||
|
|
|
@ -23,6 +23,10 @@ public record MetaClass(
|
||||||
if (extendsClass != null) {
|
if (extendsClass != null) {
|
||||||
String[] extendsSplit = extendsClass.split(":");
|
String[] extendsSplit = extendsClass.split(":");
|
||||||
builder.superclass(ClassName.get(extendsSplit[0], extendsSplit[1]));
|
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) {
|
for (MetaMethod method : methods) {
|
||||||
builder.addMethods(method.create());
|
builder.addMethods(method.create());
|
||||||
|
|
|
@ -1,32 +1,28 @@
|
||||||
package me.tofaa.entitylib.codegen;
|
package me.tofaa.entitylib.codegen;
|
||||||
|
|
||||||
import com.squareup.javapoet.ClassName;
|
|
||||||
import com.squareup.javapoet.MethodSpec;
|
import com.squareup.javapoet.MethodSpec;
|
||||||
|
import com.squareup.javapoet.TypeName;
|
||||||
|
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.Modifier;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public record MetaMethod(
|
public record MetaMethod(
|
||||||
String name,
|
String name,
|
||||||
String returnType,
|
Type returnType,
|
||||||
String defaultReturn,
|
String defaultReturn,
|
||||||
String dataType,
|
String dataType,
|
||||||
List<VersionCheck> versionChecks
|
List<VersionCheck> versionChecks
|
||||||
) {
|
) {
|
||||||
|
|
||||||
public List<MethodSpec> create() {
|
public List<MethodSpec> create() {
|
||||||
String[] nameSplit = name.split(":");
|
|
||||||
String[] returnSplit = returnType.split(":");
|
|
||||||
String namePackage = nameSplit[0];
|
|
||||||
String nameClass = nameSplit[1];
|
|
||||||
String returnPackage = returnSplit[0];
|
|
||||||
String returnClass = returnSplit[1];
|
|
||||||
|
|
||||||
String methodBasedName = nameClass.substring(0, 1).toUpperCase() + nameClass.substring(1);
|
String methodBasedName = name.substring(0, 1).toUpperCase() + name.substring(1);
|
||||||
|
|
||||||
/* offset calculator first */
|
/* offset calculator first */
|
||||||
MethodSpec.Builder calculator = MethodSpec.methodBuilder(
|
MethodSpec.Builder calculator = MethodSpec.methodBuilder(
|
||||||
"calculate" + methodBasedName + "Offset")
|
"calculate" + methodBasedName + "Offset")
|
||||||
|
.returns(byte.class)
|
||||||
.addModifiers(Modifier.PRIVATE, Modifier.STATIC)
|
.addModifiers(Modifier.PRIVATE, Modifier.STATIC)
|
||||||
.addParameter(int.class, "version");
|
.addParameter(int.class, "version");
|
||||||
for (VersionCheck check : versionChecks) {
|
for (VersionCheck check : versionChecks) {
|
||||||
|
@ -40,18 +36,22 @@ public record MetaMethod(
|
||||||
String versionVariable = "byte offset = calculate" + methodBasedName + "Offset(EntityLib.getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion())";
|
String versionVariable = "byte offset = calculate" + methodBasedName + "Offset(EntityLib.getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion())";
|
||||||
|
|
||||||
/* getter method spec. No params */
|
/* getter method spec. No params */
|
||||||
MethodSpec.Builder getter = MethodSpec.methodBuilder("get" + methodBasedName)
|
String getterName = "get";
|
||||||
|
if (returnType == TypeName.BOOLEAN) {
|
||||||
|
getterName = "is";
|
||||||
|
}
|
||||||
|
MethodSpec.Builder getter = MethodSpec.methodBuilder(getterName + methodBasedName)
|
||||||
.addModifiers(Modifier.PUBLIC)
|
.addModifiers(Modifier.PUBLIC)
|
||||||
.returns(ClassName.get(returnPackage, returnClass))
|
.returns(returnType)
|
||||||
.addStatement(versionVariable)
|
.addStatement(versionVariable)
|
||||||
.addStatement("return metadata.getIndex(" + "offset," + defaultReturn);
|
.addStatement("return metadata.getIndex(" + "offset," + defaultReturn + ");");
|
||||||
|
|
||||||
MethodSpec.Builder setter = MethodSpec.methodBuilder("set" + methodBasedName)
|
MethodSpec.Builder setter = MethodSpec.methodBuilder("set" + methodBasedName)
|
||||||
.addModifiers(Modifier.PUBLIC)
|
.addModifiers(Modifier.PUBLIC)
|
||||||
.returns(void.class)
|
.returns(void.class)
|
||||||
.addParameter(ClassName.get(returnPackage, returnClass), "value")
|
.addParameter(returnType, "value")
|
||||||
.addStatement(versionVariable)
|
.addStatement(versionVariable)
|
||||||
.addStatement("metadata.setIndex(" + "offset, " + dataType + ", " + "value");
|
.addStatement("metadata.setIndex(" + "offset, " + dataType + ", " + "value" + ");");
|
||||||
|
|
||||||
return List.of(
|
return List.of(
|
||||||
calculator.build(),
|
calculator.build(),
|
||||||
|
@ -60,6 +60,4 @@ public record MetaMethod(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public record VersionCheck(int from, int to, byte offset) {}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package me.tofaa.entitylib.codegen;
|
||||||
|
|
||||||
|
public record VersionCheck(int from, int to, byte offset) {
|
||||||
|
}
|
Loading…
Reference in a new issue