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 327982be3748e82a36c7a24ede989dacebfb04db..1b173556470d0f66b1c4a06384f268a910da50ad 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -554,7 +554,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab && 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 itemEntity : this.level() @@ -576,6 +576,12 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab profilerFiller.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 ea7666cc10aee49e13dbdd6e3367fabaa0dcbc17..8635ecfa49e2504c981dd48acbfbca5303a37611 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java @@ -175,6 +175,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.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java index f35f845e3e18c0bb0e4a076298c30be2ae479792..98937a998f55ee462421a7477cc3e2fbf4e75ba3 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java @@ -808,6 +808,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(ServerLevel level, DamageSource damageSource) { diff --git a/net/minecraft/world/entity/monster/illager/Pillager.java b/net/minecraft/world/entity/monster/illager/Pillager.java index 68fe150d0da04084690670f29a0a4ea035e8c921..1a283185ac03ba44bae531f9b234703fa213df1a 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 367c74123ee9d07795527eec6ba2f83a9e953081..97bf22925df40a2f757b50f3fc7cbefc951443bb 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 49ed463ae7ef65b2630a5b914689e04fa729a40c..6f1c3d423b7a37aa261c78a0c8f5e1cb02eee320 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -180,6 +180,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(ValueOutput output) { super.addAdditionalSaveData(output); @@ -462,7 +469,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ServerLevel level, ItemStack stack) { - return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Add mobGriefing override to everything affected + return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinCanPickUpLoot) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Check mobGriefing Overrides } protected boolean canReplaceCurrentItem(ItemStack candidate) { diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java index 7baccc23f868ac9b8720bfd77b2af6b7dd368820..91f1e6b1c916b06914c32b268b8b8c2eb3c49ce2 100644 --- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -104,6 +104,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 f1e9cec85ce911a50bb83eff9228d6b98aa00d44..59c986a28a5546a9070ec9bcf3f1994317b47fff 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(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java index 03e441e7e9033961dbcf60e574fae48621513c87..304e6e23a616ddc3312ef27ae5d94c927a52fb80 100644 --- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java +++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java @@ -64,6 +64,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(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java index 5cea4ff662c7136d2778b84c21f368cb5ac1c81a..262bea9ca0daba064d2e74223b47eb1fbb761479 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( EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random ) { diff --git a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java index 40134013e3254c6c6ed370150adb4bda7c0f2d9a..c01f182e65b7891dfdd7b92ff2c6e2cf3a8a0374 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 abafb96df26b3d987ce3ec3e1e96e8fc20cb5b6b..51e9c23436b620c32c4e5a5448fac8ae67c1dcc0 100644 --- a/net/minecraft/world/entity/monster/zombie/Drowned.java +++ b/net/minecraft/world/entity/monster/zombie/Drowned.java @@ -140,6 +140,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 ef289dd3fe0be980c200affb0b84a1066fe52232..d1390e0a88de89b3dc381449ef98a89b327eb4c9 100644 --- a/net/minecraft/world/entity/monster/zombie/Husk.java +++ b/net/minecraft/world/entity/monster/zombie/Husk.java @@ -90,6 +90,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 f14fc03577a94dc6bd6e536e819a32c2d6144f02..5223f68d2e20909e4df716fa86f7ad92c987a062 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java @@ -157,6 +157,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 a9a04a4c9cedf33b68c99b2aec12289e63fa156b..9797e206a3038c3af23495b8bfd70424e4bbd4a5 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java @@ -145,6 +145,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(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java index 528baf4ca71725d4af6876d195b6d75fdab5ca58..2d6b6bbd06d0a0443e4c32e3c9aecfe8716e1a55 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java @@ -120,6 +120,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 996468c21a79d698a8d842189ffd4f2dc86a4302..0c110421074d57e7283168c1133cd4ee314b57f6 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -296,6 +296,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // 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 b03faa7600f182a12c3a739deefc38028cf45615..60e9511bd17b6fe08009163814500ec682847fc5 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; } else if (this.mob.getCurrentRaid().isOver()) {