9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-28 03:19:14 +00:00

优化版本判断

This commit is contained in:
XiaoMoMi
2025-04-26 16:48:00 +08:00
parent 4da72b140f
commit a02a26ff54
45 changed files with 251 additions and 213 deletions

View File

@@ -124,7 +124,7 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
private void initSlimeWorldHook() {
WorldManager worldManager = this.plugin.worldManager();
if (VersionHelper.isVersionNewerThan1_21_4()) {
if (VersionHelper.isOrAbove1_21_4()) {
try {
Class.forName("com.infernalsuite.asp.api.AdvancedSlimePaperAPI");
SlimeFormatStorageAdaptor adaptor = new SlimeFormatStorageAdaptor(worldManager);

View File

@@ -51,7 +51,7 @@ public class BlockEventListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onPlayerAttack(EntityDamageByEntityEvent event) {
if (!VersionHelper.isVersionNewerThan1_20_5()) {
if (!VersionHelper.isOrAbove1_20_5()) {
if (event.getDamager() instanceof Player player) {
BukkitServerPlayer serverPlayer = plugin.adapt(player);
serverPlayer.setClientSideCanBreakBlock(true);
@@ -306,7 +306,7 @@ public class BlockEventListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
public void onEntityExplode(EntityExplodeEvent event) {
if (VersionHelper.isVersionNewerThan1_21()) {
if (VersionHelper.isOrAbove1_21()) {
if (!ExplosionUtils.isDroppingItems(event)) return;
}
handleExplodeEvent(event.blockList(), new BukkitWorld(event.getEntity().getWorld()), event.getYield());
@@ -314,7 +314,7 @@ public class BlockEventListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
public void onBlockExplode(BlockExplodeEvent event) {
if (VersionHelper.isVersionNewerThan1_21()) {
if (VersionHelper.isOrAbove1_21()) {
if (!ExplosionUtils.isDroppingItems(event)) return;
}
handleExplodeEvent(event.blockList(), new BukkitWorld(event.getBlock().getWorld()), event.getYield());

View File

@@ -107,7 +107,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
if (enableNoteBlocks) {
this.recordVanillaNoteBlocks();
}
if (VersionHelper.isVersionNewerThan1_20_3()) {
if (VersionHelper.isOrAbove1_20_3()) {
this.fallingBlockRemoveListener = new FallingBlockRemoveListener();
} else this.fallingBlockRemoveListener = null;
this.stateId2ImmutableBlockStates = new ImmutableBlockState[customBlockCount];

View File

@@ -107,7 +107,7 @@ public class BukkitCustomBlock extends CustomBlock {
Reflections.method$BlockStateBase$initCache.invoke(mcBlockState);
// set block light
if (settings.blockLight() != -1) {
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
Reflections.field$BlockStateBase$lightBlock.set(mcBlockState, settings.blockLight());
} else {
Object cache = Reflections.field$BlockStateBase$cache.get(mcBlockState);

View File

@@ -56,7 +56,7 @@ public class BushBlockBehavior extends BukkitBlockBehavior {
Object level;
Object blockPos;
Object state = args[0];
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
level = args[1];
blockPos = args[3];
} else {

View File

@@ -99,7 +99,7 @@ public class ConcretePowderBlockBehavior extends FallingBlockBehavior {
public Object updateShape(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
Object level;
Object pos;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
level = args[1];
pos = args[3];
} else {

View File

@@ -42,7 +42,7 @@ public class FallingBlockBehavior extends BukkitBlockBehavior {
public Object updateShape(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
Object world;
Object blockPos;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
world = args[1];
blockPos = args[3];
} else {
@@ -81,7 +81,7 @@ public class FallingBlockBehavior extends BukkitBlockBehavior {
@Override
public void onBrokenAfterFall(Object thisBlock, Object[] args) throws Exception {
// Use EntityRemoveEvent for 1.20.3+
if (VersionHelper.isVersionNewerThan1_20_3()) return;
if (VersionHelper.isOrAbove1_20_3()) return;
Object level = args[0];
Object fallingBlockEntity = args[2];
boolean cancelDrop = (boolean) Reflections.field$FallingBlockEntity$cancelDrop.get(fallingBlockEntity);

View File

@@ -66,7 +66,7 @@ public class LeavesBlockBehavior extends WaterLoggedBlockBehavior {
Object blockPos;
Object neighborState;
Object blockState = args[0];
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
world = args[1];
neighborState = args[6];
blockPos = args[3];

View File

@@ -79,7 +79,7 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior {
public Object updateShape(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
Object world;
Object blockPos;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
world = args[1];
blockPos = args[3];
} else {
@@ -120,7 +120,7 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior {
int age = currentState.get(ageProperty);
if (age >= this.ageProperty.max || RandomUtils.generateRandomFloat(0, 1) < this.growSpeed) {
Object abovePos = LocationUtils.above(blockPos);
if (VersionHelper.isVersionNewerThan1_21_5()) {
if (VersionHelper.isOrAbove1_21_5()) {
Reflections.method$CraftEventFactory$handleBlockGrowEvent.invoke(null, level, abovePos, super.customBlock.defaultState().customBlockState().handle(), UpdateOption.UPDATE_ALL.flags());
} else {
Reflections.method$CraftEventFactory$handleBlockGrowEvent.invoke(null, level, abovePos, super.customBlock.defaultState().customBlockState().handle());

View File

@@ -38,6 +38,6 @@ public class DisplayEntityData<T> extends BaseEntityData<T> {
}
public DisplayEntityData(int id, Object serializer, T defaultValue) {
super(!VersionHelper.isVersionNewerThan1_20_2() && id >= 11 ? id - 1 : id, serializer, defaultValue);
super(!VersionHelper.isOrAbove1_20_2() && id >= 11 ? id - 1 : id, serializer, defaultValue);
}
}

View File

@@ -60,15 +60,15 @@ public class EntityDataValue {
Serializers$OPTIONAL_BLOCK_STATE = initSerializersByName("OPTIONAL_BLOCK_STATE");
Serializers$BOOLEAN = initSerializersByName("BOOLEAN");
Serializers$PARTICLE = initSerializersByName("PARTICLE");
if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$PARTICLES = initSerializersByName("PARTICLES");
if (VersionHelper.isOrAbove1_20_5()) Serializers$PARTICLES = initSerializersByName("PARTICLES");
else Serializers$PARTICLES = null;
Serializers$ROTATIONS = initSerializersByName("ROTATIONS");
Serializers$BLOCK_POS = initSerializersByName("BLOCK_POS");
Serializers$OPTIONAL_BLOCK_POS = initSerializersByName("OPTIONAL_BLOCK_POS");
Serializers$DIRECTION = initSerializersByName("DIRECTION");
if (!VersionHelper.isVersionNewerThan1_21_5()) Serializers$OPTIONAL_UUID = initSerializersByName("OPTIONAL_UUID");
if (!VersionHelper.isOrAbove1_21_5()) Serializers$OPTIONAL_UUID = initSerializersByName("OPTIONAL_UUID");
else Serializers$OPTIONAL_UUID = null;
if (VersionHelper.isVersionNewerThan1_21_5()) Serializers$OPTIONAL_LIVING_ENTITY_REFERENCE = initSerializersByName("OPTIONAL_LIVING_ENTITY_REFERENCE");
if (VersionHelper.isOrAbove1_21_5()) Serializers$OPTIONAL_LIVING_ENTITY_REFERENCE = initSerializersByName("OPTIONAL_LIVING_ENTITY_REFERENCE");
else Serializers$OPTIONAL_LIVING_ENTITY_REFERENCE = null;
Serializers$OPTIONAL_GLOBAL_POS = initSerializersByName("OPTIONAL_GLOBAL_POS");
Serializers$COMPOUND_TAG = initSerializersByName("COMPOUND_TAG");
@@ -76,11 +76,11 @@ public class EntityDataValue {
Serializers$OPTIONAL_UNSIGNED_INT = initSerializersByName("OPTIONAL_UNSIGNED_INT");
Serializers$POSE = initSerializersByName("POSE");
Serializers$CAT_VARIANT = initSerializersByName("CAT_VARIANT");
if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$WOLF_VARIANT = initSerializersByName("WOLF_VARIANT");
if (VersionHelper.isOrAbove1_20_5()) Serializers$WOLF_VARIANT = initSerializersByName("WOLF_VARIANT");
else Serializers$WOLF_VARIANT = null;
Serializers$FROG_VARIANT = initSerializersByName("FROG_VARIANT");
Serializers$PAINTING_VARIANT = initSerializersByName("PAINTING_VARIANT");
if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$ARMADILLO_STATE = initSerializersByName("ARMADILLO_STATE");
if (VersionHelper.isOrAbove1_20_5()) Serializers$ARMADILLO_STATE = initSerializersByName("ARMADILLO_STATE");
else Serializers$ARMADILLO_STATE = null;
Serializers$SNIFFER_STATE = initSerializersByName("SNIFFER_STATE");
Serializers$VECTOR3 = initSerializersByName("VECTOR3");

View File

@@ -13,6 +13,6 @@ public class InteractionEntityData<T> extends BaseEntityData<T> {
}
public InteractionEntityData(int id, Object serializer, T defaultValue) {
super(!VersionHelper.isVersionNewerThan1_20_2() && id >= 11 ? id - 1 : id, serializer, defaultValue);
super(!VersionHelper.isOrAbove1_20_2() && id >= 11 ? id - 1 : id, serializer, defaultValue);
}
}

View File

@@ -58,7 +58,7 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
this.plugin = plugin;
this.furnitureParser = new FurnitureParser();
this.furnitureEventListener = new FurnitureEventListener(this);
this.dismountListener = VersionHelper.isVersionNewerThan1_20_3() ? new DismountListener1_20_3(this) : new DismountListener1_20(this::handleDismount);
this.dismountListener = VersionHelper.isOrAbove1_20_3() ? new DismountListener1_20_3(this) : new DismountListener1_20(this::handleDismount);
}
@Override
@@ -292,7 +292,7 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
if (previous != null) return;
Location location = display.getLocation();
boolean above1_20_1 = VersionHelper.isVersionNewerThan1_20_2();
boolean above1_20_1 = VersionHelper.isOrAbove1_20_2();
boolean preventChange = FastNMS.INSTANCE.isPreventingStatusUpdates(location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4);
if (above1_20_1) {
if (!preventChange) {

View File

@@ -297,9 +297,9 @@ public class LoadedFurniture implements Furniture {
public void spawnSeatEntityForPlayer(org.bukkit.entity.Player player, Seat seat) {
Location location = this.calculateSeatLocation(seat);
Entity seatEntity = seat.limitPlayerRotation() ?
EntityUtils.spawnEntity(player.getWorld(), VersionHelper.isVersionNewerThan1_20_2() ? location.subtract(0,0.9875,0) : location.subtract(0,0.990625,0), EntityType.ARMOR_STAND, entity -> {
EntityUtils.spawnEntity(player.getWorld(), VersionHelper.isOrAbove1_20_2() ? location.subtract(0,0.9875,0) : location.subtract(0,0.990625,0), EntityType.ARMOR_STAND, entity -> {
ArmorStand armorStand = (ArmorStand) entity;
if (VersionHelper.isVersionNewerThan1_21_3()) {
if (VersionHelper.isOrAbove1_21_3()) {
Objects.requireNonNull(armorStand.getAttribute(Attribute.MAX_HEALTH)).setBaseValue(0.01);
} else {
LegacyAttributeUtils.setMaxHealth(armorStand);
@@ -316,7 +316,7 @@ public class LoadedFurniture implements Furniture {
armorStand.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER, this.baseEntityId());
armorStand.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_VECTOR_3F_KEY, PersistentDataType.STRING, seat.offset().x + ", " + seat.offset().y + ", " + seat.offset().z);
}) :
EntityUtils.spawnEntity(player.getWorld(), VersionHelper.isVersionNewerThan1_20_2() ? location : location.subtract(0,0.25,0), EntityType.ITEM_DISPLAY, entity -> {
EntityUtils.spawnEntity(player.getWorld(), VersionHelper.isOrAbove1_20_2() ? location : location.subtract(0,0.25,0), EntityType.ITEM_DISPLAY, entity -> {
ItemDisplay itemDisplay = (ItemDisplay) entity;
itemDisplay.setPersistent(false);
itemDisplay.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER, this.baseEntityId());

View File

@@ -57,7 +57,7 @@ public class CustomHitBox extends AbstractHitBox {
FastNMS.INSTANCE.toNMSEntityType(this.entityType), 0, Reflections.instance$Vec3$Zero, 0
), true);
packets.accept(FastNMS.INSTANCE.constructor$ClientboundSetEntityDataPacket(entityId[0], List.copyOf(this.cachedValues)), true);
if (VersionHelper.isVersionNewerThan1_20_5() && this.scale != 1) {
if (VersionHelper.isOrAbove1_20_5() && this.scale != 1) {
Object attributeInstance = Reflections.constructor$AttributeInstance.newInstance(Reflections.instance$Holder$Attribute$scale, (Consumer<?>) (o) -> {});
Reflections.method$AttributeInstance$setBaseValue.invoke(attributeInstance, this.scale);
packets.accept(Reflections.constructor$ClientboundUpdateAttributesPacket0.newInstance(entityId[0], Collections.singletonList(attributeInstance)), false);

View File

@@ -223,7 +223,7 @@ public class ShulkerHitBox extends AbstractHitBox {
), false);
}
// set shulker scale
if (VersionHelper.isVersionNewerThan1_20_5() && this.scale != 1) {
if (VersionHelper.isOrAbove1_20_5() && this.scale != 1) {
Object attributeInstance = Reflections.constructor$AttributeInstance.newInstance(Reflections.instance$Holder$Attribute$scale, (Consumer<?>) (o) -> {});
Reflections.method$AttributeInstance$setBaseValue.invoke(attributeInstance, this.scale);
packets.accept(Reflections.constructor$ClientboundUpdateAttributesPacket0.newInstance(entityIds[1], Collections.singletonList(attributeInstance)), false);

View File

@@ -131,14 +131,14 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
if (result == null) return;
Player player;
try {
player = (Player) Reflections.method$InventoryView$getPlayer.invoke(VersionHelper.isVersionNewerThan1_21() ? event.getView() : LegacyInventoryUtils.getView(event));
player = (Player) Reflections.method$InventoryView$getPlayer.invoke(VersionHelper.isOrAbove1_21() ? event.getView() : LegacyInventoryUtils.getView(event));
} catch (ReflectiveOperationException e) {
this.plugin.logger().warn("Failed to get inventory viewer", e);
return;
}
String renameText;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
AnvilView anvilView = event.getView();
renameText = anvilView.getRenameText();
} else {

View File

@@ -277,7 +277,7 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
itemBuilder.dataModifier(new CustomModelDataModifier<>(customModelData));
}
// Requires the item to have model before apply item-model
else if (!hasItemModelSection && section.containsKey("model") && VersionHelper.isVersionNewerThan1_21_2()) {
else if (!hasItemModelSection && section.containsKey("model") && VersionHelper.isOrAbove1_21_2()) {
// check server version here because components require 1.21.2+
// customize or use the id
itemModelKey = Key.from(section.getOrDefault("item-model", id.toString()).toString());

View File

@@ -29,7 +29,7 @@ public class ComponentTypes {
private ComponentTypes() {}
private static Object getComponentType(Key key) {
if (!VersionHelper.isVersionNewerThan1_20_5()) return null;
if (!VersionHelper.isOrAbove1_20_5()) return null;
return FastNMS.INSTANCE.getComponentType(key.namespace(), key.value());
}
}

View File

@@ -96,7 +96,7 @@ public class AxeItemBehavior extends ItemBehavior {
player.swingHand(context.getHand());
}
// shrink item amount
if (VersionHelper.isVersionNewerThan1_20_5()) {
if (VersionHelper.isOrAbove1_20_5()) {
Object itemStack = item.getLiteralObject();
Object serverPlayer = player.serverPlayer();
Object equipmentSlot = context.getHand() == InteractionHand.MAIN_HAND ? Reflections.instance$EquipmentSlot$MAINHAND : Reflections.instance$EquipmentSlot$OFFHAND;

View File

@@ -123,10 +123,10 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
MIXED_RECIPE_CONVERTORS.put(RecipeTypes.SMITHING_TRANSFORM, (BukkitRecipeConvertor<CustomSmithingTransformRecipe<ItemStack>>) (id, recipe) -> {
try {
Object nmsRecipe = createMinecraftSmithingTransformRecipe(recipe);
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
nmsRecipe = Reflections.constructor$RecipeHolder.newInstance(
Reflections.method$CraftRecipe$toMinecraft.invoke(null, new NamespacedKey(id.namespace(), id.value())), nmsRecipe);
} else if (VersionHelper.isVersionNewerThan1_20_2()) {
} else if (VersionHelper.isOrAbove1_20_2()) {
nmsRecipe = Reflections.constructor$RecipeHolder.newInstance(KeyUtils.toResourceLocation(id), nmsRecipe);
} else {
return () -> {};
@@ -255,7 +255,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
instance = this;
this.plugin = plugin;
this.recipeEventListener = new RecipeEventListener(plugin, this, plugin.itemManager());
this.crafterEventListener = VersionHelper.isVersionNewerThan1_21() ? new CrafterEventListener(plugin, this, plugin.itemManager()) : null;
this.crafterEventListener = VersionHelper.isOrAbove1_21() ? new CrafterEventListener(plugin, this, plugin.itemManager()) : null;
try {
nmsRecipeManager = Reflections.method$MinecraftServer$getRecipeManager.invoke(Reflections.method$MinecraftServer$getServer.invoke(null));
} catch (ReflectiveOperationException e) {
@@ -286,7 +286,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
@Override
public void load() {
if (!Config.enableRecipeSystem()) return;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
try {
this.stolenFeatureFlagSet = Reflections.field$RecipeManager$featureflagset.get(nmsRecipeManager);
Reflections.field$RecipeManager$featureflagset.set(nmsRecipeManager, null);
@@ -301,7 +301,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
if (!Config.enableRecipeSystem()) return;
super.unload();
try {
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
Reflections.method$RecipeManager$finalizeRecipeLoading.invoke(nmsRecipeManager);
}
} catch (ReflectiveOperationException e) {
@@ -349,7 +349,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
private void unregisterNMSRecipe(NamespacedKey key) {
try {
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
Object recipeMap = Reflections.field$RecipeManager$recipes.get(nmsRecipeManager);
Reflections.method$RecipeMap$removeRecipe.invoke(recipeMap, Reflections.method$CraftRecipe$toMinecraft.invoke(null, key));
} else {
@@ -363,7 +363,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
@SuppressWarnings("unchecked")
private void injectDataPackRecipes() {
try {
Object fileToIdConverter = Reflections.method$FileToIdConverter$json.invoke(null, VersionHelper.isVersionNewerThan1_21() ? "recipe" : "recipes");
Object fileToIdConverter = Reflections.method$FileToIdConverter$json.invoke(null, VersionHelper.isOrAbove1_21() ? "recipe" : "recipes");
Object minecraftServer = Reflections.method$MinecraftServer$getServer.invoke(null);
Object packRepository = Reflections.method$MinecraftServer$getPackRepository.invoke(minecraftServer);
List<Object> selected = (List<Object>) Reflections.field$PackRepository$selected.get(packRepository);
@@ -446,13 +446,13 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
this.delayedTasksOnMainThread.clear();
// give flags back on 1.21.2+
if (VersionHelper.isVersionNewerThan1_21_2() && this.stolenFeatureFlagSet != null) {
if (VersionHelper.isOrAbove1_21_2() && this.stolenFeatureFlagSet != null) {
Reflections.field$RecipeManager$featureflagset.set(nmsRecipeManager(), this.stolenFeatureFlagSet);
this.stolenFeatureFlagSet = null;
}
// refresh recipes
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
Reflections.method$RecipeManager$finalizeRecipeLoading.invoke(nmsRecipeManager());
}
@@ -460,11 +460,11 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
Reflections.method$DedicatedPlayerList$reloadRecipes.invoke(Reflections.field$CraftServer$playerList.get(Bukkit.getServer()));
// now we need to remove the fake `exact`
if (VersionHelper.isVersionNewerThan1_21_4()) {
if (VersionHelper.isOrAbove1_21_4()) {
for (Object ingredient : injectedIngredients) {
Reflections.field$Ingredient$itemStacks1_21_4.set(ingredient, null);
}
} else if (VersionHelper.isVersionNewerThan1_21_2()) {
} else if (VersionHelper.isOrAbove1_21_2()) {
for (Object ingredient : injectedIngredients) {
Reflections.field$Ingredient$itemStacks1_21_2.set(ingredient, null);
}
@@ -711,11 +711,11 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
Object shapedRecipe = getNMSRecipe(id);
recipeToMcRecipeHolder.put(recipe, shapedRecipe);
if (VersionHelper.isVersionNewerThan1_20_2()) {
if (VersionHelper.isOrAbove1_20_2()) {
shapedRecipe = Reflections.field$RecipeHolder$recipe.get(shapedRecipe);
}
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
Reflections.field$ShapedRecipe$placementInfo.set(shapedRecipe, null);
}
@@ -732,11 +732,11 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
Object shapelessRecipe = getNMSRecipe(id);
recipeToMcRecipeHolder.put(recipe, shapelessRecipe);
if (VersionHelper.isVersionNewerThan1_20_2()) {
if (VersionHelper.isOrAbove1_20_2()) {
shapelessRecipe = Reflections.field$RecipeHolder$recipe.get(shapelessRecipe);
}
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
Reflections.field$ShapelessRecipe$placementInfo.set(shapelessRecipe, null);
}
@SuppressWarnings("unchecked")
@@ -752,12 +752,12 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
Ingredient<ItemStack> actualIngredient = recipe.ingredient();
Object smeltingRecipe = getNMSRecipe(id);
recipeToMcRecipeHolder.put(recipe, smeltingRecipe);
if (VersionHelper.isVersionNewerThan1_20_2()) {
if (VersionHelper.isOrAbove1_20_2()) {
smeltingRecipe = Reflections.field$RecipeHolder$recipe.get(smeltingRecipe);
}
Object ingredient;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
ingredient = Reflections.field$SingleItemRecipe$input.get(smeltingRecipe);
} else {
ingredient = Reflections.field$AbstractCookingRecipe$input.get(smeltingRecipe);
@@ -771,7 +771,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
// 获取nms配方请注意1.20.1获取配方本身而1.20.2+获取的是配方的holder
// recipe on 1.20.1 and holder on 1.20.2+
private static Object getNMSRecipe(Key id) throws ReflectiveOperationException {
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
Object resourceKey = Reflections.method$CraftRecipe$toMinecraft.invoke(null, new NamespacedKey(id.namespace(), id.value()));
@SuppressWarnings("unchecked")
Optional<Object> optional = (Optional<Object>) Reflections.method$RecipeManager$byKey.invoke(nmsRecipeManager, resourceKey);
@@ -800,9 +800,9 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
Object ingredient = fakeIngredients.get(i);
Ingredient<ItemStack> actualIngredient = actualIngredients.get(i);
List<Object> items = getIngredientLooks(actualIngredient.items());
if (VersionHelper.isVersionNewerThan1_21_4()) {
if (VersionHelper.isOrAbove1_21_4()) {
Reflections.field$Ingredient$itemStacks1_21_4.set(ingredient, new HashSet<>(items));
} else if (VersionHelper.isVersionNewerThan1_21_2()) {
} else if (VersionHelper.isOrAbove1_21_2()) {
Reflections.field$Ingredient$itemStacks1_21_2.set(ingredient, items);
} else {
Object itemStackArray = Array.newInstance(Reflections.clazz$ItemStack, items.size());
@@ -845,21 +845,21 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
// create nms smithing recipe for different versions
private static Object createMinecraftSmithingTransformRecipe(CustomSmithingTransformRecipe<ItemStack> recipe) throws ReflectiveOperationException {
if (VersionHelper.isVersionNewerThan1_21_5()) {
if (VersionHelper.isOrAbove1_21_5()) {
return Reflections.constructor$SmithingTransformRecipe.newInstance(
toOptionalMinecraftIngredient(recipe.template()),
toMinecraftIngredient(recipe.base()),
toOptionalMinecraftIngredient(recipe.addition()),
toTransmuteResult(recipe.result(ItemBuildContext.EMPTY))
);
} else if (VersionHelper.isVersionNewerThan1_21_2()) {
} else if (VersionHelper.isOrAbove1_21_2()) {
return Reflections.constructor$SmithingTransformRecipe.newInstance(
toOptionalMinecraftIngredient(recipe.template()),
toOptionalMinecraftIngredient(recipe.base()),
toOptionalMinecraftIngredient(recipe.addition()),
FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(recipe.result(ItemBuildContext.EMPTY))
);
} else if (VersionHelper.isVersionNewerThan1_20_2()) {
} else if (VersionHelper.isOrAbove1_20_2()) {
return Reflections.constructor$SmithingTransformRecipe.newInstance(
toMinecraftIngredient(recipe.template()),
toMinecraftIngredient(recipe.base()),

View File

@@ -279,7 +279,7 @@ public class RecipeEventListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onBlockIgnite(BlockIgniteEvent event) {
if (!Config.enableRecipeSystem()) return;
if (VersionHelper.isVersionNewerThan1_21_2()) return;
if (VersionHelper.isOrAbove1_21_2()) return;
Block block = event.getBlock();
Material material = block.getType();
if (material == Material.CAMPFIRE) {
@@ -308,7 +308,7 @@ public class RecipeEventListener implements Listener {
plugin.logger().warn("Failed to inject cooking block entity", e);
}
}
} else if (!VersionHelper.isVersionNewerThan1_21_2() && material == Material.CAMPFIRE) {
} else if (!VersionHelper.isOrAbove1_21_2() && material == Material.CAMPFIRE) {
if (block.getState() instanceof Campfire campfire) {
try {
Object blockEntity = Reflections.field$CraftBlockEntityState$tileEntity.get(campfire);
@@ -324,13 +324,13 @@ public class RecipeEventListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onPutItemOnCampfire(PlayerInteractEvent event) {
if (!Config.enableRecipeSystem()) return;
if (!VersionHelper.isVersionNewerThan1_21_2()) return;
if (!VersionHelper.isOrAbove1_21_2()) return;
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
Block clicked = event.getClickedBlock();
if (clicked == null) return;
Material type = clicked.getType();
if (type != Material.CAMPFIRE && type != Material.SOUL_CAMPFIRE) return;
if (!VersionHelper.isVersionNewerThan1_21_2()) {
if (!VersionHelper.isOrAbove1_21_2()) {
if (clicked.getState() instanceof Campfire campfire) {
try {
Object blockEntity = Reflections.field$CraftBlockEntityState$tileEntity.get(campfire);
@@ -375,7 +375,7 @@ public class RecipeEventListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onCampfireCook(CampfireStartEvent event) {
if (!Config.enableRecipeSystem()) return;
if (!VersionHelper.isVersionNewerThan1_21_2()) return;
if (!VersionHelper.isOrAbove1_21_2()) return;
CampfireRecipe recipe = event.getRecipe();
Key recipeId = new Key(recipe.getKey().namespace(), recipe.getKey().value());
@@ -406,7 +406,7 @@ public class RecipeEventListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onCampfireCook(BlockCookEvent event) {
if (!Config.enableRecipeSystem()) return;
if (!VersionHelper.isVersionNewerThan1_21_2()) return;
if (!VersionHelper.isOrAbove1_21_2()) return;
Material type = event.getBlock().getType();
if (type != Material.CAMPFIRE && type != Material.SOUL_CAMPFIRE) return;
CampfireRecipe recipe = (CampfireRecipe) event.getRecipe();
@@ -563,7 +563,7 @@ public class RecipeEventListener implements Listener {
String renameText;
int maxRepairCost;
//int previousCost;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
AnvilView anvilView = event.getView();
renameText = anvilView.getRenameText();
maxRepairCost = anvilView.getMaximumRepairCost();
@@ -588,10 +588,10 @@ public class RecipeEventListener implements Listener {
} catch (ReflectiveOperationException e) {
plugin.logger().warn("Failed to get hover name", e);
}
} else if (VersionHelper.isVersionNewerThan1_20_5() && wrappedFirst.hasComponent(ComponentTypes.CUSTOM_NAME)) {
} else if (VersionHelper.isOrAbove1_20_5() && wrappedFirst.hasComponent(ComponentTypes.CUSTOM_NAME)) {
repairCost += 1;
wrappedFirst.customName(null);
} else if (!VersionHelper.isVersionNewerThan1_20_5() && wrappedFirst.hasTag("display", "Name")) {
} else if (!VersionHelper.isOrAbove1_20_5() && wrappedFirst.hasTag("display", "Name")) {
repairCost += 1;
wrappedFirst.customName(null);
}
@@ -601,7 +601,7 @@ public class RecipeEventListener implements Listener {
// To fix some client side visual issues
try {
Object anvilMenu;
if (VersionHelper.isVersionNewerThan1_21()) {
if (VersionHelper.isOrAbove1_21()) {
anvilMenu = Reflections.field$CraftInventoryView$container.get(event.getView());
} else {
anvilMenu = Reflections.field$CraftInventoryAnvil$menu.get(inventory);
@@ -611,7 +611,7 @@ public class RecipeEventListener implements Listener {
this.plugin.logger().warn("Failed to broadcast changes", e);
}
if (VersionHelper.isVersionNewerThan1_21()) {
if (VersionHelper.isOrAbove1_21()) {
AnvilView anvilView = event.getView();
anvilView.setRepairCost(finalCost);
anvilView.setRepairItemCountCost(actualConsumedAmount);
@@ -622,7 +622,7 @@ public class RecipeEventListener implements Listener {
Player player;
try {
player = (Player) Reflections.method$InventoryView$getPlayer.invoke(VersionHelper.isVersionNewerThan1_21() ? event.getView() : LegacyInventoryUtils.getView(event));
player = (Player) Reflections.method$InventoryView$getPlayer.invoke(VersionHelper.isOrAbove1_21() ? event.getView() : LegacyInventoryUtils.getView(event));
} catch (ReflectiveOperationException e) {
plugin.logger().warn("Failed to get inventory viewer", e);
return;
@@ -659,7 +659,7 @@ public class RecipeEventListener implements Listener {
wrappedFirst.getCustomItem().ifPresent(item -> {
if (!item.settings().renameable()) {
String renameText;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
AnvilView anvilView = event.getView();
renameText = anvilView.getRenameText();
} else {

View File

@@ -72,7 +72,7 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme
ContextHolder.Builder builder = ContextHolder.builder();
builder.withParameter(LootParameters.WORLD, world);
builder.withParameter(LootParameters.LOCATION, vec3d);
if (VersionHelper.isVersionNewerThan1_20_5()) {
if (VersionHelper.isOrAbove1_20_5()) {
if (event.getDamageSource().getCausingEntity() instanceof Player player) {
BukkitServerPlayer serverPlayer = this.plugin.adapt(player);
builder.withParameter(LootParameters.PLAYER, serverPlayer);

View File

@@ -48,7 +48,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener {
@EventHandler(priority = EventPriority.LOW)
public void onPlayerJoin(PlayerJoinEvent event) {
if (Config.sendPackOnJoin() && !VersionHelper.isVersionNewerThan1_20_2()) {
if (Config.sendPackOnJoin() && !VersionHelper.isOrAbove1_20_2()) {
Player player = plugin.adapt(event.getPlayer());
this.sendResourcePack(player);
}
@@ -58,7 +58,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener {
public void load() {
if (ReloadCommand.RELOAD_PACK_FLAG || CraftEngine.instance().isInitializing()) {
super.load();
if (Config.sendPackOnJoin() && VersionHelper.isVersionNewerThan1_20_2() && !(resourcePackHost() instanceof NoneHost)) {
if (Config.sendPackOnJoin() && VersionHelper.isOrAbove1_20_2() && !(resourcePackHost() instanceof NoneHost)) {
this.modifyServerSettings();
}
}
@@ -69,7 +69,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener {
Object settings = Reflections.field$DedicatedServer$settings.get(Reflections.method$MinecraftServer$getServer.invoke(null));
Object properties = Reflections.field$DedicatedServerSettings$properties.get(settings);
Object info;
if (VersionHelper.isVersionNewerThan1_20_3()) {
if (VersionHelper.isOrAbove1_20_3()) {
info = Reflections.constructor$ServerResourcePackInfo.newInstance(new UUID(0, 0), FAKE_URL, "", Config.kickOnDeclined(), ComponentUtils.adventureToMinecraft(Config.resourcePackPrompt()));
} else {
info = Reflections.constructor$ServerResourcePackInfo.newInstance(FAKE_URL, "", Config.kickOnDeclined(), ComponentUtils.adventureToMinecraft(Config.resourcePackPrompt()));
@@ -84,7 +84,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener {
public void unload() {
super.unload();
if (ReloadCommand.RELOAD_PACK_FLAG) {
if (VersionHelper.isVersionNewerThan1_20_2()) {
if (VersionHelper.isOrAbove1_20_2()) {
this.resetServerSettings();
}
}

View File

@@ -43,7 +43,7 @@ public class BukkitGuiManager implements GuiManager, Listener {
if (VersionHelper.isFolia()) {
for (Player player : Bukkit.getOnlinePlayers()) {
this.plugin.scheduler().sync().run(() -> {
org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
org.bukkit.inventory.Inventory top = !VersionHelper.isOrAbove1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
if (top.getHolder() instanceof CraftEngineInventoryHolder holder) {
holder.gui().onTimer();
}
@@ -51,7 +51,7 @@ public class BukkitGuiManager implements GuiManager, Listener {
}
} else {
for (Player player : Bukkit.getOnlinePlayers()) {
org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
org.bukkit.inventory.Inventory top = !VersionHelper.isOrAbove1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
if (top.getHolder() instanceof CraftEngineInventoryHolder holder) {
holder.gui().onTimer();
}

View File

@@ -318,11 +318,11 @@ public class BukkitInjector {
.intercept(FieldAccessor.ofField("lastCustomRecipe"))
.method(ElementMatchers.named("getRecipeFor").or(ElementMatchers.named("a")))
.intercept(MethodDelegation.to(
VersionHelper.isVersionNewerThan1_21_2() ?
VersionHelper.isOrAbove1_21_2() ?
GetRecipeForMethodInterceptor1_21_2.INSTANCE :
(VersionHelper.isVersionNewerThan1_21() ?
(VersionHelper.isOrAbove1_21() ?
GetRecipeForMethodInterceptor1_21.INSTANCE :
VersionHelper.isVersionNewerThan1_20_5() ?
VersionHelper.isOrAbove1_20_5() ?
GetRecipeForMethodInterceptor1_20_5.INSTANCE :
GetRecipeForMethodInterceptor1_20.INSTANCE)
))
@@ -346,7 +346,7 @@ public class BukkitInjector {
InjectedCacheCheck injectedChecker = (InjectedCacheCheck) Reflections.UNSAFE.allocateInstance(clazz$InjectedCacheChecker);
injectedChecker.recipeType(recipeType);
Reflections.field$AbstractFurnaceBlockEntity$quickCheck.set(entity, injectedChecker);
} else if (!VersionHelper.isVersionNewerThan1_21_2() && Reflections.clazz$CampfireBlockEntity.isInstance(entity)) {
} else if (!VersionHelper.isOrAbove1_21_2() && Reflections.clazz$CampfireBlockEntity.isInstance(entity)) {
Object quickCheck = Reflections.field$CampfireBlockEntity$quickCheck.get(entity);
if (clazz$InjectedCacheChecker.isInstance(quickCheck)) return; // already injected
InjectedCacheCheck injectedChecker = (InjectedCacheCheck) Reflections.UNSAFE.allocateInstance(clazz$InjectedCacheChecker);
@@ -749,7 +749,7 @@ public class BukkitInjector {
Object direction;
Object serverLevel;
Object blockPos;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
direction = args[4];
serverLevel = args[1];
blockPos = args[3];

View File

@@ -121,7 +121,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
}
private PacketIds setupPacketIds() {
if (VersionHelper.isVersionNewerThan1_20_5()) {
if (VersionHelper.isOrAbove1_20_5()) {
return new PacketIds1_20_5();
} else {
return new PacketIds1_20();
@@ -154,18 +154,18 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerByteBufPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, this.packetIds.clientboundLevelChunkWithLightPacket());
registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket());
registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_21_3() ? PacketConsumers.LEVEL_PARTICLE_1_21_3 : (VersionHelper.isVersionNewerThan1_20_5() ? PacketConsumers.LEVEL_PARTICLE_1_20_5 : PacketConsumers.LEVEL_PARTICLE_1_20), this.packetIds.clientboundLevelParticlesPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_21_3() ? PacketConsumers.LEVEL_PARTICLE_1_21_3 : (VersionHelper.isOrAbove1_20_5() ? PacketConsumers.LEVEL_PARTICLE_1_20_5 : PacketConsumers.LEVEL_PARTICLE_1_20), this.packetIds.clientboundLevelParticlesPacket());
registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_SUBTITLE_TEXT_1_20_3 : PacketConsumers.SET_SUBTITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_ACTIONBAR_TEXT_1_20_3 : PacketConsumers.SET_ACTIONBAR_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TEAM_1_20_3 : PacketConsumers.TEAM_1_20, this.packetIds.clientboundSetPlayerTeamPacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_OBJECTIVE_1_20_3 : PacketConsumers.SET_OBJECTIVE_1_20, this.packetIds.clientboundSetObjectivePacket());
registerByteBufPacketConsumer(PacketConsumers.SET_SCORE_1_20_3, VersionHelper.isVersionNewerThan1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1);
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_SUBTITLE_TEXT_1_20_3 : PacketConsumers.SET_SUBTITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_ACTIONBAR_TEXT_1_20_3 : PacketConsumers.SET_ACTIONBAR_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.TEAM_1_20_3 : PacketConsumers.TEAM_1_20, this.packetIds.clientboundSetPlayerTeamPacket());
registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_OBJECTIVE_1_20_3 : PacketConsumers.SET_OBJECTIVE_1_20, this.packetIds.clientboundSetObjectivePacket());
registerByteBufPacketConsumer(PacketConsumers.SET_SCORE_1_20_3, VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1);
registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket());
registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket());
registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket());

View File

@@ -43,7 +43,6 @@ import net.momirealms.craftengine.core.world.chunk.PalettedContainer;
import net.momirealms.craftengine.core.world.chunk.packet.BlockEntityData;
import net.momirealms.craftengine.core.world.chunk.packet.MCSection;
import net.momirealms.craftengine.core.world.collision.AABB;
import net.momirealms.sparrow.nbt.NBT;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.*;
import org.bukkit.block.Block;
@@ -98,16 +97,15 @@ public class PacketConsumers {
try {
BukkitServerPlayer player = (BukkitServerPlayer) user;
FriendlyByteBuf buf = event.getBuffer();
// 这里是正片
int chunkX = buf.readInt();
int chunkZ = buf.readInt();
boolean named = !VersionHelper.isVersionNewerThan1_20_2();
boolean named = !VersionHelper.isOrAbove1_20_2();
// ClientboundLevelChunkPacketData
int heightmapsCount = 0;
Map<Integer, long[]> heightmapsMap = new HashMap<>();
Map<Integer, long[]> heightmapsMap = null;
Tag heightmaps = null;
if (VersionHelper.isVersionNewerThan1_21_5()) {
if (VersionHelper.isOrAbove1_21_5()) {
heightmapsMap = new HashMap<>();
heightmapsCount = buf.readVarInt();
for (int i = 0; i < heightmapsCount; i++) {
int key = buf.readVarInt();
@@ -198,8 +196,9 @@ public class PacketConsumers {
buf.writeVarInt(event.packetID());
buf.writeInt(chunkX);
buf.writeInt(chunkZ);
if (VersionHelper.isVersionNewerThan1_21_5()) {
if (VersionHelper.isOrAbove1_21_5()) {
buf.writeVarInt(heightmapsCount);
assert heightmapsMap != null;
for (Map.Entry<Integer, long[]> entry : heightmapsMap.entrySet()) {
buf.writeVarInt(entry.getKey());
buf.writeLongArray(entry.getValue());
@@ -1239,7 +1238,7 @@ public class PacketConsumers {
BukkitServerPlayer player = (BukkitServerPlayer) user;
String name = (String) Reflections.field$ServerboundHelloPacket$name.get(packet);
player.setName(name);
if (VersionHelper.isVersionNewerThan1_20_2()) {
if (VersionHelper.isOrAbove1_20_2()) {
UUID uuid = (UUID) Reflections.field$ServerboundHelloPacket$uuid.get(packet);
player.setUUID(uuid);
} else {
@@ -1287,7 +1286,7 @@ public class PacketConsumers {
BukkitServerPlayer player = (BukkitServerPlayer) user;
player.clearView();
Object dimensionKey;
if (!VersionHelper.isVersionNewerThan1_20_2()) {
if (!VersionHelper.isOrAbove1_20_2()) {
dimensionKey = Reflections.field$ClientboundRespawnPacket$dimension.get(packet);
} else {
Object commonInfo = Reflections.field$ClientboundRespawnPacket$commonPlayerSpawnInfo.get(packet);
@@ -1312,7 +1311,7 @@ public class PacketConsumers {
BukkitServerPlayer player = (BukkitServerPlayer) user;
player.setConnectionState(ConnectionState.PLAY);
Object dimensionKey;
if (!VersionHelper.isVersionNewerThan1_20_2()) {
if (!VersionHelper.isOrAbove1_20_2()) {
if (BukkitNetworkManager.hasViaVersion()) {
user.setProtocolVersion(CraftEngine.instance().compatibilityManager().getPlayerProtocolVersion(player.uuid()));
}
@@ -1340,7 +1339,7 @@ public class PacketConsumers {
// When the hotbar is full, the latest creative mode inventory can only be accessed when the player opens the inventory screen. Currently, it is not worth further handling this issue.
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SET_CREATIVE_SLOT = (user, event, packet) -> {
try {
if (VersionHelper.isVersionNewerThan1_21_4()) return;
if (VersionHelper.isOrAbove1_21_4()) return;
if (!user.isOnline()) return;
BukkitServerPlayer player = (BukkitServerPlayer) user;
if (VersionHelper.isFolia()) {
@@ -1363,7 +1362,7 @@ public class PacketConsumers {
Player bukkitPlayer = player.platformPlayer();
if (bukkitPlayer == null) return;
if (bukkitPlayer.getGameMode() != GameMode.CREATIVE) return;
int slot = VersionHelper.isVersionNewerThan1_20_5() ? Reflections.field$ServerboundSetCreativeModeSlotPacket$slotNum.getShort(packet) : Reflections.field$ServerboundSetCreativeModeSlotPacket$slotNum.getInt(packet);
int slot = VersionHelper.isOrAbove1_20_5() ? Reflections.field$ServerboundSetCreativeModeSlotPacket$slotNum.getShort(packet) : Reflections.field$ServerboundSetCreativeModeSlotPacket$slotNum.getInt(packet);
if (slot < 36 || slot > 44) return;
ItemStack item = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(Reflections.field$ServerboundSetCreativeModeSlotPacket$itemStack.get(packet));
if (ItemUtils.isEmpty(item)) return;
@@ -1935,7 +1934,7 @@ public class PacketConsumers {
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> CUSTOM_PAYLOAD = (user, event, packet) -> {
try {
if (!VersionHelper.isVersionNewerThan1_20_5()) return;
if (!VersionHelper.isOrAbove1_20_5()) return;
Object payload = Reflections.field$ServerboundCustomPayloadPacket$payload.get(packet);
if (payload.getClass().equals(Reflections.clazz$DiscardedPayload)) {
Object type = Reflections.method$CustomPacketPayload$type.invoke(payload);
@@ -2217,7 +2216,7 @@ public class PacketConsumers {
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> RESOURCE_PACK_PUSH = (user, event, packet) -> {
try {
if (!VersionHelper.isVersionNewerThan1_20_2()) return;
if (!VersionHelper.isOrAbove1_20_2()) return;
// we should only handle fake urls
String url = FastNMS.INSTANCE.field$ClientboundResourcePackPushPacket$url(packet);
if (!url.equals(BukkitPackManager.FAKE_URL)) {

View File

@@ -15,7 +15,7 @@ public class PacketIdFinder {
static {
try {
if (VersionHelper.isVersionNewerThan1_21()) {
if (VersionHelper.isOrAbove1_21()) {
Object packetReport = Reflections.constructor$PacketReport.newInstance((Object) null);
JsonElement jsonElement = (JsonElement) Reflections.method$PacketReport$serializePackets.invoke(packetReport);
var play = jsonElement.getAsJsonObject().get("play");
@@ -26,7 +26,7 @@ public class PacketIdFinder {
ids.put(entry2.getKey(), entry2.getValue().getAsJsonObject().get("protocol_id").getAsInt());
}
}
} else if (VersionHelper.isVersionNewerThan1_20_5()) {
} else if (VersionHelper.isOrAbove1_20_5()) {
gamePacketIdsByName.putAll(FastNMS.INSTANCE.method$getGamePacketIdsByName());
} else {
gamePacketIdsByClazz.putAll(FastNMS.INSTANCE.method$getGamePacketIdsByClazz());

View File

@@ -415,7 +415,7 @@ public class BukkitServerPlayer extends Player {
}
this.clientSideCanBreak = canBreak;
if (canBreak) {
if (VersionHelper.isVersionNewerThan1_20_5()) {
if (VersionHelper.isOrAbove1_20_5()) {
Object serverPlayer = serverPlayer();
Object attributeInstance = Reflections.method$ServerPlayer$getAttribute.invoke(serverPlayer, Reflections.instance$Holder$Attribute$block_break_speed);
Object newPacket = Reflections.constructor$ClientboundUpdateAttributesPacket0.newInstance(entityID(), Lists.newArrayList(attributeInstance));
@@ -425,8 +425,8 @@ public class BukkitServerPlayer extends Player {
resetEffect(Reflections.instance$MobEffecr$haste);
}
} else {
if (VersionHelper.isVersionNewerThan1_20_5()) {
Object attributeModifier = VersionHelper.isVersionNewerThan1_21() ?
if (VersionHelper.isOrAbove1_20_5()) {
Object attributeModifier = VersionHelper.isOrAbove1_21() ?
Reflections.constructor$AttributeModifier.newInstance(KeyUtils.toResourceLocation("craftengine", "custom_hardness"), -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE) :
Reflections.constructor$AttributeModifier.newInstance(UUID.randomUUID(), "craftengine:custom_hardness", -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE);
Object attributeSnapshot = Reflections.constructor$ClientboundUpdateAttributesPacket$AttributeSnapshot.newInstance(Reflections.instance$Holder$Attribute$block_break_speed, 1d, Lists.newArrayList(attributeModifier));
@@ -520,7 +520,7 @@ public class BukkitServerPlayer extends Player {
// creative mode + invalid item in hand
if (canInstabuild() && (itemMaterial == Material.DEBUG_STICK
|| itemMaterial == Material.TRIDENT
|| (VersionHelper.isVersionNewerThan1_20_5() && itemMaterial == MaterialUtils.MACE)
|| (VersionHelper.isOrAbove1_20_5() && itemMaterial == MaterialUtils.MACE)
|| item.is(ItemTags.SWORDS))) {
return;
}
@@ -757,7 +757,7 @@ public class BukkitServerPlayer extends Player {
@Override
public void addResourcePackUUID(UUID uuid) {
if (VersionHelper.isVersionNewerThan1_20_3()) {
if (VersionHelper.isOrAbove1_20_3()) {
this.resourcePackUUID.add(uuid);
}
}
@@ -790,7 +790,7 @@ public class BukkitServerPlayer extends Player {
@Override
public void unloadCurrentResourcePack() {
if (!VersionHelper.isVersionNewerThan1_20_3()) {
if (!VersionHelper.isOrAbove1_20_3()) {
return;
}
if (decoderState() == ConnectionState.PLAY && !this.resourcePackUUID.isEmpty()) {

View File

@@ -33,7 +33,7 @@ public class BukkitSoundManager extends AbstractSoundManager {
Object soundId = KeyUtils.toResourceLocation(jukeboxSong.sound());
Object song = Reflections.method$Registry$get.invoke(Reflections.instance$InternalRegistries$JUKEBOX_SONG, resourceLocation);
Object soundEvent = VersionHelper.isVersionNewerThan1_21_2() ?
Object soundEvent = VersionHelper.isOrAbove1_21_2() ?
Reflections.constructor$SoundEvent.newInstance(soundId, Optional.of(jukeboxSong.range())) :
Reflections.constructor$SoundEvent.newInstance(soundId, jukeboxSong.range(), false);
Object soundHolder = Reflections.method$Holder$direct.invoke(null, soundEvent);

View File

@@ -11,8 +11,8 @@ public class EntityDataUtils {
private static final int USE_DEFAULT_BACKGROUND = 0x04; // 4
private static final int LEFT_ALIGNMENT = 0x08; // 8
private static final int RIGHT_ALIGNMENT = 0x10; // 16
public static final int BLOCK_STATE_DATA_ID = VersionHelper.isVersionNewerThan1_20_2() ? 23 : 22;
public static final int TEXT_DATA_ID = VersionHelper.isVersionNewerThan1_20_2() ? 23 : 22;
public static final int BLOCK_STATE_DATA_ID = VersionHelper.isOrAbove1_20_2() ? 23 : 22;
public static final int TEXT_DATA_ID = VersionHelper.isOrAbove1_20_2() ? 23 : 22;
public static final int CUSTOM_NAME_DATA_ID = 2;
public static byte encodeTextDisplayMask(boolean hasShadow, boolean isSeeThrough, boolean useDefaultBackground, int alignment) {

View File

@@ -27,7 +27,7 @@ public class EntityUtils {
}
public static Entity spawnEntity(World world, Location loc, EntityType type, Consumer<Entity> function) {
if (VersionHelper.isVersionNewerThan1_20_2()) {
if (VersionHelper.isOrAbove1_20_2()) {
return world.spawnEntity(loc, type, CreatureSpawnEvent.SpawnReason.CUSTOM, function);
} else {
return LegacyEntityUtils.spawnEntity(world, loc, type, function);

View File

@@ -15,9 +15,9 @@ public class RecipeUtils {
public static List<Object> getIngredientsFromShapedRecipe(Object recipe) {
List<Object> ingredients = new ArrayList<>();
try {
if (VersionHelper.isVersionNewerThan1_20_3()) {
if (VersionHelper.isOrAbove1_20_3()) {
Object pattern = Reflections.field$1_20_3$ShapedRecipe$pattern.get(recipe);
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
List<Optional<Object>> optionals = (List<Optional<Object>>) Reflections.field$ShapedRecipePattern$ingredients1_21_2.get(pattern);
for (Optional<Object> optional : optionals) {
optional.ifPresent(ingredients::add);

View File

@@ -341,7 +341,7 @@ public class Reflections {
);
public static final Constructor<?> constructor$SoundEvent = requireNonNull(
VersionHelper.isVersionNewerThan1_21_2() ?
VersionHelper.isOrAbove1_21_2() ?
ReflectionUtils.getConstructor(
clazz$SoundEvent, clazz$ResourceLocation, Optional.class
) :
@@ -377,7 +377,7 @@ public class Reflections {
public static final Object instance$MinecraftRegistry;
static {
if (VersionHelper.isVersionNewerThan1_20()) {
if (VersionHelper.isOrAbove1_20()) {
try {
Method method = requireNonNull(ReflectionUtils.getMethod(clazz$CraftRegistry, new String[]{"getMinecraftRegistry"}));
instance$MinecraftRegistry = method.invoke(null);
@@ -460,7 +460,7 @@ public class Reflections {
);
public static final Field field$ServerCommonPacketListenerImpl$connection = requireNonNull(
VersionHelper.isVersionNewerThan1_20_2() ?
VersionHelper.isOrAbove1_20_2() ?
ReflectionUtils.getDeclaredField(
clazz$ServerCommonPacketListenerImpl, clazz$Connection, 0
) :
@@ -493,7 +493,7 @@ public class Reflections {
);
public static final Method method$Connection$sendPacketImmediate = requireNonNull(
VersionHelper.isVersionNewerThan1_20_2() ?
VersionHelper.isOrAbove1_20_2() ?
ReflectionUtils.getDeclaredMethod(
clazz$Connection, void.class, new String[] {"sendPacket", "b"}, clazz$Packet, clazz$PacketSendListener, boolean.class
) :
@@ -885,10 +885,10 @@ public class Reflections {
}
public static final Constructor<?> constructor$AttributeModifier = requireNonNull(
!VersionHelper.isVersionNewerThan1_20_5() ?
!VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getConstructor(clazz$AttributeModifier, String.class, double.class, clazz$AttributeModifier$Operation):
(
!VersionHelper.isVersionNewerThan1_21() ?
!VersionHelper.isOrAbove1_21() ?
ReflectionUtils.getConstructor(clazz$AttributeModifier, UUID.class, String.class, double.class, clazz$AttributeModifier$Operation) :
(
ReflectionUtils.getConstructor(clazz$AttributeModifier, clazz$ResourceLocation, double.class, clazz$AttributeModifier$Operation)
@@ -981,7 +981,7 @@ public class Reflections {
);
public static final Constructor<?> constructor$ClientboundUpdateAttributesPacket$AttributeSnapshot = requireNonNull(
VersionHelper.isVersionNewerThan1_20_5() ?
VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getConstructor(
clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, clazz$Holder, double.class, Collection.class
) :
@@ -1290,7 +1290,7 @@ public class Reflections {
public static final Field field$ClientboundSetPlayerTeamPacket$Parameters$nametagVisibility = requireNonNull(
ReflectionUtils.getInstanceDeclaredField(
clazz$ClientboundSetPlayerTeamPacket$Parameters,
VersionHelper.isVersionNewerThan1_21_5() ? clazz$Team$Visibility : String.class,
VersionHelper.isOrAbove1_21_5() ? clazz$Team$Visibility : String.class,
0
)
);
@@ -2158,7 +2158,7 @@ public class Reflections {
registries$Item = field.get(null);
} else if (type == clazz$Fluid) {
registries$Fluid = field.get(null);
} else if (VersionHelper.isVersionNewerThan1_21() && type == clazz$JukeboxSong) {
} else if (VersionHelper.isOrAbove1_21() && type == clazz$JukeboxSong) {
registries$JukeboxSong = field.get(null);
}
}
@@ -2586,7 +2586,7 @@ public class Reflections {
);
public static final Constructor<?> constructor$ClientboundLevelParticlesPacket = requireNonNull(
VersionHelper.isVersionNewerThan1_20_5() ?
VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getDeclaredConstructor(clazz$ClientboundLevelParticlesPacket, clazz$RegistryFriendlyByteBuf) :
ReflectionUtils.getConstructor(clazz$ClientboundLevelParticlesPacket, clazz$FriendlyByteBuf)
);
@@ -2821,7 +2821,7 @@ public class Reflections {
}
public static final Method method$ChunkHolder$sectionLightChanged = requireNonNull(
VersionHelper.isVersionNewerThan1_21_2() ?
VersionHelper.isOrAbove1_21_2() ?
ReflectionUtils.getMethod(clazz$ChunkHolder, boolean.class, clazz$LightLayer, int.class) :
ReflectionUtils.getMethod(clazz$ChunkHolder, void.class, clazz$LightLayer, int.class)
);
@@ -2881,18 +2881,18 @@ public class Reflections {
static {
try {
if (VersionHelper.isVersionNewerThan1_20_5()) {
Object block_break_speed = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", VersionHelper.isVersionNewerThan1_21_2() ? "block_break_speed" : "player.block_break_speed");
if (VersionHelper.isOrAbove1_20_5()) {
Object block_break_speed = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", VersionHelper.isOrAbove1_21_2() ? "block_break_speed" : "player.block_break_speed");
@SuppressWarnings("unchecked")
Optional<Object> breakSpeedHolder = (Optional<Object>) method$Registry$getHolder0.invoke(instance$BuiltInRegistries$ATTRIBUTE, block_break_speed);
instance$Holder$Attribute$block_break_speed = breakSpeedHolder.orElse(null);
Object block_interaction_range = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", VersionHelper.isVersionNewerThan1_21_2() ? "block_interaction_range" : "player.block_interaction_range");
Object block_interaction_range = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", VersionHelper.isOrAbove1_21_2() ? "block_interaction_range" : "player.block_interaction_range");
@SuppressWarnings("unchecked")
Optional<Object> blockInteractionRangeHolder = (Optional<Object>) method$Registry$getHolder0.invoke(instance$BuiltInRegistries$ATTRIBUTE, block_interaction_range);
instance$Holder$Attribute$block_interaction_range = blockInteractionRangeHolder.orElse(null);
Object scale = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", VersionHelper.isVersionNewerThan1_21_2() ? "scale" : "generic.scale");
Object scale = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", VersionHelper.isOrAbove1_21_2() ? "scale" : "generic.scale");
@SuppressWarnings("unchecked")
Optional<Object> scaleHolder = (Optional<Object>) method$Registry$getHolder0.invoke(instance$BuiltInRegistries$ATTRIBUTE, scale);
instance$Holder$Attribute$scale = scaleHolder.orElse(null);
@@ -2907,7 +2907,7 @@ public class Reflections {
}
public static final Method method$ServerPlayer$getAttribute = requireNonNull(
VersionHelper.isVersionNewerThan1_20_5() ?
VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, clazz$Holder) :
ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, clazz$Attribute)
);
@@ -3271,7 +3271,7 @@ public class Reflections {
);
public static final Constructor<?> constructor$ClientboundUpdateMobEffectPacket = requireNonNull(
!VersionHelper.isVersionNewerThan1_20_5() ?
!VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getConstructor(
clazz$ClientboundUpdateMobEffectPacket, int.class, clazz$MobEffectInstance
) :
@@ -3287,7 +3287,7 @@ public class Reflections {
);
public static final Field field$ClientboundUpdateMobEffectPacket$effect = requireNonNull(
!VersionHelper.isVersionNewerThan1_20_5() ?
!VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getInstanceDeclaredField(
clazz$ClientboundUpdateMobEffectPacket, clazz$MobEffect, 0
) :
@@ -3297,7 +3297,7 @@ public class Reflections {
);
public static final Field field$ClientboundUpdateMobEffectPacket$amplifier = requireNonNull(
!VersionHelper.isVersionNewerThan1_20_5() ?
!VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getInstanceDeclaredField(
clazz$ClientboundUpdateMobEffectPacket, byte.class, 0
) :
@@ -3307,7 +3307,7 @@ public class Reflections {
);
public static final Field field$ClientboundUpdateMobEffectPacket$duration = requireNonNull(
!VersionHelper.isVersionNewerThan1_20_5() ?
!VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getInstanceDeclaredField(
clazz$ClientboundUpdateMobEffectPacket, int.class, 1
) :
@@ -3317,7 +3317,7 @@ public class Reflections {
);
public static final Field field$ClientboundUpdateMobEffectPacket$flags = requireNonNull(
!VersionHelper.isVersionNewerThan1_20_5() ?
!VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getInstanceDeclaredField(
clazz$ClientboundUpdateMobEffectPacket, byte.class, 1
) :
@@ -3327,7 +3327,7 @@ public class Reflections {
);
public static final Method method$ServerPlayer$getEffect = requireNonNull(
!VersionHelper.isVersionNewerThan1_20_5() ?
!VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getMethod(
clazz$ServerPlayer, clazz$MobEffectInstance, clazz$MobEffect
) :
@@ -3371,7 +3371,7 @@ public class Reflections {
);
public static final Field field$ServerboundSetCreativeModeSlotPacket$slotNum = requireNonNull(
VersionHelper.isVersionNewerThan1_20_5() ?
VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getDeclaredField(
clazz$ServerboundSetCreativeModeSlotPacket, short.class, 0
) :
@@ -3483,7 +3483,7 @@ public class Reflections {
);
public static final Method method$BlockBehaviour$updateShape = requireNonNull(
VersionHelper.isVersionNewerThan1_21_2() ?
VersionHelper.isOrAbove1_21_2() ?
ReflectionUtils.getDeclaredMethod(
clazz$BlockBehaviour, clazz$BlockState, clazz$BlockState, clazz$LevelReader, clazz$ScheduledTickAccess, clazz$BlockPos, clazz$Direction, clazz$BlockPos, clazz$BlockState, clazz$RandomSource
) :
@@ -3742,7 +3742,7 @@ public class Reflections {
// 1.20.2+
public static final Field field$CommonPlayerSpawnInfo$dimension = Optional.ofNullable(clazz$CommonPlayerSpawnInfo)
.map(it -> {
if (VersionHelper.isVersionNewerThan1_20_5()) {
if (VersionHelper.isOrAbove1_20_5()) {
return ReflectionUtils.getDeclaredField(it, clazz$ResourceKey, 0);
} else {
return ReflectionUtils.getDeclaredField(it, clazz$ResourceKey, 1);
@@ -3791,7 +3791,7 @@ public class Reflections {
instance$EntityType$SHULKER = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, shulker);
Object armorStand = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", "armor_stand");
instance$EntityType$ARMOR_STAND = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, armorStand);
Object oakBoat = VersionHelper.isVersionNewerThan1_21_2() ? FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", "oak_boat") : FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", "boat");
Object oakBoat = VersionHelper.isOrAbove1_21_2() ? FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", "oak_boat") : FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", "boat");
instance$EntityType$OAK_BOAT = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, oakBoat);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
@@ -4077,7 +4077,7 @@ public class Reflections {
);
public static final Method method$CraftEventFactory$callBlockPlaceEvent = requireNonNull(
VersionHelper.isVersionNewerThan1_21_5()
VersionHelper.isOrAbove1_21_5()
? ReflectionUtils.getStaticMethod(clazz$CraftEventFactory, BlockPlaceEvent.class, clazz$ServerLevel, clazz$Player, clazz$InteractionHand, BlockState.class, clazz$BlockPos)
: ReflectionUtils.getStaticMethod(clazz$CraftEventFactory, BlockPlaceEvent.class, clazz$ServerLevel, clazz$Player, clazz$InteractionHand, BlockState.class, int.class, int.class, int.class)
);
@@ -4602,7 +4602,7 @@ public class Reflections {
static {
Method method$RecipeManager$byKey0 = null;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
for (Method method : clazz$RecipeManager.getMethods()) {
if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceKey) {
if (method.getReturnType() == Optional.class && method.getGenericReturnType() instanceof ParameterizedType type) {
@@ -4613,7 +4613,7 @@ public class Reflections {
}
}
}
} else if (VersionHelper.isVersionNewerThan1_20_2()) {
} else if (VersionHelper.isOrAbove1_20_2()) {
for (Method method : clazz$RecipeManager.getMethods()) {
if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceLocation) {
if (method.getReturnType() == Optional.class && method.getGenericReturnType() instanceof ParameterizedType type) {
@@ -4924,7 +4924,7 @@ public class Reflections {
);
public static final Method method$BonemealableBlock$isValidBonemealTarget = requireNonNull(
VersionHelper.isVersionNewerThan1_20_2() ?
VersionHelper.isOrAbove1_20_2() ?
ReflectionUtils.getMethod(
clazz$BonemealableBlock, boolean.class, clazz$LevelReader, clazz$BlockPos, clazz$BlockState
) :
@@ -4977,7 +4977,7 @@ public class Reflections {
);
public static final Method method$ServerLevel$levelEvent = requireNonNull(
VersionHelper.isVersionNewerThan1_21_5()
VersionHelper.isOrAbove1_21_5()
? ReflectionUtils.getMethod(clazz$ServerLevel, void.class, clazz$Entity, int.class, clazz$BlockPos, int.class)
: ReflectionUtils.getMethod(clazz$ServerLevel, void.class, clazz$Player, int.class, clazz$BlockPos, int.class)
);
@@ -5110,11 +5110,11 @@ public class Reflections {
);
public static final Constructor<?> constructor$ClientboundResourcePackPushPacket = requireNonNull(
VersionHelper.isVersionNewerThan1_20_5() ?
VersionHelper.isOrAbove1_20_5() ?
ReflectionUtils.getConstructor(
clazz$ClientboundResourcePackPushPacket, UUID.class, String.class, String.class, boolean.class, Optional.class
) :
VersionHelper.isVersionNewerThan1_20_3() ?
VersionHelper.isOrAbove1_20_3() ?
ReflectionUtils.getConstructor(
clazz$ClientboundResourcePackPushPacket, UUID.class, String.class, String.class, boolean.class, clazz$Component
) :
@@ -5276,17 +5276,17 @@ public class Reflections {
.orElse(null);
public static final Constructor<?> constructor$SmithingTransformRecipe = requireNonNull(
VersionHelper.isVersionNewerThan1_21_5()
VersionHelper.isOrAbove1_21_5()
? ReflectionUtils.getConstructor(clazz$SmithingTransformRecipe, Optional.class, clazz$Ingredient, Optional.class, clazz$TransmuteResult)
: VersionHelper.isVersionNewerThan1_21_2()
: VersionHelper.isOrAbove1_21_2()
? ReflectionUtils.getConstructor(clazz$SmithingTransformRecipe, Optional.class, Optional.class, Optional.class, clazz$ItemStack)
: VersionHelper.isVersionNewerThan1_20_2()
: VersionHelper.isOrAbove1_20_2()
? ReflectionUtils.getConstructor(clazz$SmithingTransformRecipe, clazz$Ingredient, clazz$Ingredient, clazz$Ingredient, clazz$ItemStack)
: ReflectionUtils.getConstructor(clazz$SmithingTransformRecipe, clazz$ResourceLocation, clazz$Ingredient, clazz$Ingredient, clazz$Ingredient, clazz$ItemStack)
);
public static final Method method$RecipeManager$addRecipe = requireNonNull(
VersionHelper.isVersionNewerThan1_20_2() ?
VersionHelper.isOrAbove1_20_2() ?
ReflectionUtils.getMethod(clazz$RecipeManager, void.class, clazz$RecipeHolder) :
ReflectionUtils.getMethod(clazz$RecipeManager, void.class, clazz$Recipe)
);
@@ -5588,9 +5588,9 @@ public class Reflections {
);
public static final Method method$SimpleWaterloggedBlock$canPlaceLiquid = requireNonNull(
VersionHelper.isVersionNewerThan1_21_5()
VersionHelper.isOrAbove1_21_5()
? ReflectionUtils.getMethod(clazz$SimpleWaterloggedBlock, boolean.class, clazz$LivingEntity, clazz$BlockGetter, clazz$BlockPos, clazz$BlockState, clazz$Fluid)
: VersionHelper.isVersionNewerThan1_20_2()
: VersionHelper.isOrAbove1_20_2()
? ReflectionUtils.getMethod(clazz$SimpleWaterloggedBlock, boolean.class, clazz$Player, clazz$BlockGetter, clazz$BlockPos, clazz$BlockState, clazz$Fluid)
: ReflectionUtils.getMethod(clazz$SimpleWaterloggedBlock, boolean.class, clazz$BlockGetter, clazz$BlockPos, clazz$BlockState, clazz$Fluid)
);
@@ -5602,9 +5602,9 @@ public class Reflections {
);
public static final Method method$SimpleWaterloggedBlock$pickupBlock = requireNonNull(
VersionHelper.isVersionNewerThan1_21_5()
VersionHelper.isOrAbove1_21_5()
? ReflectionUtils.getMethod(clazz$SimpleWaterloggedBlock, clazz$ItemStack, clazz$LivingEntity, clazz$LevelAccessor, clazz$BlockPos, clazz$BlockState)
: VersionHelper.isVersionNewerThan1_20_2()
: VersionHelper.isOrAbove1_20_2()
? ReflectionUtils.getMethod(clazz$SimpleWaterloggedBlock, clazz$ItemStack, clazz$Player, clazz$LevelAccessor, clazz$BlockPos, clazz$BlockState)
: ReflectionUtils.getMethod(clazz$SimpleWaterloggedBlock, clazz$ItemStack, clazz$LevelAccessor, clazz$BlockPos, clazz$BlockState)
);
@@ -5797,7 +5797,7 @@ public class Reflections {
);
public static final Method method$BlockBehaviour$getDescriptionId = requireNonNull(
VersionHelper.isVersionNewerThan1_21_2()
VersionHelper.isOrAbove1_21_2()
? ReflectionUtils.getMethod(clazz$BlockBehaviour, String.class)
: ReflectionUtils.getMethod(clazz$Block, String.class)
);
@@ -5869,7 +5869,7 @@ public class Reflections {
);
public static final Method method$CraftEventFactory$handleBlockGrowEvent = requireNonNull(
VersionHelper.isVersionNewerThan1_21_5() ?
VersionHelper.isOrAbove1_21_5() ?
ReflectionUtils.getStaticMethod(
clazz$CraftEventFactory, boolean.class, clazz$Level, clazz$BlockPos, clazz$BlockState, int.class
) :
@@ -5967,7 +5967,7 @@ public class Reflections {
instance$Pose$SNIFFING = instance$Poses[12];
instance$Pose$EMERGING = instance$Poses[13];
instance$Pose$DIGGING = instance$Poses[14];
if (VersionHelper.isVersionNewerThan1_20_3()) {
if (VersionHelper.isOrAbove1_20_3()) {
instance$Pose$SLIDING = instance$Poses[15];
instance$Pose$SHOOTING = instance$Poses[16];
instance$Pose$INHALING = instance$Poses[17];
@@ -6019,13 +6019,13 @@ public class Reflections {
// );
public static final Method method$Entity$canBeCollidedWith = requireNonNull(
VersionHelper.isVersionNewerThan1_20_5()
VersionHelper.isOrAbove1_20_5()
? ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"canBeCollidedWith"})
: VersionHelper.isVersionNewerThan1_20_3()
: VersionHelper.isOrAbove1_20_3()
? ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"bz"})
: VersionHelper.isVersionNewerThan1_20_2()
: VersionHelper.isOrAbove1_20_2()
? ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"bx"})
: VersionHelper.isVersionNewerThan1_20()
: VersionHelper.isOrAbove1_20()
? ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"bu"})
: ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"canBeCollidedWith", "bu", "bx", "bz"})
);
@@ -6039,13 +6039,13 @@ public class Reflections {
@Deprecated
public static final Method method$Entity$getId = requireNonNull(
VersionHelper.isVersionNewerThan1_20_5()
VersionHelper.isOrAbove1_20_5()
? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"getId"})
: VersionHelper.isVersionNewerThan1_20_3()
: VersionHelper.isOrAbove1_20_3()
? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"aj"})
: VersionHelper.isVersionNewerThan1_20_2()
: VersionHelper.isOrAbove1_20_2()
? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"ah"})
: VersionHelper.isVersionNewerThan1_20()
: VersionHelper.isOrAbove1_20()
? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"af"})
: ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"getId", "aj", "ah", "af"})
);
@@ -6204,7 +6204,7 @@ public class Reflections {
public static final Method method$Level$moonrise$getEntityLookup = requireNonNull(
ReflectionUtils.getMethod(
VersionHelper.isVersionNewerThan1_21() ? clazz$Level : clazz$ServerLevel,
VersionHelper.isOrAbove1_21() ? clazz$Level : clazz$ServerLevel,
clazz$EntityLookup
)
);
@@ -6329,7 +6329,7 @@ public class Reflections {
// 1.21.2+
static {
try {
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
Object[] values = (Object[]) method$ParticleStatus$values.invoke(null);
instance$ParticleStatus$ALL = values[0];
instance$ParticleStatus$DECREASED = values[1];
@@ -6455,7 +6455,7 @@ public class Reflections {
);
public static final Field field$ServerboundHelloPacket$uuid = requireNonNull(
VersionHelper.isVersionNewerThan1_20_2() ?
VersionHelper.isOrAbove1_20_2() ?
ReflectionUtils.getDeclaredField(
clazz$ServerboundHelloPacket, UUID.class, 0
) :
@@ -6472,7 +6472,7 @@ public class Reflections {
public static final Field field$ClientboundResourcePackPushPacket$prompt = requireNonNull(
ReflectionUtils.getDeclaredField(
clazz$ClientboundResourcePackPushPacket,
VersionHelper.isVersionNewerThan1_20_5() ? Optional.class : clazz$Component,
VersionHelper.isOrAbove1_20_5() ? Optional.class : clazz$Component,
0
)
);
@@ -6515,7 +6515,7 @@ public class Reflections {
instance$ServerboundResourcePackPacket$Action$DECLINED = values[1];
instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD = values[2];
instance$ServerboundResourcePackPacket$Action$ACCEPTED = values[3];
if (VersionHelper.isVersionNewerThan1_20_3()) {
if (VersionHelper.isOrAbove1_20_3()) {
instance$ServerboundResourcePackPacket$Action$DOWNLOADED = values[4];
instance$ServerboundResourcePackPacket$Action$INVALID_URL = values[5];
instance$ServerboundResourcePackPacket$Action$FAILED_RELOAD = values[6];
@@ -6552,7 +6552,7 @@ public class Reflections {
public static final Field field$ClientIntentionPacket$protocolVersion = requireNonNull(
ReflectionUtils.getDeclaredField(
clazz$ClientIntentionPacket, int.class, VersionHelper.isVersionNewerThan1_20_2() ? 0 : 1
clazz$ClientIntentionPacket, int.class, VersionHelper.isOrAbove1_20_2() ? 0 : 1
)
);

View File

@@ -74,7 +74,7 @@ public class BukkitWorld implements World {
public void dropItemNaturally(Vec3d location, Item<?> item) {
ItemStack itemStack = (ItemStack) item.load();
if (ItemUtils.isEmpty(itemStack)) return;
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
platformWorld().dropItemNaturally(new Location(null, location.x(), location.y(), location.z()), (ItemStack) item.getItem());
} else {
platformWorld().dropItemNaturally(new Location(null, location.x() - 0.5, location.y() - 0.5, location.z() - 0.5), (ItemStack) item.getItem());

View File

@@ -229,7 +229,7 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
String pattern = data.get("pattern").toString().toLowerCase(Locale.ENGLISH);
return new TrimModifier<>(material, pattern);
}, "trim");
if (VersionHelper.isVersionNewerThan1_20_5()) {
if (VersionHelper.isOrAbove1_20_5()) {
registerDataFunction((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false);
return new ComponentModifier<>(data);
@@ -239,19 +239,19 @@ public abstract class AbstractItemManager<I> extends AbstractModelGenerator impl
return new RemoveComponentModifier<>(data);
}, "remove-components", "remove-component");
}
if (VersionHelper.isVersionNewerThan1_21()) {
if (VersionHelper.isOrAbove1_21()) {
registerDataFunction((obj) -> {
String song = obj.toString();
return new JukeboxSongModifier<>(new JukeboxPlayable(song, true));
}, "jukebox-playable");
}
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
registerDataFunction((obj) -> {
String id = obj.toString();
return new TooltipStyleModifier<>(Key.of(id));
}, "tooltip-style");
}
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
registerDataFunction((obj) -> {
Map<String, Object> data = MiscUtils.castToMap(obj, false);
return new EquippableModifier<>(EquipmentData.fromMap(data));

View File

@@ -104,7 +104,7 @@ public class EquipmentData {
map.put("dispensable", this.dispensable);
map.put("swappable", this.swappable);
map.put("damage_on_hurt", this.damageOnHurt);
if (VersionHelper.isVersionNewerThan1_21_5()) {
if (VersionHelper.isOrAbove1_21_5()) {
map.put("equip_on_interact", this.equipOnInteract);
}
if (this.cameraOverlay != null) {

View File

@@ -25,7 +25,7 @@ public class ItemSettings {
public <I> List<ItemDataModifier<I>> modifiers() {
ArrayList<ItemDataModifier<I>> modifiers = new ArrayList<>();
if (VersionHelper.isVersionNewerThan1_21_2() && this.equipment != null && this.equipment.modernData() != null) modifiers.add(new EquippableModifier<>(this.equipment.modernData()));
if (VersionHelper.isOrAbove1_21_2() && this.equipment != null && this.equipment.modernData() != null) modifiers.add(new EquippableModifier<>(this.equipment.modernData()));
// TODO 1.20 leather armor
return modifiers;
}
@@ -172,7 +172,7 @@ public class ItemSettings {
registerFactory("equippable", (value -> {
Map<String, Object> args = MiscUtils.castToMap(value, false);
EquipmentData data;
if (VersionHelper.isVersionNewerThan1_21_2() && args.containsKey("slot")) data = EquipmentData.fromMap(args);
if (VersionHelper.isOrAbove1_21_2() && args.containsKey("slot")) data = EquipmentData.fromMap(args);
else data = null;
EquipmentGeneration equipment = new EquipmentGeneration(
EquipmentGeneration.Layer.fromConfig(args.get("humanoid")),

View File

@@ -40,9 +40,9 @@ public abstract class AbstractRecipeManager<T> implements RecipeManager<T> {
}
private VanillaRecipeReader initVanillaRecipeReader() {
if (VersionHelper.isVersionNewerThan1_21_2()) {
if (VersionHelper.isOrAbove1_21_2()) {
return new VanillaRecipeReader1_21_2();
} else if (VersionHelper.isVersionNewerThan1_20_5()) {
} else if (VersionHelper.isOrAbove1_20_5()) {
return new VanillaRecipeReader1_20_5();
} else {
return new VanillaRecipeReader1_20();

View File

@@ -161,7 +161,7 @@ public class CustomSmithingTransformRecipe<T> implements Recipe<T> {
public static final Key KEEP_TAGS = Key.of("craftengine:keep_tags");
static {
if (VersionHelper.isVersionNewerThan1_20_5()) {
if (VersionHelper.isOrAbove1_20_5()) {
register(KEEP_COMPONENTS, KeepComponents.FACTORY);
} else {
register(KEEP_TAGS, KeepTags.FACTORY);

View File

@@ -47,7 +47,7 @@ public abstract class AbstractSoundManager implements SoundManager {
@Override
public void runDelayedSyncTasks() {
if (!VersionHelper.isVersionNewerThan1_21()) return;
if (!VersionHelper.isOrAbove1_21()) return;
this.registerSongs(this.songs);
}

View File

@@ -30,7 +30,7 @@ public class AdventureHelper {
this.miniMessageStrict = MiniMessage.builder().strict(true).build();
this.miniMessageCustom = MiniMessage.builder().tags(TagResolver.empty()).build();
GsonComponentSerializer.Builder builder = GsonComponentSerializer.builder();
if (!VersionHelper.isVersionNewerThan1_20_5()) {
if (!VersionHelper.isOrAbove1_20_5()) {
builder.legacyHoverEventSerializer(NBTLegacyHoverEventSerializer.get());
builder.editOptions((b) -> b.value(JSONOptions.EMIT_HOVER_SHOW_ENTITY_ID_AS_INT_ARRAY, false));
}

View File

@@ -6,12 +6,39 @@ public class VersionHelper {
private static boolean folia;
private static boolean paper;
private static boolean v1_20;
private static boolean v1_20_1;
private static boolean v1_20_2;
private static boolean v1_20_3;
private static boolean v1_20_4;
private static boolean v1_20_5;
private static boolean v1_20_6;
private static boolean v1_21;
private static boolean v1_21_1;
private static boolean v1_21_2;
private static boolean v1_21_3;
private static boolean v1_21_4;
private static boolean v1_21_5;
public static void init(String serverVersion) {
String[] split = serverVersion.split("\\.");
version = Float.parseFloat(split[1] + "." + (split.length == 3 ? split[2] : "0"));
checkMojMap();
checkFolia();
checkPaper();
v1_20 = version >= 20f;
v1_20_1 = version >= 20.1f;
v1_20_2 = version >= 20.2f;
v1_20_3 = version >= 20.3f;
v1_20_4 = version >= 20.4f;
v1_20_5 = version >= 20.5f;
v1_20_6 = version >= 20.6f;
v1_21 = version >= 21f;
v1_21_1 = version >= 21.1f;
v1_21_2 = version >= 21.2f;
v1_21_3 = version >= 21.3f;
v1_21_4 = version >= 21.4f;
v1_21_5 = version >= 21.5f;
}
public static float version() {
@@ -55,43 +82,55 @@ public class VersionHelper {
return mojmap;
}
public static boolean isVersionNewerThan1_20() {
return version >= 20f;
public static boolean isOrAbove1_20() {
return v1_20;
}
public static boolean isVersionNewerThan1_20_2() {
return version >= 20.19f;
public static boolean isOrAbove1_20_1() {
return v1_20_1;
}
public static boolean isVersionNewerThan1_20_3() {
return version >= 20.29f;
public static boolean isOrAbove1_20_2() {
return v1_20_2;
}
public static boolean isVersionNewerThan1_20_4() {
return version >= 20.39f;
public static boolean isOrAbove1_20_3() {
return v1_20_3;
}
public static boolean isVersionNewerThan1_20_5() {
return version >= 20.49f;
public static boolean isOrAbove1_20_4() {
return v1_20_4;
}
public static boolean isVersionNewerThan1_21() {
return version >= 21f;
public static boolean isOrAbove1_20_5() {
return v1_20_5;
}
public static boolean isVersionNewerThan1_21_2() {
return version >= 21.19f;
public static boolean isOrAbove1_20_6() {
return v1_20_6;
}
public static boolean isVersionNewerThan1_21_3() {
return version >= 21.29f;
public static boolean isOrAbove1_21() {
return v1_21;
}
public static boolean isVersionNewerThan1_21_4() {
return version >= 21.39f;
public static boolean isOrAbove1_21_1() {
return v1_21_1;
}
public static boolean isVersionNewerThan1_21_5() {
return version >= 21.49f;
public static boolean isOrAbove1_21_2() {
return v1_21_2;
}
public static boolean isOrAbove1_21_3() {
return v1_21_3;
}
public static boolean isOrAbove1_21_4() {
return v1_21_4;
}
public static boolean isOrAbove1_21_5() {
return v1_21_5;
}
}

View File

@@ -23,9 +23,9 @@ import java.util.function.Predicate;
import java.util.stream.LongStream;
public class PalettedContainer<T> implements PaletteResizeListener<T>, ReadableContainer<T> {
private static final BiConsumer<FriendlyByteBuf, long[]> RAW_DATA_WRITER = VersionHelper.isVersionNewerThan1_21_5() ?
private static final BiConsumer<FriendlyByteBuf, long[]> RAW_DATA_WRITER = VersionHelper.isOrAbove1_21_5() ?
(FriendlyByteBuf::writeFixedSizeLongArray) : (FriendlyByteBuf::writeLongArray);
private static final BiConsumer<FriendlyByteBuf, long[]> RAW_DATA_READER = VersionHelper.isVersionNewerThan1_21_5() ?
private static final BiConsumer<FriendlyByteBuf, long[]> RAW_DATA_READER = VersionHelper.isOrAbove1_21_5() ?
(FriendlyByteBuf::readFixedSizeLongArray) : (FriendlyByteBuf::readLongArray);
private final PaletteResizeListener<T> dummyListener = (newSize, added) -> 0;
private final IndexedIterable<T> idList;