From d6c695a3539de00329246aab51c6168d3654eb2f Mon Sep 17 00:00:00 2001 From: Tofaa <82680183+Tofaa2@users.noreply.github.com> Date: Thu, 1 Feb 2024 14:55:05 +0400 Subject: [PATCH] some fixes --- .idea/workspace.xml | 81 +++++++---------- .../me/tofaa/entitylib/EntityIdProvider.java | 2 +- .../entitylib/wrapper/WrapperEntity.java | 10 +- code-gen/build.gradle | 9 ++ .../java/me/tofaa/entitylib/codegen/Main.java | 91 ++++--------------- .../me/tofaa/entitylib/codegen/MetaClass.java | 4 + .../tofaa/entitylib/codegen/MetaMethod.java | 30 +++--- .../entitylib/codegen/MetadataClass.java | 86 ++++++++++++++++++ .../tofaa/entitylib/codegen/VersionCheck.java | 4 + 9 files changed, 178 insertions(+), 139 deletions(-) create mode 100644 code-gen/src/main/java/me/tofaa/entitylib/codegen/MetadataClass.java create mode 100644 code-gen/src/main/java/me/tofaa/entitylib/codegen/VersionCheck.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a04b889..13d1c14 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,25 +5,14 @@ - - - - - - - - + + - - - - - - - - - + + + + - { + "keyToString": { + "Downloaded.Files.Path.Enabled": "false", + "Gradle.Build EntityLib.executor": "Run", + "Gradle.EntityLib [dependencies].executor": "Run", + "Gradle.EntityLib:code-gen [:code-gen:Main.main()].executor": "Run", + "Gradle.EntityLib:test-plugin [runServer].executor": "Run", + "Repository.Attach.Annotations": "false", + "Repository.Attach.JavaDocs": "false", + "Repository.Attach.Sources": "false", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "WebServerToolWindowFactoryState": "false", + "git-widget-placeholder": "feat/platform-api", + "ignore.virus.scanning.warn.message": "true", + "jdk.selected.JAVA_MODULE": "corretto-17", + "kotlin-language-version-configured": "true", + "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.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "project.structure.last.edited": "Project", + "project.structure.proportion": "0.15", + "project.structure.side.proportion": "0.2", + "settings.editor.selected.configurable": "preferences.pluginManager", + "vue.rearranger.settings.migration": "true" } -}]]> +} diff --git a/api/src/main/java/me/tofaa/entitylib/EntityIdProvider.java b/api/src/main/java/me/tofaa/entitylib/EntityIdProvider.java index b2f3a83..2dc3a17 100644 --- a/api/src/main/java/me/tofaa/entitylib/EntityIdProvider.java +++ b/api/src/main/java/me/tofaa/entitylib/EntityIdProvider.java @@ -12,7 +12,7 @@ public interface EntityIdProvider { class DefaultEntityIdProvider implements EntityIdProvider { - private final AtomicInteger integer = new AtomicInteger(); + private final AtomicInteger integer = new AtomicInteger(100000); @Override public int provide(@NotNull UUID entityUUID, @NotNull EntityType entityType) { diff --git a/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java b/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java index 407059b..3790363 100644 --- a/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java +++ b/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java @@ -117,11 +117,14 @@ public class WrapperEntity implements Tickable { 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)) { - return false; + return; } - if (!spawned) return false; WrapperPlayServerSpawnEntity packet = new WrapperPlayServerSpawnEntity( entityId, Optional.of(this.uuid), @@ -135,7 +138,6 @@ public class WrapperEntity implements Tickable { ); sendPacket(uuid, packet); sendPacket(uuid, entityMeta.createPacket()); - return true; } public void addViewer(User user) { diff --git a/code-gen/build.gradle b/code-gen/build.gradle index e6439d3..f3f728c 100644 --- a/code-gen/build.gradle +++ b/code-gen/build.gradle @@ -12,6 +12,15 @@ 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 4cbb5bb..4a912e7 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,106 +1,53 @@ 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.*; -import org.jetbrains.annotations.NotNull; +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.TypeSpec; import javax.lang.model.element.Modifier; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; + +import static me.tofaa.entitylib.codegen.MetadataClass.createMetadataClass; public final class 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 { 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)); - + writeClass(obj); } private static void writeClass(MetaClass metaClass) { - File file = new File("src/main/java"); TypeSpec typeSpec = metaClass.create(); JavaFile javaFile = JavaFile.builder("me.tofaa.entitylib.meta", typeSpec).build(); try { - FileWriter fileWriter = new FileWriter(file); - javaFile.writeTo(fileWriter); + javaFile.writeToPath(OUT.toPath()); } catch (IOException 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 public static TypeSpec.Builder builder(String packageName, String className) { 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 index 0f84713..1755889 100644 --- a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaClass.java +++ b/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaClass.java @@ -23,6 +23,10 @@ public record MetaClass( 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()); 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 index 90ecc37..cd82db7 100644 --- a/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaMethod.java +++ b/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetaMethod.java @@ -1,32 +1,28 @@ package me.tofaa.entitylib.codegen; -import com.squareup.javapoet.ClassName; 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, - String returnType, + Type returnType, String defaultReturn, String dataType, List versionChecks ) { public List 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 */ MethodSpec.Builder calculator = MethodSpec.methodBuilder( "calculate" + methodBasedName + "Offset") + .returns(byte.class) .addModifiers(Modifier.PRIVATE, Modifier.STATIC) .addParameter(int.class, "version"); for (VersionCheck check : versionChecks) { @@ -40,18 +36,22 @@ public record MetaMethod( String versionVariable = "byte offset = calculate" + methodBasedName + "Offset(EntityLib.getApi().getPacketEvents().getServerManager().getVersion().getProtocolVersion())"; /* 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) - .returns(ClassName.get(returnPackage, returnClass)) + .returns(returnType) .addStatement(versionVariable) - .addStatement("return metadata.getIndex(" + "offset," + defaultReturn); + .addStatement("return metadata.getIndex(" + "offset," + defaultReturn + ");"); MethodSpec.Builder setter = MethodSpec.methodBuilder("set" + methodBasedName) .addModifiers(Modifier.PUBLIC) .returns(void.class) - .addParameter(ClassName.get(returnPackage, returnClass), "value") + .addParameter(returnType, "value") .addStatement(versionVariable) - .addStatement("metadata.setIndex(" + "offset, " + dataType + ", " + "value"); + .addStatement("metadata.setIndex(" + "offset, " + dataType + ", " + "value" + ");"); return List.of( calculator.build(), @@ -60,6 +60,4 @@ public record MetaMethod( ); } - public record VersionCheck(int from, int to, byte offset) {} - } 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 new file mode 100644 index 0000000..ad99b37 --- /dev/null +++ b/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetadataClass.java @@ -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); + } + } + + + +} diff --git a/code-gen/src/main/java/me/tofaa/entitylib/codegen/VersionCheck.java b/code-gen/src/main/java/me/tofaa/entitylib/codegen/VersionCheck.java new file mode 100644 index 0000000..1120db8 --- /dev/null +++ b/code-gen/src/main/java/me/tofaa/entitylib/codegen/VersionCheck.java @@ -0,0 +1,4 @@ +package me.tofaa.entitylib.codegen; + +public record VersionCheck(int from, int to, byte offset) { +}