Skip to content

Commit 0102872

Browse files
committed
validate mannequin pose
1 parent 2d7f5ea commit 0102872

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
--- a/net/minecraft/world/entity/decoration/Mannequin.java
2+
+++ b/net/minecraft/world/entity/decoration/Mannequin.java
3+
@@ -33,7 +_,7 @@
4+
Mannequin.class, EntityDataSerializers.OPTIONAL_COMPONENT
5+
);
6+
public static final byte ALL_LAYERS = (byte)Arrays.stream(PlayerModelPart.values()).mapToInt(PlayerModelPart::getMask).reduce(0, (i, i1) -> i | i1);
7+
- private static final Set<Pose> VALID_POSES = Set.of(Pose.STANDING, Pose.CROUCHING, Pose.SWIMMING, Pose.FALL_FLYING, Pose.SLEEPING);
8+
+ public static final Set<Pose> VALID_POSES = Set.of(Pose.STANDING, Pose.CROUCHING, Pose.SWIMMING, Pose.FALL_FLYING, Pose.SLEEPING); // Paper - public
9+
public static final Codec<Pose> POSE_CODEC = Pose.CODEC
10+
.validate(pose -> VALID_POSES.contains(pose) ? DataResult.success(pose) : DataResult.error(() -> "Invalid pose: " + pose.getSerializedName()));
11+
private static final Codec<Byte> LAYERS_CODEC = PlayerModelPart.CODEC

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77
import com.google.common.collect.Lists;
88
import com.mojang.logging.LogUtils;
99
import io.papermc.paper.datacomponent.DataComponentType;
10+
import io.papermc.paper.entity.LookAnchor;
1011
import io.papermc.paper.entity.TeleportFlag;
1112
import java.util.HashSet;
1213
import java.util.List;
1314
import java.util.Set;
1415
import java.util.UUID;
15-
import io.papermc.paper.entity.LookAnchor;
1616
import java.util.concurrent.CompletableFuture;
1717
import net.kyori.adventure.pointer.PointersSupplier;
1818
import net.kyori.adventure.util.TriState;
19+
import net.md_5.bungee.api.chat.BaseComponent;
1920
import net.minecraft.nbt.CompoundTag;
2021
import net.minecraft.network.chat.Component;
2122
import net.minecraft.server.MinecraftServer;
@@ -74,8 +75,6 @@
7475
import org.bukkit.util.BoundingBox;
7576
import org.bukkit.util.NumberConversions;
7677
import org.bukkit.util.Vector;
77-
78-
import net.md_5.bungee.api.chat.BaseComponent; // Spigot
7978
import org.jetbrains.annotations.NotNull;
8079
import org.jetbrains.annotations.Nullable;
8180
import org.slf4j.Logger;
@@ -960,10 +959,14 @@ public boolean isSneaking() {
960959

961960
@Override
962961
public void setPose(Pose pose, boolean fixed) {
963-
Preconditions.checkNotNull(pose, "Pose cannot be null");
962+
Preconditions.checkArgument(pose != null, "pose cannot be null");
963+
this.setPose0(net.minecraft.world.entity.Pose.values()[pose.ordinal()], fixed);
964+
}
965+
966+
public void setPose0(net.minecraft.world.entity.Pose pose, boolean fixed) {
964967
final Entity handle = this.getHandle();
965968
handle.fixedPose = false;
966-
handle.setPose(net.minecraft.world.entity.Pose.values()[pose.ordinal()]);
969+
handle.setPose(pose);
967970
handle.fixedPose = fixed;
968971
}
969972

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.minecraft.world.entity.HumanoidArm;
1313
import org.bukkit.craftbukkit.CraftServer;
1414
import org.bukkit.entity.Mannequin;
15+
import org.bukkit.entity.Pose;
1516
import org.bukkit.inventory.MainHand;
1617
import org.jspecify.annotations.NullMarked;
1718
import org.jspecify.annotations.Nullable;
@@ -27,6 +28,20 @@ public net.minecraft.world.entity.decoration.Mannequin getHandle() {
2728
return (net.minecraft.world.entity.decoration.Mannequin) this.entity;
2829
}
2930

31+
@Override
32+
public void setPose(Pose pose, boolean fixed) {
33+
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)) {
36+
throw new IllegalArgumentException("Invalid pose '%s', expected one of: %s".formatted(
37+
pose.name(),
38+
net.minecraft.world.entity.decoration.Mannequin.VALID_POSES.stream().map(p -> Pose.values()[p.ordinal()]).toList() // name doesn't match
39+
));
40+
}
41+
42+
this.setPose0(internalPose, fixed);
43+
}
44+
3045
@Override
3146
public io.papermc.paper.datacomponent.item.ResolvableProfile getProfile() {
3247
return new PaperResolvableProfile(this.getHandle().getProfile());

0 commit comments

Comments
 (0)