Add more advancement API

== AT ==
public net.minecraft.advancements.Advancement decorateName(Lnet/minecraft/advancements/DisplayInfo;)Lnet/minecraft/network/chat/Component;

Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
This commit is contained in:
syldium
2021-07-09 18:50:40 +02:00
parent b2715aeeed
commit 864494345a
6 changed files with 152 additions and 6 deletions

View File

@@ -35,12 +35,47 @@ public class CraftAdvancement implements org.bukkit.advancement.Advancement {
return new CraftAdvancementRequirements(this.handle.value().requirements());
}
// Paper start - Add more advancement API
@Override
public AdvancementDisplay getDisplay() {
if (this.handle.value().display().isEmpty()) {
return null;
}
return new CraftAdvancementDisplay(this.handle.value().display().get());
public io.papermc.paper.advancement.AdvancementDisplay getDisplay() {
return this.handle.value().display().map(d -> d.paper).orElse(null);
}
@Deprecated
@io.papermc.paper.annotation.DoNotUse
public AdvancementDisplay getDisplay0() { // May be called by plugins via Commodore
return this.handle.value().display().map(CraftAdvancementDisplay::new).orElse(null);
}
@Override
public net.kyori.adventure.text.Component displayName() {
return io.papermc.paper.adventure.PaperAdventure.asAdventure(net.minecraft.advancements.Advancement.name(this.handle));
}
@Override
public org.bukkit.advancement.Advancement getParent() {
return this.handle.value().parent()
.map(net.minecraft.server.MinecraftServer.getServer().getAdvancements()::get)
.map(AdvancementHolder::toBukkit)
.orElse(null);
}
@Override
public Collection<org.bukkit.advancement.Advancement> getChildren() {
final com.google.common.collect.ImmutableList.Builder<org.bukkit.advancement.Advancement> children = com.google.common.collect.ImmutableList.<org.bukkit.advancement.Advancement>builder();
final net.minecraft.advancements.AdvancementNode advancementNode = net.minecraft.server.MinecraftServer.getServer().getAdvancements().tree().get(this.handle);
if (advancementNode != null) {
for (final net.minecraft.advancements.AdvancementNode child : advancementNode.children()) {
children.add(child.holder().toBukkit());
}
}
return children.build();
}
@Override
public org.bukkit.advancement.Advancement getRoot() {
final net.minecraft.advancements.AdvancementNode advancementNode = net.minecraft.server.MinecraftServer.getServer().getAdvancements().tree().get(this.handle);
return java.util.Objects.requireNonNull(advancementNode, "could not find internal advancement node for advancement " + this.handle.id()).root().holder().toBukkit();
}
// Paper end - Add more advancement API
}

View File

@@ -6,6 +6,7 @@ import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.inventory.ItemStack;
@Deprecated // Paper
public class CraftAdvancementDisplay implements org.bukkit.advancement.AdvancementDisplay {
private final DisplayInfo handle;

View File

@@ -458,6 +458,11 @@ public class Commodore {
super.visitMethodInsn(opcode, owner, name, "()Lcom/destroystokyo/paper/profile/PlayerProfile;", itf);
return;
}
if (owner.equals("org/bukkit/advancement/Advancement") && name.equals("getDisplay") && desc.endsWith(")Lorg/bukkit/advancement/AdvancementDisplay;")) {
super.visitTypeInsn(Opcodes.CHECKCAST, runtimeCbPkgPrefix() + "advancement/CraftAdvancement");
super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, runtimeCbPkgPrefix() + "advancement/CraftAdvancement", "getDisplay0", desc, false);
return;
}
// Paper end
if (modern) {