de.diemex.keepxp.ScrollOfKeeping.java Source code

Java tutorial

Introduction

Here is the source code for de.diemex.keepxp.ScrollOfKeeping.java

Source

/*
 * This file is part of
 * KeepXP Server Plugin for Minecraft
 *
 * Copyright (C) 2013 Diemex
 *
 * KeepXP is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * KeepXP 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 Affero Public License
 * along with KeepXP.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.diemex.keepxp;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
 * @author Diemex
 */
public class ScrollOfKeeping implements Listener {
    private final Plugin plugin;

    public ScrollOfKeeping(Plugin plugin) {
        this.plugin = plugin;
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
    }

    public static ItemStack makeScroll(int lvl, int percentage) {
        Validate.isTrue(lvl > 0, "Cannot have a scroll with a negative value");
        Validate.isTrue(percentage <= 100 && percentage >= 0, "percentage has to be < 100 & > 0 was " + percentage);

        ItemStack scroll = new ItemStack(Material.ENCHANTED_BOOK);
        ItemMeta meat = scroll.getItemMeta();
        meat.setDisplayName("Scroll of Keeping " + StringUtils.repeat("I", lvl)); //only 1-4

        List<String> lore = new ArrayList<String>();
        lore.add("This Scroll lets you keep " + percentage + "%");
        lore.add("of your experience on death.");
        lore.add("");
        lore.add("But if you die the Scroll is");
        lore.add("lost forever!");
        lore.add("");
        lore.add("SOC Lvl " + lvl);

        meat.setLore(lore);
        scroll.setItemMeta(meat);

        return scroll;
    }

    /**
     * Is the given Item a scroll
     *
     * @param stack item to check
     *
     * @return level of scroll or -1 if not a scroll
     */
    public static int getLvlOfScroll(ItemStack stack) {
        if (stack != null && stack.hasItemMeta()) {
            ItemMeta meat = stack.getItemMeta();
            List<String> lore = meat.getLore();
            if (lore != null && lore.size() > 0) {
                String lastLine = lore.get(lore.size() - 1);
                Pattern pattern = Pattern.compile("(?i)SOC lvl [0-9]"); //case insensitive
                if (pattern.matcher(lastLine).find()) {
                    //Remove all but the digits
                    lastLine = Pattern.compile("[^0-9]").matcher(lastLine).replaceAll("");
                    if (lastLine.length() > 0) {
                        return Integer.parseInt(lastLine);
                    }
                }
            }
        }
        return -1;
    }

    @EventHandler
    public void onPlayerDeath(PlayerDeathEvent event) {
        final Player player = event.getEntity();
        loop: for (ItemStack item : event.getDrops()) {
            int lvl = ScrollOfKeeping.getLvlOfScroll(item);
            if (lvl > 0) {
                switch (lvl) {
                case 1: //50%
                    event.setDroppedExp(player.getTotalExperience() * 1 / 2);
                    event.getDrops().remove(item);
                    break loop;
                case 2: //70%
                    event.setDroppedExp(player.getTotalExperience() * 7 / 10);
                    event.getDrops().remove(item);
                    break loop;
                case 3: //90%
                    event.setDroppedExp(player.getTotalExperience() * 9 / 10);
                    event.getDrops().remove(item);
                    break loop;
                case 4: //100%
                    event.setDroppedExp(player.getTotalExperience());
                    event.getDrops().remove(item);
                    break loop;
                }
            }
        }
    }
}