Skip to content

Commit 5a29fda

Browse files
committed
fix: resolve backward compatibility
1 parent b3feacf commit 5a29fda

6 files changed

Lines changed: 108 additions & 36 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ gradle-app.setting
2222

2323
.idea/
2424
vscode/
25+
26+
run/

build.gradle.kts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ plugins {
44
id("io.freefair.lombok") version "8.7.1"
55
id("com.gradleup.shadow") version "8.3.0"
66
id("net.minecrell.plugin-yml.bukkit") version "0.6.0"
7+
id("xyz.jpenilla.run-paper") version "2.3.1"
78
}
89

910
repositories {
@@ -15,11 +16,11 @@ repositories {
1516
}
1617

1718
dependencies {
18-
compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
19+
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
1920
compileOnly("com.github.slimefun:Slimefun4:3ea21da4fe")
2021
implementation("org.bstats:bstats-bukkit:3.1.0")
2122
implementation("com.google.code.findbugs:jsr305:3.0.2")
22-
implementation("net.guizhanss:guizhanlib-all:2.2.0")
23+
implementation("net.guizhanss:guizhanlib-all:2.3.0")
2324
}
2425

2526
group = "io.github.thebusybiscuit"
@@ -65,3 +66,16 @@ bukkit {
6566
website = "https://github.com/Slimefun-Addon-Community/MobCapturer"
6667
depend = listOf("Slimefun")
6768
}
69+
70+
tasks.runServer {
71+
downloadPlugins {
72+
// Slimefun
73+
url("https://blob.build/dl/Slimefun4/Experimental/latest")
74+
// SlimeHUD
75+
url("https://blob.build/dl/SlimeHUD/Dev/latest")
76+
// GuizhanCraft for testing convenient
77+
url("https://blob.build/dl/GuizhanCraft/Dev/latest")
78+
}
79+
jvmArgs("-Dcom.mojang.eula.agree=true")
80+
minecraftVersion("1.20.6")
81+
}

src/main/java/io/github/thebusybiscuit/mobcapturer/MobCapturer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import javax.annotation.Nonnull;
44

5+
import io.github.thebusybiscuit.mobcapturer.utils.compatibility.AttributeX;
6+
57
import net.guizhanss.guizhanlib.minecraft.utils.MinecraftVersionUtil;
68

79
import org.bstats.bukkit.Metrics;
@@ -45,12 +47,6 @@ public static Registry getRegistry() {
4547
public void onEnable() {
4648
setInstance(this);
4749

48-
// if (MinecraftVersionUtil.isAtLeast(21, 3)) {
49-
// getLogger().severe("MobCapturer is not compatible with Minecraft 1.21.3 or higher yet.");
50-
// getServer().getPluginManager().disablePlugin(this);
51-
// return;
52-
// }
53-
5450
Config cfg = new Config(this);
5551
new Metrics(this, 6672);
5652

src/main/java/io/github/thebusybiscuit/mobcapturer/adapters/MobAdapter.java

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.bukkit.potion.PotionEffectType;
2626

2727
import io.github.thebusybiscuit.mobcapturer.utils.JsonUtils;
28+
import io.github.thebusybiscuit.mobcapturer.utils.compatibility.AttributeX;
2829
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
2930

3031
/**
@@ -175,32 +176,7 @@ default JsonObject saveData(@Nonnull T entity) {
175176
json.addProperty("_gravity", entity.hasGravity());
176177
json.addProperty("_fireTicks", entity.getFireTicks());
177178

178-
JsonObject attributes = new JsonObject();
179-
180-
for (Attribute attribute : Attribute.values()) {
181-
AttributeInstance instance = entity.getAttribute(attribute);
182-
183-
if (instance != null) {
184-
JsonObject obj = new JsonObject();
185-
obj.addProperty("base", instance.getBaseValue());
186-
187-
JsonArray modifiers = new JsonArray();
188-
189-
for (AttributeModifier modifier : instance.getModifiers()) {
190-
JsonObject mod = new JsonObject();
191-
Map<String, Object> serializedMod = modifier.serialize();
192-
193-
for (var entry : serializedMod.entrySet()) {
194-
mod.addProperty(entry.getKey(), entry.getValue().toString());
195-
}
196-
197-
modifiers.add(mod);
198-
}
199-
200-
obj.add("modifiers", modifiers);
201-
attributes.add(attribute.toString(), obj);
202-
}
203-
}
179+
JsonObject attributes = AttributeX.serializeAttributesFromEntity(entity);
204180

205181
json.add("_attributes", attributes);
206182

src/main/java/io/github/thebusybiscuit/mobcapturer/utils/ReflectionUtils.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package io.github.thebusybiscuit.mobcapturer.utils;
22

3+
import java.lang.reflect.InvocationTargetException;
4+
5+
import javax.annotation.Nullable;
6+
37
import lombok.experimental.UtilityClass;
48

59
/**
@@ -9,13 +13,22 @@
913
@UtilityClass
1014
public final class ReflectionUtils {
1115

16+
@Nullable
1217
public static Object invoke(Object instance, String methodName, Object... args) {
1318
Class<?> currentClass = instance.getClass();
19+
Class<?>[] paramTypes = new Class<?>[args.length];
20+
for (int i = 0; i < args.length; i++) {
21+
paramTypes[i] = (args[i] != null) ? args[i].getClass() : Object.class;
22+
}
1423
while (currentClass != null) {
1524
try {
16-
return currentClass.getDeclaredMethod(methodName).invoke(instance, args);
17-
} catch (Exception x) {
25+
var method = currentClass.getDeclaredMethod(methodName, paramTypes);
26+
method.setAccessible(true);
27+
return method.invoke(instance, args);
28+
} catch (NoSuchMethodException ex) {
1829
currentClass = currentClass.getSuperclass();
30+
} catch (IllegalAccessException | InvocationTargetException ex) {
31+
return null;
1932
}
2033
}
2134
return null;
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package io.github.thebusybiscuit.mobcapturer.utils.compatibility;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.logging.Level;
7+
8+
import javax.annotation.Nonnull;
9+
10+
import com.google.gson.JsonArray;
11+
import com.google.gson.JsonObject;
12+
13+
import org.bukkit.Registry;
14+
import org.bukkit.attribute.AttributeInstance;
15+
import org.bukkit.attribute.AttributeModifier;
16+
import org.bukkit.entity.LivingEntity;
17+
18+
import io.github.thebusybiscuit.mobcapturer.MobCapturer;
19+
import io.github.thebusybiscuit.mobcapturer.utils.ReflectionUtils;
20+
21+
import lombok.experimental.UtilityClass;
22+
23+
@UtilityClass
24+
public final class AttributeX {
25+
26+
private static final List<Object> allAttributes = new ArrayList<>();
27+
28+
static {
29+
try {
30+
final var registry = ReflectionUtils.valueOf(Registry.class, "ATTRIBUTE");
31+
final var registryIterator = ReflectionUtils.invoke(registry, "iterator");
32+
while ((boolean) ReflectionUtils.invoke(registryIterator, "hasNext")) {
33+
allAttributes.add(ReflectionUtils.invoke(registryIterator, "next"));
34+
}
35+
} catch (Exception ex) {
36+
MobCapturer.getInstance().getLogger().log(Level.SEVERE, "Failed to load attributes", ex);
37+
}
38+
}
39+
40+
@Nonnull
41+
public static JsonObject serializeAttributesFromEntity(@Nonnull LivingEntity entity) {
42+
JsonObject attributes = new JsonObject();
43+
44+
for (var attribute : allAttributes) {
45+
AttributeInstance instance = (AttributeInstance) ReflectionUtils.invoke(entity, "getAttribute", attribute);
46+
if (instance != null) {
47+
JsonObject attributeObj = new JsonObject();
48+
attributeObj.addProperty("base", instance.getBaseValue());
49+
50+
JsonArray modifiers = new JsonArray();
51+
52+
for (AttributeModifier modifier : instance.getModifiers()) {
53+
JsonObject mod = new JsonObject();
54+
Map<String, Object> serializedMod = modifier.serialize();
55+
56+
for (var entry : serializedMod.entrySet()) {
57+
mod.addProperty(entry.getKey(), entry.getValue().toString());
58+
}
59+
60+
modifiers.add(mod);
61+
}
62+
63+
attributeObj.add("modifiers", modifiers);
64+
65+
attributes.add(attribute.toString(), attributeObj);
66+
}
67+
}
68+
69+
return attributes;
70+
}
71+
}

0 commit comments

Comments
 (0)