package com.asteria.game.character.npc; import java.util.Optional; import com.asteria.game.World; import com.asteria.game.character.Animation; import com.asteria.game.character.AnimationPriority; import com.asteria.game.character.CharacterDeath; import com.asteria.game.character.npc.drop.NpcDropManager; import com.asteria.game.character.player.Player; import com.asteria.task.Task; /** * The {@link CharacterDeath} implementation that is dedicated to managing the * death process for all {@link Npc}s. * * @author lare96 <http://github.com/lare96> */ public final class NpcDeath extends CharacterDeath<Npc> { /** * Creates a new {@link NpcDeath}. * * @param npc * the NPC who has died and needs the death process. */ public NpcDeath(Npc npc) { super(npc); } @Override public void preDeath(Npc character) { character.animation(new Animation(character.getDefinition().getDeathAnimation(), AnimationPriority.HIGH)); } @Override public void death(Npc character) { Optional<Player> killer = character.getCombatBuilder().getDamageCache().calculateKiller(); NpcDropManager.dropItems(killer, character); World.getNpcs().remove(character); } @Override public void postDeath(Npc character) { if (character.isRespawn()) { World.submit(new Task(character.getDefinition().getRespawnTime(), false) { @Override public void execute() { Npc npc = new Npc(character.getId(), character.getOriginalPosition()); npc.setRespawn(true); npc.getMovementCoordinator().setCoordinate(character.getMovementCoordinator().isCoordinate()); npc.getMovementCoordinator().setRadius(character.getMovementCoordinator().getRadius()); World.getNpcs().add(npc); this.cancel(); } }); } } }