@Override
    protected void controlUpdate(float tpf) {
        List<CreepControl> reachable = new ArrayList<CreepControl>();
        
        List<Spatial> creeps = this.app.getCreeps();
        
        for (Spatial creep_geo : creeps) {
            CreepControl creep = creep_geo.getControl(CreepControl.class);
            if (creep.isAlive()
                    && getTowerTop().distance(creep.getLoc()) <= FastMath.sqrt(89)) {
                reachable.add(creep);
            }
        }

        if (reachable.size() > 0) {
            Line beam = null;
            
            for (CreepControl creep : reachable) {
                Vector3f hit = creep.getLoc();
                
                beam = new Line(
                        getTowerTop(),
                        new Vector3f(
                        hit.x + FastMath.rand.nextFloat() / 10f,
                        hit.y + FastMath.rand.nextFloat() / 10f,
                        hit.z + FastMath.rand.nextFloat() / 10f));

                Geometry beam_geo = new Geometry("beam", beam);

                Material boxMat = new Material(this.app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
                boxMat.setColor("Color", ColorRGBA.Red);
                beam_geo.setMaterial(boxMat);
                this.app.addBeam(beam_geo);
                creep.decreaseCreepHealth(getDamage());
            }
        }
    }