Buff and Debuff Implementation - UQdeco2800/2021-ext-studio-2 GitHub Wiki

what is it

simple functions to add an animation to the buffs and debuffs effects faced by the player/characters. Such as a poisonous effect felt by the character which causes a debuff, and now it has an appropriate animation along it so the user knows why they lost health and indicate to them that they need to stay after. Along with animations such as Increase in health to let the player know they've healthed up, etc.

how it works

e.g. debuff poison animation calls

the implementation: here is the function which calls the animation event trigger so it works when this particular function is called

public void poisoningDisplay()
    {
        PlayerStatsDisplay playerComponent = this.player.getComponent(PlayerStatsDisplay.class);
        //playerComponent.addPoisoningImage2();
        player.getEvents().trigger("poisoned");
        removeBuff_Debuff();
    }

here is the animation trigger

entity.getEvents().addListener("poisoned", this::animatePoison);
private void animatePoison() {
        animationName = animator.getCurrentAnimation();
        preAnimationCleanUp();
        if(animationName != null) {
            animator.startAnimation(animationName + "_poisoned");
        } else {
            animator.startAnimation("main_player_walk_poisoned");
        }
    }

here is where the main poisonous display function gets called: so that it can be called when the player has already collided with it

void plantsDisappear(Fixture me, Fixture other) {
        if (hitboxComponent.getFixture() != me) {
            // Not triggered by hitbox, ignore
            return;
        }
        if (!PhysicsLayer.contains(PhysicsLayer.PLAYER, other.getFilterData().categoryBits) && !PhysicsLayer.contains(PhysicsLayer.WEAPON, other.getFilterData().categoryBits)) {
            // Doesn't match our target layer, ignore
            return;
        }
        DeBuff object = new DeBuff(target);

            object.poisoningDisplay();

        if (count == 0) { // Avoid an entity from repeatedly triggering an attack
            count++;

            particle.startEffect();
            logger.debug(COLLISION_LOGGER_INFO, entity.toString());
            animator.getEntity().setRemoveTexture();
            animator.startAnimation("obstacles");
            animator.getEntity().setParticleTime(1.3f);
            animator.getEntity().setDisappearAfterAnimation(1f, Entity.DisappearType.ANIMATION);
            locked = false;
            if (PhysicsLayer.contains(PhysicsLayer.WEAPON, other.getFilterData().categoryBits)) {
                this.entity.setRemoveCollision();
            }
        }
    }

the removeBuff_Debuff function and why its important: it removes the animation after 5 seconds due to the parameters given in the below function, so that the users have enough time to see the animation but don't have to see it after it is no longer important to the user.

 public void removeBuff_Debuff() {
        Timer timer=new Timer();
        timer.scheduleTask(new Timer.Task() {
            @Override
            public void run() {
                player.getEvents().trigger("stopBuffDebuff");
                timer.stop();
            }
        },5);
    }

UML class diagram:

SumerUMLS4