cn.nukkit.entity.item.EntityPrimedTNT Maven / Gradle / Ivy
package cn.nukkit.entity.item;
import cn.nukkit.api.PowerNukkitDifference;
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityExplosive;
import cn.nukkit.entity.data.IntEntityData;
import cn.nukkit.event.entity.EntityDamageEvent;
import cn.nukkit.event.entity.EntityDamageEvent.DamageCause;
import cn.nukkit.event.entity.EntityExplosionPrimeEvent;
import cn.nukkit.level.Explosion;
import cn.nukkit.level.GameRule;
import cn.nukkit.level.Sound;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.level.vibration.VibrationEvent;
import cn.nukkit.level.vibration.VibrationType;
import cn.nukkit.nbt.tag.CompoundTag;
/**
* @author MagicDroidX
*/
public class EntityPrimedTNT extends Entity implements EntityExplosive {
public static final int NETWORK_ID = 65;
protected int fuse;
protected Entity source;
public EntityPrimedTNT(FullChunk chunk, CompoundTag nbt) {
this(chunk, nbt, null);
}
public EntityPrimedTNT(FullChunk chunk, CompoundTag nbt, Entity source) {
super(chunk, nbt);
this.source = source;
}
@Override
public float getWidth() {
return 0.98f;
}
@Override
public float getLength() {
return 0.98f;
}
@Override
public float getHeight() {
return 0.98f;
}
@Override
protected float getGravity() {
return 0.04f;
}
@Override
protected float getDrag() {
return 0.02f;
}
@Override
protected float getBaseOffset() {
return 0.49f;
}
@Override
public boolean canCollide() {
return false;
}
@Override
public int getNetworkId() {
return NETWORK_ID;
}
@Override
public boolean attack(EntityDamageEvent source) {
return source.getCause() == DamageCause.VOID && super.attack(source);
}
@Override
@PowerNukkitDifference(info = "Using new method to play sounds", since = "1.4.0.0-PN")
protected void initEntity() {
super.initEntity();
if (namedTag.contains("Fuse")) {
fuse = namedTag.getByte("Fuse");
} else {
fuse = 80;
}
this.setDataFlag(DATA_FLAGS, DATA_FLAG_IGNITED, true);
this.setDataProperty(new IntEntityData(DATA_FUSE_LENGTH, fuse));
this.getLevel().addSound(this, Sound.RANDOM_FUSE);
}
@Override
public boolean canCollideWith(Entity entity) {
return false;
}
@Override
public void saveNBT() {
super.saveNBT();
namedTag.putByte("Fuse", fuse);
}
@Override
public boolean onUpdate(int currentTick) {
if (closed) {
return false;
}
this.timing.startTiming();
int tickDiff = currentTick - lastUpdate;
if (tickDiff <= 0 && !justCreated) {
return true;
}
if (fuse % 5 == 0) {
this.setDataProperty(new IntEntityData(DATA_FUSE_LENGTH, fuse));
}
lastUpdate = currentTick;
boolean hasUpdate = entityBaseTick(tickDiff);
if (isAlive()) {
motionY -= getGravity();
move(motionX, motionY, motionZ);
float friction = 1 - getDrag();
motionX *= friction;
motionY *= friction;
motionZ *= friction;
updateMovement();
if (onGround) {
motionY *= -0.5;
motionX *= 0.7;
motionZ *= 0.7;
}
fuse -= tickDiff;
if (fuse <= 0) {
if (this.level.getGameRules().getBoolean(GameRule.TNT_EXPLODES))
explode();
kill();
}
}
this.timing.stopTiming();
return hasUpdate || fuse >= 0 || Math.abs(motionX) > 0.00001 || Math.abs(motionY) > 0.00001 || Math.abs(motionZ) > 0.00001;
}
@Override
public void explode() {
EntityExplosionPrimeEvent event = new EntityExplosionPrimeEvent(this, 4);
server.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
Explosion explosion = new Explosion(this, event.getForce(), this);
explosion.setFireChance(event.getFireChance());
if (event.isBlockBreaking()) {
explosion.explodeA();
}
explosion.explodeB();
this.level.getVibrationManager().callVibrationEvent(new VibrationEvent(this, this.clone(), VibrationType.EXPLODE));
}
public Entity getSource() {
return source;
}
@PowerNukkitOnly
@Since("1.5.1.0-PN")
@Override
public String getOriginalName() {
return "Block of TNT";
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy