Search in sources :

Example 1 with BlockIgniteEvent

use of cn.nukkit.event.block.BlockIgniteEvent in project Nukkit by Nukkit.

the class BlockFire method onUpdate.

@Override
public int onUpdate(int type) {
    if (type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_RANDOM) {
        if (!this.isBlockTopFacingSurfaceSolid(this.down()) && !this.canNeighborBurn()) {
            this.getLevel().setBlock(this, new BlockAir(), true);
        }
        return Level.BLOCK_UPDATE_NORMAL;
    } else if (type == Level.BLOCK_UPDATE_SCHEDULED && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK)) {
        boolean forever = this.down().getId() == Block.NETHERRACK;
        ThreadLocalRandom random = ThreadLocalRandom.current();
        if (!this.isBlockTopFacingSurfaceSolid(this.down()) && !this.canNeighborBurn()) {
            this.getLevel().setBlock(this, new BlockAir(), true);
        }
        if (!forever && this.getLevel().isRaining() && (this.getLevel().canBlockSeeSky(this) || this.getLevel().canBlockSeeSky(this.east()) || this.getLevel().canBlockSeeSky(this.west()) || this.getLevel().canBlockSeeSky(this.south()) || this.getLevel().canBlockSeeSky(this.north()))) {
            this.getLevel().setBlock(this, new BlockAir(), true);
        } else {
            int meta = this.getDamage();
            if (meta < 15) {
                this.setDamage(meta + random.nextInt(3));
                this.getLevel().setBlock(this, this, true);
            }
            this.getLevel().scheduleUpdate(this, this.tickRate() + random.nextInt(10));
            if (!forever && !this.canNeighborBurn()) {
                if (!this.isBlockTopFacingSurfaceSolid(this.down()) || meta > 3) {
                    this.getLevel().setBlock(this, new BlockAir(), true);
                }
            } else if (!forever && !(this.down().getBurnAbility() > 0) && meta == 15 && random.nextInt(4) == 0) {
                this.getLevel().setBlock(this, new BlockAir(), true);
            } else {
                int o = 0;
                // TODO: decrease the o if the rainfall values are high
                this.tryToCatchBlockOnFire(this.east(), 300 + o, meta);
                this.tryToCatchBlockOnFire(this.west(), 300 + o, meta);
                this.tryToCatchBlockOnFire(this.down(), 250 + o, meta);
                this.tryToCatchBlockOnFire(this.up(), 250 + o, meta);
                this.tryToCatchBlockOnFire(this.south(), 300 + o, meta);
                this.tryToCatchBlockOnFire(this.north(), 300 + o, meta);
                for (int x = (int) (this.x - 1); x <= (int) (this.x + 1); ++x) {
                    for (int z = (int) (this.z - 1); z <= (int) (this.z + 1); ++z) {
                        for (int y = (int) (this.y - 1); y <= (int) (this.y + 4); ++y) {
                            if (x != (int) this.x || y != (int) this.y || z != (int) this.z) {
                                int k = 100;
                                if (y > this.y + 1) {
                                    k += (y - (this.y + 1)) * 100;
                                }
                                Block block = this.getLevel().getBlock(new Vector3(x, y, z));
                                int chance = this.getChanceOfNeighborsEncouragingFire(block);
                                if (chance > 0) {
                                    int t = (chance + 40 + this.getLevel().getServer().getDifficulty() * 7) / (meta + 30);
                                    if (t > 0 && random.nextInt(k) <= t) {
                                        int damage = meta + random.nextInt(5) / 4;
                                        if (damage > 15) {
                                            damage = 15;
                                        }
                                        BlockIgniteEvent e = new BlockIgniteEvent(block, this, null, BlockIgniteEvent.BlockIgniteCause.SPREAD);
                                        this.level.getServer().getPluginManager().callEvent(e);
                                        if (!e.isCancelled()) {
                                            this.getLevel().setBlock(block, new BlockFire(damage), true);
                                            this.getLevel().scheduleUpdate(block, this.tickRate());
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}
Also used : ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Vector3(cn.nukkit.math.Vector3) BlockIgniteEvent(cn.nukkit.event.block.BlockIgniteEvent)

Example 2 with BlockIgniteEvent

use of cn.nukkit.event.block.BlockIgniteEvent in project Nukkit by Nukkit.

the class EntityLightning 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;
    this.entityBaseTick(tickDiff);
    if (this.state == 2) {
        this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_THUNDER, 93, -1);
        this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_EXPLODE, 93, -1);
    }
    this.state--;
    if (this.state < 0) {
        if (this.liveTime == 0) {
            this.close();
            return false;
        } else if (this.state < -ThreadLocalRandom.current().nextInt(10)) {
            this.liveTime--;
            this.state = 1;
            if (this.isEffect && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK)) {
                Block block = this.getLevelBlock();
                if (block.getId() == Block.AIR || block.getId() == Block.TALL_GRASS) {
                    BlockIgniteEvent e = new BlockIgniteEvent(block, null, this, BlockIgniteEvent.BlockIgniteCause.LIGHTNING);
                    getServer().getPluginManager().callEvent(e);
                    if (!e.isCancelled()) {
                        Block fire = new BlockFire();
                        this.level.setBlock(block, fire);
                        this.getLevel().scheduleUpdate(fire, fire.tickRate());
                    }
                }
            }
        }
    }
    if (this.state >= 0) {
        if (this.isEffect) {
            AxisAlignedBB bb = getBoundingBox().grow(3, 3, 3);
            bb.setMaxX(bb.getMaxX() + 6);
            for (Entity entity : this.level.getCollidingEntities(bb, this)) {
                entity.onStruckByLightning(this);
            }
        }
    }
    return true;
}
Also used : AxisAlignedBB(cn.nukkit.math.AxisAlignedBB) Entity(cn.nukkit.entity.Entity) Block(cn.nukkit.block.Block) BlockIgniteEvent(cn.nukkit.event.block.BlockIgniteEvent) BlockFire(cn.nukkit.block.BlockFire)

Example 3 with BlockIgniteEvent

use of cn.nukkit.event.block.BlockIgniteEvent in project Nukkit by Nukkit.

the class EntityLightning method initEntity.

@Override
protected void initEntity() {
    super.initEntity();
    this.setHealth(4);
    this.setMaxHealth(4);
    this.state = 2;
    this.liveTime = ThreadLocalRandom.current().nextInt(3) + 1;
    if (isEffect && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK) && (this.server.getDifficulty() >= 2)) {
        Block block = this.getLevelBlock();
        if (block.getId() == 0 || block.getId() == Block.TALL_GRASS) {
            BlockFire fire = new BlockFire();
            fire.x = block.x;
            fire.y = block.y;
            fire.z = block.z;
            fire.level = level;
            this.getLevel().setBlock(fire, fire, true);
            if (fire.isBlockTopFacingSurfaceSolid(fire.down()) || fire.canNeighborBurn()) {
                BlockIgniteEvent e = new BlockIgniteEvent(block, null, this, BlockIgniteEvent.BlockIgniteCause.LIGHTNING);
                getServer().getPluginManager().callEvent(e);
                if (!e.isCancelled()) {
                    level.setBlock(fire, fire, true);
                    level.scheduleUpdate(fire, fire.tickRate() + ThreadLocalRandom.current().nextInt(10));
                }
            }
        }
    }
}
Also used : Block(cn.nukkit.block.Block) BlockIgniteEvent(cn.nukkit.event.block.BlockIgniteEvent) BlockFire(cn.nukkit.block.BlockFire)

Example 4 with BlockIgniteEvent

use of cn.nukkit.event.block.BlockIgniteEvent in project Nukkit by Nukkit.

the class ItemFlintSteel method onActivate.

@Override
public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) {
    if (block.getId() == AIR && (target instanceof BlockSolid || target instanceof BlockSolidMeta)) {
        if (target.getId() == OBSIDIAN) {
            int targetX = target.getFloorX();
            int targetY = target.getFloorY();
            int targetZ = target.getFloorZ();
            int x_max = targetX;
            int x_min = targetX;
            int x;
            for (x = targetX + 1; level.getBlock(new Vector3(x, targetY, targetZ)).getId() == OBSIDIAN; x++) {
                x_max++;
            }
            for (x = targetX - 1; level.getBlock(new Vector3(x, targetY, targetZ)).getId() == OBSIDIAN; x--) {
                x_min--;
            }
            int count_x = x_max - x_min + 1;
            int z_max = targetZ;
            int z_min = targetZ;
            int z;
            for (z = targetZ + 1; level.getBlock(new Vector3(targetX, targetY, z)).getId() == OBSIDIAN; z++) {
                z_max++;
            }
            for (z = targetZ - 1; level.getBlock(new Vector3(targetX, targetY, z)).getId() == OBSIDIAN; z--) {
                z_min--;
            }
            int count_z = z_max - z_min + 1;
            int z_max_y = targetY;
            int z_min_y = targetY;
            int y;
            for (y = targetY; level.getBlock(new Vector3(targetX, y, z_max)).getId() == OBSIDIAN; y++) {
                z_max_y++;
            }
            for (y = targetY; level.getBlock(new Vector3(targetX, y, z_min)).getId() == OBSIDIAN; y++) {
                z_min_y++;
            }
            int y_max = Math.min(z_max_y, z_min_y) - 1;
            int count_y = y_max - targetY + 2;
            if ((count_x >= 4 && count_x <= 23 || count_z >= 4 && count_z <= 23) && count_y >= 5 && count_y <= 23) {
                int count_up = 0;
                for (int up_z = z_min; level.getBlock(new Vector3(targetX, y_max, up_z)).getId() == OBSIDIAN && up_z <= z_max; up_z++) {
                    count_up++;
                }
                if (count_up == count_z) {
                    for (int block_z = z_min + 1; block_z < z_max; block_z++) {
                        for (int block_y = targetY + 1; block_y < y_max; block_y++) {
                            level.setBlock(new Vector3(targetX, block_y, block_z), new BlockNetherPortal());
                        }
                    }
                    return true;
                }
            }
        }
        BlockFire fire = new BlockFire();
        fire.x = block.x;
        fire.y = block.y;
        fire.z = block.z;
        fire.level = level;
        if (fire.isBlockTopFacingSurfaceSolid(fire.down()) || fire.canNeighborBurn()) {
            BlockIgniteEvent e = new BlockIgniteEvent(block, null, player, BlockIgniteEvent.BlockIgniteCause.FLINT_AND_STEEL);
            block.getLevel().getServer().getPluginManager().callEvent(e);
            if (!e.isCancelled()) {
                level.setBlock(fire, fire, true);
                level.scheduleUpdate(fire, fire.tickRate() + ThreadLocalRandom.current().nextInt(10));
            }
            return true;
        }
        if ((player.gamemode & 0x01) == 0 && this.useOn(block)) {
            if (this.getDamage() >= this.getMaxDurability()) {
                this.count = 0;
            } else {
                this.meta++;
            }
        }
        return true;
    }
    return false;
}
Also used : Vector3(cn.nukkit.math.Vector3) BlockIgniteEvent(cn.nukkit.event.block.BlockIgniteEvent)

Example 5 with BlockIgniteEvent

use of cn.nukkit.event.block.BlockIgniteEvent in project Nukkit by Nukkit.

the class BlockLava method onUpdate.

@Override
public int onUpdate(int type) {
    int result = super.onUpdate(type);
    if (type == Level.BLOCK_UPDATE_RANDOM && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK)) {
        Random random = ThreadLocalRandom.current();
        int i = random.nextInt(3);
        if (i > 0) {
            for (int k = 0; k < i; ++k) {
                Vector3 v = this.add(random.nextInt(3) - 1, 1, random.nextInt(3) - 1);
                Block block = this.getLevel().getBlock(v);
                if (block.getId() == AIR) {
                    if (this.isSurroundingBlockFlammable(block)) {
                        BlockIgniteEvent e = new BlockIgniteEvent(block, this, null, BlockIgniteEvent.BlockIgniteCause.LAVA);
                        this.level.getServer().getPluginManager().callEvent(e);
                        if (!e.isCancelled()) {
                            BlockFire fire = new BlockFire();
                            this.getLevel().setBlock(v, fire, true);
                            this.getLevel().scheduleUpdate(fire, fire.tickRate());
                            return Level.BLOCK_UPDATE_RANDOM;
                        }
                        return 0;
                    }
                } else if (block.isSolid()) {
                    return Level.BLOCK_UPDATE_RANDOM;
                }
            }
        } else {
            for (int k = 0; k < 3; ++k) {
                Vector3 v = this.add(random.nextInt(3) - 1, 0, random.nextInt(3) - 1);
                Block block = this.getLevel().getBlock(v);
                if (block.up().getId() == AIR && block.getBurnChance() > 0) {
                    BlockIgniteEvent e = new BlockIgniteEvent(block, this, null, BlockIgniteEvent.BlockIgniteCause.LAVA);
                    this.level.getServer().getPluginManager().callEvent(e);
                    if (!e.isCancelled()) {
                        BlockFire fire = new BlockFire();
                        this.getLevel().setBlock(v, fire, true);
                        this.getLevel().scheduleUpdate(fire, fire.tickRate());
                    }
                }
            }
        }
    }
    return result;
}
Also used : Random(java.util.Random) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Vector3(cn.nukkit.math.Vector3) BlockIgniteEvent(cn.nukkit.event.block.BlockIgniteEvent)

Aggregations

BlockIgniteEvent (cn.nukkit.event.block.BlockIgniteEvent)6 Vector3 (cn.nukkit.math.Vector3)3 ThreadLocalRandom (java.util.concurrent.ThreadLocalRandom)3 Block (cn.nukkit.block.Block)2 BlockFire (cn.nukkit.block.BlockFire)2 Random (java.util.Random)2 Entity (cn.nukkit.entity.Entity)1 BlockBurnEvent (cn.nukkit.event.block.BlockBurnEvent)1 AxisAlignedBB (cn.nukkit.math.AxisAlignedBB)1