Skip to content

Commit 467866f

Browse files
committed
v8.8.0
Updated for 1.19 ItemStack Added a lisp-like condition-restart system for deserialization material errors. Changed the way how configs are accessed for a few options. This is necessary for external config handlers.
1 parent 6a1502f commit 467866f

File tree

14 files changed

+664
-239
lines changed

14 files changed

+664
-239
lines changed

pom.xml

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

77
<groupId>com.github.cryptomorin</groupId>
88
<artifactId>XSeries</artifactId>
9-
<version>8.7.1</version>
9+
<version>8.8.0</version>
1010

1111
<name>XSeries</name>
1212
<description>A set of utilities for Minecraft plugins</description>
@@ -63,7 +63,7 @@
6363

6464
<properties>
6565
<!-- Latest version -->
66-
<spigotVersion>1.18.2-R0.1-SNAPSHOT</spigotVersion>
66+
<spigotVersion>1.19-R0.1-SNAPSHOT</spigotVersion>
6767
</properties>
6868

6969
<dependencies>
@@ -240,6 +240,12 @@
240240
</plugins>
241241
</build>
242242
</profile>
243+
<profile>
244+
<id>latest</id>
245+
<properties>
246+
<nms>19_R0</nms>
247+
</properties>
248+
</profile>
243249
<profile>
244250
<id>18</id>
245251
<properties>

src/main/java/com/cryptomorin/xseries/NMSExtras.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@
3333
import java.lang.invoke.MethodType;
3434
import java.lang.reflect.Array;
3535
import java.lang.reflect.Field;
36-
import java.util.Collection;
37-
import java.util.Collections;
38-
import java.util.Map;
39-
import java.util.UUID;
36+
import java.util.*;
4037

4138
import static com.cryptomorin.xseries.ReflectionUtils.*;
4239

@@ -47,7 +44,7 @@
4744
* All the parameters are non-null.
4845
*
4946
* @author Crypto Morin
50-
* @version 5.1.0
47+
* @version 5.2.0
5148
*/
5249
public final class NMSExtras {
5350
public static final MethodHandle EXP_PACKET;
@@ -116,8 +113,8 @@ public final class NMSExtras {
116113

117114
// https://wiki.vg/Protocol#Set_Experience
118115
// exp - lvl - total exp
119-
expPacket = lookup.findConstructor(getNMSClass("network.protocol.game", "PacketPlayOutExperience"), MethodType.methodType(void.class, float.class,
120-
int.class, int.class));
116+
expPacket = lookup.findConstructor(getNMSClass("network.protocol.game", "PacketPlayOutExperience"), MethodType.methodType(
117+
void.class, float.class, int.class, int.class));
121118
// Lightning
122119
if (!supports(16)) {
123120
entityPacket = lookup.findConstructor(getNMSClass("PacketPlayOutSpawnEntityWeather"), MethodType.methodType(void.class,
@@ -126,8 +123,14 @@ public final class NMSExtras {
126123
vec3D = lookup.findConstructor(nmsVec3D, MethodType.methodType(void.class,
127124
double.class, double.class, double.class));
128125

129-
entityPacket = lookup.findConstructor(getNMSClass("network.protocol.game", "PacketPlayOutSpawnEntity"), MethodType.methodType(void.class,
130-
int.class, UUID.class, double.class, double.class, double.class, float.class, float.class, nmsEntityType, int.class, nmsVec3D));
126+
List<Class<?>> spawnTypes = new ArrayList<>(Arrays.asList(
127+
int.class, UUID.class,
128+
double.class, double.class, double.class, float.class, float.class,
129+
nmsEntityType, int.class, nmsVec3D)
130+
);
131+
if (ReflectionUtils.supports(19)) spawnTypes.add(double.class);
132+
entityPacket = lookup.findConstructor(getNMSClass("network.protocol.game", "PacketPlayOutSpawnEntity"),
133+
MethodType.methodType(void.class, spawnTypes));
131134
}
132135

133136
worldHandle = lookup.findVirtual(getCraftClass("CraftWorld"), "getHandle", MethodType.methodType(

src/main/java/com/cryptomorin/xseries/XBiome.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
* <a href="https://minecraft.fandom.com/wiki/Java_Edition_1.18">1.18 removed biomes issue.</a>
4747
*
4848
* @author Crypto Morin
49-
* @version 6.0.0
49+
* @version 6.1.0
5050
* @see Biome
5151
*/
5252
public enum XBiome {
@@ -62,6 +62,8 @@ public enum XBiome {
6262
OLD_GROWTH_SPRUCE_TAIGA("GIANT_SPRUCE_TAIGA", "MUTATED_REDWOOD_TAIGA", "MEGA_SPRUCE_TAIGA"),
6363
WINDSWEPT_SAVANNA("SHATTERED_SAVANNA", "MUTATED_SAVANNA", "SAVANNA_MOUNTAINS"),
6464
MEADOW,
65+
MANGROVE_SWAMP,
66+
DEEP_DARK,
6567
GROVE,
6668
SNOWY_SLOPES,
6769
FROZEN_PEAKS,

src/main/java/com/cryptomorin/xseries/XEnchantment.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
* Enchanting: https://minecraft.gamepedia.com/Enchanting
5050
*
5151
* @author Crypto Morin
52-
* @version 2.2.0
52+
* @version 2.3.0
5353
* @see Enchantment
5454
*/
5555
public enum XEnchantment {
@@ -68,7 +68,6 @@ public enum XEnchantment {
6868
FIRE_ASPECT(true, "FIRE", "MELEE_FIRE", "MELEE_FLAME", "FA"),
6969
FROST_WALKER(true, "FROST", "WALKER"),
7070
IMPALING(true, "IMPALE", "OCEAN_DAMAGE", "OCEAN_DMG"),
71-
SOUL_SPEED(true, "SPEED_SOUL", "SOUL_RUNNER"),
7271
KNOCKBACK(true, "K_BACK", "KB"),
7372
LOOT_BONUS_BLOCKS("FORTUNE", "BLOCKS_LOOT_BONUS", "FORT", "LBB"),
7473
LOOT_BONUS_MOBS("LOOTING", "MOB_LOOT", "MOBS_LOOT_BONUS", "LBM"),
@@ -87,7 +86,9 @@ public enum XEnchantment {
8786
QUICK_CHARGE(true, "QUICKCHARGE", "QUICK_DRAW", "FAST_CHARGE", "FAST_DRAW"),
8887
RIPTIDE(true, "RIP", "TIDE", "LAUNCH"),
8988
SILK_TOUCH(true, "SOFT_TOUCH", "ST"),
89+
SOUL_SPEED(true, "SPEED_SOUL", "SOUL_RUNNER"),
9090
SWEEPING_EDGE("SWEEPING", "SWEEPING_EDGE", "SWEEP_EDGE"),
91+
SWIFT_SNEAK(true, "SNEAK_SWIFT"),
9192
THORNS(true, "HIGHCRIT", "THORN", "HIGHERCRIT", "T"),
9293
VANISHING_CURSE(true, "VANISHING_CURSE", "VANISH_CURSE", "VANISHING", "VANISH"),
9394
WATER_WORKER("AQUA_AFFINITY", "WATER_WORKER", "AQUA_AFFINITY", "WATER_MINE", "WW");

src/main/java/com/cryptomorin/xseries/XEntity.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
* Entity: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Entity.html
5555
*
5656
* @author Crypto Morin
57-
* @version 4.0.0
57+
* @version 4.0.1
5858
* @see XMaterial
5959
* @see XItemStack
6060
* @see XPotion
@@ -135,13 +135,12 @@ public static Entity edit(@Nonnull Entity entity, @Nonnull ConfigurationSection
135135
if (config.isSet("silent")) entity.setSilent(config.getBoolean("silent"));
136136
entity.setFireTicks(config.getInt("fire-ticks"));
137137
entity.setFallDistance(config.getInt("fall-distance"));
138-
entity.setInvulnerable(config.getBoolean("invulnerable"));
138+
if (config.isSet("invulnerable")) entity.setInvulnerable(config.getBoolean("invulnerable"));
139139

140140
int live = config.getInt("ticks-lived");
141141
if (live > 0) entity.setTicksLived(live);
142142

143-
int portalCooldown = config.getInt("portal-cooldown", -1);
144-
if (portalCooldown != -1) entity.setPortalCooldown(portalCooldown);
143+
if (config.isSet("portal-cooldown")) entity.setPortalCooldown(config.getInt("portal-cooldown", -1));
145144
// We don't need damage cause.
146145

147146
if (XMaterial.supports(13)) {
@@ -181,8 +180,8 @@ public static Entity edit(@Nonnull Entity entity, @Nonnull ConfigurationSection
181180

182181
if (entity instanceof LivingEntity) {
183182
LivingEntity living = (LivingEntity) entity;
184-
double hp = config.getDouble("health", -1);
185-
if (hp > -1) {
183+
if (config.isSet("health")) {
184+
double hp = config.getDouble("health");
186185
living.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(hp);
187186
living.setHealth(hp);
188187
}

src/main/java/com/cryptomorin/xseries/XItemStack.java

Lines changed: 115 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import javax.annotation.Nullable;
6060
import java.util.*;
6161
import java.util.function.BiPredicate;
62+
import java.util.function.Consumer;
6263
import java.util.function.Function;
6364
import java.util.function.Predicate;
6465

@@ -74,7 +75,7 @@
7475
* ItemStack: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html
7576
*
7677
* @author Crypto Morin
77-
* @version 7.1.0
78+
* @version 7.2.0
7879
* @see XMaterial
7980
* @see XPotion
8081
* @see SkullUtils
@@ -366,7 +367,7 @@ public static Map<String, Object> serialize(@Nonnull ItemStack item) {
366367
*/
367368
@Nonnull
368369
public static ItemStack deserialize(@Nonnull ConfigurationSection config) {
369-
return edit(new ItemStack(Material.AIR), config, Function.identity());
370+
return edit(new ItemStack(Material.AIR), config, Function.identity(), null);
370371
}
371372

372373
private static List<String> splitNewLine(String str) {
@@ -397,19 +398,45 @@ private static List<String> splitNewLine(String str) {
397398
return list;
398399
}
399400

401+
@Nonnull
402+
public static ItemStack deserialize(@Nonnull ConfigurationSection config,
403+
@Nonnull Function<String, String> translator) {
404+
return deserialize(config, translator, null);
405+
}
406+
400407
/**
401408
* Deserialize an ItemStack from the config.
402409
*
403410
* @param config the config section to deserialize the ItemStack object from.
404411
*
405412
* @return an edited ItemStack.
406-
* @since 7.0.0
413+
* @since 7.2.0
414+
*/
415+
@Nonnull
416+
public static ItemStack deserialize(@Nonnull ConfigurationSection config,
417+
@Nonnull Function<String, String> translator,
418+
@Nullable Consumer<Exception> restart) {
419+
return edit(new ItemStack(Material.AIR), config, translator, restart);
420+
}
421+
422+
423+
/**
424+
* Deserialize an ItemStack from a {@code Map}.
425+
*
426+
* @param serializedItem the map holding the item configurations to deserialize
427+
* the ItemStack object from.
428+
* @param translator the translator to use for translating the item's name.
429+
*
430+
* @return a deserialized ItemStack.
407431
*/
408432
@Nonnull
409-
public static ItemStack deserialize(@Nonnull ConfigurationSection config, @Nonnull Function<String, String> translator) {
410-
return edit(new ItemStack(Material.AIR), config, translator);
433+
public static ItemStack deserialize(@Nonnull Map<String, Object> serializedItem, @Nonnull Function<String, String> translator) {
434+
Objects.requireNonNull(serializedItem, "serializedItem cannot be null.");
435+
Objects.requireNonNull(translator, "translator cannot be null.");
436+
return deserialize(mapToConfigSection(serializedItem), translator);
411437
}
412438

439+
413440
/**
414441
* Deserialize an ItemStack from the config.
415442
*
@@ -420,16 +447,45 @@ public static ItemStack deserialize(@Nonnull ConfigurationSection config, @Nonnu
420447
*/
421448
@SuppressWarnings("deprecation")
422449
@Nonnull
423-
public static ItemStack edit(@Nonnull ItemStack item, @Nonnull ConfigurationSection config, @Nonnull Function<String, String> translator) {
450+
public static ItemStack edit(@Nonnull ItemStack item,
451+
@Nonnull ConfigurationSection config,
452+
@Nonnull Function<String, String> translator,
453+
@Nullable Consumer<Exception> restart) {
424454
Objects.requireNonNull(item, "Cannot operate on null ItemStack, considering using an AIR ItemStack instead");
425455
Objects.requireNonNull(config, "Cannot deserialize item to a null configuration section.");
426456
Objects.requireNonNull(translator, "Translator function cannot be null");
427457

428458
// Material
429459
String materialName = config.getString("material");
430-
Optional<XMaterial> material = Strings.isNullOrEmpty(materialName) ?
431-
Optional.empty() : XMaterial.matchXMaterial(materialName);
432-
if (material.isPresent()) material.get().setType(item);
460+
if (!Strings.isNullOrEmpty(materialName)) {
461+
Optional<XMaterial> materialOpt = XMaterial.matchXMaterial(materialName);
462+
XMaterial material;
463+
if (materialOpt.isPresent()) material = materialOpt.get();
464+
else {
465+
UnknownMaterialCondition unknownMaterialCondition = new UnknownMaterialCondition(materialName);
466+
restart.accept(unknownMaterialCondition);
467+
468+
if (unknownMaterialCondition.hasSolution()) material = unknownMaterialCondition.solution;
469+
else throw unknownMaterialCondition;
470+
}
471+
472+
if (!material.isSupported()) {
473+
UnAcceptableMaterialCondition unsupportedMaterialCondition = new UnAcceptableMaterialCondition(material, UnAcceptableMaterialCondition.Reason.UNSUPPORTED);
474+
restart.accept(unsupportedMaterialCondition);
475+
476+
if (unsupportedMaterialCondition.hasSolution()) material = unsupportedMaterialCondition.solution;
477+
else throw unsupportedMaterialCondition;
478+
}
479+
if (XTag.INVENTORY_NOT_DISPLAYABLE.isTagged(material)) {
480+
UnAcceptableMaterialCondition unsupportedMaterialCondition = new UnAcceptableMaterialCondition(material, UnAcceptableMaterialCondition.Reason.NOT_DISPLAYABLE);
481+
restart.accept(unsupportedMaterialCondition);
482+
483+
if (unsupportedMaterialCondition.hasSolution()) material = unsupportedMaterialCondition.solution;
484+
else throw unsupportedMaterialCondition;
485+
}
486+
487+
material.setType(item);
488+
}
433489

434490
// Amount
435491
int amount = config.getInt("amount");
@@ -1151,4 +1207,54 @@ public static int firstPartialOrEmpty(@Nonnull Inventory inventory, @Nullable It
11511207
}
11521208
return -1;
11531209
}
1210+
1211+
public static class MaterialCondition extends RuntimeException {
1212+
protected XMaterial solution;
1213+
1214+
public MaterialCondition(String message) {
1215+
super(message);
1216+
}
1217+
1218+
public void setSolution(XMaterial solution) {
1219+
this.solution = solution;
1220+
}
1221+
1222+
public boolean hasSolution() {
1223+
return this.solution != null;
1224+
}
1225+
}
1226+
1227+
public static final class UnknownMaterialCondition extends MaterialCondition {
1228+
private final String material;
1229+
1230+
public UnknownMaterialCondition(String material) {
1231+
super("Unknown material: " + material);
1232+
this.material = material;
1233+
}
1234+
1235+
public String getMaterial() {
1236+
return material;
1237+
}
1238+
}
1239+
1240+
public static final class UnAcceptableMaterialCondition extends MaterialCondition {
1241+
private final XMaterial material;
1242+
private final Reason reason;
1243+
1244+
public UnAcceptableMaterialCondition(XMaterial material, Reason reason) {
1245+
super("Unacceptable material: " + material.name() + " (" + reason.name() + ')');
1246+
this.material = material;
1247+
this.reason = reason;
1248+
}
1249+
1250+
public Reason getReason() {
1251+
return reason;
1252+
}
1253+
1254+
public XMaterial getMaterial() {
1255+
return material;
1256+
}
1257+
1258+
public enum Reason {UNSUPPORTED, NOT_DISPLAYABLE}
1259+
}
11541260
}

0 commit comments

Comments
 (0)