From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peashooter101 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 3402444417535121cc9da4924ef9c4dbfb134b0e..a0342618ab9ffc2ed95f69a80c8f627d4d593326 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -571,7 +571,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() @@ -590,6 +590,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 cdca0b9d8765b760b132d65f4141779fd0278324..489e09f26aa3595317e70a26e14ff3018636911e 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 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 a5c8c4cd7fb80ee0fb87eba85b6a3095223b849c..db20e27227430809704b2d6148d0ffa13c7094fe 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java @@ -814,6 +814,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 - Fix MC-153010 (dropCustomDeathLoot is only called when shouldDropLoot = true) protected boolean guaranteedToDropUndamaged(final net.minecraft.world.entity.EquipmentSlot slot) { diff --git a/net/minecraft/world/entity/monster/illager/Pillager.java b/net/minecraft/world/entity/monster/illager/Pillager.java index b0a79d1c96362e2a50d4b3215f7449a7a5fb6e04..ed9052bfa3b9c19ffcc54d74a7a24c36ba476812 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 e3ceb6f928fa428f80c6b2680564c8124b8e888d..61a1c9ab2daf48722678633deec94dc702776b8d 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); @@ -429,7 +436,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 dd55f35c828beb57ae1f995ecbbacb95ef982603..cece76ba9a5c58cc811af1fec415f8e7cd81b3b3 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 f7fe246c39f8588037171f16b6cd80be87b21547..5f78e335e92e11a6640becf1e5bde7803373199e 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 6262140e9f06c870c91fa1e91367ec2abadd6f6d..0b2779ec2917f9221691bf1d2fa9ed0ffbede93f 100644 --- a/net/minecraft/world/entity/monster/skeleton/Stray.java +++ b/net/minecraft/world/entity/monster/skeleton/Stray.java @@ -62,6 +62,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 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 d4b92e44f9c211378f332398e2fc4233b55acf2d..6335b03c39452c2e8e46084e61cefcf8185d2580 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 e797ac2444e7ec5c880db0a747ad301be5d3a94e..890f1d5e48daa41e050cfc3cec8391ed95545311 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 getBrain() { return (Brain)super.getBrain(); diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java index fb25bceaf1535a1a07eef6188b4c3656512415bb..3c68ca6a9f2ccb8eb67f1dbb009222324dff7c8d 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java @@ -396,7 +396,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; }