Files
Purpur/purpur-server/minecraft-patches/features/0021-Per-mob-mob_griefing-loot-pickup-override.patch
2026-06-08 12:07:56 -07:00

343 lines
17 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Peashooter101 <Peashooter101@yahoo.com>
Date: Sat, 13 Dec 2025 13:59:23 -0600
Subject: [PATCH] Per mob mob_griefing loot pickup override
diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java
index b5c2b64c581c30cdf6f379ccd76a863b81513f8b..7aaabbde2aaa58d2ae412bc6910cb95dee3b9fe5 100644
--- a/net/minecraft/world/entity/Mob.java
+++ b/net/minecraft/world/entity/Mob.java
@@ -577,7 +577,7 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs
&& this.canPickUpLoot()
&& this.isAlive()
&& !this.dead
- && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.entitiesPickUpLootMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
+ && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, checkEntityPickUpLootOverride())) { // Purpur - Check mobGriefing Overrides
Vec3i pickupReach = this.getPickupReach();
for (ItemEntity entity : this.level()
@@ -596,6 +596,12 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs
profiler.pop();
}
+ // Purpur start - Check mobGriefing Overrides
+ protected @Nullable Boolean checkEntityPickUpLootOverride() {
+ return null;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
protected EquipmentSlot sunProtectionSlot() {
return EquipmentSlot.HEAD;
}
diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java
index 9206c45b9789ff2834f14efb65dc85113c7bd7d7..d3074e1ce8d7d13bcb5b23e7602e94d6b7558f03 100644
--- a/net/minecraft/world/entity/animal/allay/Allay.java
+++ b/net/minecraft/world/entity/animal/allay/Allay.java
@@ -163,6 +163,13 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS
}
// Purpur end - Configurable entity base attributes
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.allayCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected Brain<Allay> makeBrain(final Brain.Packed packedBrain) {
return BRAIN_PROVIDER.makeBrain(this, packedBrain);
diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java
index ca5b0b8081c4943bfbfba4f0f9284f0fdda3cf9f..91a001af54b9ba53c9c2a7cfd797d9ff2f53c0db 100644
--- a/net/minecraft/world/entity/animal/fox/Fox.java
+++ b/net/minecraft/world/entity/animal/fox/Fox.java
@@ -821,6 +821,13 @@ public class Fox extends Animal {
}
// Purpur end - Tulips change fox type
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.foxCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
// Paper start - Cancellable death event
protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(final ServerLevel level, final DamageSource source) {
diff --git a/net/minecraft/world/entity/monster/illager/Pillager.java b/net/minecraft/world/entity/monster/illager/Pillager.java
index 9d6629c29dc471ef1db672cce4260a983d452cbd..55b7fc1c375edaf8c86294884da55d5d97e09e93 100644
--- a/net/minecraft/world/entity/monster/illager/Pillager.java
+++ b/net/minecraft/world/entity/monster/illager/Pillager.java
@@ -104,6 +104,13 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.pillagerCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void registerGoals() {
super.registerGoals();
diff --git a/net/minecraft/world/entity/monster/illager/Vindicator.java b/net/minecraft/world/entity/monster/illager/Vindicator.java
index d42afe275f7a917d5784da2838972dff73f1476a..68b252bfd6bacc3952ffc610032cd8a0ec1169e3 100644
--- a/net/minecraft/world/entity/monster/illager/Vindicator.java
+++ b/net/minecraft/world/entity/monster/illager/Vindicator.java
@@ -96,6 +96,13 @@ public class Vindicator extends AbstractIllager {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.vindicatorCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void registerGoals() {
super.registerGoals();
diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java
index 9246caa06976c258c15c95b52a156aebf63d89d7..ac96afede920fcc19a3a136ed75b1c66c0cfdea5 100644
--- a/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -148,6 +148,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.piglinCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void addAdditionalSaveData(final ValueOutput output) {
super.addAdditionalSaveData(output);
@@ -430,7 +437,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@Override
public boolean wantsToPickUp(final ServerLevel level, final ItemStack itemStack) {
- return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, itemStack); // Purpur - Add mobGriefing override to everything affected
+ return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinCanPickUpLoot) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, itemStack); // Purpur - Check mobGriefing Overrides
}
protected boolean canReplaceCurrentItem(final ItemStack newItemStack) {
diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java
index ee1a87f7811d22b5b33b3ae6b22fc5332b57322b..34cd7f5b209e466a4bef506a9d796e04fcfe425d 100644
--- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java
+++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java
@@ -89,6 +89,13 @@ public class PiglinBrute extends AbstractPiglin {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.piglinBruteCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
public static AttributeSupplier.Builder createAttributes() {
return Monster.createMonsterAttributes()
.add(Attributes.MAX_HEALTH, 50.0)
diff --git a/net/minecraft/world/entity/monster/skeleton/Bogged.java b/net/minecraft/world/entity/monster/skeleton/Bogged.java
index 617f61f4f7559a42e27d935ab9837ed99a8e9c1e..4022813e5cb9188f310fa5b633567cf854f4d627 100644
--- a/net/minecraft/world/entity/monster/skeleton/Bogged.java
+++ b/net/minecraft/world/entity/monster/skeleton/Bogged.java
@@ -66,6 +66,13 @@ public class Bogged extends AbstractSkeleton implements Shearable {
}
// Purpur end - Configurable entity base attributes
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.boggedCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void defineSynchedData(final SynchedEntityData.Builder entityData) {
super.defineSynchedData(entityData);
diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java
index 675faf3f02447fd73f48acc08c4b224114a0dc2e..8610e59cdebe6ae6fc4ba0fb654e990b1e3f34ee 100644
--- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java
+++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java
@@ -65,6 +65,13 @@ public class Skeleton extends AbstractSkeleton {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.skeletonCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void defineSynchedData(final SynchedEntityData.Builder entityData) {
super.defineSynchedData(entityData);
diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java
index 19ed23a4fc07f3a47f64ceefe1081b3641dfdccb..8188c9e34e0df679e3799bd184790d57f38635be 100644
--- a/net/minecraft/world/entity/monster/skeleton/Stray.java
+++ b/net/minecraft/world/entity/monster/skeleton/Stray.java
@@ -61,6 +61,13 @@ public class Stray extends AbstractSkeleton {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.strayCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
public static boolean checkStraySpawnRules(
final EntityType<Stray> type, final ServerLevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
) {
diff --git a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java
index 5b057a367198f1b39e3e5ade7d48eb04a2a4b324..d8eb5f2b681dab360a9a425e4cfef026799ffae4 100644
--- a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java
+++ b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java
@@ -73,6 +73,13 @@ public class WitherSkeleton extends AbstractSkeleton {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.witherSkeletonCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void registerGoals() {
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true));
diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java
index a823cca07465fa5804eb01759174cbef9becbcca..936369cc110899ac074221be0972bbf6dc7c5847 100644
--- a/net/minecraft/world/entity/monster/zombie/Drowned.java
+++ b/net/minecraft/world/entity/monster/zombie/Drowned.java
@@ -148,6 +148,13 @@ public class Drowned extends Zombie implements RangedAttackMob {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.drownedCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void addBehaviourGoals() {
this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0));
diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java
index 75b57de8caf55d795ce10e115d657998fb86b401..de736df453541a2c4a71de97765581575caba0b7 100644
--- a/net/minecraft/world/entity/monster/zombie/Husk.java
+++ b/net/minecraft/world/entity/monster/zombie/Husk.java
@@ -99,6 +99,13 @@ public class Husk extends Zombie {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.huskCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
public boolean isSunSensitive() {
return this.shouldBurnInDay; // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight
diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java
index 0671b7c2a77d1173d58812abcfcad2461a42d240..7ec2345a45dc62cab2fa363ed24bae4bca02db72 100644
--- a/net/minecraft/world/entity/monster/zombie/Zombie.java
+++ b/net/minecraft/world/entity/monster/zombie/Zombie.java
@@ -167,6 +167,13 @@ public class Zombie extends Monster {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.zombieCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void registerGoals() {
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
diff --git a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java
index e4be264d71c7980047194a86c5681020e822a67a..23a5cee36253c222d383cc8e9d5e492231da131e 100644
--- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java
+++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java
@@ -147,6 +147,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.zombieVillagerCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void defineSynchedData(final SynchedEntityData.Builder entityData) {
super.defineSynchedData(entityData);
diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java
index 2c0f08308430356a44a61d9b7a94609f340b454d..8245dcf59c17d98a01ee509350bd79efca2b1bb3 100644
--- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java
+++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java
@@ -124,6 +124,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob {
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.zombifiedPiglinCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
protected void addBehaviourGoals() {
this.goalSelector.addGoal(1, new SpearUseGoal<>(this, 1.0, 1.0, 10.0F, 2.0F));
diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java
index 64a6f4517f581f64a71382bdb302b71c68dc5396..a1ff5e589516bb46236ef1408f0f4f2f1387e72a 100644
--- a/net/minecraft/world/entity/npc/villager/Villager.java
+++ b/net/minecraft/world/entity/npc/villager/Villager.java
@@ -289,6 +289,13 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re
}
// Purpur end - Mobs always drop experience
+ // Purpur start - Check mobGriefing Overrides
+ @Override
+ protected Boolean checkEntityPickUpLootOverride() {
+ return this.level().purpurConfig.villagerCanPickUpLoot;
+ }
+ // Purpur end - Check mobGriefing Overrides
+
@Override
public Brain<Villager> getBrain() {
return (Brain<Villager>)super.getBrain();
diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java
index f37710c48aafb11d65b99e4d37ef1382a8a36417..23a541f8d740d19df59b9e024156f497326a41cb 100644
--- a/net/minecraft/world/entity/raid/Raider.java
+++ b/net/minecraft/world/entity/raid/Raider.java
@@ -398,7 +398,7 @@ public abstract class Raider extends PatrollingMonster {
}
private boolean cannotPickUpBanner() {
- if (!getServerLevel(this.mob).getGameRules().get(net.minecraft.world.level.gamerules.GameRules.MOB_GRIEFING, this.mob.level().purpurConfig.pillagerMobGriefingOverride)) return true; // Paper - respect game and entity rules for picking up items // Purpur - Add mobGriefing override to everything affected
+ if (!getServerLevel(this.mob).getGameRules().get(net.minecraft.world.level.gamerules.GameRules.MOB_GRIEFING, this.mob.level().purpurConfig.pillagerCanPickUpLoot)) return true; // Paper - respect game and entity rules for picking up items // Purpur - Check mobGriefing Overrides
if (!this.mob.hasActiveRaid()) {
return true;
}