Skip to content

Commit fc03781

Browse files
authored
Migrate reflection in MetaItemStack to a provider (EssentialsX#4592)
1 parent 0e25ca4 commit fc03781

File tree

14 files changed

+82
-35
lines changed

14 files changed

+82
-35
lines changed

Essentials/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ dependencies {
2222
exclude group: "org.bukkit", module: "bukkit"
2323
}
2424
api(project(':providers:1_8Provider')) {
25+
exclude group: "org.spigotmc", module: "spigot"
26+
}
27+
api(project(':providers:1_12Provider')) {
2528
exclude group: "org.bukkit", module: "bukkit"
2629
}
2730
}
@@ -40,6 +43,7 @@ shadowJar {
4043
include (project(':providers:PaperProvider'))
4144
include (project(':providers:NMSReflectionProvider'))
4245
include (project(':providers:1_8Provider'))
46+
include (project(':providers:1_12Provider'))
4347
}
4448
relocate 'io.papermc.lib', 'com.earth2me.essentials.paperlib'
4549
relocate 'org.bstats', 'com.earth2me.essentials.libs.bstats'

Essentials/src/main/java/com/earth2me/essentials/Essentials.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import net.ess3.nms.refl.providers.ReflSyncCommandsProvider;
5858
import net.ess3.provider.ContainerProvider;
5959
import net.ess3.provider.FormattedCommandAliasProvider;
60+
import net.ess3.provider.ItemUnbreakableProvider;
6061
import net.ess3.provider.KnownCommandsProvider;
6162
import net.ess3.provider.MaterialTagProvider;
6263
import net.ess3.provider.PersistentDataProvider;
@@ -73,8 +74,10 @@
7374
import net.ess3.provider.providers.BukkitMaterialTagProvider;
7475
import net.ess3.provider.providers.BukkitSpawnerBlockProvider;
7576
import net.ess3.provider.providers.FlatSpawnEggProvider;
77+
import net.ess3.provider.providers.LegacyItemUnbreakableProvider;
7678
import net.ess3.provider.providers.LegacyPotionMetaProvider;
7779
import net.ess3.provider.providers.LegacySpawnEggProvider;
80+
import net.ess3.provider.providers.ModernItemUnbreakableProvider;
7881
import net.ess3.provider.providers.ModernPersistentDataProvider;
7982
import net.ess3.provider.providers.PaperContainerProvider;
8083
import net.ess3.provider.providers.PaperKnownCommandsProvider;
@@ -166,6 +169,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
166169
private transient SyncCommandsProvider syncCommandsProvider;
167170
private transient PersistentDataProvider persistentDataProvider;
168171
private transient ReflOnlineModeProvider onlineModeProvider;
172+
private transient ItemUnbreakableProvider unbreakableProvider;
169173
private transient Kits kits;
170174
private transient RandomTeleport randomTeleport;
171175
private transient UpdateChecker updateChecker;
@@ -409,6 +413,12 @@ public void onEnable() {
409413

410414
onlineModeProvider = new ReflOnlineModeProvider();
411415

416+
if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_11_2_R01)) {
417+
unbreakableProvider = new ModernItemUnbreakableProvider();
418+
} else {
419+
unbreakableProvider = new LegacyItemUnbreakableProvider();
420+
}
421+
412422
execTimer.mark("Init(Providers)");
413423
reload();
414424

@@ -1269,6 +1279,11 @@ public ReflOnlineModeProvider getOnlineModeProvider() {
12691279
return onlineModeProvider;
12701280
}
12711281

1282+
@Override
1283+
public ItemUnbreakableProvider getItemUnbreakableProvider() {
1284+
return unbreakableProvider;
1285+
}
1286+
12721287
@Override
12731288
public PluginCommand getPluginCommand(final String cmd) {
12741289
return this.getCommand(cmd);

Essentials/src/main/java/com/earth2me/essentials/IEssentials.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.ess3.nms.refl.providers.ReflOnlineModeProvider;
1111
import net.ess3.provider.ContainerProvider;
1212
import net.ess3.provider.FormattedCommandAliasProvider;
13+
import net.ess3.provider.ItemUnbreakableProvider;
1314
import net.ess3.provider.KnownCommandsProvider;
1415
import net.ess3.provider.MaterialTagProvider;
1516
import net.ess3.provider.PersistentDataProvider;
@@ -159,5 +160,7 @@ public interface IEssentials extends Plugin {
159160

160161
ReflOnlineModeProvider getOnlineModeProvider();
161162

163+
ItemUnbreakableProvider getItemUnbreakableProvider();
164+
162165
PluginCommand getPluginCommand(String cmd);
163166
}

Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.bukkit.potion.PotionEffect;
3434
import org.bukkit.potion.PotionEffectType;
3535

36-
import java.lang.reflect.Method;
3736
import java.util.ArrayList;
3837
import java.util.Arrays;
3938
import java.util.HashMap;
@@ -48,9 +47,6 @@
4847
public class MetaItemStack {
4948
private static final Map<String, DyeColor> colorMap = new HashMap<>();
5049
private static final Map<String, FireworkEffect.Type> fireworkShape = new HashMap<>();
51-
private static int bukkitUnbreakableSupport = -1;
52-
private static Method spigotMethod;
53-
private static Method setUnbreakableMethod;
5450
private static boolean useNewSkullMethod = true;
5551

5652
static {
@@ -212,7 +208,7 @@ public void addStringMeta(final CommandSource sender, final boolean allowUnsafe,
212208
stack.setItemMeta(meta);
213209
} else if (split[0].equalsIgnoreCase("unbreakable") && hasMetaPermission(sender, "unbreakable", false, true, ess)) {
214210
final boolean value = split.length <= 1 || Boolean.parseBoolean(split[1]);
215-
setUnbreakable(stack, value);
211+
setUnbreakable(ess, stack, value);
216212
} else if (split.length > 1 && (split[0].equalsIgnoreCase("player") || split[0].equalsIgnoreCase("owner")) && hasMetaPermission(sender, "head", false, true, ess)) {
217213
if (MaterialUtil.isPlayerHead(stack.getType(), stack.getDurability())) {
218214
final String owner = split[1];
@@ -686,35 +682,9 @@ private boolean hasMetaPermission(final User user, final String metaPerm, final
686682
}
687683
}
688684

689-
private void setUnbreakable(final ItemStack is, final boolean unbreakable) {
685+
private void setUnbreakable(final IEssentials ess, final ItemStack is, final boolean unbreakable) {
690686
final ItemMeta meta = is.getItemMeta();
691-
try {
692-
if (bukkitUnbreakableSupport == -1) {
693-
try {
694-
ItemMeta.class.getDeclaredMethod("setUnbreakable", boolean.class);
695-
bukkitUnbreakableSupport = 1;
696-
} catch (final NoSuchMethodException | SecurityException ex) {
697-
bukkitUnbreakableSupport = 0;
698-
}
699-
}
700-
701-
if (bukkitUnbreakableSupport == 1) {
702-
meta.setUnbreakable(unbreakable);
703-
} else {
704-
if (spigotMethod == null) {
705-
spigotMethod = meta.getClass().getDeclaredMethod("spigot");
706-
spigotMethod.setAccessible(true);
707-
}
708-
final Object itemStackSpigot = spigotMethod.invoke(meta);
709-
if (setUnbreakableMethod == null) {
710-
setUnbreakableMethod = itemStackSpigot.getClass().getDeclaredMethod("setUnbreakable", Boolean.TYPE);
711-
setUnbreakableMethod.setAccessible(true);
712-
}
713-
setUnbreakableMethod.invoke(itemStackSpigot, unbreakable);
714-
}
715-
is.setItemMeta(meta);
716-
} catch (final Throwable t) {
717-
t.printStackTrace();
718-
}
687+
ess.getItemUnbreakableProvider().setUnbreakable(meta, unbreakable);
688+
is.setItemMeta(meta);
719689
}
720690
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugins {
2+
id("essentials.base-conventions")
3+
}
4+
5+
dependencies {
6+
api project(':providers:NMSReflectionProvider')
7+
}
8+
9+
essentials {
10+
injectBukkitApi.set(false)
11+
injectBstats.set(false)
12+
}

providers/1_8Provider/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ plugins {
33
}
44

55
dependencies {
6-
api project(':providers:NMSReflectionProvider')
6+
implementation(project(':providers:BaseProviders')) {
7+
exclude group: "org.spigotmc", module: "spigot-api"
8+
}
9+
implementation 'org.spigotmc:spigot-api:1.8.8-R0.1-SNAPSHOT'
710
}
811

912
essentials {

0 commit comments

Comments
 (0)