From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <Blake.Galbreath@GMail.com>
Date: Sat, 29 Sep 2018 16:08:23 -0500
Subject: [PATCH] Turtle API


diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalGotoTarget.java b/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalGotoTarget.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalGotoTarget.java
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalGotoTarget.java
@@ -0,0 +0,0 @@ public abstract class PathfinderGoalGotoTarget extends PathfinderGoal {
     protected int c;
     protected int d;
     private int g;
-    protected BlockPosition e;
+    protected BlockPosition e;public final BlockPosition getTargetPosition() { return this.e; } // Paper - OBFHELPER
     private boolean h;
     private final int i;
     private final int j;
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityTurtle.java b/src/main/java/net/minecraft/world/entity/animal/EntityTurtle.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityTurtle.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityTurtle.java
@@ -0,0 +0,0 @@ import net.minecraft.nbt.NBTTagCompound;
 import net.minecraft.network.syncher.DataWatcher;
 import net.minecraft.network.syncher.DataWatcherObject;
 import net.minecraft.network.syncher.DataWatcherRegistry;
+import net.minecraft.server.MCUtil;
 import net.minecraft.server.level.EntityPlayer;
 import net.minecraft.server.level.WorldServer;
 import net.minecraft.sounds.SoundCategory;
@@ -0,0 +0,0 @@ public class EntityTurtle extends EntityAnimal {
         this.datawatcher.set(EntityTurtle.bp, blockposition);
     }
 
-    private BlockPosition getHomePos() {
+    public BlockPosition getHomePos() { // Paper - public
         return (BlockPosition) this.datawatcher.get(EntityTurtle.bp);
     }
 
@@ -0,0 +0,0 @@ public class EntityTurtle extends EntityAnimal {
         return (Boolean) this.datawatcher.get(EntityTurtle.bq);
     }
 
-    private void setHasEgg(boolean flag) {
+    public void setHasEgg(boolean flag) { // Paper
         this.datawatcher.set(EntityTurtle.bq, flag);
     }
 
+    public final boolean isDigging() { return this.eL(); } // Paper - OBFHELPER
     public boolean eL() {
         return (Boolean) this.datawatcher.get(EntityTurtle.br);
     }
 
+    public final void setDigging(boolean digging) { this.u(digging); } // Paper - OBFHELPER
     private void u(boolean flag) {
         this.bv = flag ? 1 : 0;
         this.datawatcher.set(EntityTurtle.br, flag);
     }
 
+    public final boolean isGoingHome() { return this.eU(); } // Paper - OBFHELPER
     private boolean eU() {
         return (Boolean) this.datawatcher.get(EntityTurtle.bt);
     }
 
+    public final void setGoingHome(boolean goingHome) { this.v(goingHome); } // Paper - OBFHELPER
     private void v(boolean flag) {
         this.datawatcher.set(EntityTurtle.bt, flag);
     }
 
+    public final boolean isTravelling() { return this.eV(); } // Paper - OBFHELPER
     private boolean eV() {
         return (Boolean) this.datawatcher.get(EntityTurtle.bu);
     }
 
+    public final void setTravelling(boolean travelling) { this.w(travelling); } // Paper - OBFHELPER
     private void w(boolean flag) {
         this.datawatcher.set(EntityTurtle.bu, flag);
     }
@@ -0,0 +0,0 @@ public class EntityTurtle extends EntityAnimal {
 
             if (!this.g.isInWater() && this.l()) {
                 if (this.g.bv < 1) {
-                    this.g.u(true);
+                    this.g.setDigging(new com.destroystokyo.paper.event.entity.TurtleStartDiggingEvent((org.bukkit.entity.Turtle) this.g.getBukkitEntity(), MCUtil.toLocation(this.g.world, this.getTargetPosition())).callEvent()); // Paper
                 } else if (this.g.bv > 200) {
                     World world = this.g.world;
 
                     // CraftBukkit start
-                    if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.g, this.e.up(), (IBlockData) Blocks.TURTLE_EGG.getBlockData().set(BlockTurtleEgg.b, this.g.random.nextInt(4) + 1)).isCancelled()) {
+                    // Paper start
+                    int eggCount = this.g.random.nextInt(4) + 1;
+                    com.destroystokyo.paper.event.entity.TurtleLayEggEvent layEggEvent = new com.destroystokyo.paper.event.entity.TurtleLayEggEvent((org.bukkit.entity.Turtle) this.g.getBukkitEntity(), MCUtil.toLocation(this.g.world, this.e.up()), eggCount);
+                    if (layEggEvent.callEvent() && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.g, this.e.up(), Blocks.TURTLE_EGG.getBlockData().set(BlockTurtleEgg.b, layEggEvent.getEggCount())).isCancelled()) {
                     world.playSound((EntityHuman) null, blockposition, SoundEffects.ENTITY_TURTLE_LAY_EGG, SoundCategory.BLOCKS, 0.3F, 0.9F + world.random.nextFloat() * 0.2F);
-                    world.setTypeAndData(this.e.up(), (IBlockData) Blocks.TURTLE_EGG.getBlockData().set(BlockTurtleEgg.b, this.g.random.nextInt(4) + 1), 3);
+                    world.setTypeAndData(this.e.up(), (IBlockData) Blocks.TURTLE_EGG.getBlockData().set(BlockTurtleEgg.b, layEggEvent.getEggCount()), 3);
                     }
                     // CraftBukkit end
                     this.g.setHasEgg(false);
@@ -0,0 +0,0 @@ public class EntityTurtle extends EntityAnimal {
 
         @Override
         public boolean a() {
-            return this.a.isBaby() ? false : (this.a.hasEgg() ? true : (this.a.getRandom().nextInt(700) != 0 ? false : !this.a.getHomePos().a((IPosition) this.a.getPositionVector(), 64.0D)));
+            return this.a.isBaby() ? false : (this.a.hasEgg() ? true : (this.a.getRandom().nextInt(700) != 0 ? false : !this.a.getHomePos().a((IPosition) this.a.getPositionVector(), 64.0D))) && new com.destroystokyo.paper.event.entity.TurtleGoHomeEvent((org.bukkit.entity.Turtle) this.a.getBukkitEntity()).callEvent(); // Paper
         }
 
         @Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java
@@ -0,0 +0,0 @@ public class CraftTurtle extends CraftAnimals implements Turtle {
     public EntityType getType() {
         return EntityType.TURTLE;
     }
+
+    // Paper start
+    @Override
+    public org.bukkit.Location getHome() {
+        return net.minecraft.server.MCUtil.toLocation(getHandle().world, getHandle().getHomePos());
+    }
+
+    @Override
+    public void setHome(org.bukkit.Location location) {
+        getHandle().setHomePos(net.minecraft.server.MCUtil.toBlockPosition(location));
+    }
+
+    @Override
+    public boolean isGoingHome() {
+        return getHandle().isGoingHome();
+    }
+
+    @Override
+    public boolean isDigging() {
+        return getHandle().isDigging();
+    }
+
+    @Override
+    public boolean hasEgg() {
+        return getHandle().hasEgg();
+    }
+
+    @Override
+    public void setHasEgg(boolean hasEgg) {
+        getHandle().setHasEgg(hasEgg);
+    }
+    // Paper end
 }