Newer
Older
void-pack-super-server / work / decompile-ee3ecae0 / net / minecraft / server / TileEntityBell.java
package net.minecraft.server;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class TileEntityBell extends TileEntity implements ITickable {

    private long g;
    public int a;
    public boolean b;
    public EnumDirection c;
    private List<EntityLiving> h;
    private boolean i;
    private int j;

    public TileEntityBell() {
        super(TileEntityTypes.BELL);
    }

    @Override
    public boolean setProperty(int i, int j) {
        if (i == 1) {
            this.f();
            this.j = 0;
            this.c = EnumDirection.fromType1(j);
            this.a = 0;
            this.b = true;
            return true;
        } else {
            return super.setProperty(i, j);
        }
    }

    @Override
    public void tick() {
        if (this.b) {
            ++this.a;
        }

        if (this.a >= 50) {
            this.b = false;
            this.a = 0;
        }

        if (this.a >= 5 && this.j == 0 && this.h()) {
            this.i = true;
            this.d();
        }

        if (this.i) {
            if (this.j < 40) {
                ++this.j;
            } else {
                this.a(this.world);
                this.b(this.world);
                this.i = false;
            }
        }

    }

    private void d() {
        this.world.playSound((EntityHuman) null, this.getPosition(), SoundEffects.BLOCK_BELL_RESONATE, SoundCategory.BLOCKS, 1.0F, 1.0F);
    }

    public void a(EnumDirection enumdirection) {
        BlockPosition blockposition = this.getPosition();

        this.c = enumdirection;
        if (this.b) {
            this.a = 0;
        } else {
            this.b = true;
        }

        this.world.playBlockAction(blockposition, this.getBlock().getBlock(), 1, enumdirection.b());
    }

    private void f() {
        BlockPosition blockposition = this.getPosition();

        if (this.world.getTime() > this.g + 60L || this.h == null) {
            this.g = this.world.getTime();
            AxisAlignedBB axisalignedbb = (new AxisAlignedBB(blockposition)).g(48.0D);

            this.h = this.world.a(EntityLiving.class, axisalignedbb);
        }

        if (!this.world.isClientSide) {
            Iterator iterator = this.h.iterator();

            while (iterator.hasNext()) {
                EntityLiving entityliving = (EntityLiving) iterator.next();

                if (entityliving.isAlive() && !entityliving.dead && blockposition.a((IPosition) entityliving.getPositionVector(), 32.0D)) {
                    entityliving.getBehaviorController().setMemory(MemoryModuleType.HEARD_BELL_TIME, (Object) this.world.getTime());
                }
            }
        }

    }

    private boolean h() {
        BlockPosition blockposition = this.getPosition();
        Iterator iterator = this.h.iterator();

        EntityLiving entityliving;

        do {
            if (!iterator.hasNext()) {
                return false;
            }

            entityliving = (EntityLiving) iterator.next();
        } while (!entityliving.isAlive() || entityliving.dead || !blockposition.a((IPosition) entityliving.getPositionVector(), 32.0D) || !entityliving.getEntityType().a(TagsEntity.RADIERS));

        return true;
    }

    private void a(World world) {
        if (!world.isClientSide) {
            this.h.stream().filter(this::a).forEach(this::b);
        }
    }

    private void b(World world) {
        if (world.isClientSide) {
            BlockPosition blockposition = this.getPosition();
            AtomicInteger atomicinteger = new AtomicInteger(16700985);
            int i = (int) this.h.stream().filter((entityliving) -> {
                return blockposition.a((IPosition) entityliving.getPositionVector(), 48.0D);
            }).count();

            this.h.stream().filter(this::a).forEach((entityliving) -> {
                float f = 1.0F;
                float f1 = MathHelper.sqrt((entityliving.locX() - (double) blockposition.getX()) * (entityliving.locX() - (double) blockposition.getX()) + (entityliving.locZ() - (double) blockposition.getZ()) * (entityliving.locZ() - (double) blockposition.getZ()));
                double d0 = (double) ((float) blockposition.getX() + 0.5F) + (double) (1.0F / f1) * (entityliving.locX() - (double) blockposition.getX());
                double d1 = (double) ((float) blockposition.getZ() + 0.5F) + (double) (1.0F / f1) * (entityliving.locZ() - (double) blockposition.getZ());
                int j = MathHelper.clamp((i - 21) / -2, 3, 15);

                for (int k = 0; k < j; ++k) {
                    atomicinteger.addAndGet(5);
                    double d2 = (double) (atomicinteger.get() >> 16 & 255) / 255.0D;
                    double d3 = (double) (atomicinteger.get() >> 8 & 255) / 255.0D;
                    double d4 = (double) (atomicinteger.get() & 255) / 255.0D;

                    world.addParticle(Particles.ENTITY_EFFECT, d0, (double) ((float) blockposition.getY() + 0.5F), d1, d2, d3, d4);
                }

            });
        }
    }

    private boolean a(EntityLiving entityliving) {
        return entityliving.isAlive() && !entityliving.dead && this.getPosition().a((IPosition) entityliving.getPositionVector(), 48.0D) && entityliving.getEntityType().a(TagsEntity.RADIERS);
    }

    private void b(EntityLiving entityliving) {
        entityliving.addEffect(new MobEffect(MobEffects.GLOWING, 60));
    }
}