MoparClassic/GameServer/src/org/moparscape/msc/gs/phandler/client/DropHandler.java

111 lines
3.1 KiB
Java

package org.moparscape.msc.gs.phandler.client;
import org.apache.mina.common.IoSession;
import org.moparscape.msc.gs.Instance;
import org.moparscape.msc.gs.connection.Packet;
import org.moparscape.msc.gs.event.DelayedEvent;
import org.moparscape.msc.gs.event.SingleEvent;
import org.moparscape.msc.gs.model.InvItem;
import org.moparscape.msc.gs.model.Item;
import org.moparscape.msc.gs.model.Player;
import org.moparscape.msc.gs.model.World;
import org.moparscape.msc.gs.model.snapshot.Activity;
import org.moparscape.msc.gs.phandler.PacketHandler;
import org.moparscape.msc.gs.states.Action;
public class DropHandler implements PacketHandler {
/**
* World instance
*/
public static final World world = Instance.getWorld();
public void handlePacket(Packet p, IoSession session) throws Exception {
Player player = (Player) session.getAttachment();
if (player.isBusy()) {
player.resetPath();
return;
}
player.resetAll();
final int idx = (int) p.readShort();
if (idx < 0 || idx >= player.getInventory().size()) {
player.setSuspiciousPlayer(true);
return;
}
final InvItem item = player.getInventory().get(idx);
if (item == null) {
player.setSuspiciousPlayer(true);
return;
}
if (player.isPMod() && !player.isMod())
return;
if (item.getDef().isMembers() && !World.isMembers()) {
player.getActionSender().sendMessage(
"This feature is only avaliable on a members server");
return;
}
// drop item after a path has finished
if(player.pathHandler != null && !player.pathHandler.finishedPath()) {
waitAndDrop(player, item);
} else {
drop(player, item);
}
}
public void waitAndDrop(final Player player,final InvItem item) {
Instance.getDelayedEventHandler().add(new SingleEvent(player, 500) {
@Override
public void action() {
if(owner.dropTickCount > 20) { // 10 seconds they are allowed to walk for. anything longer won't drop.
owner.dropTickCount = 0;
stop();
} else {
owner.dropTickCount++;
if(owner.pathHandler != null && !owner.pathHandler.finishedPath()) {
waitAndDrop(owner, item);
} else {
drop(owner, item);
}
}
}
});
}
public void drop(Player player, final InvItem item) {
player.getActionSender().sendMessage("Dropping!");
player.setStatus(Action.DROPPING_GITEM);
Instance.getDelayedEventHandler().add(new DelayedEvent(player, 500) {
public void run() {
if (owner.isBusy() || !owner.getInventory().contains(item)
|| owner.getStatus() != Action.DROPPING_GITEM) {
matchRunning = false;
return;
}
if (owner.hasMoved()) {
this.stop();
return;
}
world.addEntryToSnapshots(new Activity(owner.getUsername(),
owner.getUsername() + " dropped ID: " + item.getID()
+ " amount: " + item.getAmount() + " at: "
+ owner.getX() + "/" + owner.getY()));
owner.getActionSender().sendSound("dropobject");
owner.getInventory().remove(item);
owner.getActionSender().sendInventory();
world.registerItem(new Item(item.getID(), owner.getX(), owner
.getY(), item.getAmount(), owner));
matchRunning = false;
}
});
}
}