Skip to content

Commit 6a99268

Browse files
Warriorrrrkennytv
authored andcommitted
Add PlayerToggleEntityAgeLockEvent (#13742)
1 parent bc8f592 commit 6a99268

5 files changed

Lines changed: 137 additions & 7 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package io.papermc.paper.event.player;
2+
3+
import org.bukkit.entity.LivingEntity;
4+
import org.bukkit.entity.Player;
5+
import org.bukkit.event.Cancellable;
6+
import org.bukkit.event.HandlerList;
7+
import org.bukkit.event.player.PlayerEvent;
8+
import org.bukkit.inventory.EquipmentSlot;
9+
import org.bukkit.inventory.ItemStack;
10+
import org.jetbrains.annotations.ApiStatus;
11+
import org.jspecify.annotations.NullMarked;
12+
13+
/**
14+
* Called when a player toggles the age lock of an entity using an item.
15+
*/
16+
@NullMarked
17+
public class PlayerToggleEntityAgeLockEvent extends PlayerEvent implements Cancellable {
18+
private static final HandlerList HANDLER_LIST = new HandlerList();
19+
20+
private final LivingEntity entity;
21+
private final ItemStack item;
22+
private final EquipmentSlot hand;
23+
private final boolean ageLocked;
24+
private boolean cancelled;
25+
26+
@ApiStatus.Internal
27+
public PlayerToggleEntityAgeLockEvent(final Player player, final LivingEntity entity, final ItemStack item, final EquipmentSlot hand, final boolean ageLocked) {
28+
super(player);
29+
this.entity = entity;
30+
this.item = item;
31+
this.hand = hand;
32+
this.ageLocked = ageLocked;
33+
}
34+
35+
/**
36+
* {@return the entity that is having its age locked or unlocked}
37+
*/
38+
public LivingEntity getEntity() {
39+
return this.entity;
40+
}
41+
42+
/**
43+
* {@return the item being used to toggle the age lock of the entity}
44+
*/
45+
public ItemStack getItem() {
46+
return this.item.clone();
47+
}
48+
49+
/**
50+
* {@return the hand being used to toggle the age lock of the entity}
51+
*/
52+
public EquipmentSlot getHand() {
53+
return this.hand;
54+
}
55+
56+
/**
57+
* {@return whether the age of the entity is going to be locked or not}
58+
*/
59+
public boolean isAgeLocked() {
60+
return this.ageLocked;
61+
}
62+
63+
@Override
64+
public boolean isCancelled() {
65+
return this.cancelled;
66+
}
67+
68+
@Override
69+
public void setCancelled(final boolean cancel) {
70+
this.cancelled = cancel;
71+
}
72+
73+
@Override
74+
public HandlerList getHandlers() {
75+
return HANDLER_LIST;
76+
}
77+
78+
public static HandlerList getHandlerList() {
79+
return HANDLER_LIST;
80+
}
81+
}

paper-server/patches/features/0005-Entity-Activation-Range-2.0.patch

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Adds villagers as separate config
1515

1616
diff --git a/io/papermc/paper/entity/activation/ActivationRange.java b/io/papermc/paper/entity/activation/ActivationRange.java
1717
new file mode 100644
18-
index 0000000000000000000000000000000000000000..c18823746ab2edcab536cb1589b7720e3af07e0f
18+
index 0000000000000000000000000000000000000000..ce6b57eeeeb1bd652f4bb53c19dcfbc05126c7e9
1919
--- /dev/null
2020
+++ b/io/papermc/paper/entity/activation/ActivationRange.java
2121
@@ -0,0 +1,334 @@
@@ -415,10 +415,10 @@ index 96e45eab1e8cf857f5068e911070259866d8bdcb..a0477b407d41ab7391f764b3d21352f4
415415
}
416416
}
417417
diff --git a/net/minecraft/world/entity/AgeableMob.java b/net/minecraft/world/entity/AgeableMob.java
418-
index 4f98f6e1ca266ab7377fb52e753b977d4ccd1558..a0c930afcdb01e2fb103836613417fb9fc96d86b 100644
418+
index 1cca5523edf4052bd3048496d38acd44f19a7c63..9f77fcd1cebf675a90adb55c6ffd34e9c5bc0aa7 100644
419419
--- a/net/minecraft/world/entity/AgeableMob.java
420420
+++ b/net/minecraft/world/entity/AgeableMob.java
421-
@@ -184,6 +184,21 @@ public abstract class AgeableMob extends PathfinderMob {
421+
@@ -189,6 +189,21 @@ public abstract class AgeableMob extends PathfinderMob {
422422
super.onSyncedDataUpdated(accessor);
423423
}
424424

@@ -441,7 +441,7 @@ index 4f98f6e1ca266ab7377fb52e753b977d4ccd1558..a0c930afcdb01e2fb103836613417fb9
441441
public void aiStep() {
442442
super.aiStep();
443443
diff --git a/net/minecraft/world/entity/AreaEffectCloud.java b/net/minecraft/world/entity/AreaEffectCloud.java
444-
index 6309a615ba2525437758b1fe39c43060ec42d6f8..677b0cadec2270537d868aac7d0acaf7e6bfa2ea 100644
444+
index 0df8332933203a904bd9ef9efb3c9bce21e65441..1a502cbd8acea9420fa6dd8d716018b5ede4ba6a 100644
445445
--- a/net/minecraft/world/entity/AreaEffectCloud.java
446446
+++ b/net/minecraft/world/entity/AreaEffectCloud.java
447447
@@ -140,6 +140,16 @@ public class AreaEffectCloud extends Entity implements TraceableEntity {
@@ -521,7 +521,7 @@ index f7b4da570ee28b7128b4d2cd1c67b89e3980bced..93d3fb313d538cc1067b1db010458169
521521
delta = this.maybeBackOffFromEdge(delta, moverType);
522522
Vec3 movement = this.collide(delta);
523523
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
524-
index 9d579b7f17dc38c9e92447ea27ec71a8967a9964..30d518454e7a48b42242184203ab583b19b3e770 100644
524+
index c4da41f3b5ba6d8492d3776654b1ce62a5015895..6a0ebbdfcc0bc07915574c1cf87463e82213ca7e 100644
525525
--- a/net/minecraft/world/entity/LivingEntity.java
526526
+++ b/net/minecraft/world/entity/LivingEntity.java
527527
@@ -3385,6 +3385,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
@@ -639,7 +639,7 @@ index d46e0e3a4a7fc3bb3f1dd695d4cc563778b99db0..c6e9b155c2341c13d569f28f54f0c1d2
639639
}
640640
}
641641
diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java
642-
index a4f719c1b1b6a8920068ed8969a9e780420eade1..3791ffa6a14a1b2304780382e19f0e38a59f573f 100644
642+
index c482c3348267ca2b88109e34291aa860e0cde916..b11b59d80e37d272770ab51a63028fdddfe800d6 100644
643643
--- a/net/minecraft/world/entity/item/ItemEntity.java
644644
+++ b/net/minecraft/world/entity/item/ItemEntity.java
645645
@@ -124,6 +124,29 @@ public class ItemEntity extends Entity implements TraceableEntity {
@@ -757,7 +757,7 @@ index c457a6b0935fa4dce20f93db79c27070ce147705..c9f7e68abccbc6b894a66b675952c973
757757
public void tick() {
758758
super.tick();
759759
diff --git a/net/minecraft/world/entity/projectile/arrow/Arrow.java b/net/minecraft/world/entity/projectile/arrow/Arrow.java
760-
index 23a9a11f8b9397c91ac610d858b7c1c3810095c8..d8c84e718b9c9d142925e2569afbd72e462bf5ca 100644
760+
index f3861c936855a0d9c9170585f4da4ce1cd77b854..3b4cbbc4c8ca1cd3110d1d6ba9e3531283b53c08 100644
761761
--- a/net/minecraft/world/entity/projectile/arrow/Arrow.java
762762
+++ b/net/minecraft/world/entity/projectile/arrow/Arrow.java
763763
@@ -70,6 +70,16 @@ public class Arrow extends AbstractArrow {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--- a/net/minecraft/world/entity/AgeableMob.java
2+
+++ b/net/minecraft/world/entity/AgeableMob.java
3+
@@ -68,6 +_,11 @@
4+
protected InteractionResult mobInteract(final Player player, final InteractionHand hand) {
5+
ItemStack itemInHand = player.getItemInHand(hand);
6+
if (canUseGoldenDandelion(itemInHand, this.isBaby(), this.ageLockParticleTimer, this)) {
7+
+ // Paper start - call PlayerToggleEntityAgeLockEvent
8+
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerToggleEntityAgeLockEvent(player, this, itemInHand, hand, !this.isAgeLocked(), AGE_LOCKED)) {
9+
+ return InteractionResult.SUCCESS;
10+
+ }
11+
+ // Paper end - call PlayerToggleEntityAgeLockEvent
12+
setAgeLocked(this, this::isAgeLocked, player, itemInHand, mob -> this.setAgeLockedData());
13+
return InteractionResult.SUCCESS;
14+
} else {

paper-server/patches/sources/net/minecraft/world/entity/animal/frog/Tadpole.java.patch

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,18 @@
99
this.entityData.set(AGE_LOCKED, locked);
1010
}
1111

12+
@@ -157,6 +_,11 @@
13+
this.feed(player, itemStack);
14+
return InteractionResult.SUCCESS;
15+
} else if (AgeableMob.canUseGoldenDandelion(itemStack, true, this.ageLockParticleTimer, this)) {
16+
+ // Paper start - call PlayerToggleEntityAgeLockEvent
17+
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerToggleEntityAgeLockEvent(player, this, itemStack, hand, !this.isAgeLocked(), AGE_LOCKED)) {
18+
+ return InteractionResult.SUCCESS;
19+
+ }
20+
+ // Paper end - call PlayerToggleEntityAgeLockEvent
21+
AgeableMob.setAgeLocked(this, this::isAgeLocked, player, itemStack, mob -> this.setAgeLockedData());
22+
return InteractionResult.SUCCESS;
23+
} else {
1224
@@ -236,12 +_,17 @@
1325

1426
private void ageUp() {

paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.papermc.paper.event.connection.PlayerConnectionValidateLoginEvent;
1515
import io.papermc.paper.event.entity.ItemTransportingEntityValidateTargetEvent;
1616
import io.papermc.paper.event.player.PlayerBedFailEnterEvent;
17+
import io.papermc.paper.event.player.PlayerToggleEntityAgeLockEvent;
1718
import java.util.ArrayList;
1819
import java.util.Collections;
1920
import java.util.EnumMap;
@@ -27,6 +28,7 @@
2728
import net.minecraft.network.Connection;
2829
import net.minecraft.network.chat.Component;
2930
import net.minecraft.network.protocol.game.ServerboundContainerClosePacket;
31+
import net.minecraft.network.syncher.EntityDataAccessor;
3032
import net.minecraft.server.MinecraftServer;
3133
import net.minecraft.server.level.ServerLevel;
3234
import net.minecraft.server.level.ServerPlayer;
@@ -2394,4 +2396,25 @@ public static boolean sendChestLockedNotifications(Vec3 pos) {
23942396
}
23952397
return false;
23962398
}
2399+
2400+
public static boolean callPlayerToggleEntityAgeLockEvent(net.minecraft.world.entity.player.Player player, Mob target, ItemStack itemUsed, InteractionHand hand, boolean ageLocked, @Nullable EntityDataAccessor<?> accessorToResync) {
2401+
PlayerToggleEntityAgeLockEvent event = new PlayerToggleEntityAgeLockEvent(
2402+
(org.bukkit.entity.Player) player.getBukkitEntity(),
2403+
(LivingEntity) target.getBukkitEntity(),
2404+
itemUsed.asBukkitCopy(),
2405+
org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand),
2406+
ageLocked
2407+
);
2408+
2409+
if (!event.callEvent()) {
2410+
if (accessorToResync != null && player instanceof ServerPlayer serverPlayer) {
2411+
target.resendPossiblyDesyncedDataValues(List.of(accessorToResync), serverPlayer);
2412+
}
2413+
if (!player.hasInfiniteMaterials()) {
2414+
player.inventoryMenu.forceHeldSlot(hand);
2415+
}
2416+
return false;
2417+
}
2418+
return true;
2419+
}
23972420
}

0 commit comments

Comments
 (0)