some fixes

This commit is contained in:
Tofaa 2024-02-01 14:55:05 +04:00
parent e22a057bff
commit d6c695a353
9 changed files with 178 additions and 139 deletions

View file

@ -5,25 +5,14 @@
</component>
<component name="ChangeListManager">
<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$/api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.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 afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/MetadataClass.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/code-gen/src/main/java/me/tofaa/entitylib/codegen/VersionCheck.java" 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/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$/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$/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$/settings.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/settings.gradle" 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" />
<change beforePath="$PROJECT_DIR$/code-gen/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/code-gen/build.gradle" 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$/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$/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" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -86,36 +75,36 @@
<option name="showExcludedFiles" value="false" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"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"
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;Downloaded.Files.Path.Enabled&quot;: &quot;false&quot;,
&quot;Gradle.Build EntityLib.executor&quot;: &quot;Run&quot;,
&quot;Gradle.EntityLib [dependencies].executor&quot;: &quot;Run&quot;,
&quot;Gradle.EntityLib:code-gen [:code-gen:Main.main()].executor&quot;: &quot;Run&quot;,
&quot;Gradle.EntityLib:test-plugin [runServer].executor&quot;: &quot;Run&quot;,
&quot;Repository.Attach.Annotations&quot;: &quot;false&quot;,
&quot;Repository.Attach.JavaDocs&quot;: &quot;false&quot;,
&quot;Repository.Attach.Sources&quot;: &quot;false&quot;,
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
&quot;git-widget-placeholder&quot;: &quot;feat/platform-api&quot;,
&quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
&quot;jdk.selected.JAVA_MODULE&quot;: &quot;corretto-17&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;D:/Github/EntityLib/api/src/main/java/me/tofaa/entitylib/meta&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;project.structure.last.edited&quot;: &quot;Project&quot;,
&quot;project.structure.proportion&quot;: &quot;0.15&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;preferences.pluginManager&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}]]></component>
}</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\Github\EntityLib\api\src\main\java\me\tofaa\entitylib\meta" />

View file

@ -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) {

View file

@ -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) {

View file

@ -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'

View file

@ -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<MetaClass> 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) {

View file

@ -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());

View file

@ -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<VersionCheck> versionChecks
) {
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 */
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) {}
}

View file

@ -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);
}
}
}

View file

@ -0,0 +1,4 @@
package me.tofaa.entitylib.codegen;
public record VersionCheck(int from, int to, byte offset) {
}