From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 4 May 2019 01:10:30 -0500
Subject: [PATCH] Cows eat mushrooms


diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 7cafc89e048e43f339f5289f38674b18d052e70d..4edb489012ddc9454e412f06acc4587a3572c8d3 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -2791,6 +2791,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
         this.invulnerable = flag;
     }
 
+    public void copyPositionRotation(Entity entity) { this.u(entity); } // Purpur - OBFHELPER
     public void u(Entity entity) {
         this.setPositionRotation(entity.locX(), entity.locY(), entity.locZ(), entity.yaw, entity.pitch);
     }
diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java
index 42e6761c8b18b79ffd3f4d5e853ea87a2c153c23..cfb009c811bd2908d38da1b0007cb7aaed4e42c3 100644
--- a/src/main/java/net/minecraft/server/EntityCow.java
+++ b/src/main/java/net/minecraft/server/EntityCow.java
@@ -16,6 +16,7 @@ public class EntityCow extends EntityAnimal {
         this.goalSelector.a(0, new PathfinderGoalFloat(this));
         this.goalSelector.a(1, new PathfinderGoalPanic(this, 2.0D));
         this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D));
+        if (world.purpurConfig.cowFeedMushrooms > 0) this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.25D, RecipeItemStack.a(Items.WHEAT, Blocks.RED_MUSHROOM.getItem(), Blocks.BROWN_MUSHROOM.getItem()), false)); else // Purpur
         this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.25D, RecipeItemStack.a(Items.WHEAT), false));
         this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.25D));
         this.goalSelector.a(5, new PathfinderGoalRandomStrollLand(this, 1.0D));
@@ -70,11 +71,80 @@ public class EntityCow extends EntityAnimal {
 
             entityhuman.a(enumhand, itemstack1);
             return EnumInteractionResult.a(this.world.isClientSide);
+        // Purpur start - feed mushroom to change to mooshroom
+        } else if (world.purpurConfig.cowFeedMushrooms > 0 && getEntityType() != EntityTypes.MOOSHROOM && isMushroom(itemstack)) {
+            return feedMushroom(entityhuman, itemstack);
+        // Purpur end
         } else {
             return super.b(entityhuman, enumhand);
         }
     }
 
+    // Purpur start - feed mushroom to change to mooshroom
+    private int redMushroomsFed = 0;
+    private int brownMushroomsFed = 0;
+
+    private boolean isMushroom(ItemStack itemstack) {
+        return itemstack.getItem() == Blocks.RED_MUSHROOM.getItem() || itemstack.getItem() == Blocks.BROWN_MUSHROOM.getItem();
+    }
+
+    private int incrementFeedCount(ItemStack itemstack) {
+        if (itemstack.getItem() == Blocks.RED_MUSHROOM.getItem()) {
+            return ++redMushroomsFed;
+        } else {
+            return ++brownMushroomsFed;
+        }
+    }
+
+    private EnumInteractionResult feedMushroom(EntityHuman entityhuman, ItemStack itemstack) {
+        world.broadcastEntityEffect(this, (byte) 18); // hearts
+        playSound(SoundEffects.ENTITY_COW_MILK, 1.0F, 1.0F);
+        if (incrementFeedCount(itemstack) < world.purpurConfig.cowFeedMushrooms) {
+            if (!entityhuman.abilities.canInstantlyBuild) {
+                itemstack.subtract(1);
+            }
+            return EnumInteractionResult.CONSUME; // require 5 mushrooms to transform (prevents mushroom duping)
+        }
+        EntityMushroomCow mooshroom = EntityTypes.MOOSHROOM.create(world);
+        if (mooshroom == null) {
+            return EnumInteractionResult.PASS;
+        }
+        if (itemstack.getItem() == Blocks.BROWN_MUSHROOM.getItem()) {
+            mooshroom.setVariant(EntityMushroomCow.Type.BROWN);
+        } else {
+            mooshroom.setVariant(EntityMushroomCow.Type.RED);
+        }
+        mooshroom.setPositionRotation(this.locX(), this.locY(), this.locZ(), this.yaw, this.pitch);
+        mooshroom.setHealth(this.getHealth());
+        mooshroom.setAge(getAge());
+        mooshroom.copyPositionRotation(this);
+        mooshroom.setRenderYawOffset(this.getRenderYawOffset());
+        mooshroom.setHeadRotation(this.getHeadRotation());
+        mooshroom.lastYaw = this.lastYaw;
+        mooshroom.lastPitch = this.lastPitch;
+        if (this.hasCustomName()) {
+            mooshroom.setCustomName(this.getCustomName());
+        }
+        if (CraftEventFactory.callEntityTransformEvent(this, mooshroom, org.bukkit.event.entity.EntityTransformEvent.TransformReason.INFECTION).isCancelled()) {
+            return EnumInteractionResult.PASS;
+        }
+        if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), mooshroom.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.INFECTED).callEvent()) {
+            return EnumInteractionResult.PASS;
+        }
+        this.world.addEntity(mooshroom);
+        this.die();
+        if (!entityhuman.abilities.canInstantlyBuild) {
+            itemstack.subtract(1);
+        }
+        for (int i = 0; i < 15; ++i) {
+            ((WorldServer) world).sendParticles(((WorldServer) world).players, null, Particles.HAPPY_VILLAGER,
+                    locX() + random.nextFloat(), locY() + (random.nextFloat() * 2), locZ() + random.nextFloat(), 1,
+                    random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, 0, true);
+        }
+        return EnumInteractionResult.SUCCESS;
+    }
+    // Purpur end
+
     @Override
     public EntityCow createChild(WorldServer worldserver, EntityAgeable entityageable) {
         return (EntityCow) EntityTypes.COW.a((World) worldserver);
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 996242d7c62984b67b9443356c509d0c7c85e33a..8cc440e0e7108e2c7ca29b2f8a2fc5a723dcef0d 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -81,7 +81,7 @@ public abstract class EntityLiving extends Entity {
     public int maxNoDamageTicks;
     public final float ay;
     public final float az;
-    public float aA;
+    public float aA; public float getRenderYawOffset() { return this.aA; } public void setRenderYawOffset(float f) { this.aA = f; } // Purpur - OBFHELPER
     public float aB;
     public float aC;
     public float aD;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 9c5de125a6ed207f238dff1e17e38a4083c4c251..0c841b824a93d5e43bad171d1ca828eca3e891df 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -132,6 +132,11 @@ public class PurpurWorldConfig {
         chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate);
     }
 
+    public int cowFeedMushrooms = 0;
+    private void cowSettings() {
+        cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms);
+    }
+
     public double creeperChargedChance = 0.0D;
     private void creeperSettings() {
         creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance);
