package net.scapeemulator.game.dispatcher.object;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import net.scapeemulator.game.GameServer;
import net.scapeemulator.game.model.Option;
import net.scapeemulator.game.model.Position;
import net.scapeemulator.game.model.World;
import net.scapeemulator.game.model.definition.ObjectDefinitions;
import net.scapeemulator.game.model.object.GroundObjectList;
import net.scapeemulator.game.model.object.GroundObjectList.GroundObject;
import net.scapeemulator.game.model.player.Player;
import net.scapeemulator.game.util.HandlerContext;
/**
* @author Hadyn Richard
*/
public final class ObjectDispatcher {
/**
* The mapping for all of the handler lists.
*/
private Map<Option, List<ObjectHandler>> handlerLists = new HashMap<>();
/**
* Constructs a new {@link ObjectDispatcher};
*/
public ObjectDispatcher() {
for (Option option : Option.values()) {
if (option.equals(Option.ALL)) {
continue;
}
handlerLists.put(option, new LinkedList<ObjectHandler>());
}
}
public void bind(ObjectHandler handler) {
if (handler.getOption().equals(Option.ALL)) {
for (Map.Entry<Option, List<ObjectHandler>> entry : handlerLists.entrySet()) {
entry.getValue().add(handler);
}
} else {
List<ObjectHandler> list = handlerLists.get(handler.getOption());
list.add(handler);
}
}
public void unbindAll() {
for (List<?> list : handlerLists.values()) {
list.clear();
}
}
private static String getOptionName(int id, Option option) {
String optionName = ObjectDefinitions.forId(id).getOptions()[option.toInteger()];
return optionName == null ? "null" : optionName.toLowerCase();
}
public void handle(Player player, int id, Position position, Option option) {
if (player.actionsBlocked()) {
return;
}
List<ObjectHandler> handlers = handlerLists.get(option);
if (handlers != null) {
GroundObjectList objectList = World.getWorld().getGroundObjects();
if (player.getInHouse() != null) {
objectList = player.getInHouse().getObjectList();
}
if (World.getWorld().getTraversalMap().shouldModifyPlane(position.getX(), position.getY())) {
position = position.copy(0, 0, 1);
}
GroundObject object = objectList.get(id, position);
if (object == null || object.isHidden()) {
System.out.println("Object not found " + id);
return;
}
System.out.println("id: " + id + ", rotation: " + object.getRotation() + " , option: " + option + ", type: " + object.getType());
String optionName = getOptionName(id, option);
HandlerContext context = new HandlerContext();
for (ObjectHandler handler : handlers) {
/* Handle the message parameters */
handler.handle(player, object, optionName, context);
if (context.doStop()) {
break;
}
}
}
}
public static ObjectDispatcher getInstance() {
return GameServer.getInstance().getMessageDispatcher().getObjectDispatcher();
}
}