163 lines
6.1 KiB
Diff
163 lines
6.1 KiB
Diff
--- ../src-base/minecraft/net/minecraft/entity/EntityLiving.java
|
|
+++ ../src-work/minecraft/net/minecraft/entity/EntityLiving.java
|
|
@@ -38,6 +38,13 @@
|
|
import cpw.mods.fml.common.eventhandler.Event.Result;
|
|
import net.minecraftforge.event.ForgeEventFactory;
|
|
|
|
+// CraftBukkit start
|
|
+import net.minecraft.entity.player.EntityPlayerMP;
|
|
+import org.bukkit.craftbukkit.event.CraftEventFactory;
|
|
+import org.bukkit.event.entity.EntityUnleashEvent;
|
|
+import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason;
|
|
+// CraftBukkit end
|
|
+
|
|
public abstract class EntityLiving extends EntityLivingBase
|
|
{
|
|
public int livingSoundTime;
|
|
@@ -52,9 +59,9 @@
|
|
private EntityLivingBase attackTarget;
|
|
private EntitySenses senses;
|
|
private ItemStack[] equipment = new ItemStack[5];
|
|
- protected float[] equipmentDropChances = new float[5];
|
|
- private boolean canPickUpLoot;
|
|
- private boolean persistenceRequired;
|
|
+ public float[] equipmentDropChances = new float[5]; // CraftBukkit - protected -> public
|
|
+ public boolean canPickUpLoot; // CraftBukkit - private -> public
|
|
+ public boolean persistenceRequired; // CraftBukkit - private -> public
|
|
protected float defaultPitch;
|
|
private Entity currentTarget;
|
|
protected int numTicksToChaseTarget;
|
|
@@ -311,9 +318,23 @@
|
|
public void readEntityFromNBT(NBTTagCompound p_70037_1_)
|
|
{
|
|
super.readEntityFromNBT(p_70037_1_);
|
|
- this.setCanPickUpLoot(p_70037_1_.getBoolean("CanPickUpLoot"));
|
|
- this.persistenceRequired = p_70037_1_.getBoolean("PersistenceRequired");
|
|
+ // CraftBukkit start - If looting or persistence is false only use it if it was set after we started using it
|
|
+ boolean data = p_70037_1_.getBoolean("CanPickUpLoot");
|
|
|
|
+ if (isLevelAtLeast(p_70037_1_, 1) || data)
|
|
+ {
|
|
+ this.canPickUpLoot = data;
|
|
+ }
|
|
+
|
|
+ data = p_70037_1_.getBoolean("PersistenceRequired");
|
|
+
|
|
+ if (isLevelAtLeast(p_70037_1_, 1) || data)
|
|
+ {
|
|
+ this.persistenceRequired = data;
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
+
|
|
if (p_70037_1_.hasKey("CustomName", 8) && p_70037_1_.getString("CustomName").length() > 0)
|
|
{
|
|
this.setCustomNameTag(p_70037_1_.getString("CustomName"));
|
|
@@ -521,15 +542,36 @@
|
|
this.entityAge = 0;
|
|
}
|
|
}
|
|
+ // Cauldron start - Force despawn of entity if a player isn't near
|
|
+ else if (this.worldObj.cauldronConfig.entityDespawnImmediate && this.canDespawn())
|
|
+ {
|
|
+ this.despawn("No Player : Immediate");
|
|
+ }
|
|
+ // Cauldron end
|
|
}
|
|
}
|
|
|
|
+ // Cauldron start
|
|
+ private void despawn(String reason) {
|
|
+ this.setDead();
|
|
+ net.minecraftforge.cauldron.CauldronHooks.logEntityDespawn(this, reason);
|
|
+ }
|
|
+ // Cauldron end
|
|
+
|
|
protected void updateAITasks()
|
|
{
|
|
++this.entityAge;
|
|
this.worldObj.theProfiler.startSection("checkDespawn");
|
|
this.despawnEntity();
|
|
this.worldObj.theProfiler.endSection();
|
|
+
|
|
+ // Spigot Start
|
|
+ if (this.fromMobSpawner)
|
|
+ {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ // Spigot End
|
|
this.worldObj.theProfiler.startSection("sensing");
|
|
this.senses.clearSensingCache();
|
|
this.worldObj.theProfiler.endSection();
|
|
@@ -1005,6 +1047,14 @@
|
|
{
|
|
if (this.getLeashed() && this.getLeashedToEntity() == p_130002_1_)
|
|
{
|
|
+ // CraftBukkit start
|
|
+ if (CraftEventFactory.callPlayerUnleashEntityEvent(this, p_130002_1_).isCancelled())
|
|
+ {
|
|
+ ((EntityPlayerMP) p_130002_1_).playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, this, this.getLeashedToEntity()));
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
this.clearLeashed(true, !p_130002_1_.capabilities.isCreativeMode);
|
|
return true;
|
|
}
|
|
@@ -1016,6 +1066,14 @@
|
|
{
|
|
if (!(this instanceof EntityTameable) || !((EntityTameable)this).isTamed())
|
|
{
|
|
+ // CraftBukkit start
|
|
+ if (CraftEventFactory.callPlayerLeashEntityEvent(this, p_130002_1_, p_130002_1_).isCancelled())
|
|
+ {
|
|
+ ((EntityPlayerMP) p_130002_1_).playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, this, this.getLeashedToEntity()));
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
this.setLeashedToEntity(p_130002_1_, true);
|
|
--itemstack.stackSize;
|
|
return true;
|
|
@@ -1023,6 +1081,14 @@
|
|
|
|
if (((EntityTameable)this).func_152114_e(p_130002_1_))
|
|
{
|
|
+ // CraftBukkit start
|
|
+ if (CraftEventFactory.callPlayerLeashEntityEvent(this, p_130002_1_, p_130002_1_).isCancelled())
|
|
+ {
|
|
+ ((EntityPlayerMP) p_130002_1_).playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, this, this.getLeashedToEntity()));
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
this.setLeashedToEntity(p_130002_1_, true);
|
|
--itemstack.stackSize;
|
|
return true;
|
|
@@ -1049,6 +1115,7 @@
|
|
{
|
|
if (this.leashedToEntity == null || this.leashedToEntity.isDead)
|
|
{
|
|
+ this.worldObj.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.HOLDER_GONE)); // CraftBukkit
|
|
this.clearLeashed(true, true);
|
|
}
|
|
}
|
|
@@ -1136,10 +1203,16 @@
|
|
}
|
|
else
|
|
{
|
|
+ this.worldObj.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit
|
|
this.clearLeashed(false, true);
|
|
}
|
|
}
|
|
|
|
this.field_110170_bx = null;
|
|
}
|
|
+
|
|
+ public boolean canDespawn_CB()
|
|
+ {
|
|
+ return this.canDespawn();
|
|
+ }
|
|
}
|