Files
2009scape/Server/src/main/content/global/skill/construction/BuildOptionPlugin.java
T
Ceikry a100affda2 Repository reorganisation
Unified kotlin and java into just src/main
Unified the rs09 and core packages
Took all content out of the core package, and placed it into the new content package
Reorganised all source code relating to content to be easier to find and explore
2023-01-26 13:59:28 +00:00

181 lines
5.0 KiB
Java

package content.global.skill.construction;
import core.cache.def.impl.SceneryDefinition;
import core.game.component.Component;
import core.game.dialogue.DialogueInterpreter;
import core.game.dialogue.DialoguePlugin;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.player.Player;
import core.game.node.scenery.Scenery;
import core.plugin.Initializable;
import core.plugin.Plugin;
import core.tools.SystemLogger;
import core.plugin.ClassScanner;
/**
* The build option handling plugin.
* @author Emperor
*
*/
@Initializable
public final class BuildOptionPlugin extends OptionHandler {
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
SceneryDefinition.setOptionHandler("build", this);
SceneryDefinition.setOptionHandler("remove", this);
ClassScanner.definePlugin(new RemoveDialogue());
return this;
}
@Override
public boolean handle(Player player, Node node, String option) {
if (!player.getHouseManager().isBuildingMode()) {
player.getPacketDispatch().sendMessage("You have to be in building mode to do this.");
return true;
}
Scenery object = ((Scenery) node);
if (option.equals("remove")) {
Decoration decoration = Decoration.getDecoration(player, object);
if (decoration == null || !object.isActive()) {
return false;
}
player.getDialogueInterpreter().open("con:removedec", object);
return true;
}
player.setAttribute("con:hsobject", node);
if (BuildingUtils.isDoorHotspot(object)) {
int[] pos = BuildingUtils.roomExists(player, object);
if (pos != null) {
player.getDialogueInterpreter().open("con:remove", "room", pos);
return true;
}
if (player.getHouseManager().getRoomAmount() < player.getHouseManager().getMaximumRooms(player)) {
player.getInterfaceManager().open(new Component(402));
} else {
player.getPacketDispatch().sendMessage("You currently have the maximum amount of rooms available.");
}
return true;
}
Hotspot hotspot = player.getHouseManager().getHotspot(object);
if (hotspot == null || !isBuildable(player, object, hotspot)) {
System.out.println(hotspot == null);
SystemLogger.logErr(this.getClass(), "Construction (building): " + hotspot + " : " + object + " chunkX = " + object.getLocation().getChunkX() + ", chunkY = " + object.getLocation().getChunkY());
return true;
}
player.setAttribute("con:hotspot", hotspot);
BuildingUtils.openBuildInterface(player, hotspot.getHotspot());
return true;
}
/**
* Checks if the hotspot can be used.
* @param player The player.
* @param hotspot The hotspot.
* @return {@code True} if so.
*/
private static boolean isBuildable(Player player, Scenery object, Hotspot hotspot) {
Room room = player.getHouseManager().getRoom(object.getLocation());
if (room == null) {
return false;
}
switch (hotspot.getHotspot()) {
case STAIRWAYS:
case STAIRS_DOWN:
case STAIRWAYS_DUNGEON:
if (room.isBuilt(BuildHotspot.HALL_RUG)) {
player.getPacketDispatch().sendMessage("You can't build a staircase on a rug.");
return false;
}
return true;
case HALL_RUG:
case HALL_RUG2:
case HALL_RUG3:
if (room.isBuilt(BuildHotspot.STAIRWAYS) || room.isBuilt(BuildHotspot.STAIRS_DOWN) || room.isBuilt(BuildHotspot.STAIRWAYS_DUNGEON)) {
player.getPacketDispatch().sendMessage("You can't build a rug under a staircase.");
return false;
}
return true;
case QUEST_STAIRWAYS:
case STAIRS_DOWN2:
if (room.isBuilt(BuildHotspot.Q_HALL_RUG)) {
player.getPacketDispatch().sendMessage("You can't build a staircase on a rug.");
return false;
}
return true;
case Q_HALL_RUG:
case Q_HALL_RUG2:
case Q_HALL_RUG3:
if (room.isBuilt(BuildHotspot.QUEST_STAIRWAYS) || room.isBuilt(BuildHotspot.STAIRS_DOWN2)) {
player.getPacketDispatch().sendMessage("You can't build a rug under a staircase.");
return false;
}
return true;
default:
return true;
}
}
/**
* Handles the removing a decoration dialogue.
* @author Emperor
*
*/
private static class RemoveDialogue extends DialoguePlugin {
/**
* The object.
*/
private Scenery object;
/**
* Constructs a new {@code RemoveDialogue} {@code Object}.
*/
public RemoveDialogue() {
super();
}
/**
* Constructs a new {@code RemoveDialogue} {@code Object}.
* @param player The player.
*/
public RemoveDialogue(Player player) {
super(player);
}
@Override
public DialoguePlugin newInstance(Player player) {
return new RemoveDialogue(player);
}
@Override
public boolean open(Object... args) {
interpreter.sendOptions("Really remove it?", "Yes", "No");
object = (Scenery) args[0];
return true;
}
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (buttonId) {
case 1:
BuildingUtils.removeDecoration(player, object);
break;
}
end();
return true;
}
@Override
public int[] getIds() {
return new int[] { DialogueInterpreter.getDialogueKey("con:removedec") };
}
}
}