alright heres the fishing class, it sends the message but the disconnects
error
Code:
SEVERE: An error occurred in an executor service! The server will be halted immediately.
java.lang.NullPointerException
at org.rs2server.rs2.action.impl.HarvestingAction.execute(HarvestingAction.java:177)
at org.rs2server.rs2.action.ActionQueue$1.execute(ActionQueue.java:114)
at org.rs2server.rs2.tickable.Tickable.cycle(Tickable.java:105)
at org.rs2server.rs2.event.impl.UpdateEvent.execute(UpdateEvent.java:47)
at org.rs2server.rs2.event.EventManager$1.run(EventManager.java:49)
at org.rs2server.rs2.GameEngine$2.run(GameEngine.java:130)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Code:
package org.rs2server.rs2.model.skills;
import java.util.HashMap;
import java.util.Map;
import org.rs2server.rs2.action.impl.HarvestingAction;
import org.rs2server.rs2.model.Animation;
import org.rs2server.rs2.model.GameObject;
import org.rs2server.rs2.model.Item;
import org.rs2server.rs2.model.Mob;
import org.rs2server.rs2.model.Skills;
public class Fishing extends HarvestingAction {
private Spot spot;
public Fishing(Mob mob, Spot spot) {
super(mob);
this.spot = spot;
}
public enum Spot {
SHRIMP(310, 1, 317, 303, 100);
/**
* The npc id.
*/
private int npc;
/**
* The level required to fish this.
*/
private int level;
/**
* The Fish given
*/
private int fish;
/**
* The gear required
*/
private int gear;
private int exp;
/**
* A list of spots.
*/
private static Map<Integer, Spot> spots = new HashMap<>();
/**
* Gets the list of hatchets.
* @return The list of hatchets.
*/
public static Spot forId(int npc) {
return spots.get(npc);
}
/**
* Populates the fish map.
*/
static {
for (Spot spot : Spot.values()) {
spots.put(spot.npc, spot);
}
}
private Spot(int npc, int level, int fish, int gear, int exp) {
this.npc = npc;
this.level = level;
this.fish = fish;
this.gear = gear;
this.exp = exp;
}
/**
* @return the id
*/
public int getNpc() {
return npc;
}
/**
* @return the level
*/
public int getRequiredLevel() {
return level;
}
public int getFish() {
return fish;
}
public int getGear() {
return gear;
}
public int getExp() {
return exp;
}
}
@Override
public Animation getAnimation() {
return Animation.create(1249);
}
@Override
public int getCycleCount() {
return 3;
}
@Override
public double getExperience() {
return spot.getExp();
}
@Override
public GameObject getGameObject() {
return null;
}
@Override
public int getGameObjectMaxHealth() {
return 0;
}
@Override
public String getHarvestStartedMessage() {
return "you attempt to catch some fish";
}
@Override
public String getLevelTooLowMessage() {
return "You need a " + Skills.SKILL_NAME[getSkill()] + " level of " + spot.getRequiredLevel() + " to fish here.";
}
@Override
public int getRequiredLevel() {
return spot.getRequiredLevel();
}
@Override
public Item getReward() {
return new Item(spot.getFish(), 1);
}
@Override
public int getSkill() {
return Skills.FISHING;
}
@Override
public String getSuccessfulHarvestMessage() {
return "You get some " + getReward().getDefinition().getName().toLowerCase() + ".";
}
@Override
public boolean canHarvest() {
for(Spot spot : Spot.values()) {
if((getMob().getInventory().contains(spot.getGear()))
&& getMob().getSkills().getLevelForExperience(getSkill()) >= spot.getRequiredLevel()) {
this.spot = spot;
break;
}
}
return true;
}
@Override
public String getInventoryFullMessage() {
return "Your inventory is too full to hold any more " + getReward().getDefinition().getName().toLowerCase() + ".";
}
@Override
public GameObject getReplacementObject() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getObjectRespawnTimer() {
// TODO Auto-generated method stub
return 0;
}
}
and the first click npc packet
Code:
private void handleOption1(final Player player, Packet packet) {
int id = packet.getShort() & 0xFFFF;
if(id < 0 || id >= Constants.MAX_NPCS) {
return;
}
if(player.getCombatState().isDead()) {
return;
}
player.getActionQueue().clearRemovableActions();
final NPC npc = (NPC) World.getWorld().getNPCs().get(id);
player.getActionSender().sendDebugPacket(packet.getOpcode(), "NpcOpt1", new Object[] { "ID: " + npc.getDefinition().getId(), "Index: " + id });
if(npc != null) {
player.setInteractingEntity(InteractionMode.TALK, npc);
final Spot fish = Spot.forId(npc.getDefinition().getId());
Action action = new Action(player, 0) {
@Override
public void execute() {
if(player.getCombatState().isDead()) {
this.stop();
return;
}
if (fish != null) {
player.getActionQueue().addAction(new Fishing(player, fish));
}
if(npc.getDefinition().getInteractionMenu()[0].startsWith("Talk")) {
if(npc.getDefinition().getName().toLowerCase().contains("banker")) {
DialogueManager.openDialogue(player, 0);
} else {
String scriptName = "talkTo" + npc.getDefinition().getId();
if(!ScriptManager.getScriptManager().invokeWithFailTest(scriptName, player, npc)) {
player.getActionSender().sendMessage(npc.getDefinedName() + " does not want to talk.");
}
}
npc.setInteractingEntity(InteractionMode.TALK, player);
}
this.stop();
}
@Override
public AnimationPolicy getAnimationPolicy() {
return AnimationPolicy.RESET_ALL;
}
@Override
public CancelPolicy getCancelPolicy() {
return CancelPolicy.ALWAYS;
}
@Override
public StackPolicy getStackPolicy() {
return StackPolicy.NEVER;
}
};
int distance = 1;
if(npc.getDefinition().getName().toLowerCase().contains("banker")
|| npc.getDefinition().getName().toLowerCase().contains("emily")
|| npc.getDefinition().getName().toLowerCase().contains("zambo")) {
distance = 2;
}
player.addCoordinateAction(player.getWidth(), player.getHeight(), npc.getLocation(), npc.getWidth(), npc.getHeight(), distance, action);
}
}
what am i doing wrong?