Skip to content

Commit 1015948

Browse files
feature: expose mannequin poses and provide pose argument
1 parent 6da8af7 commit 1015948

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

paper-api/src/main/java/io/papermc/paper/InternalAPIBridge.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.papermc.paper.datacomponent.item.ResolvableProfile;
66
import io.papermc.paper.world.damagesource.CombatEntry;
77
import io.papermc.paper.world.damagesource.FallLocationType;
8+
import java.util.Set;
89
import java.util.function.Function;
910
import java.util.function.Predicate;
1011
import net.kyori.adventure.text.Component;
@@ -14,6 +15,7 @@
1415
import org.bukkit.damage.DamageEffect;
1516
import org.bukkit.damage.DamageSource;
1617
import org.bukkit.entity.LivingEntity;
18+
import org.bukkit.entity.Pose;
1719
import org.jetbrains.annotations.ApiStatus;
1820
import org.jetbrains.annotations.Contract;
1921
import org.jspecify.annotations.NullMarked;
@@ -100,4 +102,6 @@ class Holder {
100102
Component defaultMannequinDescription();
101103

102104
<MODERN, LEGACY> GameRule<LEGACY> legacyGameRuleBridge(GameRule<MODERN> rule, Function<LEGACY, MODERN> fromLegacyToModern, Function<MODERN, LEGACY> toLegacyFromModern, Class<LEGACY> legacyClass);
105+
106+
Set<Pose> validMannequinPoses();
103107
}

paper-api/src/main/java/org/bukkit/entity/Mannequin.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.destroystokyo.paper.SkinParts;
44
import io.papermc.paper.InternalAPIBridge;
55
import io.papermc.paper.datacomponent.item.ResolvableProfile;
6+
import java.util.Set;
67
import net.kyori.adventure.text.Component;
78
import org.bukkit.inventory.EntityEquipment;
89
import org.bukkit.inventory.MainHand;
@@ -12,6 +13,15 @@
1213
@NullMarked
1314
public interface Mannequin extends LivingEntity {
1415

16+
/**
17+
* Returns the valid poses for a mannequin.
18+
*
19+
* @return the valid poses
20+
*/
21+
static Set<Pose> validPoses() {
22+
return InternalAPIBridge.get().validMannequinPoses();
23+
}
24+
1525
/**
1626
* Returns the default mannequin profile.
1727
*

paper-server/src/main/java/io/papermc/paper/PaperServerInternalAPIBridge.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import io.papermc.paper.world.damagesource.FallLocationType;
1111
import io.papermc.paper.world.damagesource.PaperCombatEntryWrapper;
1212
import io.papermc.paper.world.damagesource.PaperCombatTrackerWrapper;
13+
import java.util.Set;
1314
import java.util.function.Function;
1415
import java.util.function.Predicate;
16+
import java.util.stream.Collectors;
1517
import net.kyori.adventure.text.Component;
1618
import net.minecraft.Optionull;
1719
import net.minecraft.commands.Commands;
@@ -27,13 +29,17 @@
2729
import org.bukkit.damage.DamageEffect;
2830
import org.bukkit.damage.DamageSource;
2931
import org.bukkit.entity.LivingEntity;
32+
import org.bukkit.entity.Pose;
3033
import org.jspecify.annotations.NullMarked;
3134
import org.jspecify.annotations.Nullable;
3235

3336
@NullMarked
3437
public class PaperServerInternalAPIBridge implements InternalAPIBridge {
3538
public static final PaperServerInternalAPIBridge INSTANCE = new PaperServerInternalAPIBridge();
3639

40+
private static final Set<Pose> validMannequinPoses = Mannequin.VALID_POSES.stream()
41+
.map(pose -> Pose.values()[pose.ordinal()]).collect(Collectors.toSet());
42+
3743
@Override
3844
public DamageEffect getDamageEffect(final String key) {
3945
return CraftDamageEffect.getById(key);
@@ -116,4 +122,9 @@ public Component defaultMannequinDescription() {
116122
public <MODERN, LEGACY> GameRule<LEGACY> legacyGameRuleBridge(GameRule<MODERN> rule, Function<LEGACY, MODERN> fromLegacyToModern, Function<MODERN, LEGACY> toLegacyFromModern, Class<LEGACY> legacyClass) {
117123
return CraftGameRule.wrap(rule, fromLegacyToModern, toLegacyFromModern, legacyClass);
118124
}
125+
126+
@Override
127+
public Set<Pose> validMannequinPoses() {
128+
return validMannequinPoses;
129+
}
119130
}

paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftMannequin.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,14 @@ public net.minecraft.world.entity.decoration.Mannequin getHandle() {
3131
@Override
3232
public void setPose(Pose pose, boolean fixed) {
3333
Preconditions.checkArgument(pose != null, "pose cannot be null");
34-
net.minecraft.world.entity.Pose internalPose = net.minecraft.world.entity.Pose.values()[pose.ordinal()];
35-
if (!net.minecraft.world.entity.decoration.Mannequin.VALID_POSES.contains(internalPose)) {
34+
if (!Mannequin.validPoses().contains(pose)) {
3635
throw new IllegalArgumentException("Invalid pose '%s', expected one of: %s".formatted(
3736
pose.name(),
38-
net.minecraft.world.entity.decoration.Mannequin.VALID_POSES.stream().map(p -> Pose.values()[p.ordinal()]).toList() // name doesn't match
37+
Mannequin.validPoses().stream().toList() // name doesn't match
3938
));
4039
}
4140

42-
this.setPose0(internalPose, fixed);
41+
this.setPose0(net.minecraft.world.entity.Pose.values()[pose.ordinal()], fixed);
4342
}
4443

4544
@Override

0 commit comments

Comments
 (0)