--- ../src-base/minecraft/net/minecraft/entity/projectile/EntityArrow.java +++ ../src-work/minecraft/net/minecraft/entity/projectile/EntityArrow.java @@ -2,7 +2,9 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; + import java.util.List; + import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.enchantment.EnchantmentHelper; @@ -23,6 +25,14 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; +// CraftBukkit start +import net.minecraft.entity.item.EntityItem; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.entity.EntityCombustByEntityEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +// CraftBukkit end + public class EntityArrow extends Entity implements IProjectile { private int field_145791_d = -1; @@ -30,14 +40,14 @@ private int field_145789_f = -1; private Block field_145790_g; private int inData; - private boolean inGround; + public boolean inGround = false; // Spigot - private -> public public int canBePickedUp; public int arrowShake; public Entity shootingEntity; private int ticksInGround; private int ticksInAir; private double damage = 2.0D; - private int knockbackStrength; + public int knockbackStrength; // CraftBukkit - private -> public private static final String __OBFID = "CL_00001715"; public EntityArrow(World p_i1753_1_) @@ -61,6 +71,7 @@ super(p_i1755_1_); this.renderDistanceWeight = 10.0D; this.shootingEntity = p_i1755_2_; + this.projectileSource = (LivingEntity) p_i1755_2_.getBukkitEntity(); // CraftBukkit if (p_i1755_2_ instanceof EntityPlayer) { @@ -91,6 +102,7 @@ super(p_i1756_1_); this.renderDistanceWeight = 10.0D; this.shootingEntity = p_i1756_2_; + this.projectileSource = (LivingEntity) p_i1756_2_.getBukkitEntity(); // CraftBukkit if (p_i1756_2_ instanceof EntityPlayer) { @@ -199,7 +211,7 @@ { ++this.ticksInGround; - if (this.ticksInGround == 1200) + if (this.ticksInGround == worldObj.getSpigotConfig().arrowDespawnRate) // Spigot // Cauldron { this.setDead(); } @@ -246,7 +258,7 @@ if (movingobjectposition1 != null) { - double d1 = vec31.distanceTo(movingobjectposition1.hitVec); + double d1 = vec31.squareDistanceTo(movingobjectposition1.hitVec); // CraftBukkit - distance efficiency if (d1 < d0 || d0 == 0.0D) { @@ -277,6 +289,8 @@ if (movingobjectposition != null) { + org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // CraftBukkit - Call event + if (movingobjectposition.entityHit != null) { f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); @@ -298,13 +312,23 @@ damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity); } - if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) + // CraftBukkit start - Moved damage call + if (movingobjectposition.entityHit.attackEntityFrom(damagesource, k)) { - movingobjectposition.entityHit.setFire(5); - } + if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman) && (!(movingobjectposition.entityHit instanceof EntityPlayerMP) || !(this.shootingEntity instanceof EntityPlayerMP) || this.worldObj.pvpMode)) // CraftBukkit - abide by pvp setting if destination is a player + { + EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 5); + org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); - if (movingobjectposition.entityHit.attackEntityFrom(damagesource, (float)k)) - { + if (!combustEvent.isCancelled()) + { + movingobjectposition.entityHit.setFire(combustEvent.getDuration()); + } + + // CraftBukkit end + } + + // if (movingobjectposition.entityHit.attackEntityFrom(damagesource, (float)k)) { // CraftBukkit - moved up if (movingobjectposition.entityHit instanceof EntityLivingBase) { EntityLivingBase entitylivingbase = (EntityLivingBase)movingobjectposition.entityHit; @@ -487,6 +511,23 @@ { if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) { + // CraftBukkit start + ItemStack itemstack = new ItemStack(Items.arrow); + + if (this.canBePickedUp == 1 && p_70100_1_.inventory.canHold(itemstack) > 0) + { + EntityItem item = new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, itemstack); + PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) p_70100_1_.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.worldObj.getServer(), this, item), 0); + // event.setCancelled(!entityplayer.canPickUpLoot); TODO + this.worldObj.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + return; + } + } + + // CraftBukkit end boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && p_70100_1_.capabilities.isCreativeMode; if (this.canBePickedUp == 1 && !p_70100_1_.inventory.addItemStackToInventory(new ItemStack(Items.arrow, 1))) @@ -553,4 +594,18 @@ byte b0 = this.dataWatcher.getWatchableObjectByte(16); return (b0 & 1) != 0; } + + // CraftBukkit start + public boolean isInGround() + { + return inGround; + } + // CraftBukkit end + + // Cauldron start + @Override + public boolean entityProjectileHook() { + return true; + } + // Cauldron end }