/**
* BetonQuest - advanced quests for Bukkit
* Copyright (C) 2016 Jakub "Co0sh" Sapalski
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package pl.betoncraft.betonquest.events;
import java.util.Arrays;
import org.bukkit.scheduler.BukkitRunnable;
import pl.betoncraft.betonquest.BetonQuest;
import pl.betoncraft.betonquest.Instruction;
import pl.betoncraft.betonquest.InstructionParseException;
import pl.betoncraft.betonquest.ObjectiveID;
import pl.betoncraft.betonquest.QuestRuntimeException;
import pl.betoncraft.betonquest.api.QuestEvent;
import pl.betoncraft.betonquest.database.PlayerData;
import pl.betoncraft.betonquest.utils.Debug;
import pl.betoncraft.betonquest.utils.PlayerConverter;
/**
* Starts an objective for the player
*
* @author Jakub Sapalski
*/
public class ObjectiveEvent extends QuestEvent {
private final ObjectiveID objective;
private final String action;
public ObjectiveEvent(Instruction instruction) throws InstructionParseException {
super(instruction);
action = instruction.next();
objective = instruction.getObjective();
if (!Arrays.asList(new String[]{"start", "add", "delete", "remove", "complete", "finish"})
.contains(action)) {
throw new InstructionParseException("Unknown action: " + action);
}
if (action.equalsIgnoreCase("complete")) {
persistent = false;
} else {
persistent = true;
}
}
@Override
public void run(final String playerID) throws QuestRuntimeException {
if (BetonQuest.getInstance().getObjective(objective) == null) {
throw new QuestRuntimeException("Objective '" + objective + "' is not defined, cannot run objective event");
}
if (PlayerConverter.getPlayer(playerID) == null) {
new BukkitRunnable() {
@Override
public void run() {
PlayerData playerData = new PlayerData(playerID);
switch (action.toLowerCase()) {
case "start":
case "add":
playerData.addNewRawObjective(objective);
break;
case "delete":
case "remove":
playerData.removeRawObjective(objective);
break;
case "complete":
case "finish":
Debug.error("Cannot complete objective for offline player!");
break;
}
}
}.runTaskAsynchronously(BetonQuest.getInstance());
} else {
switch (action.toLowerCase()) {
case "start":
case "add":
BetonQuest.newObjective(playerID, objective);
break;
case "delete":
case "remove":
BetonQuest.getInstance().getObjective(objective).removePlayer(playerID);
BetonQuest.getInstance().getPlayerData(playerID).removeRawObjective(objective);
break;
case "complete":
case "finish":
BetonQuest.getInstance().getObjective(objective).completeObjective(playerID);
break;
}
}
}
}