This commit is contained in:
Bjarne Koll 2024-06-14 00:44:26 +02:00
parent 02d989b548
commit e0f5e2a1d5
16 changed files with 85 additions and 47 deletions

View file

@ -351,6 +351,23 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
/** /**
* Provides protection against environmental damage * Provides protection against environmental damage
*/ */
@@ -0,0 +0,0 @@ public abstract class Enchantment implements Keyed, Translatable {
public abstract net.kyori.adventure.text.@NotNull Component displayName(int level);
// Paper end
+ // Paper start - mark translation key as deprecated
+ /**
+ * @deprecated this method assumes that the enchantments description
+ * always be a translatable component which is not guaranteed.
+ */
+ @Override
+ @Deprecated(forRemoval = true)
+ public abstract @NotNull String translationKey();
+ // Paper end - mark translation key as deprecated
+
/**
* Gets the Enchantment at the specified key
*
diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java --- a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java

View file

@ -127,11 +127,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @param level the level of enchantment + * @param level the level of enchantment
+ * @param entityCategory the category of entity + * @param entityCategory the category of entity
+ * @return the damage increase + * @return the damage increase
+ * @deprecated Use {@link #getDamageIncrease(int, org.bukkit.entity.EntityType)} instead. + * @deprecated Enchantments now have a complex effect systems that cannot be reduced to a simple damage increase.
+ * Enchantment damage increase is no longer handled via {@link org.bukkit.entity.EntityCategory}s, but
+ * is instead controlled by tags, e.g. {@link org.bukkit.Tag#ENTITY_TYPES_SENSITIVE_TO_BANE_OF_ARTHROPODS}.
+ * As such, a category cannot properly represent all entities defined by the tags.
+ */ + */
+ @Contract("-> fail")
+ @Deprecated(forRemoval = true, since = "1.20.5") + @Deprecated(forRemoval = true, since = "1.20.5")
+ public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityCategory entityCategory); + public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityCategory entityCategory);
+ +
@ -141,19 +139,40 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @param level the level of enchantment + * @param level the level of enchantment
+ * @param entityType the type of entity. + * @param entityType the type of entity.
+ * @return the damage increase + * @return the damage increase
+ * @deprecated Enchantments now have a complex effect systems that cannot be reduced to a simple damage increase.
+ */ + */
+ @Contract("-> fail")
+ @Deprecated(forRemoval = true, since = "1.21")
+ public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityType entityType); + public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityType entityType);
+ +
+ /** + /**
+ * Gets the equipment slots where this enchantment is considered "active". + * Gets the equipment slots where this enchantment is considered "active".
+ * + *
+ * @return the equipment slots + * @return the equipment slots
+ * @deprecated Use {@link #getActiveSlotGroups()} instead as enchantments are now applicable to a group of equipment slots.
+ */
+ @NotNull
+ @Deprecated(forRemoval = true, since = "1.21")
+ public java.util.Set<org.bukkit.inventory.EquipmentSlot> getActiveSlots() {
+ final java.util.Set<org.bukkit.inventory.EquipmentSlotGroup> slots = this.getActiveSlotGroups();
+ return java.util.Arrays.stream(org.bukkit.inventory.EquipmentSlot.values()).filter(e -> {
+ for (final org.bukkit.inventory.EquipmentSlotGroup group : slots) {
+ if (group.test(e)) return true;
+ }
+ return false;
+ }).collect(java.util.stream.Collectors.toSet());
+ }
+
+ /**
+ * Gets the equipment slots where this enchantment is considered "active".
+ *
+ * @return the equipment slots
+ */ + */
+ @NotNull + @NotNull
+ public abstract java.util.Set<org.bukkit.inventory.EquipmentSlot> getActiveSlots(); + public abstract java.util.Set<org.bukkit.inventory.EquipmentSlotGroup> getActiveSlotGroups();
// Paper end // Paper end
/** // Paper start - mark translation key as deprecated
diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java --- a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java

View file

@ -57,7 +57,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
public void aiStep() { public void aiStep() {
- if (this.isAlive() && this.isSunBurnTick()) { - if (this.isAlive() && this.isSunBurnTick()) {
+ if (this.isAlive() && this.shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API + if (this.isAlive() && this.shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API
this.igniteForSeconds(8); this.igniteForSeconds(8.0F);
} }
@@ -0,0 +0,0 @@ public class Phantom extends FlyingMob implements Enemy { @@ -0,0 +0,0 @@ public class Phantom extends FlyingMob implements Enemy {

View file

@ -48,18 +48,20 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/ma
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -0,0 +0,0 @@ public class ServerPlayer extends Player { @@ -0,0 +0,0 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
} }
public boolean setGameMode(GameType gameMode) { public boolean setGameMode(GameType gameMode) {
- if (!this.gameMode.changeGameModeForPlayer(gameMode)) {
- return false;
+ // Paper start - Expand PlayerGameModeChangeEvent + // Paper start - Expand PlayerGameModeChangeEvent
+ org.bukkit.event.player.PlayerGameModeChangeEvent event = this.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.UNKNOWN, null); + org.bukkit.event.player.PlayerGameModeChangeEvent event = this.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.UNKNOWN, null);
+ return event == null ? false : event.isCancelled(); + return event == null ? false : event.isCancelled();
+ } + }
+ @Nullable + @Nullable
+ public org.bukkit.event.player.PlayerGameModeChangeEvent setGameMode(GameType gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause cause, @Nullable net.kyori.adventure.text.Component message) { + public org.bukkit.event.player.PlayerGameModeChangeEvent setGameMode(GameType gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause cause, @Nullable net.kyori.adventure.text.Component message) {
boolean flag = this.isSpectator();
- if (!this.gameMode.changeGameModeForPlayer(gameMode)) {
- return false;
+ org.bukkit.event.player.PlayerGameModeChangeEvent event = this.gameMode.changeGameModeForPlayer(gameMode, cause, message); + org.bukkit.event.player.PlayerGameModeChangeEvent event = this.gameMode.changeGameModeForPlayer(gameMode, cause, message);
+ if (event == null || event.isCancelled()) { + if (event == null || event.isCancelled()) {
+ return null; + return null;
@ -67,7 +69,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
} else { } else {
this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, (float) gameMode.getId())); this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, (float) gameMode.getId()));
if (gameMode == GameType.SPECTATOR) { if (gameMode == GameType.SPECTATOR) {
@@ -0,0 +0,0 @@ public class ServerPlayer extends Player { @@ -0,0 +0,0 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
this.onUpdateAbilities(); this.onUpdateAbilities();
this.updateEffectVisibility(); this.updateEffectVisibility();
@ -76,7 +78,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
} }
} }
@@ -0,0 +0,0 @@ public class ServerPlayer extends Player { @@ -0,0 +0,0 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
} }
public void loadGameTypes(@Nullable CompoundTag nbt) { public void loadGameTypes(@Nullable CompoundTag nbt) {
@ -137,7 +139,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
this.player = this.server.getPlayerList().respawn(this.player, false, RespawnReason.DEATH); this.player = this.server.getPlayerList().respawn(this.player, false, Entity.RemovalReason.KILLED, RespawnReason.DEATH); // CraftBukkit
if (this.server.isHardcore()) { if (this.server.isHardcore()) {
- this.player.setGameMode(GameType.SPECTATOR); - this.player.setGameMode(GameType.SPECTATOR);
+ this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper - Expand PlayerGameModeChangeEvent + this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper - Expand PlayerGameModeChangeEvent

View file

@ -13,12 +13,20 @@ diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
+++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
@@ -0,0 +0,0 @@ import java.util.Locale;
import net.minecraft.Util;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
+import net.minecraft.network.chat.contents.TranslatableContents;
import net.minecraft.tags.EnchantmentTags;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
@@ -0,0 +0,0 @@ public class CraftEnchantment extends Enchantment implements Handleable<net.mine @@ -0,0 +0,0 @@ public class CraftEnchantment extends Enchantment implements Handleable<net.mine
@Override @Override
public boolean isCursed() { public boolean isTreasure() {
- return this.handle instanceof BindingCurseEnchantment || this.handle instanceof VanishingCurseEnchantment; - return !this.handle.is(EnchantmentTags.IN_ENCHANTING_TABLE);
+ return this.handle.isCurse(); // Paper - More Enchantment API + return this.handle.is(EnchantmentTags.TREASURE); // Paper - use treasure tag
} }
@Override @Override
@ -27,37 +35,45 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@Override @Override
public net.kyori.adventure.text.Component displayName(int level) { public net.kyori.adventure.text.Component displayName(int level) {
- return io.papermc.paper.adventure.PaperAdventure.asAdventure(getHandle().getFullname(level)); - return io.papermc.paper.adventure.PaperAdventure.asAdventure(getHandle().getFullname(level));
+ return io.papermc.paper.adventure.PaperAdventure.asAdventure(this.handle.getFullname(level)); + return io.papermc.paper.adventure.PaperAdventure.asAdventure(net.minecraft.world.item.enchantment.Enchantment.getFullname(this.handle, level));
} }
@Override @Override
public String translationKey() { public String translationKey() {
return this.handle.getDescriptionId(); - return this.handle.getDescriptionId();
} + if (!(this.getHandle().description().getContents() instanceof final TranslatableContents translatableContents)) {
+ throw new UnsupportedOperationException("Description isn't translatable!"); // Paper
+ }
+ return translatableContents.getKey();
+ }
+ +
+ @Override + @Override
+ public boolean isTradeable() { + public boolean isTradeable() {
+ return this.handle.isTradeable(); + return this.handle.is(EnchantmentTags.TRADEABLE);
+ } + }
+ +
+ @Override + @Override
+ public boolean isDiscoverable() { + public boolean isDiscoverable() {
+ return this.handle.isDiscoverable(); + return this.handle.is(EnchantmentTags.IN_ENCHANTING_TABLE)
+ || this.handle.is(EnchantmentTags.ON_RANDOM_LOOT)
+ || this.handle.is(EnchantmentTags.ON_MOB_SPAWN_EQUIPMENT)
+ || this.handle.is(EnchantmentTags.TRADEABLE)
+ || this.handle.is(EnchantmentTags.ON_TRADED_EQUIPMENT);
+ } + }
+ +
+ @Override + @Override
+ public int getMinModifiedCost(int level) { + public int getMinModifiedCost(int level) {
+ return this.handle.getMinCost(level); + return this.getHandle().definition().minCost().calculate(level);
+ } + }
+ +
+ @Override + @Override
+ public int getMaxModifiedCost(int level) { + public int getMaxModifiedCost(int level) {
+ return this.handle.getMaxCost(level); + return this.getHandle().definition().maxCost().calculate(level);
+ } + }
+ +
+ @Override + @Override
+ public int getAnvilCost() { + public int getAnvilCost() {
+ return this.handle.getAnvilCost(); + return this.getHandle().definition().anvilCost();
+ } + }
+ +
+ @Override + @Override
@ -67,35 +83,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ +
+ @Override + @Override
+ public float getDamageIncrease(int level, org.bukkit.entity.EntityCategory entityCategory) { + public float getDamageIncrease(int level, org.bukkit.entity.EntityCategory entityCategory) {
+ return this.handle.getDamageBonus(level, this.guessEntityTypeFromEnchantmentCategory(entityCategory)); + throw new UnsupportedOperationException("Enchantments are based on complex effect maps since 1.21, cannot compute a simple damage increase");
+ } + }
+ +
+ @Override + @Override
+ public float getDamageIncrease(int level, org.bukkit.entity.EntityType entityType) { + public float getDamageIncrease(int level, org.bukkit.entity.EntityType entityType) {
+ return this.handle.getDamageBonus(level, org.bukkit.craftbukkit.util.CraftMagicNumbers.getEntityTypes(entityType)); + throw new UnsupportedOperationException("Enchantments are based on complex effect maps since 1.21, cannot compute a simple damage increase");
+ }
+
+ @Deprecated(forRemoval = true)
+ private net.minecraft.world.entity.EntityType<?> guessEntityTypeFromEnchantmentCategory(
+ final org.bukkit.entity.EntityCategory entityCategory
+ ) {
+ final net.minecraft.tags.TagKey<net.minecraft.world.entity.EntityType<?>> tag = switch (entityCategory) {
+ case ARTHROPOD -> net.minecraft.tags.EntityTypeTags.SENSITIVE_TO_BANE_OF_ARTHROPODS;
+ case UNDEAD -> net.minecraft.tags.EntityTypeTags.SENSITIVE_TO_SMITE;
+ case WATER -> net.minecraft.tags.EntityTypeTags.SENSITIVE_TO_IMPALING;
+ default -> null;
+ };
+ if (tag == null) return null;
+
+ return net.minecraft.core.registries.BuiltInRegistries.ENTITY_TYPE.getTag(tag)
+ .map(e -> e.size() > 0 ? e.get(0).value() : null)
+ .orElse(null);
+ } + }
+ +
+ @Override + @Override
+ public java.util.Set<org.bukkit.inventory.EquipmentSlot> getActiveSlots() { + public java.util.Set<org.bukkit.inventory.EquipmentSlotGroup> getActiveSlotGroups() {
+ return java.util.stream.Stream.of(this.handle.definition.slots()).map(org.bukkit.craftbukkit.CraftEquipmentSlot::getSlot).collect(java.util.stream.Collectors.toSet()); + return this.getHandle().definition().slots().stream()
+ } + .map(org.bukkit.craftbukkit.CraftEquipmentSlot::getSlot)
+ .collect(java.util.stream.Collectors.toSet());
}
// Paper end // Paper end
@Override