private synchronized boolean fire() {
Entity itemShot = getCloseEntityIfUpgraded();
if (getPressure() >= PneumaticValues.MIN_PRESSURE_AIR_CANNON && (itemShot != null || !inventory.getStackInSlot(CANNON_SLOT).isEmpty())) {
double[] velocity = getVelocityVector(heightAngle, rotationAngle, getForce());
addAir((int) (-500 * getForce()));
boolean shootingInventory = false;
if (itemShot == null) {
shootingInventory = true;
itemShot = getPayloadEntity();
if (itemShot instanceof EntityItem) {
inventory.setStackInSlot(CANNON_SLOT, ItemStack.EMPTY);
if (getUpgrades(EnumUpgrade.BLOCK_TRACKER) > 0) {
trackedItems.add((EntityItem) itemShot);
}
} else {
inventory.extractItem(CANNON_SLOT, 1, false);
}
} else if (itemShot instanceof EntityPlayer) {
EntityPlayerMP entityplayermp = (EntityPlayerMP) itemShot;
if (entityplayermp.connection.getNetworkManager().isChannelOpen()) {
//This is a nasty hack to get around "player moved wrongly!" messages, which can be caused if player movement
// triggers a player teleport (e.g. player moves onto pressure plate, triggers air cannon with an entity tracker).
entityplayermp.invulnerableDimensionChange = true;
entityplayermp.setPositionAndUpdate(getPos().getX() + 0.5D, getPos().getY() + 1.8D, getPos().getZ() + 0.5D);
}
}
if (itemShot.isRiding()) {
itemShot.dismountRidingEntity();
}
itemShot.setPosition(getPos().getX() + 0.5D, getPos().getY() + 1.8D, getPos().getZ() + 0.5D);
NetworkHandler.sendToAllAround(new PacketSetEntityMotion(itemShot, velocity[0], velocity[1], velocity[2]),
new TargetPoint(getWorld().provider.getDimension(), getPos().getX(), getPos().getY(), getPos().getZ(), 64));
if (itemShot instanceof EntityFireball) {
velocity[0] *= 0.05D;
velocity[1] *= 0.05D;
velocity[2] *= 0.05D;
}
itemShot.motionX = velocity[0];
itemShot.motionY = velocity[1];
itemShot.motionZ = velocity[2];
itemShot.onGround = false;
itemShot.collided = false;
itemShot.collidedHorizontally = false;
itemShot.collidedVertically = false;
if (itemShot instanceof EntityLivingBase) ((EntityLivingBase) itemShot).setJumping(true);
if (shootingInventory && !getWorld().isRemote) getWorld().spawnEntity(itemShot);
for (int i = 0; i < 10; i++) {
double velX = velocity[0] * 0.4D + (rand.nextGaussian() - 0.5D) * 0.05D;
double velY = velocity[1] * 0.4D + (rand.nextGaussian() - 0.5D) * 0.05D;
double velZ = velocity[2] * 0.4D + (rand.nextGaussian() - 0.5D) * 0.05D;
NetworkHandler.sendToAllAround(new PacketSpawnParticle(EnumParticleTypes.SMOKE_LARGE, getPos().getX() + 0.5D, getPos().getY() + 0.7D, getPos().getZ() + 0.5D, velX, velY, velZ), getWorld());
}
NetworkHandler.sendToAllAround(new PacketPlaySound(Sounds.CANNON_SOUND, SoundCategory.BLOCKS, getPos().getX(), getPos().getY(), getPos().getZ(), 1.0F, rand.nextFloat() / 4F + 0.75F, true), getWorld());
return true;
} else {
return false;
}
}
TileEntityAirCannon.java 文件源码
java
阅读 21
收藏 0
点赞 0
评论 0
项目:pnc-repressurized
作者:
评论列表
文章目录