use of cn.nukkit.entity.Entity in project Nukkit by Nukkit.
the class EntityMinecartAbstract method attack.
@Override
public boolean attack(EntityDamageEvent source) {
if (invulnerable) {
return false;
} else {
Entity damager = ((EntityDamageByEntityEvent) source).getDamager();
boolean instantKill = damager instanceof Player && ((Player) damager).isCreative();
if (!instantKill)
performHurtAnimation((int) source.getFinalDamage());
if (instantKill || getDamage() > 40) {
if (linkedEntity != null) {
mountEntity(linkedEntity);
}
if (instantKill && (!hasCustomName())) {
kill();
} else {
if (level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) {
dropItem();
}
close();
}
}
}
return true;
}
use of cn.nukkit.entity.Entity in project Nukkit by Nukkit.
the class EntityProjectile method onUpdate.
@Override
public boolean onUpdate(int currentTick) {
if (this.closed) {
return false;
}
int tickDiff = currentTick - this.lastUpdate;
if (tickDiff <= 0 && !this.justCreated) {
return true;
}
this.lastUpdate = currentTick;
boolean hasUpdate = this.entityBaseTick(tickDiff);
if (this.isAlive()) {
MovingObjectPosition movingObjectPosition = null;
if (!this.isCollided) {
this.motionY -= this.getGravity();
}
Vector3 moveVector = new Vector3(this.x + this.motionX, this.y + this.motionY, this.z + this.motionZ);
Entity[] list = this.getLevel().getCollidingEntities(this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1, 1, 1), this);
double nearDistance = Integer.MAX_VALUE;
Entity nearEntity = null;
for (Entity entity : list) {
if (/*!entity.canCollideWith(this) or */
(entity == this.shootingEntity && this.ticksLived < 5)) {
continue;
}
AxisAlignedBB axisalignedbb = entity.boundingBox.grow(0.3, 0.3, 0.3);
MovingObjectPosition ob = axisalignedbb.calculateIntercept(this, moveVector);
if (ob == null) {
continue;
}
double distance = this.distanceSquared(ob.hitVector);
if (distance < nearDistance) {
nearDistance = distance;
nearEntity = entity;
}
}
if (nearEntity != null) {
movingObjectPosition = MovingObjectPosition.fromEntity(nearEntity);
}
if (movingObjectPosition != null) {
if (movingObjectPosition.entityHit != null) {
onCollideWithEntity(movingObjectPosition.entityHit);
return true;
}
}
this.move(this.motionX, this.motionY, this.motionZ);
if (this.isCollided && !this.hadCollision) {
// collide with block
this.hadCollision = true;
this.motionX = 0;
this.motionY = 0;
this.motionZ = 0;
this.server.getPluginManager().callEvent(new ProjectileHitEvent(this, MovingObjectPosition.fromBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ(), -1, this)));
return false;
} else if (!this.isCollided && this.hadCollision) {
this.hadCollision = false;
}
if (!this.hadCollision || Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionY) > 0.00001 || Math.abs(this.motionZ) > 0.00001) {
double f = Math.sqrt((this.motionX * this.motionX) + (this.motionZ * this.motionZ));
this.yaw = Math.atan2(this.motionX, this.motionZ) * 180 / Math.PI;
this.pitch = Math.atan2(this.motionY, f) * 180 / Math.PI;
hasUpdate = true;
}
this.updateMovement();
}
return hasUpdate;
}
use of cn.nukkit.entity.Entity in project Nukkit by Nukkit.
the class EntityBoat method attack.
@Override
public boolean attack(EntityDamageEvent source) {
if (invulnerable) {
return false;
} else {
// Event start
VehicleDamageEvent event = new VehicleDamageEvent(this, source.getEntity(), source.getFinalDamage());
getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return false;
}
// Event stop
performHurtAnimation((int) event.getDamage());
boolean instantKill = false;
if (source instanceof EntityDamageByEntityEvent) {
Entity damager = ((EntityDamageByEntityEvent) source).getDamager();
instantKill = damager instanceof Player && ((Player) damager).isCreative();
}
if (instantKill || getDamage() > 40) {
// Event start
VehicleDestroyEvent event2 = new VehicleDestroyEvent(this, source.getEntity());
getServer().getPluginManager().callEvent(event2);
if (event2.isCancelled()) {
return false;
}
// Event stop
if (linkedEntity != null) {
mountEntity(linkedEntity);
}
if (instantKill && (!hasCustomName())) {
kill();
} else {
if (level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) {
this.level.dropItem(this, new ItemBoat());
}
close();
}
}
}
return true;
}
use of cn.nukkit.entity.Entity in project Nukkit by Nukkit.
the class Explosion method explodeB.
public boolean explodeB() {
HashMap<BlockVector3, Boolean> updateBlocks = new HashMap<>();
List<Vector3> send = new ArrayList<>();
Vector3 source = (new Vector3(this.source.x, this.source.y, this.source.z)).floor();
double yield = (1d / this.size) * 100d;
if (this.what instanceof Entity) {
EntityExplodeEvent ev = new EntityExplodeEvent((Entity) this.what, this.source, this.affectedBlocks, yield);
this.level.getServer().getPluginManager().callEvent(ev);
if (ev.isCancelled()) {
return false;
} else {
yield = ev.getYield();
this.affectedBlocks = ev.getBlockList();
}
}
double explosionSize = this.size * 2d;
double minX = NukkitMath.floorDouble(this.source.x - explosionSize - 1);
double maxX = NukkitMath.ceilDouble(this.source.x + explosionSize + 1);
double minY = NukkitMath.floorDouble(this.source.y - explosionSize - 1);
double maxY = NukkitMath.ceilDouble(this.source.y + explosionSize + 1);
double minZ = NukkitMath.floorDouble(this.source.z - explosionSize - 1);
double maxZ = NukkitMath.ceilDouble(this.source.z + explosionSize + 1);
AxisAlignedBB explosionBB = new SimpleAxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ);
Entity[] list = this.level.getNearbyEntities(explosionBB, this.what instanceof Entity ? (Entity) this.what : null);
for (Entity entity : list) {
double distance = entity.distance(this.source) / explosionSize;
if (distance <= 1) {
Vector3 motion = entity.subtract(this.source).normalize();
int exposure = 1;
double impact = (1 - distance) * exposure;
int damage = (int) (((impact * impact + impact) / 2) * 8 * explosionSize + 1);
if (this.what instanceof Entity) {
entity.attack(new EntityDamageByEntityEvent((Entity) this.what, entity, DamageCause.ENTITY_EXPLOSION, damage));
} else if (this.what instanceof Block) {
entity.attack(new EntityDamageByBlockEvent((Block) this.what, entity, DamageCause.BLOCK_EXPLOSION, damage));
} else {
entity.attack(new EntityDamageEvent(entity, DamageCause.BLOCK_EXPLOSION, damage));
}
entity.setMotion(motion.multiply(impact));
}
}
ItemBlock air = new ItemBlock(new BlockAir());
// Iterator iter = this.affectedBlocks.entrySet().iterator();
for (Block block : this.affectedBlocks) {
// Block block = (Block) ((HashMap.Entry) iter.next()).getValue();
if (block.getId() == Block.TNT) {
((BlockTNT) block).prime(new NukkitRandom().nextRange(10, 30));
} else if (Math.random() * 100 < yield) {
for (Item drop : block.getDrops(air)) {
this.level.dropItem(block.add(0.5, 0.5, 0.5), drop);
}
}
this.level.setBlockIdAt((int) block.x, (int) block.y, (int) block.z, 0);
Vector3 pos = new Vector3(block.x, block.y, block.z);
for (BlockFace side : BlockFace.values()) {
Vector3 sideBlock = pos.getSide(side);
BlockVector3 index = Level.blockHash((int) sideBlock.x, (int) sideBlock.y, (int) sideBlock.z);
if (!this.affectedBlocks.contains(sideBlock) && !updateBlocks.containsKey(index)) {
BlockUpdateEvent ev = new BlockUpdateEvent(this.level.getBlock(sideBlock));
this.level.getServer().getPluginManager().callEvent(ev);
if (!ev.isCancelled()) {
ev.getBlock().onUpdate(Level.BLOCK_UPDATE_NORMAL);
}
updateBlocks.put(index, true);
}
}
send.add(new Vector3(block.x - source.x, block.y - source.y, block.z - source.z));
}
ExplodePacket pk = new ExplodePacket();
pk.x = (float) this.source.x;
pk.y = (float) this.source.y;
pk.z = (float) this.source.z;
pk.radius = (float) this.size;
pk.records = send.stream().toArray(Vector3[]::new);
this.level.addChunkPacket((int) source.x >> 4, (int) source.z >> 4, pk);
this.level.addParticle(new HugeExplodeSeedParticle(this.source));
this.level.addSound(new Vector3(this.source.x, this.source.y, this.source.z), Sound.RANDOM_EXPLODE);
return true;
}
use of cn.nukkit.entity.Entity in project Nukkit by Nukkit.
the class Level method useItemOn.
public Item useItemOn(Vector3 vector, Item item, BlockFace face, float fx, float fy, float fz, Player player, boolean playSound) {
Block target = this.getBlock(vector);
Block block = target.getSide(face);
if (block.y > 255 || block.y < 0) {
return null;
}
if (target.getId() == Item.AIR) {
return null;
}
if (player != null) {
PlayerInteractEvent ev = new PlayerInteractEvent(player, item, target, face, target.getId() == 0 ? Action.RIGHT_CLICK_AIR : Action.RIGHT_CLICK_BLOCK);
if (player.getGamemode() > 2) {
ev.setCancelled();
}
int distance = this.server.getSpawnRadius();
if (!player.isOp() && distance > -1) {
Vector2 t = new Vector2(target.x, target.z);
Vector2 s = new Vector2(this.getSpawnLocation().x, this.getSpawnLocation().z);
if (!this.server.getOps().getAll().isEmpty() && t.distance(s) <= distance) {
ev.setCancelled();
}
}
this.server.getPluginManager().callEvent(ev);
if (!ev.isCancelled()) {
target.onUpdate(BLOCK_UPDATE_TOUCH);
if ((!player.isSneaking() || player.getInventory().getItemInHand().isNull()) && target.canBeActivated() && target.onActivate(item, player)) {
return item;
}
if (item.canBeActivated() && item.onActivate(this, player, block, target, face, fx, fy, fz)) {
if (item.getCount() <= 0) {
item = new ItemBlock(new BlockAir(), 0, 0);
return item;
}
}
} else {
return null;
}
} else if (target.canBeActivated() && target.onActivate(item, null)) {
return item;
}
Block hand;
if (item.canBePlaced()) {
hand = item.getBlock();
hand.position(block);
} else {
return null;
}
if (!(block.canBeReplaced() || (hand.getId() == Item.SLAB && block.getId() == Item.SLAB))) {
return null;
}
if (target.canBeReplaced()) {
block = target;
hand.position(block);
}
if (!hand.canPassThrough() && hand.getBoundingBox() != null) {
Entity[] entities = this.getCollidingEntities(hand.getBoundingBox());
int realCount = 0;
for (Entity e : entities) {
if (e instanceof EntityArrow || e instanceof EntityItem || (e instanceof Player && ((Player) e).isSpectator())) {
continue;
}
++realCount;
}
if (player != null) {
Vector3 diff = player.getNextPosition().subtract(player.getPosition());
if (diff.lengthSquared() > 0.00001) {
AxisAlignedBB bb = player.getBoundingBox().getOffsetBoundingBox(diff.x, diff.y, diff.z);
if (hand.getBoundingBox().intersectsWith(bb)) {
++realCount;
}
}
}
if (realCount > 0) {
// Entity in block
return null;
}
}
Tag tag = item.getNamedTagEntry("CanPlaceOn");
if (tag instanceof ListTag) {
boolean canPlace = false;
for (Tag v : ((ListTag<Tag>) tag).getAll()) {
if (v instanceof StringTag) {
Item entry = Item.fromString(((StringTag) v).data);
if (entry.getId() > 0 && entry.getBlock() != null && entry.getBlock().getId() == target.getId()) {
canPlace = true;
break;
}
}
}
if (!canPlace) {
return null;
}
}
if (player != null) {
BlockPlaceEvent event = new BlockPlaceEvent(player, hand, block, target, item);
int distance = this.server.getSpawnRadius();
if (!player.isOp() && distance > -1) {
Vector2 t = new Vector2(target.x, target.z);
Vector2 s = new Vector2(this.getSpawnLocation().x, this.getSpawnLocation().z);
if (!this.server.getOps().getAll().isEmpty() && t.distance(s) <= distance) {
event.setCancelled();
}
}
this.server.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return null;
}
}
if (!hand.place(item, block, target, face, fx, fy, fz, player)) {
return null;
}
if (player != null) {
if (!player.isCreative()) {
item.setCount(item.getCount() - 1);
}
}
if (playSound) {
this.addLevelSoundEvent(hand, LevelSoundEventPacket.SOUND_PLACE, 1, item.getId(), false);
}
if (item.getCount() <= 0) {
item = new ItemBlock(new BlockAir(), 0, 0);
}
return item;
}
Aggregations