gt:     return getClass() == Mob.class;
context: // Generated by delombok at Sat Feb 25 09:19:07 PST 2017
  package astraeus.game.model.entity.mob;
  
  import java.util.ArrayDeque;
  import java.util.Deque;
  import java.util.EnumSet;
  import java.util.LinkedList;
  import java.util.List;
  import java.util.Optional;
  import java.util.PriorityQueue;
  import java.util.Queue;
  import astraeus.GameEngine;
  import astraeus.game.model.Animation;
  import astraeus.game.model.Graphic;
  import astraeus.game.model.Position;
  import astraeus.game.model.World;
  import astraeus.game.model.entity.Entity;
  import astraeus.game.model.entity.EntityType;
  import astraeus.game.model.entity.item.Item;
  import astraeus.game.model.entity.mob.combat.Combat;
  import astraeus.game.model.entity.mob.combat.dmg.Hit;
  import astraeus.game.model.entity.mob.combat.dmg.Poison.DamageTypes;
  import astraeus.game.model.entity.mob.npc.Npc;
  import astraeus.game.model.entity.mob.player.ForceMovement;
  import astraeus.game.model.entity.mob.player.Player;
  import astraeus.game.model.entity.mob.player.attr.AttributeMap;
  import astraeus.game.model.entity.mob.player.skill.SkillSet;
  import astraeus.game.model.entity.mob.update.UpdateFlag;
  import astraeus.game.model.entity.object.GameObject;
  import astraeus.game.task.Task;
  import astraeus.util.Stopwatch;
  
  /**
   * The class that represents a mobile entity that is either a NPC (Non-Playable-Character) or
   * Player.
   *
   * @author Vult-R
   */
  public abstract class Mob extends Entity {
    private final List<Player> localPlayers = new LinkedList<Player>();
    private final List<Npc> localNpcs = new LinkedList<Npc>();
    protected final EnumSet<UpdateFlag> updateFlags = EnumSet.noneOf(UpdateFlag.class);
    private final Queue<Animation> animations = new PriorityQueue<>();
    private final Queue<Graphic> graphics = new PriorityQueue<>();
    protected final AttributeMap attr = new AttributeMap();
    protected final Combat combat = new Combat(this);
    private SkillSet skills = new SkillSet(this);
    private Position lastPosition = new Position(0, 0, 0);
    protected Position createdPosition;
    private DamageTypes poisonType;
    protected int slot;
    private Position facingLocation;
    protected final Movement movement = new Movement(this);
    private ForceMovement forceMovement;
    private Mob interactingEntity;
    private Optional<Task> currentAction = Optional.empty();
    protected final Deque<Hit> hitQueue = new ArrayDeque<>();
    private int antipoisonTimer = 0;
    private int id;
    protected int size = 1;
    private int walkingDirection = -1;
    private int runningDirection = -1;
    private Stopwatch lastPoisoned = new Stopwatch();
    private final MobAnimation mobAnimation = new MobAnimation();
    private boolean registered;
    private boolean poisoned;
    private boolean isDead;
    private boolean regionChange;
    private boolean teleporting;
    private boolean visible;
    private boolean following;
    private String forcedChat;
    private int immunity;
    
    public Mob(Position position) {
      this.position = position;
    }
    
    /**
     * The method called on a game tick.
     */
    public abstract void onTick();
    
    public abstract int getCurrentHealth();
    private static int tick = GameEngine.tick;
    
    /**
     * The method that increments tick to time actions
     */
    protected void tick() {
      tick = GameEngine.tick;
      onTick();
      if (tick >= 1000) {
        tick = 0;
      }
    }
    
    /**
     * Gets the maximum number of hitpoints an entity has.
     */
    public abstract int getMaximumHealth();
    
    /**
     * The method called before the mob is updated.
     */
    public abstract void preUpdate();
    
    /**
     * The method called during an update. This should only be used for a player, since a player will
     * send the PlayerUpdatePacket, and NpcUpdatePacket right after it.
     */
    public void update() {
    }
    
    /**
     * The method called after a mob is updated.
     */
    public abstract void postUpdate();
    
    /**
     * The method called when an entity dies.
     */
    public abstract void onDeath();
    
    /**
     * The method called when an entity walks or runs.
     */
    public abstract void onMovement();
    
    public abstract void dealDamage(Mob attacker, Hit hit);
    
    public void startAction(Task currentAction) {
      this.currentAction.ifPresent(it -> {
        if (it.equals(currentAction)) {
          return;
        }
        stopAction();
      });
      this.currentAction = Optional.of(currentAction);
      World.submit(currentAction);
    }
    
    public void stopAction() {
      currentAction.ifPresent(it -> {
        it.setInterrupt(true);
        it.stop();
        currentAction = Optional.empty();
      });
    }
    
    public AttributeMap attr() {
      return attr;
    }
    
    /**
     * Determines if this {@link Player} can logout.
     *
     * @return {@code true} If this player can logout. {@code false} Otherwise.
     */
    public boolean canLogout() {
      return true;
    }
    
    public boolean canTeleport() {
      return true;
    }
    
    public boolean canClickButton() {
      return true;
    }
    
    public boolean canTrade() {
      return true;
    }
    
    public boolean canDuel() {
      return true;
    }
    
    public boolean canAttackMob(Npc mob) {
      return true;
    }
    
    public boolean canAttackPlayer(Player player) {
      return true;
    }
    
    public boolean canClickMob(Npc mob) {
      return true;
    }
    
    public boolean canClickObject(GameObject object) {
      return true;
    }
    
    public boolean canDrink() {
      return true;
    }
    
    public boolean canEat() {
      return true;
    }
    
    public boolean canDrop() {
      return true;
    }
    
    public boolean canMove() {
      return true;
    }
    
    public boolean canPickup(Item item) {
      return true;
    }
    
    public boolean canSave() {
      return true;
    }
    
    public boolean canPray() {
      return true;
    }
    
    public boolean canTalk() {
      return true;
    }
    
    public boolean canUnequip(Item item) {
      return true;
    }
    
    public boolean canUseSpecial() {
      return true;
    }
    
    public Npc getNpc() {
      return World.getNpcs().get(slot);
    }
    
    public Player getPlayer() {
      return World.getPlayers().get(slot);
    }
    
    public int getSize() {
      return size;
    }
    
    public boolean isUpdateRequired() {
      return !updateFlags.isEmpty();
    }
    
    public boolean isNpc() {
      return type() == EntityType.NPC;
    }
    
    public boolean isPlayer() {
      return type() == EntityType.PLAYER;
    }
    
    @Override
    public boolean isMob() {
  