package net.scapeemulator.game.model.player.skills.cooking; import java.util.Random; import net.scapeemulator.game.model.World; import net.scapeemulator.game.model.definition.ItemDefinitions; import net.scapeemulator.game.model.object.GroundObjectList.GroundObject; import net.scapeemulator.game.model.object.GroundObjectListenerAdapter; import net.scapeemulator.game.model.player.Equipment; 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.action.ReachObjectAction; import net.scapeemulator.game.model.player.skills.MakeItemInterface; import net.scapeemulator.game.model.player.skills.Skill; import net.scapeemulator.game.model.player.skills.MakeItemInterface.MakeItemInterfaceListener; /** * @author David Insley */ public class CookingAction extends ReachObjectAction { private static final Random random = new Random(); private enum State { INIT, WALKING, START, WAITING, COOKING } private final SlottedItem item; private final HeatSource heatSource; private final RawFood food; private final FireObjectListener listener; private final GroundObject object; private State state; private int amount; public CookingAction(Player player, HeatSource heatSource, RawFood food, SlottedItem item, GroundObject object) { super(1, true, player, object, 1, true); this.heatSource = heatSource; this.food = food; this.item = item; this.object = object; listener = new FireObjectListener(); state = State.INIT; } @Override public void executeAction() { switch (state) { case INIT: World.getWorld().getGroundObjects().addListener(listener); state = State.WALKING; executeAction(); return; case WALKING: if (mob.getWalkingQueue().isEmpty()) { state = State.START; mob.turnToPosition(object.getCenterPosition()); } return; case START: MakeItemInterface.showMakeItemInterface(mob, new CookItemInterfaceListener(), new Item(food.getRawId()), true); state = State.WAITING; return; case WAITING: return; case COOKING: if (amount-- < 1) { stop(); return; } if (!food.getRequirements().hasRequirementsDisplayOne(mob)) { stop(); return; } mob.playAnimation(heatSource.getAnimation()); mob.getInventory().remove(item); /* - Credits to Abyssal Noob - */ int lvlReq = food.getLevelReq(); double burnChance = (55.0 - heatSource.getCookingBonus()); int stopBurn = food.getStopBurn(); if (mob.getEquipment().get(Equipment.HANDS) != null) { stopBurn -= mob.getEquipment().get(Equipment.HANDS).getId() == Cooking.COOKING_GAUNTLETS ? food.getGauntletMod() : 0; } int burnLvlDelta = (stopBurn - lvlReq); double burnDecrease = (burnChance / burnLvlDelta); int lvlReqDelta = (mob.getSkillSet().getCurrentLevel(Skill.COOKING) - lvlReq); burnChance -= (lvlReqDelta * burnDecrease); double randNum = random.nextDouble() * 100.0; /* --------------------------- */ String name = ItemDefinitions.forId(food.getCookedId()).getName().toLowerCase(); if (burnChance <= randNum) { mob.getInventory().add(new Item(food.getCookedId()), item.getSlot()); mob.sendMessage("You successfully cook some " + name + "."); mob.getSkillSet().addExperience(Skill.COOKING, food.getXp()); } else { mob.getInventory().add(new Item(food.getBurnedId()), item.getSlot()); mob.sendMessage("You accidentally burn the " + name + "."); } food.getRequirements().fulfillAll(mob); return; } } @Override public void stop() { World.getWorld().getGroundObjects().removeListener(listener); mob.cancelAnimation(); super.stop(); } private class CookItemInterfaceListener extends MakeItemInterfaceListener { @Override public void makeAllSelected() { start(mob.getInventory().getAmount(food.getRawId())); } @Override public void makeAmountSelected(int amt) { start(amt); } @Override public void cancelled() { stop(); } private void start(int amt) { amount = amt; setDelay(4); state = State.COOKING; } } private class FireObjectListener extends GroundObjectListenerAdapter { @Override public void groundObjectIdUpdated(GroundObject updated, int oldId) { if (object == updated) { fireOut(); } } @Override public void groundObjectRemoved(GroundObject removed) { if (object == removed) { fireOut(); } } private void fireOut() { mob.sendMessage("Your fire has gone out."); stop(); } } }