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);
}