package net.scapeemulator.game.model.player.skills.firemaking; import net.scapeemulator.game.model.Position; import net.scapeemulator.game.model.World; import net.scapeemulator.game.model.mob.Animation; import net.scapeemulator.game.model.mob.Direction; import net.scapeemulator.game.model.object.GroundObjectList.GroundObject; import net.scapeemulator.game.model.object.ObjectOrientation; import net.scapeemulator.game.model.object.ObjectType; import net.scapeemulator.game.model.pathfinding.Path; import net.scapeemulator.game.model.player.Item; import net.scapeemulator.game.model.player.Player; import net.scapeemulator.game.model.player.SlottedItem; import net.scapeemulator.game.model.player.skills.Skill; import net.scapeemulator.game.task.Action; /** * @author David Insley */ public class FiremakingAction extends Action<Player> { private static final Animation ANIMATION = new Animation(733); private static final Direction[] PREFERRED_DIRECTIONS = { Direction.WEST, Direction.EAST, Direction.SOUTH, Direction.NORTH }; private final Log log; private final SlottedItem slottedLog; private int status = -2; public FiremakingAction(Player player, Log log, SlottedItem slottedLog) { super(player, 2, true); this.log = log; this.slottedLog = slottedLog; } @Override public void execute() { if (status == -2) { mob.getWalkingQueue().reset(); status = -1; } if (!log.getRequirements().hasRequirementsDisplayOne(mob)) { stop(); return; } if (!mob.getInventory().contains(Firemaking.TINDERBOX)) { mob.sendMessage("You need a tinderbox to light a fire."); stop(); return; } // See if the ground object list has an empty space for us here. // TODO add areas for banks etc where you can't light fires if (!World.getWorld().getGroundObjects().isEmpty(mob.getPosition())) { mob.sendMessage("You can't light a fire here."); stop(); return; } if (status == -1) { log.getRequirements().fulfillAll(mob); if (slottedLog != null) { Item removed = mob.getInventory().remove(slottedLog.getItem(), slottedLog.getSlot()); if (!removed.equals(slottedLog.getItem())) { stop(); return; } World.getWorld().getGroundItems().add(log.getItemId(), 1, mob.getPosition(), mob); } mob.playAnimation(ANIMATION); int dif = mob.getSkillSet().getCurrentLevel(Skill.FIREMAKING) - log.getLevel(); dif = dif > 15 ? 15 : dif; status = (int) (Math.random() * (16 - dif)) + 1; } if (!World.getWorld().getGroundItems().contains(log.getItemId(), mob.getPosition(), mob)) { mob.sendMessage("Your logs have disappeared!"); stop(); return; } status -= 1; if (status == 0) { World.getWorld().getGroundItems().remove(log.getItemId(), mob.getPosition(), mob); GroundObject fire = World.getWorld().getGroundObjects().put(mob.getPosition(), log.getFireId(), ObjectOrientation.WEST, ObjectType.PROP); if (fire != null) { World.getWorld().getTaskScheduler().schedule(new RemoveFireTask(fire)); } mob.getSkillSet().addExperience(Skill.FIREMAKING, log.getXp()); mob.cancelAnimation(); mob.sendMessage("The fire catches and the logs begin to burn."); for (Direction direction : PREFERRED_DIRECTIONS) { if (mob.canTraverse(direction)) { Path path = new Path(); path.addFirst(new Position(mob.getPosition().getX() + direction.getX(), mob.getPosition().getY() + direction.getY())); mob.walkPath(path); break; } } if (fire != null) { mob.turnToPosition(fire.getPosition()); } stop(); } } }