diff --git a/patches/api/Add-EntityDyeEvent-and-CollarColorable-interface.patch b/patches/api/Add-EntityDyeEvent-and-CollarColorable-interface.patch new file mode 100644 index 000000000..f06fef223 --- /dev/null +++ b/patches/api/Add-EntityDyeEvent-and-CollarColorable-interface.patch @@ -0,0 +1,262 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Fri, 18 Mar 2022 21:16:38 -0700 +Subject: [PATCH] Add EntityDyeEvent and CollarColorable interface + + +diff --git a/src/main/java/io/papermc/paper/entity/CollarColorable.java b/src/main/java/io/papermc/paper/entity/CollarColorable.java +new file mode 100644 +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/entity/CollarColorable.java +@@ -0,0 +0,0 @@ ++package io.papermc.paper.entity; ++ ++import org.bukkit.DyeColor; ++import org.bukkit.entity.LivingEntity; ++import org.jetbrains.annotations.NotNull; ++ ++/** ++ * Entities that can have their collars colored. ++ */ ++public interface CollarColorable extends LivingEntity { ++ ++ /** ++ * Get the collar color of this entity ++ * ++ * @return the color of the collar ++ */ ++ @NotNull DyeColor getCollarColor(); ++ ++ /** ++ * Set the collar color of this entity ++ * ++ * @param color the color to apply ++ */ ++ void setCollarColor(@NotNull DyeColor color); ++} +diff --git a/src/main/java/io/papermc/paper/event/entity/EntityDyeEvent.java b/src/main/java/io/papermc/paper/event/entity/EntityDyeEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/event/entity/EntityDyeEvent.java +@@ -0,0 +0,0 @@ ++package io.papermc.paper.event.entity; ++ ++import org.bukkit.DyeColor; ++import org.bukkit.entity.Entity; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.entity.EntityEvent; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++/** ++ * Called when an entity is dyed. Currently, this is called for {@link org.bukkit.entity.Sheep} ++ * being dyed, and {@link org.bukkit.entity.Wolf}/{@link org.bukkit.entity.Cat} collars being dyed. ++ */ ++public class EntityDyeEvent extends EntityEvent implements Cancellable { ++ ++ private static final HandlerList HANDLER_LIST = new HandlerList(); ++ ++ private DyeColor dyeColor; ++ private final Player player; ++ private boolean cancel; ++ ++ public EntityDyeEvent(@NotNull Entity entity, @NotNull DyeColor dyeColor, @Nullable Player player) { ++ super(entity); ++ this.dyeColor = dyeColor; ++ this.player = player; ++ } ++ ++ /** ++ * Gets the DyeColor the entity is being dyed ++ * ++ * @return the DyeColor the entity is being dyed ++ */ ++ public @NotNull DyeColor getColor() { ++ return this.dyeColor; ++ } ++ ++ /** ++ * Sets the DyeColor the entity is being dyed ++ * ++ * @param dyeColor the DyeColor the entity will be dyed ++ */ ++ public void setColor(@NotNull DyeColor dyeColor) { ++ this.dyeColor = dyeColor; ++ } ++ ++ /** ++ * Returns the player dyeing the entity, if available. ++ * ++ * @return player or null ++ */ ++ public @Nullable Player getPlayer() { ++ return player; ++ } ++ ++ @Override ++ public boolean isCancelled() { ++ return this.cancel; ++ } ++ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancel = cancel; ++ } ++ ++ @Override ++ public @NotNull HandlerList getHandlers() { ++ return HANDLER_LIST; ++ } ++ ++ public static @NotNull HandlerList getHandlerList() { ++ return HANDLER_LIST; ++ } ++} +diff --git a/src/main/java/org/bukkit/entity/Cat.java b/src/main/java/org/bukkit/entity/Cat.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/entity/Cat.java ++++ b/src/main/java/org/bukkit/entity/Cat.java +@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull; + /** + * Meow. + */ +-public interface Cat extends Tameable, Sittable { ++public interface Cat extends Tameable, Sittable, io.papermc.paper.entity.CollarColorable { // Paper - CollarColorable + + /** + * Gets the current type of this cat. +@@ -0,0 +0,0 @@ public interface Cat extends Tameable, Sittable { + * @return the color of the collar + */ + @NotNull ++ @Override // Paper + public DyeColor getCollarColor(); + + /** +@@ -0,0 +0,0 @@ public interface Cat extends Tameable, Sittable { + * + * @param color the color to apply + */ ++ @Override // Paper + public void setCollarColor(@NotNull DyeColor color); + + /** +diff --git a/src/main/java/org/bukkit/entity/Wolf.java b/src/main/java/org/bukkit/entity/Wolf.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/entity/Wolf.java ++++ b/src/main/java/org/bukkit/entity/Wolf.java +@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull; + /** + * Represents a Wolf + */ +-public interface Wolf extends Tameable, Sittable { ++public interface Wolf extends Tameable, Sittable, io.papermc.paper.entity.CollarColorable { // Paper - CollarColorable + + /** + * Checks if this wolf is angry +@@ -0,0 +0,0 @@ public interface Wolf extends Tameable, Sittable { + * @return the color of the collar + */ + @NotNull ++ @Override // Paper + public DyeColor getCollarColor(); + + /** +@@ -0,0 +0,0 @@ public interface Wolf extends Tameable, Sittable { + * + * @param color the color to apply + */ ++ @Override // Paper + public void setCollarColor(@NotNull DyeColor color); + + // Paper start +diff --git a/src/main/java/org/bukkit/event/entity/SheepDyeWoolEvent.java b/src/main/java/org/bukkit/event/entity/SheepDyeWoolEvent.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/event/entity/SheepDyeWoolEvent.java ++++ b/src/main/java/org/bukkit/event/entity/SheepDyeWoolEvent.java +@@ -0,0 +0,0 @@ import org.jetbrains.annotations.Nullable; + /** + * Called when a sheep's wool is dyed + */ +-public class SheepDyeWoolEvent extends EntityEvent implements Cancellable { +- private static final HandlerList handlers = new HandlerList(); +- private boolean cancel; +- private DyeColor color; +- private final Player player; ++public class SheepDyeWoolEvent extends io.papermc.paper.event.entity.EntityDyeEvent implements Cancellable { ++ // Paper - move everything to superclass + + @Deprecated + public SheepDyeWoolEvent(@NotNull final Sheep sheep, @NotNull final DyeColor color) { +@@ -0,0 +0,0 @@ public class SheepDyeWoolEvent extends EntityEvent implements Cancellable { + } + + public SheepDyeWoolEvent(@NotNull final Sheep sheep, @NotNull final DyeColor color, @Nullable Player player) { +- super(sheep); +- this.cancel = false; +- this.color = color; +- this.player = player; +- } +- +- @Override +- public boolean isCancelled() { +- return cancel; +- } +- +- @Override +- public void setCancelled(boolean cancel) { +- this.cancel = cancel; ++ super(sheep, color, player); // Paper + } + + @NotNull +@@ -0,0 +0,0 @@ public class SheepDyeWoolEvent extends EntityEvent implements Cancellable { + public Sheep getEntity() { + return (Sheep) entity; + } +- +- /** +- * Returns the player dyeing the sheep, if available. +- * +- * @return player or null +- */ +- @Nullable +- public Player getPlayer() { +- return player; +- } +- +- /** +- * Gets the DyeColor the sheep is being dyed +- * +- * @return the DyeColor the sheep is being dyed +- */ +- @NotNull +- public DyeColor getColor() { +- return color; +- } +- +- /** +- * Sets the DyeColor the sheep is being dyed +- * +- * @param color the DyeColor the sheep will be dyed +- */ +- public void setColor(@NotNull DyeColor color) { +- this.color = color; +- } +- +- @NotNull +- @Override +- public HandlerList getHandlers() { +- return handlers; +- } +- +- @NotNull +- public static HandlerList getHandlerList() { +- return handlers; +- } +- + } diff --git a/patches/server/Add-EntityDyeEvent-and-CollarColorable-interface.patch b/patches/server/Add-EntityDyeEvent-and-CollarColorable-interface.patch new file mode 100644 index 000000000..2b5f7aadb --- /dev/null +++ b/patches/server/Add-EntityDyeEvent-and-CollarColorable-interface.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Fri, 18 Mar 2022 21:15:55 -0700 +Subject: [PATCH] Add EntityDyeEvent and CollarColorable interface + + +diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java +@@ -0,0 +0,0 @@ public class Cat extends TamableAnimal { + DyeColor enumcolor = ((DyeItem) item).getDyeColor(); + + if (enumcolor != this.getCollarColor()) { ++ // Paper start ++ final io.papermc.paper.event.entity.EntityDyeEvent event = new io.papermc.paper.event.entity.EntityDyeEvent(this.getBukkitEntity(), org.bukkit.DyeColor.getByWoolData((byte) enumcolor.getId()), ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity()); ++ if (!event.callEvent()) { ++ return InteractionResult.FAIL; ++ } ++ enumcolor = DyeColor.byId(event.getColor().getWoolData()); ++ // Paper end + this.setCollarColor(enumcolor); + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); +diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java +@@ -0,0 +0,0 @@ public class Wolf extends TamableAnimal implements NeutralMob { + DyeColor enumcolor = ((DyeItem) item).getDyeColor(); + + if (enumcolor != this.getCollarColor()) { ++ // Paper start ++ final io.papermc.paper.event.entity.EntityDyeEvent event = new io.papermc.paper.event.entity.EntityDyeEvent(this.getBukkitEntity(), org.bukkit.DyeColor.getByWoolData((byte) enumcolor.getId()), ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity()); ++ if (!event.callEvent()) { ++ return InteractionResult.FAIL; ++ } ++ enumcolor = DyeColor.byId(event.getColor().getWoolData()); ++ // Paper end + this.setCollarColor(enumcolor); + if (!player.getAbilities().instabuild) { + itemstack.shrink(1);