You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
6.1 KiB
141 lines
6.1 KiB
--- ../src-base/minecraft/net/minecraft/entity/projectile/EntityArrow.java |
|
+++ ../src-work/minecraft/net/minecraft/entity/projectile/EntityArrow.java |
|
@@ -23,6 +23,13 @@ |
|
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 +37,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 +68,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 +99,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 +208,7 @@ |
|
{ |
|
++this.ticksInGround; |
|
|
|
- if (this.ticksInGround == 1200) |
|
+ if (this.ticksInGround == worldObj.getSpigotConfig().arrowDespawnRate) // Spigot // Cauldron |
|
{ |
|
this.setDead(); |
|
} |
|
@@ -246,7 +255,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 +286,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 +309,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 +508,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 +591,11 @@ |
|
byte b0 = this.dataWatcher.getWatchableObjectByte(16); |
|
return (b0 & 1) != 0; |
|
} |
|
+ |
|
+ // CraftBukkit start |
|
+ public boolean isInGround() |
|
+ { |
|
+ return inGround; |
|
+ } |
|
+ // CraftBukkit end |
|
}
|
|
|