Skip to content
Merged

26 #150

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public static void load(@NotNull FileConfiguration config) {
}
}

protected static void loadFlammabilityValues(FileConfiguration config, Function<Material, Boolean> addToSet, BiConsumer<Material, Pair<Integer, Optional<Integer>>> putBurnOddsFunction, BiConsumer<Material, Pair<Integer, Optional<Integer>>> putIgniteOddsFunction) {
protected static void loadFlammabilityValues(@NotNull FileConfiguration config, Function<Material, Boolean> addToSet, BiConsumer<Material, Pair<Integer, Optional<Integer>>> putBurnOddsFunction, BiConsumer<Material, Pair<Integer, Optional<Integer>>> putIgniteOddsFunction) {
if (!config.contains("FlammabilityOverride"))
return;
var section = config.getConfigurationSection("FlammabilityOverride");
Expand Down Expand Up @@ -111,7 +111,7 @@ protected static void loadFlammabilityValues(FileConfiguration config, Function<
}
}

protected static void loadBlastResistanceValues(FileConfiguration config, Function<Material, Boolean> addToSet, BiConsumer<Material, Float> putFunction) {
protected static void loadBlastResistanceValues(@NotNull FileConfiguration config, Function<Material, Boolean> addToSet, BiConsumer<Material, Float> putFunction) {
if (!config.contains("BlastResistanceOverride"))
return;
var section = config.getConfigurationSection("BlastResistanceOverride");
Expand Down Expand Up @@ -156,26 +156,26 @@ protected static void processOverriddenEntry(final BiFunction<Material, BlockOve
}
}

protected static boolean set(Material mat, BlockOverride override) {
protected static boolean set(Material mat, @NotNull BlockOverride override) {
boolean result = true;

// Blast resistance
if (override.blastResistanceOverride().isPresent()) {
result = result && NMS_HELPER.setBlastResistance(mat, override.blastResistanceOverride().get().floatValue());
result &= NMS_HELPER.setBlastResistance(mat, override.blastResistanceOverride().get());
}
// Burn oddity
if (override.burnOddity().isPresent()) {
result = result && NMS_HELPER.setBurnOdds(mat, override.burnOddity().get().intValue());
result &= NMS_HELPER.setBurnOdds(mat, override.burnOddity().get());
}
// Ignite oddity
if (override.igniteOddity().isPresent()) {
result = result && NMS_HELPER.setIgniteOdds(mat, override.igniteOddity().get().intValue());
result &= NMS_HELPER.setIgniteOdds(mat, override.igniteOddity().get());
}

return result;
}

protected static boolean reset(Material mat, BlockOverride override) {
protected static boolean reset(Material mat, @NotNull BlockOverride override) {
boolean result = true;

// Blast resistance
Expand All @@ -195,14 +195,15 @@ protected static boolean reset(Material mat, BlockOverride override) {
}

private static abstract class NMSHelper {

public static final NMSHelper createInstance() {
@NotNull
public static NMSHelper createInstance() {
String[] parts = Bukkit.getServer().getMinecraftVersion().split("\\.");
if (parts.length < 2)
throw new IllegalArgumentException();
int major_version = Integer.parseInt(parts[1]);
int major_version = Integer.parseInt(parts[0]);
int minor_version = Integer.parseInt(parts[1]);
NMSHelper result;
if (major_version < 20) {
if ((major_version < 2) && (minor_version < 20)) {
result = new NMSSpigotMappings();
} else {
result = new NMSMojangMappings();
Expand All @@ -219,16 +220,16 @@ public static final NMSHelper createInstance() {
@Nullable
Class<?> magicNumbers;

protected NMSHelper(String blastResField, String burnOddsField, String igniteOddsField) {
this.fieldNameBlastResistance = blastResField;
this.fieldNameBurnOdds = burnOddsField;
this.fieldNameIgniteOdds = igniteOddsField;
protected NMSHelper(@Nullable String blastResField, @Nullable String burnOddsField, @Nullable String igniteOddsField) {
fieldNameBlastResistance = blastResField;
fieldNameBurnOdds = burnOddsField;
fieldNameIgniteOdds = igniteOddsField;
}

public boolean setBlastResistance(Material m, float value) {
try {
Object block = this.getBlockClass(m);
writeField(block, value, this.fieldNameBlastResistance);
Object block = getBlockClass(m);
writeField(block, value, fieldNameBlastResistance);
return true;
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException | NoSuchFieldException | ClassNotFoundException e) {
Expand All @@ -239,8 +240,8 @@ public boolean setBlastResistance(Material m, float value) {

public Optional<Float> getBlastResistance(Material m) {
try {
Object block = this.getBlockClass(m);
return getFieldValueSafe(block, this.fieldNameBlastResistance);
Object block = getBlockClass(m);
return getFieldValueSafe(block, fieldNameBlastResistance);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException | ClassNotFoundException e) {
e.printStackTrace();
Expand All @@ -250,7 +251,7 @@ public Optional<Float> getBlastResistance(Material m) {

public boolean setBurnOdds(Material m, int value) {
try {
Object fireBlock = this.getBlockClass(Material.FIRE);
Object fireBlock = getBlockClass(Material.FIRE);
return setBurnOdds(m, value, fireBlock);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException | ClassNotFoundException e) {
Expand All @@ -261,9 +262,9 @@ public boolean setBurnOdds(Material m, int value) {

public Optional<Integer> getBurnOdds(Material m) {
try {
Object fireBlock = this.getBlockClass(Material.FIRE);
Object block = this.getBlockClass(m);
Optional<Object2IntMap> optMap = getFieldValueSafe(fireBlock, this.fieldNameBurnOdds);
Object fireBlock = getBlockClass(Material.FIRE);
Object block = getBlockClass(m);
Optional<Object2IntMap> optMap = getFieldValueSafe(fireBlock, fieldNameBurnOdds);
if (optMap.isPresent()) {
if (optMap.get().containsKey(block)) {
return Optional.of(optMap.get().getInt(block));
Expand All @@ -279,7 +280,7 @@ public Optional<Integer> getBurnOdds(Material m) {

public boolean setIgniteOdds(Material m, int value) {
try {
Object fireBlock = this.getBlockClass(Material.FIRE);
Object fireBlock = getBlockClass(Material.FIRE);
return setIgniteOdds(m, value, fireBlock);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException | ClassNotFoundException e) {
Expand All @@ -290,9 +291,9 @@ public boolean setIgniteOdds(Material m, int value) {

public Optional<Integer> getIgniteOdds(Material m) {
try {
Object fireBlock = this.getBlockClass(Material.FIRE);
Object block = this.getBlockClass(m);
Optional<Object2IntMap<Object>> optMap = getFieldValueSafe(fireBlock, this.fieldNameIgniteOdds);
Object fireBlock = getBlockClass(Material.FIRE);
Object block = getBlockClass(m);
Optional<Object2IntMap<Object>> optMap = getFieldValueSafe(fireBlock, fieldNameIgniteOdds);
if (optMap.isPresent()) {
if (optMap.get().containsKey(block)) {
return Optional.of(optMap.get().getInt(block));
Expand Down Expand Up @@ -342,8 +343,8 @@ protected boolean setIgniteOdds(Material m, int value, Object fireBlock) {
protected Object getBlockClass(Material m)
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException,
ClassNotFoundException {
if (this.magicNumbers == null) {
this.magicNumbers = this.getCraftMagicNumbersClass();
if (magicNumbers == null) {
magicNumbers = getCraftMagicNumbersClass();
}
Method method = magicNumbers.getMethod("getBlock", Material.class);
return method.invoke(null, m);
Expand All @@ -352,7 +353,17 @@ protected Object getBlockClass(Material m)
protected static <T> void writeField(@NotNull Object block, @NotNull Consumer<T> whatToDoWithField,
String fieldName) throws IllegalAccessException, NoSuchFieldException, ClassCastException,
InaccessibleObjectException, SecurityException {
Field field = block.getClass().getField(fieldName);
Class<?> clazz = block.getClass();
Field field = null;
while (clazz != null) {
try {
field = clazz.getDeclaredField(fieldName);
break;
} catch (NoSuchFieldException e) {
clazz = clazz.getSuperclass();
}
}
if (field == null) throw new NoSuchFieldException(fieldName);
field.setAccessible(true);
T obj = (T) field.get(block);
whatToDoWithField.accept(obj);
Expand All @@ -361,7 +372,17 @@ protected static <T> void writeField(@NotNull Object block, @NotNull Consumer<T>
protected static <T> void writeField(@NotNull Object block, T value, String fieldName)
throws IllegalAccessException, NoSuchFieldException, ClassCastException, InaccessibleObjectException,
SecurityException {
Field field = block.getClass().getField(fieldName);
Class<?> clazz = block.getClass();
Field field = null;
while (clazz != null) {
try {
field = clazz.getDeclaredField(fieldName);
break;
} catch (NoSuchFieldException e) {
clazz = clazz.getSuperclass();
}
}
if (field == null) throw new NoSuchFieldException(fieldName);
field.setAccessible(true);
field.set(block, value);
}
Expand All @@ -377,15 +398,14 @@ protected static <T> Optional<T> getFieldValueSafe(@NotNull Object instance, Str
protected static <T> T getFieldValue(@NotNull Object instance, String fieldName)
throws IllegalAccessException, NoSuchFieldException, ClassCastException, InaccessibleObjectException,
SecurityException {
Field field = instance.getClass().getField(fieldName);
Field field = instance.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
T obj = (T) field.get(instance);
return obj;
}
}

private static class NMSSpigotMappings extends NMSHelper {

// Tested in 1.19.4
private static final String FIELD_NAME_IGNITE_ODDS = "O";
private static final String FIELD_NAME_BURN_ODDS = "P";
Expand All @@ -399,6 +419,7 @@ protected NMSSpigotMappings(String blastResField, String burnOddsField, String i
super(blastResField, burnOddsField, igniteOddsField);
}

@NotNull
@Override
Class<?> getCraftMagicNumbersClass() throws ClassNotFoundException {
String packageName = Bukkit.getServer().getClass().getPackage().getName();
Expand All @@ -408,7 +429,6 @@ Class<?> getCraftMagicNumbersClass() throws ClassNotFoundException {
}

private static class NMSMojangMappings extends NMSHelper {

// Tested on 1.20.4 and 1.21
private static final String FIELD_NAME_IGNITE_ODDS = "igniteOdds";
private static final String FIELD_NAME_BURN_ODDS = "burnOdds";
Expand All @@ -422,10 +442,10 @@ protected NMSMojangMappings(String blastResField, String burnOddsField, String i
super(blastResField, burnOddsField, igniteOddsField);
}

@NotNull
@Override
Class<?> getCraftMagicNumbersClass() throws ClassNotFoundException {
return Class.forName(Bukkit.getServer().getClass().getPackage().getName() + ".util.CraftMagicNumbers");
}
}

}
Loading