/* * Copyright (C) 2016 eccentric_nz * * 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 me.eccentric_nz.TARDIS.achievement; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import me.eccentric_nz.TARDIS.TARDIS; import me.eccentric_nz.TARDIS.database.QueryFactory; import me.eccentric_nz.TARDIS.database.ResultSetAchievements; import me.eccentric_nz.TARDIS.utility.TARDISNumberParsers; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; /** * Rassilon was the founder of Time Lord civilisation and perhaps the single * greatest figure of Gallifreyan history. He was generally considered the first * Time Lord. Rassilon brought the Eye of Harmony, actually the singularity of a * black hole, to Gallifrey. He invented TARDISes. * * @author eccentric_nz */ public class TARDISAchievementFactory { private final TARDIS plugin; private final Player player; private final String name; int size; public TARDISAchievementFactory(TARDIS plugin, Player player, String name, int size) { this.plugin = plugin; this.player = player; this.name = name; this.size = size; } public void doAchievement(Object obj) { QueryFactory qf = new QueryFactory(plugin); // have they started the achievement? HashMap<String, Object> wherea = new HashMap<String, Object>(); wherea.put("uuid", player.getUniqueId().toString()); wherea.put("name", name); wherea.put("completed", 0); ResultSetAchievements rsa = new ResultSetAchievements(plugin, wherea, false); HashMap<String, Object> seta = new HashMap<String, Object>(); if (rsa.resultSet()) { HashMap<String, Object> wherem = new HashMap<String, Object>(); wherem.put("a_id", rsa.getA_id()); boolean achieved = false; // check if the achievement has been reached List<String> data = null; String amount = (rsa.getAmount().isEmpty()) ? "0" : rsa.getAmount(); if (obj.getClass().equals(String.class)) { // farm mobs & rooms - have they got this type before? data = Arrays.asList(amount.split(":")); if ((data.size() + 1) == size) { achieved = true; } } else { int req = plugin.getAchievementConfig().getInt(name + ".required"); int have = TARDISNumberParsers.parseInt(amount); int sum = have + (Integer) obj; if (sum >= req) { achieved = true; } } if (achieved) { // award achievement! int reward_amount = plugin.getAchievementConfig().getInt(name + ".reward_amount"); String reward_type = plugin.getAchievementConfig().getString(name + ".reward_type"); // TODO display a proper achievement player.sendMessage(ChatColor.YELLOW + "Achievement Get!"); player.sendMessage(ChatColor.WHITE + plugin.getAchievementConfig().getString(name + ".message")); if (reward_type.equalsIgnoreCase("XP")) { new TARDISXPRewarder(player).changeExp(reward_amount); } else { ItemStack is = new ItemStack(Material.valueOf(reward_type), reward_amount); Inventory inv = player.getInventory(); HashMap<Integer, ItemStack> excess = inv.addItem(is); for (Map.Entry<Integer, ItemStack> me : excess.entrySet()) { player.getWorld().dropItem(player.getLocation(), me.getValue()); } } // set achievement as done seta.put("completed", 1); qf.doUpdate("achievements", seta, wherem); } else { if (obj.getClass().equals(String.class)) { if (data != null && !data.contains((String) obj)) { seta.put("amount", amount + ":" + obj); qf.doUpdate("achievements", seta, wherem); } } else { seta.put("amount", TARDISNumberParsers.parseInt(amount) + (Integer) obj); qf.doUpdate("achievements", seta, wherem); } } } else { // is it an auto achievement? if (plugin.getAchievementConfig().getBoolean(name + ".auto")) { // insert a new record seta.put("uuid", player.getUniqueId().toString()); seta.put("name", name); seta.put("amount", obj); seta.put("completed", 0); qf.doInsert("achievements", seta); } } } }