From 65d884e78a59016a69b616c58d85eab4de193034 Mon Sep 17 00:00:00 2001 From: Recursive G Date: Thu, 23 Jul 2015 11:18:02 +0800 Subject: [PATCH] Code reformated with IntellijIDEA --- src/main/java/think/rpgitems/Events.java | 803 +++--- src/main/java/think/rpgitems/Handler.java | 1127 ++++---- src/main/java/think/rpgitems/Plugin.java | 308 +-- .../java/think/rpgitems/PowerHandler.java | 900 ++++--- src/main/java/think/rpgitems/Updater.java | 943 ++++--- .../java/think/rpgitems/api/RPGItems.java | 20 +- .../commands/CommandDocumentation.java | 2 +- .../think/rpgitems/commands/CommandGroup.java | 2 +- .../rpgitems/commands/CommandString.java | 4 +- .../think/rpgitems/commands/Commands.java | 2304 ++++++++--------- .../think/rpgitems/config/ConfigUpdater.java | 89 +- .../think/rpgitems/config/Update01To02.java | 61 +- .../think/rpgitems/config/Update02To03.java | 297 ++- .../think/rpgitems/config/Update03To04.java | 59 +- .../think/rpgitems/config/Update04To05.java | 333 ++- .../java/think/rpgitems/config/Updater.java | 2 +- src/main/java/think/rpgitems/data/Font.java | 30 +- src/main/java/think/rpgitems/data/Locale.java | 317 ++- .../java/think/rpgitems/data/RPGMetadata.java | 352 ++- .../java/think/rpgitems/data/RPGValue.java | 83 +- .../java/think/rpgitems/item/ItemGroup.java | 36 +- .../java/think/rpgitems/item/ItemManager.java | 360 ++- .../think/rpgitems/item/LocaleInventory.java | 113 +- .../java/think/rpgitems/item/Quality.java | 14 +- .../java/think/rpgitems/item/RPGItem.java | 1647 ++++++------ src/main/java/think/rpgitems/power/Power.java | 56 +- .../java/think/rpgitems/power/PowerArrow.java | 79 +- .../think/rpgitems/power/PowerCommand.java | 201 +- .../think/rpgitems/power/PowerConsume.java | 59 +- .../think/rpgitems/power/PowerFireball.java | 77 +- .../java/think/rpgitems/power/PowerFlame.java | 59 +- .../java/think/rpgitems/power/PowerFood.java | 69 +- .../java/think/rpgitems/power/PowerIce.java | 296 ++- .../think/rpgitems/power/PowerKnockup.java | 59 +- .../think/rpgitems/power/PowerLifeSteal.java | 71 +- .../think/rpgitems/power/PowerLightning.java | 67 +- .../think/rpgitems/power/PowerPotionHit.java | 71 +- .../think/rpgitems/power/PowerPotionSelf.java | 93 +- .../think/rpgitems/power/PowerPotionTick.java | 93 +- .../think/rpgitems/power/PowerRainbow.java | 199 +- .../think/rpgitems/power/PowerRumble.java | 197 +- .../java/think/rpgitems/power/PowerRush.java | 83 +- .../think/rpgitems/power/PowerSkyHook.java | 169 +- .../think/rpgitems/power/PowerTNTCannon.java | 79 +- .../think/rpgitems/power/PowerTeleport.java | 206 +- .../think/rpgitems/power/PowerTicker.java | 35 +- .../rpgitems/power/PowerUnbreakable.java | 39 +- .../think/rpgitems/power/PowerUnbreaking.java | 69 +- .../think/rpgitems/power/types/Power.java | 2 +- .../think/rpgitems/power/types/PowerHit.java | 2 +- .../rpgitems/power/types/PowerLeftClick.java | 2 +- .../power/types/PowerProjectileHit.java | 2 +- .../rpgitems/power/types/PowerRightClick.java | 2 +- .../think/rpgitems/power/types/PowerTick.java | 2 +- .../think/rpgitems/support/WorldGuard.java | 65 +- 55 files changed, 6278 insertions(+), 6431 deletions(-) diff --git a/src/main/java/think/rpgitems/Events.java b/src/main/java/think/rpgitems/Events.java index cf684317..4f492630 100644 --- a/src/main/java/think/rpgitems/Events.java +++ b/src/main/java/think/rpgitems/Events.java @@ -19,14 +19,6 @@ import gnu.trove.map.hash.TIntByteHashMap; import gnu.trove.map.hash.TIntIntHashMap; import gnu.trove.map.hash.TObjectIntHashMap; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Random; -import java.util.Set; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -46,11 +38,7 @@ import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingBreakEvent.RemoveCause; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.inventory.InventoryOpenEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.inventory.*; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.event.player.PlayerJoinEvent; @@ -60,7 +48,6 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.projectiles.ProjectileSource; import org.bukkit.scheduler.BukkitRunnable; - import think.rpgitems.data.Locale; import think.rpgitems.data.RPGMetadata; import think.rpgitems.item.ItemManager; @@ -68,399 +55,401 @@ import think.rpgitems.item.RPGItem; import think.rpgitems.support.WorldGuard; -public class Events implements Listener { - - public static TIntByteHashMap removeArrows = new TIntByteHashMap(); - public static TIntIntHashMap rpgProjectiles = new TIntIntHashMap(); - public static TObjectIntHashMap recipeWindows = new TObjectIntHashMap(); - public static HashMap> drops = new HashMap>(); - public static boolean useLocaleInv = false; - - @EventHandler - public void onHangingBreak(HangingBreakEvent e) { - if (e.getCause().equals(RemoveCause.EXPLOSION)) - if (e.getEntity().hasMetadata("Rumble")) { - e.getEntity().removeMetadata("Rumble", Plugin.plugin); // Allow the entity to be broken again - e.setCancelled(true); - } - } - - @EventHandler(ignoreCancelled = true) - public void onBlockBreak(BlockBreakEvent e) { - Player player = e.getPlayer(); - ItemStack item = player.getItemInHand(); - RPGItem rItem; - if ((rItem = ItemManager.toRPGItem(item)) != null) { - RPGMetadata meta = RPGItem.getMetadata(item); - if (rItem.getMaxDurability() != -1) { - int durability = meta.containsKey(RPGMetadata.DURABILITY) ? ((Number) meta.get(RPGMetadata.DURABILITY)).intValue() : rItem.getMaxDurability(); - durability--; - if (durability <= 0) { - player.setItemInHand(null); - } - meta.put(RPGMetadata.DURABILITY, Integer.valueOf(durability)); - } - RPGItem.updateItem(item, Locale.getPlayerLocale(player), meta); - player.updateInventory(); - } - - } - - @EventHandler - public void onEntityDeath(EntityDeathEvent e) { - String type = e.getEntity().getType().toString(); - Random random = new Random(); - if (drops.containsKey(type)) { - Set items = drops.get(type); - Iterator it = items.iterator(); - while (it.hasNext()) { - int id = it.next(); - RPGItem item = ItemManager.getItemById(id); - if (item == null) { - it.remove(); - continue; - } - double chance = item.dropChances.get(type); - if (random.nextDouble() < chance / 100d) { - e.getDrops().add(item.toItemStack("en_GB")); - } - } - } - } - - @EventHandler - public void onProjectileHit(ProjectileHitEvent e) { - final Entity entity = e.getEntity(); - if (removeArrows.contains(entity.getEntityId())) { - entity.remove(); - removeArrows.remove(entity.getEntityId()); - } else if (rpgProjectiles.contains(entity.getEntityId())) { - RPGItem item = ItemManager.getItemById(rpgProjectiles.get(entity.getEntityId())); - new BukkitRunnable() { - @Override - public void run() { - rpgProjectiles.remove(entity.getEntityId()); - } - }.runTask(Plugin.plugin); - if (item == null) - return; - item.projectileHit((Player) ((Projectile) entity).getShooter(), (Projectile) entity); - } - } - - @EventHandler - public void onProjectileFire(ProjectileLaunchEvent e) { - ProjectileSource shooter = e.getEntity().getShooter(); - if (shooter instanceof Player) { - Player player = (Player) shooter; - ItemStack item = player.getItemInHand(); - RPGItem rItem = ItemManager.toRPGItem(item); - if (rItem == null) - return; - if (!WorldGuard.canPvP(player.getLocation()) && !rItem.ignoreWorldGuard) - return; - if (rItem.getHasPermission() == true && player.hasPermission(rItem.getPermission()) == false) { - e.setCancelled(true); - player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); - } - RPGMetadata meta = RPGItem.getMetadata(item); - if (rItem.getMaxDurability() != -1) { - int durability = meta.containsKey(RPGMetadata.DURABILITY) ? ((Number) meta.get(RPGMetadata.DURABILITY)).intValue() : rItem.getMaxDurability(); - durability--; - if (durability <= 0) { - player.setItemInHand(null); - } - meta.put(RPGMetadata.DURABILITY, Integer.valueOf(durability)); - } - RPGItem.updateItem(item, Locale.getPlayerLocale(player), meta); - player.updateInventory(); - rpgProjectiles.put(e.getEntity().getEntityId(), rItem.getID()); - } - } - - @EventHandler - public void onPlayerAction(PlayerInteractEvent e) { - Player player = e.getPlayer(); - if ((e.getAction() == Action.RIGHT_CLICK_AIR || (e.getAction() == Action.RIGHT_CLICK_BLOCK) && !e.isCancelled())) { - ItemStack item = player.getItemInHand(); - - if (item.getType() == Material.BOW || item.getType() == Material.SNOW_BALL || item.getType() == Material.EGG || item.getType() == Material.POTION) - return; - - RPGItem rItem = ItemManager.toRPGItem(item); - if (rItem == null) - return; - if (!WorldGuard.canPvP(player.getLocation()) && !rItem.ignoreWorldGuard) - return; - if (rItem.getHasPermission() == true && player.hasPermission(rItem.getPermission()) == false) { - e.setCancelled(true); - player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); - } - rItem.rightClick(player); - if (!player.getItemInHand().getType().equals(Material.AIR)) - RPGItem.updateItem(item, Locale.getPlayerLocale(player)); - else - player.setItemInHand(null); - player.updateInventory(); - } else if (e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK) { - ItemStack item = player.getItemInHand(); - if (item.getType() == Material.BOW || item.getType() == Material.SNOW_BALL || item.getType() == Material.EGG || item.getType() == Material.POTION) - return; - - RPGItem rItem = ItemManager.toRPGItem(item); - if (rItem == null) - return; - if (!WorldGuard.canPvP(player.getLocation()) && !rItem.ignoreWorldGuard) - return; - if (rItem.getHasPermission() == true && player.hasPermission(rItem.getPermission()) == false) { - e.setCancelled(true); - player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); - } - rItem.leftClick(player); - RPGItem.updateItem(item, Locale.getPlayerLocale(player)); - } - - } +import java.util.*; - @EventHandler - public void onBlockPlace(BlockPlaceEvent e) { - ItemStack item = e.getPlayer().getItemInHand(); - if (item == null) - return; - - RPGItem rItem = ItemManager.toRPGItem(item); - if (rItem == null) - return; - e.setCancelled(true); - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent e) { - Player player = e.getPlayer(); - PlayerInventory in = player.getInventory(); - String locale = Locale.getPlayerLocale(player); - for (int i = 0; i < in.getSize(); i++) { - ItemStack item = in.getItem(i); - if (ItemManager.toRPGItem(item) != null) - RPGItem.updateItem(item, locale); - } - for (ItemStack item : player.getInventory().getArmorContents()) { - if (ItemManager.toRPGItem(item) != null) - RPGItem.updateItem(item, locale); - } - } - - @EventHandler - public void onPlayerPickup(PlayerPickupItemEvent e) { - ItemStack item = e.getItem().getItemStack(); - String locale = Locale.getPlayerLocale(e.getPlayer()); - if (ItemManager.toRPGItem(item) != null) { - RPGItem.updateItem(item, locale); - e.getItem().setItemStack(item); - } - } - - private HashSet localeInventories = new HashSet(); - - @EventHandler - public void onInventoryClose(InventoryCloseEvent e) { - if (recipeWindows.containsKey(e.getPlayer().getName())) { - int id = recipeWindows.remove(e.getPlayer().getName()); - RPGItem item = ItemManager.getItemById(id); - if (item.recipe == null) { - item.recipe = new ArrayList(); - } - item.recipe.clear(); - for (int y = 0; y < 3; y++) { - for (int x = 0; x < 3; x++) { - int i = x + y * 9; - ItemStack it = e.getInventory().getItem(i); - item.recipe.add(it); - } - } - item.hasRecipe = true; - item.resetRecipe(true); - ItemManager.save(Plugin.plugin); - ((Player) e.getPlayer()).sendMessage(ChatColor.AQUA + "Recipe set for " + item.getName()); - } else if (useLocaleInv && e.getView() instanceof LocaleInventory) { - localeInventories.remove(e.getView()); - ((LocaleInventory) e.getView()).getView().close(); - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void onInventoryClick(InventoryClickEvent e) { - if (useLocaleInv && e.getView() instanceof LocaleInventory) { - LocaleInventory inv = (LocaleInventory) e.getView(); - InventoryClickEvent clickEvent = new InventoryClickEvent(inv.getView(), e.getSlotType(), e.getSlot(), e.getClick(), e.getAction()); - Bukkit.getServer().getPluginManager().callEvent(clickEvent); - if (clickEvent.isCancelled()) { - e.setCancelled(true); - } else { - switch (clickEvent.getResult()) { - case DEFAULT: // Can't really do this with current events - case ALLOW: - System.out.println("ok..."); - System.out.println(inv.getView().getItem(e.getRawSlot())); - inv.getView().setItem(e.getRawSlot(), clickEvent.getCursor()); - System.out.println(inv.getView().getItem(e.getRawSlot())); - break; - case DENY: - break; - } - } - for (LocaleInventory localeInv : localeInventories) { - if (localeInv != inv) - localeInv.reload(); - } - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void onInventoryOpen(final InventoryOpenEvent e) { - if (e.getView() instanceof LocaleInventory) - return; - if (e.getInventory().getType() != InventoryType.CHEST || !useLocaleInv) { - Inventory in = e.getInventory(); - Iterator it = in.iterator(); - String locale = Locale.getPlayerLocale((Player) e.getPlayer()); - try { - while (it.hasNext()) { - ItemStack item = it.next(); - if (ItemManager.toRPGItem(item) != null) - RPGItem.updateItem(item, locale); - } - } catch (ArrayIndexOutOfBoundsException ex) { - // Fix for the bug with anvils in craftbukkit - } - } else if (useLocaleInv) { - LocaleInventory localeInv = new LocaleInventory((Player) e.getPlayer(), e.getView()); - e.setCancelled(true); - e.getPlayer().openInventory(localeInv); - localeInventories.add(localeInv); - } - } - - private Random random = new Random(); - - private double playerDamager(EntityDamageByEntityEvent e, double damage) { - Player player = (Player) e.getDamager(); - ItemStack item = player.getItemInHand(); - if (item.getType() == Material.BOW || item.getType() == Material.SNOW_BALL || item.getType() == Material.EGG || item.getType() == Material.POTION) - return damage; - - RPGItem rItem = ItemManager.toRPGItem(item); - if (rItem == null) - return damage; - if (!WorldGuard.canPvP(player.getLocation()) && !rItem.ignoreWorldGuard) - return damage; - if (rItem.getHasPermission() == true && player.hasPermission(rItem.getPermission()) == false) { - damage = 0; - e.setCancelled(true); - player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); - } - damage = rItem.getDamageMin() != rItem.getDamageMax() ? (rItem.getDamageMin() + random.nextInt(rItem.getDamageMax() - rItem.getDamageMin())) : rItem.getDamageMin(); - if (e.getEntity() instanceof LivingEntity) { - LivingEntity le = (LivingEntity) e.getEntity(); - rItem.hit(player, le, e.getDamage()); - } - RPGMetadata meta = RPGItem.getMetadata(item); - if (rItem.getMaxDurability() != -1) { - int durability = meta.containsKey(RPGMetadata.DURABILITY) ? ((Number) meta.get(RPGMetadata.DURABILITY)).intValue() : rItem.getMaxDurability(); - durability--; - if (durability <= 0) { - player.setItemInHand(null); - } - meta.put(RPGMetadata.DURABILITY, Integer.valueOf(durability)); - } - RPGItem.updateItem(item, Locale.getPlayerLocale(player), meta); - player.updateInventory(); - return damage; - } - - private double projectileDamager(EntityDamageByEntityEvent e, double damage) { - Projectile entity = (Projectile) e.getDamager(); - if (rpgProjectiles.contains(entity.getEntityId())) { - RPGItem rItem = ItemManager.getItemById(rpgProjectiles.get(entity.getEntityId())); - if (rItem == null) - return damage; - damage = rItem.getDamageMin() != rItem.getDamageMax() ? (rItem.getDamageMin() + random.nextInt(rItem.getDamageMax() - rItem.getDamageMin())) : rItem.getDamageMin(); - if (e.getEntity() instanceof LivingEntity) { - LivingEntity le = (LivingEntity) e.getEntity(); - rItem.hit((Player) entity.getShooter(), le, e.getDamage()); - } - } - return damage; - } - - private double playerHit(EntityDamageByEntityEvent e, double damage) { - Player p = (Player) e.getEntity(); - if (e.isCancelled() || !WorldGuard.canPvP(p.getLocation())) - return damage; - String locale = Locale.getPlayerLocale(p); - ItemStack[] armour = p.getInventory().getArmorContents(); - for (int i = 0; i < armour.length; i++) { - ItemStack pArmour = armour[i]; - RPGItem pRItem = ItemManager.toRPGItem(pArmour); - if (pRItem == null) - continue; - if (!WorldGuard.canPvP(p.getLocation()) && !pRItem.ignoreWorldGuard) - return damage; - if (pRItem.getHasPermission() == true && p.hasPermission(pRItem.getPermission()) == false) { - damage = 0; - e.setCancelled(true); - p.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(p)))); - } - if (pRItem.getArmour() > 0) { - damage -= Math.round(((double) damage) * (((double) pRItem.getArmour()) / 100d)); - } - RPGMetadata meta = RPGItem.getMetadata(pArmour); - if (pRItem.getMaxDurability() != -1) { - int durability = meta.containsKey(RPGMetadata.DURABILITY) ? ((Number) meta.get(RPGMetadata.DURABILITY)).intValue() : pRItem.getMaxDurability(); - durability--; - if (durability <= 0) { - armour[i] = null; - } - meta.put(RPGMetadata.DURABILITY, Integer.valueOf(durability)); - } - RPGItem.updateItem(pArmour, locale, meta); - } - p.getInventory().setArmorContents(armour); - p.updateInventory(); - return damage; - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onDamage(EntityDamageByEntityEvent e) { - double damage = e.getDamage(); - if (e.getDamager() instanceof Player) { - damage = playerDamager(e, damage); - } else if (e.getDamager() instanceof Projectile) { - damage = projectileDamager(e, damage); - } - if (e.getEntity() instanceof Player) { - damage = playerHit(e, damage); - } - e.setDamage(damage); - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void onItemCraft(PrepareItemCraftEvent e) { - if (ItemManager.toRPGItem(e.getInventory().getResult()) != null) { - Random random = new Random(); - if (random.nextInt(ItemManager.toRPGItem(e.getInventory().getResult()).recipechance) != 0) { - ItemStack baseitem = new ItemStack(e.getInventory().getResult().getType()); - e.getInventory().setResult(baseitem); - } - } - } +public class Events implements Listener { - public void onItemDamage(PlayerItemConsumeEvent e) { - if (ItemManager.toRPGItem(e.getItem()) != null) { - RPGItem rpgitem = ItemManager.toRPGItem(e.getItem()); - if (rpgitem.getMaxDurability() > 0) { - e.getItem().setDurability((short) -1); - } - } - } + public static TIntByteHashMap removeArrows = new TIntByteHashMap(); + public static TIntIntHashMap rpgProjectiles = new TIntIntHashMap(); + public static TObjectIntHashMap recipeWindows = new TObjectIntHashMap(); + public static HashMap> drops = new HashMap>(); + public static boolean useLocaleInv = false; + + @EventHandler + public void onHangingBreak(HangingBreakEvent e) { + if (e.getCause().equals(RemoveCause.EXPLOSION)) + if (e.getEntity().hasMetadata("Rumble")) { + e.getEntity().removeMetadata("Rumble", Plugin.plugin); // Allow the entity to be broken again + e.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent e) { + Player player = e.getPlayer(); + ItemStack item = player.getItemInHand(); + RPGItem rItem; + if ((rItem = ItemManager.toRPGItem(item)) != null) { + RPGMetadata meta = RPGItem.getMetadata(item); + if (rItem.getMaxDurability() != -1) { + int durability = meta.containsKey(RPGMetadata.DURABILITY) ? ((Number) meta.get(RPGMetadata.DURABILITY)).intValue() : rItem.getMaxDurability(); + durability--; + if (durability <= 0) { + player.setItemInHand(null); + } + meta.put(RPGMetadata.DURABILITY, Integer.valueOf(durability)); + } + RPGItem.updateItem(item, Locale.getPlayerLocale(player), meta); + player.updateInventory(); + } + + } + + @EventHandler + public void onEntityDeath(EntityDeathEvent e) { + String type = e.getEntity().getType().toString(); + Random random = new Random(); + if (drops.containsKey(type)) { + Set items = drops.get(type); + Iterator it = items.iterator(); + while (it.hasNext()) { + int id = it.next(); + RPGItem item = ItemManager.getItemById(id); + if (item == null) { + it.remove(); + continue; + } + double chance = item.dropChances.get(type); + if (random.nextDouble() < chance / 100d) { + e.getDrops().add(item.toItemStack("en_GB")); + } + } + } + } + + @EventHandler + public void onProjectileHit(ProjectileHitEvent e) { + final Entity entity = e.getEntity(); + if (removeArrows.contains(entity.getEntityId())) { + entity.remove(); + removeArrows.remove(entity.getEntityId()); + } else if (rpgProjectiles.contains(entity.getEntityId())) { + RPGItem item = ItemManager.getItemById(rpgProjectiles.get(entity.getEntityId())); + new BukkitRunnable() { + @Override + public void run() { + rpgProjectiles.remove(entity.getEntityId()); + } + }.runTask(Plugin.plugin); + if (item == null) + return; + item.projectileHit((Player) ((Projectile) entity).getShooter(), (Projectile) entity); + } + } + + @EventHandler + public void onProjectileFire(ProjectileLaunchEvent e) { + ProjectileSource shooter = e.getEntity().getShooter(); + if (shooter instanceof Player) { + Player player = (Player) shooter; + ItemStack item = player.getItemInHand(); + RPGItem rItem = ItemManager.toRPGItem(item); + if (rItem == null) + return; + if (!WorldGuard.canPvP(player.getLocation()) && !rItem.ignoreWorldGuard) + return; + if (rItem.getHasPermission() == true && player.hasPermission(rItem.getPermission()) == false) { + e.setCancelled(true); + player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); + } + RPGMetadata meta = RPGItem.getMetadata(item); + if (rItem.getMaxDurability() != -1) { + int durability = meta.containsKey(RPGMetadata.DURABILITY) ? ((Number) meta.get(RPGMetadata.DURABILITY)).intValue() : rItem.getMaxDurability(); + durability--; + if (durability <= 0) { + player.setItemInHand(null); + } + meta.put(RPGMetadata.DURABILITY, Integer.valueOf(durability)); + } + RPGItem.updateItem(item, Locale.getPlayerLocale(player), meta); + player.updateInventory(); + rpgProjectiles.put(e.getEntity().getEntityId(), rItem.getID()); + } + } + + @EventHandler + public void onPlayerAction(PlayerInteractEvent e) { + Player player = e.getPlayer(); + if ((e.getAction() == Action.RIGHT_CLICK_AIR || (e.getAction() == Action.RIGHT_CLICK_BLOCK) && !e.isCancelled())) { + ItemStack item = player.getItemInHand(); + + if (item.getType() == Material.BOW || item.getType() == Material.SNOW_BALL || item.getType() == Material.EGG || item.getType() == Material.POTION) + return; + + RPGItem rItem = ItemManager.toRPGItem(item); + if (rItem == null) + return; + if (!WorldGuard.canPvP(player.getLocation()) && !rItem.ignoreWorldGuard) + return; + if (rItem.getHasPermission() == true && player.hasPermission(rItem.getPermission()) == false) { + e.setCancelled(true); + player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); + } + rItem.rightClick(player); + if (!player.getItemInHand().getType().equals(Material.AIR)) + RPGItem.updateItem(item, Locale.getPlayerLocale(player)); + else + player.setItemInHand(null); + player.updateInventory(); + } else if (e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK) { + ItemStack item = player.getItemInHand(); + if (item.getType() == Material.BOW || item.getType() == Material.SNOW_BALL || item.getType() == Material.EGG || item.getType() == Material.POTION) + return; + + RPGItem rItem = ItemManager.toRPGItem(item); + if (rItem == null) + return; + if (!WorldGuard.canPvP(player.getLocation()) && !rItem.ignoreWorldGuard) + return; + if (rItem.getHasPermission() == true && player.hasPermission(rItem.getPermission()) == false) { + e.setCancelled(true); + player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); + } + rItem.leftClick(player); + RPGItem.updateItem(item, Locale.getPlayerLocale(player)); + } + + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent e) { + ItemStack item = e.getPlayer().getItemInHand(); + if (item == null) + return; + + RPGItem rItem = ItemManager.toRPGItem(item); + if (rItem == null) + return; + e.setCancelled(true); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + Player player = e.getPlayer(); + PlayerInventory in = player.getInventory(); + String locale = Locale.getPlayerLocale(player); + for (int i = 0; i < in.getSize(); i++) { + ItemStack item = in.getItem(i); + if (ItemManager.toRPGItem(item) != null) + RPGItem.updateItem(item, locale); + } + for (ItemStack item : player.getInventory().getArmorContents()) { + if (ItemManager.toRPGItem(item) != null) + RPGItem.updateItem(item, locale); + } + } + + @EventHandler + public void onPlayerPickup(PlayerPickupItemEvent e) { + ItemStack item = e.getItem().getItemStack(); + String locale = Locale.getPlayerLocale(e.getPlayer()); + if (ItemManager.toRPGItem(item) != null) { + RPGItem.updateItem(item, locale); + e.getItem().setItemStack(item); + } + } + + private HashSet localeInventories = new HashSet(); + + @EventHandler + public void onInventoryClose(InventoryCloseEvent e) { + if (recipeWindows.containsKey(e.getPlayer().getName())) { + int id = recipeWindows.remove(e.getPlayer().getName()); + RPGItem item = ItemManager.getItemById(id); + if (item.recipe == null) { + item.recipe = new ArrayList(); + } + item.recipe.clear(); + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + int i = x + y * 9; + ItemStack it = e.getInventory().getItem(i); + item.recipe.add(it); + } + } + item.hasRecipe = true; + item.resetRecipe(true); + ItemManager.save(Plugin.plugin); + ((Player) e.getPlayer()).sendMessage(ChatColor.AQUA + "Recipe set for " + item.getName()); + } else if (useLocaleInv && e.getView() instanceof LocaleInventory) { + localeInventories.remove(e.getView()); + ((LocaleInventory) e.getView()).getView().close(); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onInventoryClick(InventoryClickEvent e) { + if (useLocaleInv && e.getView() instanceof LocaleInventory) { + LocaleInventory inv = (LocaleInventory) e.getView(); + InventoryClickEvent clickEvent = new InventoryClickEvent(inv.getView(), e.getSlotType(), e.getSlot(), e.getClick(), e.getAction()); + Bukkit.getServer().getPluginManager().callEvent(clickEvent); + if (clickEvent.isCancelled()) { + e.setCancelled(true); + } else { + switch (clickEvent.getResult()) { + case DEFAULT: // Can't really do this with current events + case ALLOW: + System.out.println("ok..."); + System.out.println(inv.getView().getItem(e.getRawSlot())); + inv.getView().setItem(e.getRawSlot(), clickEvent.getCursor()); + System.out.println(inv.getView().getItem(e.getRawSlot())); + break; + case DENY: + break; + } + } + for (LocaleInventory localeInv : localeInventories) { + if (localeInv != inv) + localeInv.reload(); + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onInventoryOpen(final InventoryOpenEvent e) { + if (e.getView() instanceof LocaleInventory) + return; + if (e.getInventory().getType() != InventoryType.CHEST || !useLocaleInv) { + Inventory in = e.getInventory(); + Iterator it = in.iterator(); + String locale = Locale.getPlayerLocale((Player) e.getPlayer()); + try { + while (it.hasNext()) { + ItemStack item = it.next(); + if (ItemManager.toRPGItem(item) != null) + RPGItem.updateItem(item, locale); + } + } catch (ArrayIndexOutOfBoundsException ex) { + // Fix for the bug with anvils in craftbukkit + } + } else if (useLocaleInv) { + LocaleInventory localeInv = new LocaleInventory((Player) e.getPlayer(), e.getView()); + e.setCancelled(true); + e.getPlayer().openInventory(localeInv); + localeInventories.add(localeInv); + } + } + + private Random random = new Random(); + + private double playerDamager(EntityDamageByEntityEvent e, double damage) { + Player player = (Player) e.getDamager(); + ItemStack item = player.getItemInHand(); + if (item.getType() == Material.BOW || item.getType() == Material.SNOW_BALL || item.getType() == Material.EGG || item.getType() == Material.POTION) + return damage; + + RPGItem rItem = ItemManager.toRPGItem(item); + if (rItem == null) + return damage; + if (!WorldGuard.canPvP(player.getLocation()) && !rItem.ignoreWorldGuard) + return damage; + if (rItem.getHasPermission() == true && player.hasPermission(rItem.getPermission()) == false) { + damage = 0; + e.setCancelled(true); + player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); + } + damage = rItem.getDamageMin() != rItem.getDamageMax() ? (rItem.getDamageMin() + random.nextInt(rItem.getDamageMax() - rItem.getDamageMin())) : rItem.getDamageMin(); + if (e.getEntity() instanceof LivingEntity) { + LivingEntity le = (LivingEntity) e.getEntity(); + rItem.hit(player, le, e.getDamage()); + } + RPGMetadata meta = RPGItem.getMetadata(item); + if (rItem.getMaxDurability() != -1) { + int durability = meta.containsKey(RPGMetadata.DURABILITY) ? ((Number) meta.get(RPGMetadata.DURABILITY)).intValue() : rItem.getMaxDurability(); + durability--; + if (durability <= 0) { + player.setItemInHand(null); + } + meta.put(RPGMetadata.DURABILITY, Integer.valueOf(durability)); + } + RPGItem.updateItem(item, Locale.getPlayerLocale(player), meta); + player.updateInventory(); + return damage; + } + + private double projectileDamager(EntityDamageByEntityEvent e, double damage) { + Projectile entity = (Projectile) e.getDamager(); + if (rpgProjectiles.contains(entity.getEntityId())) { + RPGItem rItem = ItemManager.getItemById(rpgProjectiles.get(entity.getEntityId())); + if (rItem == null) + return damage; + damage = rItem.getDamageMin() != rItem.getDamageMax() ? (rItem.getDamageMin() + random.nextInt(rItem.getDamageMax() - rItem.getDamageMin())) : rItem.getDamageMin(); + if (e.getEntity() instanceof LivingEntity) { + LivingEntity le = (LivingEntity) e.getEntity(); + rItem.hit((Player) entity.getShooter(), le, e.getDamage()); + } + } + return damage; + } + + private double playerHit(EntityDamageByEntityEvent e, double damage) { + Player p = (Player) e.getEntity(); + if (e.isCancelled() || !WorldGuard.canPvP(p.getLocation())) + return damage; + String locale = Locale.getPlayerLocale(p); + ItemStack[] armour = p.getInventory().getArmorContents(); + for (int i = 0; i < armour.length; i++) { + ItemStack pArmour = armour[i]; + RPGItem pRItem = ItemManager.toRPGItem(pArmour); + if (pRItem == null) + continue; + if (!WorldGuard.canPvP(p.getLocation()) && !pRItem.ignoreWorldGuard) + return damage; + if (pRItem.getHasPermission() == true && p.hasPermission(pRItem.getPermission()) == false) { + damage = 0; + e.setCancelled(true); + p.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(p)))); + } + if (pRItem.getArmour() > 0) { + damage -= Math.round(((double) damage) * (((double) pRItem.getArmour()) / 100d)); + } + RPGMetadata meta = RPGItem.getMetadata(pArmour); + if (pRItem.getMaxDurability() != -1) { + int durability = meta.containsKey(RPGMetadata.DURABILITY) ? ((Number) meta.get(RPGMetadata.DURABILITY)).intValue() : pRItem.getMaxDurability(); + durability--; + if (durability <= 0) { + armour[i] = null; + } + meta.put(RPGMetadata.DURABILITY, Integer.valueOf(durability)); + } + RPGItem.updateItem(pArmour, locale, meta); + } + p.getInventory().setArmorContents(armour); + p.updateInventory(); + return damage; + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onDamage(EntityDamageByEntityEvent e) { + double damage = e.getDamage(); + if (e.getDamager() instanceof Player) { + damage = playerDamager(e, damage); + } else if (e.getDamager() instanceof Projectile) { + damage = projectileDamager(e, damage); + } + if (e.getEntity() instanceof Player) { + damage = playerHit(e, damage); + } + e.setDamage(damage); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onItemCraft(PrepareItemCraftEvent e) { + if (ItemManager.toRPGItem(e.getInventory().getResult()) != null) { + Random random = new Random(); + if (random.nextInt(ItemManager.toRPGItem(e.getInventory().getResult()).recipechance) != 0) { + ItemStack baseitem = new ItemStack(e.getInventory().getResult().getType()); + e.getInventory().setResult(baseitem); + } + } + } + + public void onItemDamage(PlayerItemConsumeEvent e) { + if (ItemManager.toRPGItem(e.getItem()) != null) { + RPGItem rpgitem = ItemManager.toRPGItem(e.getItem()); + if (rpgitem.getMaxDurability() > 0) { + e.getItem().setDurability((short) -1); + } + } + } } \ No newline at end of file diff --git a/src/main/java/think/rpgitems/Handler.java b/src/main/java/think/rpgitems/Handler.java index afd96955..731985a7 100644 --- a/src/main/java/think/rpgitems/Handler.java +++ b/src/main/java/think/rpgitems/Handler.java @@ -1,9 +1,5 @@ package think.rpgitems; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; @@ -15,7 +11,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; - import think.rpgitems.commands.CommandDocumentation; import think.rpgitems.commands.CommandGroup; import think.rpgitems.commands.CommandHandler; @@ -27,565 +22,569 @@ import think.rpgitems.power.Power; import think.rpgitems.support.WorldGuard; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + public class Handler implements CommandHandler { - @CommandString("rpgitem list") - @CommandDocumentation("$command.rpgitem.list") - @CommandGroup("list") - public void listItems(CommandSender sender) { - sender.sendMessage(ChatColor.GREEN + "RPGItems:"); - for (RPGItem item : ItemManager.itemByName.values()) { - sender.sendMessage(ChatColor.GREEN + item.getName() + " - " + item.getDisplay()); - } - } - - @CommandString("rpgitem option worldguard") - @CommandDocumentation("$command.rpgitem.worldguard") - @CommandGroup("option_worldguard") - public void toggleWorldGuard(CommandSender sender) { - String locale = Locale.getPlayerLocale((Player) sender); - if (!WorldGuard.isEnabled()) { - sender.sendMessage(ChatColor.RED + Locale.get("message.worldguard.error", locale)); - return; - } - if (WorldGuard.useWorldGuard) { - sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.disable", locale)); - } else { - sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.enable", locale)); - } - WorldGuard.useWorldGuard = !WorldGuard.useWorldGuard; - Plugin.plugin.getConfig().set("support.worldguard", WorldGuard.useWorldGuard); - Plugin.plugin.saveConfig(); - } - - @CommandString("rpgitem $n[]") - @CommandDocumentation("$command.rpgitem.print") - @CommandGroup("item") - public void printItem(CommandSender sender, RPGItem item) { - item.print(sender); - } - - @CommandString("rpgitem $name:s[] create") - @CommandDocumentation("$command.rpgitem.create") - @CommandGroup("item") - public void createItem(CommandSender sender, String itemName) { - String locale = Locale.getPlayerLocale((Player) sender); - if (ItemManager.newItem(itemName.toLowerCase()) != null) { - sender.sendMessage(String.format(ChatColor.GREEN + Locale.get("message.create.ok", locale), itemName)); - ItemManager.save(Plugin.plugin); - } else { - sender.sendMessage(ChatColor.RED + Locale.get("message.create.fail", locale)); - } - } - - @CommandString("rpgitem option giveperms") - @CommandDocumentation("$command.rpgitem.giveperms") - @CommandGroup("option_giveperms") - public void givePerms(CommandSender sender) { - String locale = Locale.getPlayerLocale((Player) sender); - Plugin.plugin.getConfig().set("give-perms", !Plugin.plugin.getConfig().getBoolean("give-perms", false)); - if (Plugin.plugin.getConfig().getBoolean("give-perms", false)) { - sender.sendMessage(ChatColor.AQUA + Locale.get("message.giveperms.true", locale)); - } else { - sender.sendMessage(ChatColor.AQUA + Locale.get("message.giveperms.false", locale)); - } - Plugin.plugin.saveConfig(); - } - - @CommandString(value = "rpgitem $n[] give", handlePermissions = true) - @CommandDocumentation("$command.rpgitem.give") - @CommandGroup("item_give") - public void giveItem(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - if (sender instanceof Player) { - if ((!Plugin.plugin.getConfig().getBoolean("give-perms", false) && sender.hasPermission("rpgitem")) || (Plugin.plugin.getConfig().getBoolean("give-perms", false) && sender.hasPermission("rpgitem.give." + item.getName()))) { - item.give((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.give.ok", locale), item.getDisplay())); - } else { - sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); - } - } else { - sender.sendMessage(ChatColor.RED + Locale.get("message.give.console", locale)); - } - } - - @CommandString("rpgitem $n[] give $p[]") - @CommandDocumentation("$command.rpgitem.give.player") - @CommandGroup("item_give") - public void giveItemPlayer(CommandSender sender, RPGItem item, Player player) { - String locale = Locale.getPlayerLocale((Player) sender); - item.give(player); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.give.to", locale), item.getDisplay() + ChatColor.AQUA, player.getName())); - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.give.ok", locale), item.getDisplay())); - } - - @CommandString("rpgitem $n[] give $p[] $count:i[]") - @CommandDocumentation("$command.rpgitem.give.player.count") - @CommandGroup("item_give") - public void giveItemPlayerCount(CommandSender sender, RPGItem item, Player player, int count) { - for (int i = 0; i < count; i++) { - item.give(player); - } - } - - @CommandString("rpgitem $n[] remove") - @CommandDocumentation("$command.rpgitem.remove") - @CommandGroup("item_remove") - public void removeItem(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - ItemManager.remove(item); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.remove.ok", locale), item.getName())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] display") - @CommandDocumentation("$command.rpgitem.display") - @CommandGroup("item_display") - public void getItemDisplay(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.display.get", locale), item.getName(), item.getDisplay())); - } - - @CommandString("rpgitem $n[] display $display:s[]") - @CommandDocumentation("$command.rpgitem.display.set") - @CommandGroup("item_display") - public void setItemDisplay(CommandSender sender, RPGItem item, String display) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setDisplay(display); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.display.set", locale), item.getName(), item.getDisplay())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] quality") - @CommandDocumentation("$command.rpgitem.quality") - @CommandGroup("item_quality") - public void getItemQuality(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.quality.get", locale), item.getName(), item.getQuality().toString().toLowerCase())); - } - - @CommandString("rpgitem $n[] quality $e[think.rpgitems.item.Quality]") - @CommandDocumentation("$command.rpgitem.quality.set") - @CommandGroup("item_quality") - public void setItemQuality(CommandSender sender, RPGItem item, Quality quality) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setQuality(quality); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.quality.set", locale), item.getName(), item.getQuality().toString().toLowerCase())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] damage") - @CommandDocumentation("$command.rpgitem.damage") - @CommandGroup("item_damage") - public void getItemDamage(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.damage.get", locale), item.getName(), item.getDamageMin(), item.getDamageMax())); - } - - @CommandString("rpgitem $n[] damage $damage:i[]") - @CommandDocumentation("$command.rpgitem.damage.set") - @CommandGroup("item_damage") - public void setItemDamage(CommandSender sender, RPGItem item, int damage) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setDamage(damage, damage); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.damage.set", locale), item.getName(), item.getDamageMin())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] damage $min:i[] $max:i[]") - @CommandDocumentation("$command.rpgitem.damage.set.range") - @CommandGroup("item_damage") - public void setItemDamage(CommandSender sender, RPGItem item, int min, int max) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setDamage(min, max); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.damage.set.range", locale), item.getName(), item.getDamageMin(), item.getDamageMax())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] armour") - @CommandDocumentation("$command.rpgitem.armour") - @CommandGroup("item_armour") - public void getItemArmour(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.armour.get", locale), item.getName(), item.getArmour())); - } - - @CommandString("rpgitem $n[] armour $armour:i[0,100]") - @CommandDocumentation("$command.rpgitem.armour.set") - @CommandGroup("item_armour") - public void setItemArmour(CommandSender sender, RPGItem item, int armour) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setArmour(armour); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.armour.set", locale), item.getName(), item.getArmour())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] type") - @CommandDocumentation("$command.rpgitem.type") - @CommandGroup("item_type") - public void getItemType(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.type.get", locale), item.getName(), item.getType())); - } - - @CommandString("rpgitem $n[] type $type:s[]") - @CommandDocumentation("$command.rpgitem.type.set") - @CommandGroup("item_type") - public void setItemType(CommandSender sender, RPGItem item, String type) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setType(type); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.type.set", locale), item.getName(), item.getType())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] hand") - @CommandDocumentation("$command.rpgitem.hand") - @CommandGroup("item_hand") - public void getItemHand(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.hand.get", locale), item.getName(), item.getHand())); - } - - @CommandString("rpgitem $n[] hand $hand:s[]") - @CommandDocumentation("$command.rpgitem.hand.set") - @CommandGroup("item_hand") - public void setItemHand(CommandSender sender, RPGItem item, String hand) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setHand(hand); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.hand.set", locale), item.getName(), item.getHand())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] lore") - @CommandDocumentation("$command.rpgitem.lore") - @CommandGroup("item_lore") - public void getItemLore(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.lore.get", locale), item.getName(), item.getLore())); - } - - @CommandString("rpgitem $n[] lore $lore:s[]") - @CommandDocumentation("$command.rpgitem.lore.set") - @CommandGroup("item_lore") - public void setItemLore(CommandSender sender, RPGItem item, String lore) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setLore(lore); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.lore.set", locale), item.getName(), item.getLore())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] item") - @CommandDocumentation("$command.rpgitem.item") - @CommandGroup("item_item") - public void getItemItem(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.get", locale), item.getName(), item.getItem().toString())); - } - - @CommandString("rpgitem $n[] item $m[]") - @CommandDocumentation("$command.rpgitem.item.set") - @CommandGroup("item_item") - public void setItemItem(CommandSender sender, RPGItem item, Material material) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setItem(material); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] item $m[] $data:i[]") - @CommandDocumentation("$command.rpgitem.item.set.data") - @CommandGroup("item_item") - public void setItemItem(CommandSender sender, RPGItem item, Material material, int data) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setItem(material, false); - ItemMeta meta = item.getLocaleMeta(locale); - if (meta instanceof LeatherArmorMeta) { - ((LeatherArmorMeta) meta).setColor(Color.fromRGB(data)); - } else { - item.setDataValue((short) data); - } - for (String locales : Locale.getLocales()) { - item.setLocaleMeta(locales, meta.clone()); - } - item.rebuild(); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] item $m[] hex $hexcolour:s[]") - @CommandDocumentation("$command.rpgitem.item.set.data.hex") - @CommandGroup("item_item") - public void setItemItem(CommandSender sender, RPGItem item, Material material, String hexColour) { - String locale = Locale.getPlayerLocale((Player) sender); - int dam; - try { - dam = Integer.parseInt((String) hexColour, 16); - } catch (NumberFormatException e) { - sender.sendMessage(ChatColor.RED + "Failed to parse " + hexColour); - return; - } - item.setItem(material, true); - ItemMeta meta = item.getLocaleMeta(locale); - if (meta instanceof LeatherArmorMeta) { - ((LeatherArmorMeta) meta).setColor(Color.fromRGB(dam)); - } else { - item.setDataValue((short) dam); - } - for (String locales : Locale.getLocales()) { - item.setLocaleMeta(locales, meta.clone()); - } - item.rebuild(); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); - ItemManager.save(Plugin.plugin); - } - - @SuppressWarnings("deprecation") - @CommandString("rpgitem $n[] item $itemid:i[]") - @CommandDocumentation("$command.rpgitem.item.set.id") - @CommandGroup("item_item") - public void setItemItem(CommandSender sender, RPGItem item, int id) { - String locale = Locale.getPlayerLocale((Player) sender); - Material mat = Material.getMaterial(id); - if (mat == null) { - sender.sendMessage(ChatColor.RED + "Cannot find item"); - return; - } - item.setItem(mat); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); - ItemManager.save(Plugin.plugin); - } - - @SuppressWarnings("deprecation") - @CommandString("rpgitem $n[] item $itemid:i[] $data:i[]") - @CommandDocumentation("$command.rpgitem.item.set.id.data") - @CommandGroup("item_item") - public void setItemItem(CommandSender sender, RPGItem item, int id, int data) { - String locale = Locale.getPlayerLocale((Player) sender); - Material mat = Material.getMaterial(id); - if (mat == null) { - sender.sendMessage(ChatColor.RED + Locale.get("message.item.cant.find", locale)); - return; - } - item.setItem(mat, true); - ItemMeta meta = item.toItemStack(locale).getItemMeta(); - if (meta instanceof LeatherArmorMeta) { - ((LeatherArmorMeta) meta).setColor(Color.fromRGB(data)); - } else { - item.setDataValue((short) data); - } - for (String locales : Locale.getLocales()) { - item.setLocaleMeta(locales, meta); - } - item.rebuild(); - sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] removepower $power:s[]") - @CommandDocumentation("$command.rpgitem.removepower") - @CommandGroup("item_removepower") - public void itemRemovePower(CommandSender sender, RPGItem item, String power) { - String locale = Locale.getPlayerLocale((Player) sender); - if (item.removePower(power)) { - Power.powerUsage.put(power, Power.powerUsage.get(power) - 1); - sender.sendMessage(ChatColor.GREEN + String.format(Locale.get("message.power.removed", locale), power)); - ItemManager.save(Plugin.plugin); - } else { - sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.power.unknown", locale), power)); - } - } - - @CommandString("rpgitem $n[] description add $descriptionline:s[]") - @CommandDocumentation("$command.rpgitem.description.add") - @CommandGroup("item_description") - public void itemAddDescription(CommandSender sender, RPGItem item, String line) { - String locale = Locale.getPlayerLocale((Player) sender); - item.addDescription(ChatColor.WHITE + line); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.description.ok", locale)); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] description set $lineno:i[] $descriptionline:s[]") - @CommandDocumentation("$command.rpgitem.description.set") - @CommandGroup("item_description") - public void itemSetDescription(CommandSender sender, RPGItem item, int lineNo, String line) { - String locale = Locale.getPlayerLocale((Player) sender); - if (lineNo < 0 || lineNo >= item.description.size()) { - sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.description.out.of.range", locale), line)); - return; - } - item.description.set(lineNo, ChatColor.translateAlternateColorCodes('&', ChatColor.WHITE + line)); - item.rebuild(); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.description.change", locale)); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] description remove $lineno:i[]") - @CommandDocumentation("$command.rpgitem.description.remove") - @CommandGroup("item_description") - public void itemRemoveDescription(CommandSender sender, RPGItem item, int lineNo) { - String locale = Locale.getPlayerLocale((Player) sender); - if (lineNo < 0 || lineNo >= item.description.size()) { - sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.description.out.of.range", locale), lineNo)); - return; - } - item.description.remove(lineNo); - item.rebuild(); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.description.remove", locale)); - ItemManager.save(Plugin.plugin); - } - - @CommandString("rpgitem $n[] worldguard") - @CommandDocumentation("$command.rpgitem.item.worldguard") - @CommandGroup("item_worldguard") - public void itemToggleWorldGuard(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - if (!WorldGuard.isEnabled()) { - sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.error", locale)); - return; - } - item.ignoreWorldGuard = !item.ignoreWorldGuard; - if (item.ignoreWorldGuard) { - sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.override.active", locale)); - } else { - sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.override.disabled", locale)); - } - } - - @CommandString("rpgitem $n[] removerecipe") - @CommandDocumentation("$command.rpgitem.removerecipe") - @CommandGroup("item_recipe") - public void itemRemoveRecipe(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - item.hasRecipe = false; - item.resetRecipe(true); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.recipe.removed", locale)); - } - - @CommandString("rpgitem $n[] recipe $chance:i[]") - @CommandDocumentation("$command.rpgitem.recipe") - @CommandGroup("item_recipe") - public void itemSetRecipe(CommandSender sender, RPGItem item, int chance) { - String locale = Locale.getPlayerLocale((Player) sender); - if (sender instanceof Player) { - Player player = (Player) sender; - String title = "RPGItems - " + item.getDisplay(); - if (title.length() > 32) { - title = title.substring(0, 32); - } - Inventory recipeInventory = Bukkit.createInventory(player, 27, title); - if (item.hasRecipe) { - ItemStack blank = new ItemStack(Material.WALL_SIGN); - ItemMeta meta = blank.getItemMeta(); - meta.setDisplayName(ChatColor.RED + Locale.get("message.recipe.1", locale)); - ArrayList lore = new ArrayList(); - lore.add(ChatColor.WHITE + Locale.get("message.recipe.2", locale)); - lore.add(ChatColor.WHITE + Locale.get("message.recipe.3", locale)); - lore.add(ChatColor.WHITE + Locale.get("message.recipe.4", locale)); - lore.add(ChatColor.WHITE + Locale.get("message.recipe.5", locale)); - meta.setLore(lore); - blank.setItemMeta(meta); - for (int i = 0; i < 27; i++) { - recipeInventory.setItem(i, blank); - } - for (int x = 0; x < 3; x++) { - for (int y = 0; y < 3; y++) { - int i = x + y * 9; - ItemStack it = item.recipe.get(x + y * 3); - if (it != null) - recipeInventory.setItem(i, it); - else - recipeInventory.setItem(i, null); - } - } - } - item.setRecipeChance(chance); - player.openInventory(recipeInventory); - Events.recipeWindows.put(player.getName(), item.getID()); - } else { - sender.sendMessage(ChatColor.RED + Locale.get("message.error.only.player", locale)); - } - } - - @CommandString("rpgitem $n[] drop $e[org.bukkit.entity.EntityType]") - @CommandDocumentation("$command.rpgitem.drop") - @CommandGroup("item_drop") - public void getItemDropChance(CommandSender sender, RPGItem item, EntityType type) { - String locale = Locale.getPlayerLocale((Player) sender); - sender.sendMessage(String.format(ChatColor.AQUA + Locale.get("message.drop.get", locale), item.getDisplay() + ChatColor.AQUA, type.toString().toLowerCase(), item.dropChances.get(type.toString()))); - } - - @CommandString("rpgitem $n[] drop $e[org.bukkit.entity.EntityType] $chance:f[]") - @CommandDocumentation("$command.rpgitem.drop.set") - @CommandGroup("item_drop") - public void setItemDropChance(CommandSender sender, RPGItem item, EntityType type, double chance) { - String locale = Locale.getPlayerLocale((Player) sender); - chance = Math.min(chance, 100.0); - String typeS = type.toString(); - if (chance > 0) { - item.dropChances.put(typeS, chance); - if (!Events.drops.containsKey(typeS)) { - Events.drops.put(typeS, new HashSet()); - } - Set set = Events.drops.get(typeS); - set.add(item.getID()); - } else { - item.dropChances.remove(typeS); - if (Events.drops.containsKey(typeS)) { - Set set = Events.drops.get(typeS); - set.remove(item.getID()); - } - } - ItemManager.save(Plugin.plugin); - sender.sendMessage(String.format(ChatColor.AQUA + Locale.get("message.drop.set", locale), item.getDisplay() + ChatColor.AQUA, typeS.toLowerCase(), item.dropChances.get(typeS))); - } - - @CommandString("rpgitem $n[] durability $durability:i[]") - @CommandDocumentation("$command.rpgitem.durability") - @CommandGroup("item_durability") - public void setItemDurability(CommandSender sender, RPGItem item, int newValue) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setMaxDurability(newValue); - ItemManager.save(Plugin.plugin); - sender.sendMessage(Locale.get("message.durability.change", locale)); - } - - @CommandString("rpgitem $n[] durability infinite") - @CommandDocumentation("$command.rpgitem.durability.infinite") - @CommandGroup("item_durability") - public void setItemDurabilityInfinite(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - item.setMaxDurability(-1); - ItemManager.save(Plugin.plugin); - sender.sendMessage(Locale.get("message.durability.change", locale)); - } - - @CommandString("rpgitem $n[] durability togglebar") - @CommandDocumentation("$command.rpgitem.durability.togglebar") - @CommandGroup("item_durability") - public void toggleItemDurabilityBar(CommandSender sender, RPGItem item) { - String locale = Locale.getPlayerLocale((Player) sender); - item.toggleBar(); - ItemManager.save(Plugin.plugin); - sender.sendMessage(Locale.get("message.durability.toggle", locale)); - } - - @CommandString("rpgitem $n[] permission $permission:s[] $haspermission:s[]") - @CommandDocumentation("$command.rpgitem.permission") - @CommandGroup("item_permission") - public void setPermission(CommandSender sender, RPGItem item, String permission, String haspermission) { - String locale = Locale.getPlayerLocale((Player) sender); - boolean enabled = false; - if (haspermission.equalsIgnoreCase("true")) { - enabled = true; - } else if (haspermission.equalsIgnoreCase("false")) { - enabled = false; - } else { - sender.sendMessage(Locale.get("message.permission.booleanerror", locale)); - } - item.setPermission(permission); - item.setHaspermission(enabled); - ItemManager.save(Plugin.plugin); - sender.sendMessage(Locale.get("message.permission.success", locale)); - } + @CommandString("rpgitem list") + @CommandDocumentation("$command.rpgitem.list") + @CommandGroup("list") + public void listItems(CommandSender sender) { + sender.sendMessage(ChatColor.GREEN + "RPGItems:"); + for (RPGItem item : ItemManager.itemByName.values()) { + sender.sendMessage(ChatColor.GREEN + item.getName() + " - " + item.getDisplay()); + } + } + + @CommandString("rpgitem option worldguard") + @CommandDocumentation("$command.rpgitem.worldguard") + @CommandGroup("option_worldguard") + public void toggleWorldGuard(CommandSender sender) { + String locale = Locale.getPlayerLocale((Player) sender); + if (!WorldGuard.isEnabled()) { + sender.sendMessage(ChatColor.RED + Locale.get("message.worldguard.error", locale)); + return; + } + if (WorldGuard.useWorldGuard) { + sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.disable", locale)); + } else { + sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.enable", locale)); + } + WorldGuard.useWorldGuard = !WorldGuard.useWorldGuard; + Plugin.plugin.getConfig().set("support.worldguard", WorldGuard.useWorldGuard); + Plugin.plugin.saveConfig(); + } + + @CommandString("rpgitem $n[]") + @CommandDocumentation("$command.rpgitem.print") + @CommandGroup("item") + public void printItem(CommandSender sender, RPGItem item) { + item.print(sender); + } + + @CommandString("rpgitem $name:s[] create") + @CommandDocumentation("$command.rpgitem.create") + @CommandGroup("item") + public void createItem(CommandSender sender, String itemName) { + String locale = Locale.getPlayerLocale((Player) sender); + if (ItemManager.newItem(itemName.toLowerCase()) != null) { + sender.sendMessage(String.format(ChatColor.GREEN + Locale.get("message.create.ok", locale), itemName)); + ItemManager.save(Plugin.plugin); + } else { + sender.sendMessage(ChatColor.RED + Locale.get("message.create.fail", locale)); + } + } + + @CommandString("rpgitem option giveperms") + @CommandDocumentation("$command.rpgitem.giveperms") + @CommandGroup("option_giveperms") + public void givePerms(CommandSender sender) { + String locale = Locale.getPlayerLocale((Player) sender); + Plugin.plugin.getConfig().set("give-perms", !Plugin.plugin.getConfig().getBoolean("give-perms", false)); + if (Plugin.plugin.getConfig().getBoolean("give-perms", false)) { + sender.sendMessage(ChatColor.AQUA + Locale.get("message.giveperms.true", locale)); + } else { + sender.sendMessage(ChatColor.AQUA + Locale.get("message.giveperms.false", locale)); + } + Plugin.plugin.saveConfig(); + } + + @CommandString(value = "rpgitem $n[] give", handlePermissions = true) + @CommandDocumentation("$command.rpgitem.give") + @CommandGroup("item_give") + public void giveItem(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + if (sender instanceof Player) { + if ((!Plugin.plugin.getConfig().getBoolean("give-perms", false) && sender.hasPermission("rpgitem")) || (Plugin.plugin.getConfig().getBoolean("give-perms", false) && sender.hasPermission("rpgitem.give." + item.getName()))) { + item.give((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.give.ok", locale), item.getDisplay())); + } else { + sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); + } + } else { + sender.sendMessage(ChatColor.RED + Locale.get("message.give.console", locale)); + } + } + + @CommandString("rpgitem $n[] give $p[]") + @CommandDocumentation("$command.rpgitem.give.player") + @CommandGroup("item_give") + public void giveItemPlayer(CommandSender sender, RPGItem item, Player player) { + String locale = Locale.getPlayerLocale((Player) sender); + item.give(player); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.give.to", locale), item.getDisplay() + ChatColor.AQUA, player.getName())); + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.give.ok", locale), item.getDisplay())); + } + + @CommandString("rpgitem $n[] give $p[] $count:i[]") + @CommandDocumentation("$command.rpgitem.give.player.count") + @CommandGroup("item_give") + public void giveItemPlayerCount(CommandSender sender, RPGItem item, Player player, int count) { + for (int i = 0; i < count; i++) { + item.give(player); + } + } + + @CommandString("rpgitem $n[] remove") + @CommandDocumentation("$command.rpgitem.remove") + @CommandGroup("item_remove") + public void removeItem(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + ItemManager.remove(item); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.remove.ok", locale), item.getName())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] display") + @CommandDocumentation("$command.rpgitem.display") + @CommandGroup("item_display") + public void getItemDisplay(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.display.get", locale), item.getName(), item.getDisplay())); + } + + @CommandString("rpgitem $n[] display $display:s[]") + @CommandDocumentation("$command.rpgitem.display.set") + @CommandGroup("item_display") + public void setItemDisplay(CommandSender sender, RPGItem item, String display) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setDisplay(display); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.display.set", locale), item.getName(), item.getDisplay())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] quality") + @CommandDocumentation("$command.rpgitem.quality") + @CommandGroup("item_quality") + public void getItemQuality(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.quality.get", locale), item.getName(), item.getQuality().toString().toLowerCase())); + } + + @CommandString("rpgitem $n[] quality $e[think.rpgitems.item.Quality]") + @CommandDocumentation("$command.rpgitem.quality.set") + @CommandGroup("item_quality") + public void setItemQuality(CommandSender sender, RPGItem item, Quality quality) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setQuality(quality); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.quality.set", locale), item.getName(), item.getQuality().toString().toLowerCase())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] damage") + @CommandDocumentation("$command.rpgitem.damage") + @CommandGroup("item_damage") + public void getItemDamage(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.damage.get", locale), item.getName(), item.getDamageMin(), item.getDamageMax())); + } + + @CommandString("rpgitem $n[] damage $damage:i[]") + @CommandDocumentation("$command.rpgitem.damage.set") + @CommandGroup("item_damage") + public void setItemDamage(CommandSender sender, RPGItem item, int damage) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setDamage(damage, damage); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.damage.set", locale), item.getName(), item.getDamageMin())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] damage $min:i[] $max:i[]") + @CommandDocumentation("$command.rpgitem.damage.set.range") + @CommandGroup("item_damage") + public void setItemDamage(CommandSender sender, RPGItem item, int min, int max) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setDamage(min, max); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.damage.set.range", locale), item.getName(), item.getDamageMin(), item.getDamageMax())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] armour") + @CommandDocumentation("$command.rpgitem.armour") + @CommandGroup("item_armour") + public void getItemArmour(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.armour.get", locale), item.getName(), item.getArmour())); + } + + @CommandString("rpgitem $n[] armour $armour:i[0,100]") + @CommandDocumentation("$command.rpgitem.armour.set") + @CommandGroup("item_armour") + public void setItemArmour(CommandSender sender, RPGItem item, int armour) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setArmour(armour); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.armour.set", locale), item.getName(), item.getArmour())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] type") + @CommandDocumentation("$command.rpgitem.type") + @CommandGroup("item_type") + public void getItemType(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.type.get", locale), item.getName(), item.getType())); + } + + @CommandString("rpgitem $n[] type $type:s[]") + @CommandDocumentation("$command.rpgitem.type.set") + @CommandGroup("item_type") + public void setItemType(CommandSender sender, RPGItem item, String type) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setType(type); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.type.set", locale), item.getName(), item.getType())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] hand") + @CommandDocumentation("$command.rpgitem.hand") + @CommandGroup("item_hand") + public void getItemHand(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.hand.get", locale), item.getName(), item.getHand())); + } + + @CommandString("rpgitem $n[] hand $hand:s[]") + @CommandDocumentation("$command.rpgitem.hand.set") + @CommandGroup("item_hand") + public void setItemHand(CommandSender sender, RPGItem item, String hand) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setHand(hand); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.hand.set", locale), item.getName(), item.getHand())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] lore") + @CommandDocumentation("$command.rpgitem.lore") + @CommandGroup("item_lore") + public void getItemLore(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.lore.get", locale), item.getName(), item.getLore())); + } + + @CommandString("rpgitem $n[] lore $lore:s[]") + @CommandDocumentation("$command.rpgitem.lore.set") + @CommandGroup("item_lore") + public void setItemLore(CommandSender sender, RPGItem item, String lore) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setLore(lore); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.lore.set", locale), item.getName(), item.getLore())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] item") + @CommandDocumentation("$command.rpgitem.item") + @CommandGroup("item_item") + public void getItemItem(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.get", locale), item.getName(), item.getItem().toString())); + } + + @CommandString("rpgitem $n[] item $m[]") + @CommandDocumentation("$command.rpgitem.item.set") + @CommandGroup("item_item") + public void setItemItem(CommandSender sender, RPGItem item, Material material) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setItem(material); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] item $m[] $data:i[]") + @CommandDocumentation("$command.rpgitem.item.set.data") + @CommandGroup("item_item") + public void setItemItem(CommandSender sender, RPGItem item, Material material, int data) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setItem(material, false); + ItemMeta meta = item.getLocaleMeta(locale); + if (meta instanceof LeatherArmorMeta) { + ((LeatherArmorMeta) meta).setColor(Color.fromRGB(data)); + } else { + item.setDataValue((short) data); + } + for (String locales : Locale.getLocales()) { + item.setLocaleMeta(locales, meta.clone()); + } + item.rebuild(); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] item $m[] hex $hexcolour:s[]") + @CommandDocumentation("$command.rpgitem.item.set.data.hex") + @CommandGroup("item_item") + public void setItemItem(CommandSender sender, RPGItem item, Material material, String hexColour) { + String locale = Locale.getPlayerLocale((Player) sender); + int dam; + try { + dam = Integer.parseInt((String) hexColour, 16); + } catch (NumberFormatException e) { + sender.sendMessage(ChatColor.RED + "Failed to parse " + hexColour); + return; + } + item.setItem(material, true); + ItemMeta meta = item.getLocaleMeta(locale); + if (meta instanceof LeatherArmorMeta) { + ((LeatherArmorMeta) meta).setColor(Color.fromRGB(dam)); + } else { + item.setDataValue((short) dam); + } + for (String locales : Locale.getLocales()) { + item.setLocaleMeta(locales, meta.clone()); + } + item.rebuild(); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); + ItemManager.save(Plugin.plugin); + } + + @SuppressWarnings("deprecation") + @CommandString("rpgitem $n[] item $itemid:i[]") + @CommandDocumentation("$command.rpgitem.item.set.id") + @CommandGroup("item_item") + public void setItemItem(CommandSender sender, RPGItem item, int id) { + String locale = Locale.getPlayerLocale((Player) sender); + Material mat = Material.getMaterial(id); + if (mat == null) { + sender.sendMessage(ChatColor.RED + "Cannot find item"); + return; + } + item.setItem(mat); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); + ItemManager.save(Plugin.plugin); + } + + @SuppressWarnings("deprecation") + @CommandString("rpgitem $n[] item $itemid:i[] $data:i[]") + @CommandDocumentation("$command.rpgitem.item.set.id.data") + @CommandGroup("item_item") + public void setItemItem(CommandSender sender, RPGItem item, int id, int data) { + String locale = Locale.getPlayerLocale((Player) sender); + Material mat = Material.getMaterial(id); + if (mat == null) { + sender.sendMessage(ChatColor.RED + Locale.get("message.item.cant.find", locale)); + return; + } + item.setItem(mat, true); + ItemMeta meta = item.toItemStack(locale).getItemMeta(); + if (meta instanceof LeatherArmorMeta) { + ((LeatherArmorMeta) meta).setColor(Color.fromRGB(data)); + } else { + item.setDataValue((short) data); + } + for (String locales : Locale.getLocales()) { + item.setLocaleMeta(locales, meta); + } + item.rebuild(); + sender.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.item.set", locale), item.getName(), item.getItem(), item.getDataValue())); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] removepower $power:s[]") + @CommandDocumentation("$command.rpgitem.removepower") + @CommandGroup("item_removepower") + public void itemRemovePower(CommandSender sender, RPGItem item, String power) { + String locale = Locale.getPlayerLocale((Player) sender); + if (item.removePower(power)) { + Power.powerUsage.put(power, Power.powerUsage.get(power) - 1); + sender.sendMessage(ChatColor.GREEN + String.format(Locale.get("message.power.removed", locale), power)); + ItemManager.save(Plugin.plugin); + } else { + sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.power.unknown", locale), power)); + } + } + + @CommandString("rpgitem $n[] description add $descriptionline:s[]") + @CommandDocumentation("$command.rpgitem.description.add") + @CommandGroup("item_description") + public void itemAddDescription(CommandSender sender, RPGItem item, String line) { + String locale = Locale.getPlayerLocale((Player) sender); + item.addDescription(ChatColor.WHITE + line); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.description.ok", locale)); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] description set $lineno:i[] $descriptionline:s[]") + @CommandDocumentation("$command.rpgitem.description.set") + @CommandGroup("item_description") + public void itemSetDescription(CommandSender sender, RPGItem item, int lineNo, String line) { + String locale = Locale.getPlayerLocale((Player) sender); + if (lineNo < 0 || lineNo >= item.description.size()) { + sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.description.out.of.range", locale), line)); + return; + } + item.description.set(lineNo, ChatColor.translateAlternateColorCodes('&', ChatColor.WHITE + line)); + item.rebuild(); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.description.change", locale)); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] description remove $lineno:i[]") + @CommandDocumentation("$command.rpgitem.description.remove") + @CommandGroup("item_description") + public void itemRemoveDescription(CommandSender sender, RPGItem item, int lineNo) { + String locale = Locale.getPlayerLocale((Player) sender); + if (lineNo < 0 || lineNo >= item.description.size()) { + sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.description.out.of.range", locale), lineNo)); + return; + } + item.description.remove(lineNo); + item.rebuild(); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.description.remove", locale)); + ItemManager.save(Plugin.plugin); + } + + @CommandString("rpgitem $n[] worldguard") + @CommandDocumentation("$command.rpgitem.item.worldguard") + @CommandGroup("item_worldguard") + public void itemToggleWorldGuard(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + if (!WorldGuard.isEnabled()) { + sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.error", locale)); + return; + } + item.ignoreWorldGuard = !item.ignoreWorldGuard; + if (item.ignoreWorldGuard) { + sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.override.active", locale)); + } else { + sender.sendMessage(ChatColor.AQUA + Locale.get("message.worldguard.override.disabled", locale)); + } + } + + @CommandString("rpgitem $n[] removerecipe") + @CommandDocumentation("$command.rpgitem.removerecipe") + @CommandGroup("item_recipe") + public void itemRemoveRecipe(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + item.hasRecipe = false; + item.resetRecipe(true); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.recipe.removed", locale)); + } + + @CommandString("rpgitem $n[] recipe $chance:i[]") + @CommandDocumentation("$command.rpgitem.recipe") + @CommandGroup("item_recipe") + public void itemSetRecipe(CommandSender sender, RPGItem item, int chance) { + String locale = Locale.getPlayerLocale((Player) sender); + if (sender instanceof Player) { + Player player = (Player) sender; + String title = "RPGItems - " + item.getDisplay(); + if (title.length() > 32) { + title = title.substring(0, 32); + } + Inventory recipeInventory = Bukkit.createInventory(player, 27, title); + if (item.hasRecipe) { + ItemStack blank = new ItemStack(Material.WALL_SIGN); + ItemMeta meta = blank.getItemMeta(); + meta.setDisplayName(ChatColor.RED + Locale.get("message.recipe.1", locale)); + ArrayList lore = new ArrayList(); + lore.add(ChatColor.WHITE + Locale.get("message.recipe.2", locale)); + lore.add(ChatColor.WHITE + Locale.get("message.recipe.3", locale)); + lore.add(ChatColor.WHITE + Locale.get("message.recipe.4", locale)); + lore.add(ChatColor.WHITE + Locale.get("message.recipe.5", locale)); + meta.setLore(lore); + blank.setItemMeta(meta); + for (int i = 0; i < 27; i++) { + recipeInventory.setItem(i, blank); + } + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + int i = x + y * 9; + ItemStack it = item.recipe.get(x + y * 3); + if (it != null) + recipeInventory.setItem(i, it); + else + recipeInventory.setItem(i, null); + } + } + } + item.setRecipeChance(chance); + player.openInventory(recipeInventory); + Events.recipeWindows.put(player.getName(), item.getID()); + } else { + sender.sendMessage(ChatColor.RED + Locale.get("message.error.only.player", locale)); + } + } + + @CommandString("rpgitem $n[] drop $e[org.bukkit.entity.EntityType]") + @CommandDocumentation("$command.rpgitem.drop") + @CommandGroup("item_drop") + public void getItemDropChance(CommandSender sender, RPGItem item, EntityType type) { + String locale = Locale.getPlayerLocale((Player) sender); + sender.sendMessage(String.format(ChatColor.AQUA + Locale.get("message.drop.get", locale), item.getDisplay() + ChatColor.AQUA, type.toString().toLowerCase(), item.dropChances.get(type.toString()))); + } + + @CommandString("rpgitem $n[] drop $e[org.bukkit.entity.EntityType] $chance:f[]") + @CommandDocumentation("$command.rpgitem.drop.set") + @CommandGroup("item_drop") + public void setItemDropChance(CommandSender sender, RPGItem item, EntityType type, double chance) { + String locale = Locale.getPlayerLocale((Player) sender); + chance = Math.min(chance, 100.0); + String typeS = type.toString(); + if (chance > 0) { + item.dropChances.put(typeS, chance); + if (!Events.drops.containsKey(typeS)) { + Events.drops.put(typeS, new HashSet()); + } + Set set = Events.drops.get(typeS); + set.add(item.getID()); + } else { + item.dropChances.remove(typeS); + if (Events.drops.containsKey(typeS)) { + Set set = Events.drops.get(typeS); + set.remove(item.getID()); + } + } + ItemManager.save(Plugin.plugin); + sender.sendMessage(String.format(ChatColor.AQUA + Locale.get("message.drop.set", locale), item.getDisplay() + ChatColor.AQUA, typeS.toLowerCase(), item.dropChances.get(typeS))); + } + + @CommandString("rpgitem $n[] durability $durability:i[]") + @CommandDocumentation("$command.rpgitem.durability") + @CommandGroup("item_durability") + public void setItemDurability(CommandSender sender, RPGItem item, int newValue) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setMaxDurability(newValue); + ItemManager.save(Plugin.plugin); + sender.sendMessage(Locale.get("message.durability.change", locale)); + } + + @CommandString("rpgitem $n[] durability infinite") + @CommandDocumentation("$command.rpgitem.durability.infinite") + @CommandGroup("item_durability") + public void setItemDurabilityInfinite(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + item.setMaxDurability(-1); + ItemManager.save(Plugin.plugin); + sender.sendMessage(Locale.get("message.durability.change", locale)); + } + + @CommandString("rpgitem $n[] durability togglebar") + @CommandDocumentation("$command.rpgitem.durability.togglebar") + @CommandGroup("item_durability") + public void toggleItemDurabilityBar(CommandSender sender, RPGItem item) { + String locale = Locale.getPlayerLocale((Player) sender); + item.toggleBar(); + ItemManager.save(Plugin.plugin); + sender.sendMessage(Locale.get("message.durability.toggle", locale)); + } + + @CommandString("rpgitem $n[] permission $permission:s[] $haspermission:s[]") + @CommandDocumentation("$command.rpgitem.permission") + @CommandGroup("item_permission") + public void setPermission(CommandSender sender, RPGItem item, String permission, String haspermission) { + String locale = Locale.getPlayerLocale((Player) sender); + boolean enabled = false; + if (haspermission.equalsIgnoreCase("true")) { + enabled = true; + } else if (haspermission.equalsIgnoreCase("false")) { + enabled = false; + } else { + sender.sendMessage(Locale.get("message.permission.booleanerror", locale)); + } + item.setPermission(permission); + item.setHaspermission(enabled); + ItemManager.save(Plugin.plugin); + sender.sendMessage(Locale.get("message.permission.success", locale)); + } } diff --git a/src/main/java/think/rpgitems/Plugin.java b/src/main/java/think/rpgitems/Plugin.java index d46aeaad..28b21d1d 100644 --- a/src/main/java/think/rpgitems/Plugin.java +++ b/src/main/java/think/rpgitems/Plugin.java @@ -16,15 +16,6 @@ */ package think.rpgitems; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.List; -import java.util.logging.Logger; - import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; @@ -32,173 +23,154 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.java.JavaPlugin; - import think.rpgitems.commands.Commands; import think.rpgitems.config.ConfigUpdater; import think.rpgitems.data.Font; import think.rpgitems.data.Locale; import think.rpgitems.item.ItemManager; -import think.rpgitems.power.Power; -import think.rpgitems.power.PowerArrow; -import think.rpgitems.power.PowerCommand; -import think.rpgitems.power.PowerConsume; -import think.rpgitems.power.PowerFireball; -import think.rpgitems.power.PowerFlame; -import think.rpgitems.power.PowerFood; -import think.rpgitems.power.PowerIce; -import think.rpgitems.power.PowerKnockup; -import think.rpgitems.power.PowerLifeSteal; -import think.rpgitems.power.PowerLightning; -import think.rpgitems.power.PowerPotionHit; -import think.rpgitems.power.PowerPotionSelf; -import think.rpgitems.power.PowerPotionTick; -import think.rpgitems.power.PowerRainbow; -import think.rpgitems.power.PowerRumble; -import think.rpgitems.power.PowerRush; -import think.rpgitems.power.PowerSkyHook; -import think.rpgitems.power.PowerTNTCannon; -import think.rpgitems.power.PowerTeleport; -import think.rpgitems.power.PowerTicker; -import think.rpgitems.power.PowerUnbreakable; -import think.rpgitems.power.PowerUnbreaking; +import think.rpgitems.power.*; import think.rpgitems.support.WorldGuard; +import java.io.*; +import java.util.List; +import java.util.logging.Logger; + @SuppressWarnings("deprecation") public class Plugin extends JavaPlugin { - public static Logger logger = Logger.getLogger("RPGItems"); - - public static Plugin plugin; - - @Override - public void onLoad() { - plugin = this; - reloadConfig(); - Font.load(); - Power.powers.put("arrow", PowerArrow.class); - Power.powers.put("tntcannon", PowerTNTCannon.class); - Power.powers.put("rainbow", PowerRainbow.class); - Power.powers.put("flame", PowerFlame.class); - Power.powers.put("lightning", PowerLightning.class); - Power.powers.put("command", PowerCommand.class); - Power.powers.put("potionhit", PowerPotionHit.class); - Power.powers.put("teleport", PowerTeleport.class); - Power.powers.put("fireball", PowerFireball.class); - Power.powers.put("ice", PowerIce.class); - Power.powers.put("knockup", PowerKnockup.class); - Power.powers.put("rush", PowerRush.class); - Power.powers.put("potionself", PowerPotionSelf.class); - Power.powers.put("consume", PowerConsume.class); - Power.powers.put("unbreakable", PowerUnbreakable.class); - Power.powers.put("unbreaking", PowerUnbreaking.class); - Power.powers.put("rumble", PowerRumble.class); - Power.powers.put("skyhook", PowerSkyHook.class); - Power.powers.put("potiontick", PowerPotionTick.class); - Power.powers.put("food", PowerFood.class); - Power.powers.put("lifesteal", PowerLifeSteal.class); - } - - @Override - public void onEnable() { - Locale.init(this); - updateConfig(); - WorldGuard.init(this); - ConfigurationSection conf = getConfig(); - if (conf.getBoolean("autoupdate", true)) { - new Updater(this, 70226, this.getFile(), Updater.UpdateType.DEFAULT, false); - } - if (conf.getBoolean("localeInv", false)) { - Events.useLocaleInv = true; - } - getServer().getPluginManager().registerEvents(new Events(), this); - ItemManager.load(this); - Commands.register(new Handler()); - Commands.register(new PowerHandler()); - new PowerTicker().runTaskTimer(this, 0, 1); - } - - @Override - public void saveConfig() { - FileConfiguration config = getConfig(); - FileOutputStream out = null; - try { - File f = new File(getDataFolder(), "config.yml"); - if (!f.exists()) - f.createNewFile(); - out = new FileOutputStream(f); - out.write(config.saveToString().getBytes("UTF-8")); - } catch (FileNotFoundException e) { - } catch (UnsupportedEncodingException e) { - } catch (IOException e) { - } finally { - try { - if (out != null) - out.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - public static FileConfiguration config; - - @Override - public void reloadConfig() { - FileInputStream in = null; - config = new YamlConfiguration(); - try { - File f = new File(getDataFolder(), "config.yml"); - in = new FileInputStream(f); - byte[] data = new byte[(int) f.length()]; - in.read(data); - String str = new String(data, "UTF-8"); - config.loadFromString(str); - } catch (FileNotFoundException e) { - } catch (IOException e) { - } catch (InvalidConfigurationException e) { - } finally { - try { - if (in != null) - in.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - } - - public FileConfiguration getConfig() { - return config; - } - - public void updateConfig() { - ConfigUpdater.updateConfig(getConfig()); - saveConfig(); - } - - @Override - public void onDisable() { - this.getServer().getScheduler().cancelAllTasks(); - } - - @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - StringBuilder out = new StringBuilder(); - out.append(label).append(' '); - for (String arg : args) - out.append(arg).append(' '); - Commands.exec(sender, out.toString()); - return true; - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - StringBuilder out = new StringBuilder(); - out.append(alias).append(' '); - for (String arg : args) - out.append(arg).append(' '); - return Commands.complete(sender, out.toString()); - } + public static Logger logger = Logger.getLogger("RPGItems"); + + public static Plugin plugin; + + @Override + public void onLoad() { + plugin = this; + reloadConfig(); + Font.load(); + Power.powers.put("arrow", PowerArrow.class); + Power.powers.put("tntcannon", PowerTNTCannon.class); + Power.powers.put("rainbow", PowerRainbow.class); + Power.powers.put("flame", PowerFlame.class); + Power.powers.put("lightning", PowerLightning.class); + Power.powers.put("command", PowerCommand.class); + Power.powers.put("potionhit", PowerPotionHit.class); + Power.powers.put("teleport", PowerTeleport.class); + Power.powers.put("fireball", PowerFireball.class); + Power.powers.put("ice", PowerIce.class); + Power.powers.put("knockup", PowerKnockup.class); + Power.powers.put("rush", PowerRush.class); + Power.powers.put("potionself", PowerPotionSelf.class); + Power.powers.put("consume", PowerConsume.class); + Power.powers.put("unbreakable", PowerUnbreakable.class); + Power.powers.put("unbreaking", PowerUnbreaking.class); + Power.powers.put("rumble", PowerRumble.class); + Power.powers.put("skyhook", PowerSkyHook.class); + Power.powers.put("potiontick", PowerPotionTick.class); + Power.powers.put("food", PowerFood.class); + Power.powers.put("lifesteal", PowerLifeSteal.class); + } + + @Override + public void onEnable() { + Locale.init(this); + updateConfig(); + WorldGuard.init(this); + ConfigurationSection conf = getConfig(); + if (conf.getBoolean("autoupdate", true)) { + new Updater(this, 70226, this.getFile(), Updater.UpdateType.DEFAULT, false); + } + if (conf.getBoolean("localeInv", false)) { + Events.useLocaleInv = true; + } + getServer().getPluginManager().registerEvents(new Events(), this); + ItemManager.load(this); + Commands.register(new Handler()); + Commands.register(new PowerHandler()); + new PowerTicker().runTaskTimer(this, 0, 1); + } + + @Override + public void saveConfig() { + FileConfiguration config = getConfig(); + FileOutputStream out = null; + try { + File f = new File(getDataFolder(), "config.yml"); + if (!f.exists()) + f.createNewFile(); + out = new FileOutputStream(f); + out.write(config.saveToString().getBytes("UTF-8")); + } catch (FileNotFoundException e) { + } catch (UnsupportedEncodingException e) { + } catch (IOException e) { + } finally { + try { + if (out != null) + out.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + public static FileConfiguration config; + + @Override + public void reloadConfig() { + FileInputStream in = null; + config = new YamlConfiguration(); + try { + File f = new File(getDataFolder(), "config.yml"); + in = new FileInputStream(f); + byte[] data = new byte[(int) f.length()]; + in.read(data); + String str = new String(data, "UTF-8"); + config.loadFromString(str); + } catch (FileNotFoundException e) { + } catch (IOException e) { + } catch (InvalidConfigurationException e) { + } finally { + try { + if (in != null) + in.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + + public FileConfiguration getConfig() { + return config; + } + + public void updateConfig() { + ConfigUpdater.updateConfig(getConfig()); + saveConfig(); + } + + @Override + public void onDisable() { + this.getServer().getScheduler().cancelAllTasks(); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + StringBuilder out = new StringBuilder(); + out.append(label).append(' '); + for (String arg : args) + out.append(arg).append(' '); + Commands.exec(sender, out.toString()); + return true; + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + StringBuilder out = new StringBuilder(); + out.append(alias).append(' '); + for (String arg : args) + out.append(arg).append(' '); + return Commands.complete(sender, out.toString()); + } } diff --git a/src/main/java/think/rpgitems/PowerHandler.java b/src/main/java/think/rpgitems/PowerHandler.java index d97df037..64cfae6a 100644 --- a/src/main/java/think/rpgitems/PowerHandler.java +++ b/src/main/java/think/rpgitems/PowerHandler.java @@ -5,7 +5,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; - import think.rpgitems.commands.CommandDocumentation; import think.rpgitems.commands.CommandGroup; import think.rpgitems.commands.CommandHandler; @@ -13,465 +12,448 @@ import think.rpgitems.data.Locale; import think.rpgitems.item.ItemManager; import think.rpgitems.item.RPGItem; -import think.rpgitems.power.PowerArrow; -import think.rpgitems.power.PowerCommand; -import think.rpgitems.power.PowerConsume; -import think.rpgitems.power.PowerFireball; -import think.rpgitems.power.PowerFlame; -import think.rpgitems.power.PowerFood; -import think.rpgitems.power.PowerIce; -import think.rpgitems.power.PowerKnockup; -import think.rpgitems.power.PowerLifeSteal; -import think.rpgitems.power.PowerLightning; -import think.rpgitems.power.PowerPotionHit; -import think.rpgitems.power.PowerPotionSelf; -import think.rpgitems.power.PowerPotionTick; -import think.rpgitems.power.PowerRainbow; -import think.rpgitems.power.PowerRumble; -import think.rpgitems.power.PowerSkyHook; -import think.rpgitems.power.PowerTNTCannon; -import think.rpgitems.power.PowerTeleport; +import think.rpgitems.power.*; public class PowerHandler implements CommandHandler { - @CommandString("rpgitem $n[] power arrow") - @CommandDocumentation("$command.rpgitem.arrow") - @CommandGroup("item_power_arrow") - public void arrow(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerArrow pow = new PowerArrow(); - pow.cooldownTime = 20; - pow.item = item; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power arrow $cooldown:i[]") - @CommandDocumentation("$command.rpgitem.arrow.full") - @CommandGroup("item_power_arrow") - public void arrow(CommandSender sender, RPGItem item, int cooldown) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerArrow pow = new PowerArrow(); - pow.item = item; - pow.cooldownTime = cooldown; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power command $cooldown:i[] $o[left,right] $display:s[] $command:s[]") - @CommandDocumentation("$command.rpgitem.command") - @CommandGroup("item_power_command_b") - public void command(CommandSender sender, RPGItem item, int cooldown, String mouse, String displayText, String command) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerCommand com = new PowerCommand(); - com.cooldownTime = cooldown; - command = command.trim(); - if (command.charAt(0) == '/') { - command = command.substring(1); - } - com.isRight = mouse.equals("right"); - com.display = displayText; - com.command = command; - com.item = item; - item.addPower(com); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power command $cooldown:i[] $o[left,right] $display:s[] $command:s[] $permission:s[]") - @CommandDocumentation("$command.rpgitem.command.full") - @CommandGroup("item_power_command_a") - public void command(CommandSender sender, RPGItem item, int cooldown, String mouse, String displayText, String command, String permission) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerCommand com = new PowerCommand(); - com.cooldownTime = cooldown; - command = command.trim(); - if (command.charAt(0) == '/') { - command = command.substring(1); - } - com.isRight = mouse.equals("right"); - com.display = displayText; - com.command = command; - com.permission = permission; - com.item = item; - item.addPower(com); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power command $cooldown:i[] $o[left,right] $details:s[]") - @CommandDocumentation("$command.rpgitem.command.old") - @CommandGroup("item_power_command_c") - public void command(CommandSender sender, RPGItem item, int cooldown, String mouse, String details) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - String[] pArgs = details.split("\\|"); - if (pArgs.length < 2) { - sender.sendMessage(ChatColor.RED + Locale.get("message.error.command.format", locale)); - return; - } - String display = pArgs[0].trim(); - String command = pArgs[1].trim(); - if (command.charAt(0) == '/') { - command = command.substring(1); - } - String permission = ""; - if (pArgs.length > 2) { - permission = pArgs[2].trim(); - } - - PowerCommand com = new PowerCommand(); - com.cooldownTime = cooldown; - - com.isRight = mouse.equals("right"); - com.item = item; - com.display = display; - com.command = command; - com.permission = permission; - - item.addPower(com); - item.rebuild(); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power consume") - @CommandDocumentation("$command.rpgitem.consume") - @CommandGroup("item_power_consume") - public void consume(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerConsume pow = new PowerConsume(); - pow.item = item; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power fireball") - @CommandDocumentation("$command.rpgitem.fireball") - @CommandGroup("item_power_fireball") - public void fireball(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerFireball pow = new PowerFireball(); - pow.cooldownTime = 20; - pow.item = item; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power fireball $cooldown:i[]") - @CommandDocumentation("$command.rpgitem.fireball.full") - @CommandGroup("item_power_fireball") - public void fireball(CommandSender sender, RPGItem item, int cooldown) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerFireball pow = new PowerFireball(); - pow.item = item; - pow.cooldownTime = cooldown; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power flame") - @CommandDocumentation("$command.rpgitem.flame") - @CommandGroup("item_power_flame") - public void flame(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerFlame pow = new PowerFlame(); - pow.burnTime = 20; - pow.item = item; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power flame $burntime:i[]") - @CommandDocumentation("$command.rpgitem.flame.full") - @CommandGroup("item_power_flame") - public void flame(CommandSender sender, RPGItem item, int burnTime) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerFlame pow = new PowerFlame(); - pow.item = item; - pow.burnTime = burnTime; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power lifesteal $chance:i[]") - @CommandDocumentation("$command.rpgitem.lifesteal") - @CommandGroup("item_power_lifesteal") - public void lifsteal(CommandSender sender, RPGItem item, int chance) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerLifeSteal pow = new PowerLifeSteal(); - pow.item = item; - pow.chance = chance; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power ice") - @CommandDocumentation("$command.rpgitem.ice") - @CommandGroup("item_power_ice") - public void ice(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerIce pow = new PowerIce(); - pow.cooldownTime = 20; - pow.item = item; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power ice $cooldown:i[]") - @CommandDocumentation("$command.rpgitem.ice.full") - @CommandGroup("item_power_ice") - public void ice(CommandSender sender, RPGItem item, int cooldown) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerIce pow = new PowerIce(); - pow.item = item; - pow.cooldownTime = cooldown; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power knockup") - @CommandDocumentation("$command.rpgitem.knockup") - @CommandGroup("item_power_knockup") - public void knockup(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerKnockup pow = new PowerKnockup(); - pow.item = item; - pow.chance = 20; - pow.power = 2; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power knockup $chance:i[] $power:f[]") - @CommandDocumentation("$command.rpgitem.knockup.full") - @CommandGroup("item_power_knockup") - public void knockup(CommandSender sender, RPGItem item, int chance, double power) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerKnockup pow = new PowerKnockup(); - pow.item = item; - pow.chance = chance; - pow.power = power; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power lightning") - @CommandDocumentation("$command.rpgitem.lightning") - @CommandGroup("item_power_lightning") - public void lightning(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerLightning pow = new PowerLightning(); - pow.item = item; - pow.chance = 20; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power lightning $chance:i[]") - @CommandDocumentation("$command.rpgitem.lightning.full") - @CommandGroup("item_power_lightning") - public void lightning(CommandSender sender, RPGItem item, int chance) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerLightning pow = new PowerLightning(); - pow.item = item; - pow.chance = chance; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power potionhit $chance:i[] $duration:i[] $amplifier:i[] $effect:s[]") - @CommandDocumentation("$command.rpgitem.potionhit+PotionEffectType") - @CommandGroup("item_power_potionhit") - public void potionhit(CommandSender sender, RPGItem item, int chance, int duration, int amplifier, String effect) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerPotionHit pow = new PowerPotionHit(); - pow.item = item; - pow.chance = chance; - pow.duration = duration; - pow.amplifier = amplifier; - pow.type = PotionEffectType.getByName(effect); - if (pow.type == null) { - sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.effect", locale), effect)); - return; - } - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power potionself $cooldown:i[] $duration:i[] $amplifier:i[] $effect:s[]") - @CommandDocumentation("$command.rpgitem.potionself+PotionEffectType") - @CommandGroup("item_power_potionself") - public void potionself(CommandSender sender, RPGItem item, int ccoldown, int duration, int amplifier, String effect) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerPotionSelf pow = new PowerPotionSelf(); - pow.item = item; - pow.cooldownTime = ccoldown; - pow.time = duration; - pow.amplifier = amplifier; - pow.type = PotionEffectType.getByName(effect); - if (pow.type == null) { - sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.effect", locale), effect)); - return; - } - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power rainbow") - @CommandDocumentation("$command.rpgitem.rainbow") - @CommandGroup("item_power_rainbow") - public void rainbow(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerRainbow pow = new PowerRainbow(); - pow.cooldownTime = 20; - pow.count = 5; - pow.item = item; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power rainbow $cooldown:i[] $count:i[]") - @CommandDocumentation("$command.rpgitem.rainbow.full") - @CommandGroup("item_power_rainbow") - public void rainbow(CommandSender sender, RPGItem item, int cooldown, int count) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerRainbow pow = new PowerRainbow(); - pow.cooldownTime = cooldown; - pow.count = count; - pow.item = item; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power rumble $cooldown:i[] $power:i[] $distance:i[]") - @CommandDocumentation("$command.rpgitem.rumble") - @CommandGroup("item_power_rumble") - public void rumble(CommandSender sender, RPGItem item, int cooldown, int power, int distance) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerRumble pow = new PowerRumble(); - pow.item = item; - pow.cooldownTime = cooldown; - pow.power = power; - pow.distance = distance; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power teleport") - @CommandDocumentation("$command.rpgitem.teleport") - @CommandGroup("item_power_teleport") - public void teleport(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerTeleport pow = new PowerTeleport(); - pow.item = item; - pow.cooldownTime = 20; - pow.distance = 5; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power teleport $cooldown:i[] $distance:i[]") - @CommandDocumentation("$command.rpgitem.teleport.full") - @CommandGroup("item_power_teleport") - public void teleport(CommandSender sender, RPGItem item, int cooldown, int distance) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerTeleport pow = new PowerTeleport(); - pow.item = item; - pow.cooldownTime = cooldown; - pow.distance = distance; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power tntcannon") - @CommandDocumentation("$command.rpgitem.tntcannon") - @CommandGroup("item_power_tntcannon") - public void tntcannon(CommandSender sender, RPGItem item) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerTNTCannon pow = new PowerTNTCannon(); - pow.item = item; - pow.cooldownTime = 20; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power tntcannon $cooldown:i[]") - @CommandDocumentation("$command.rpgitem.tntcannon.full") - @CommandGroup("item_power_tntcannon") - public void tntcannon(CommandSender sender, RPGItem item, int cooldown) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerTNTCannon pow = new PowerTNTCannon(); - pow.item = item; - pow.cooldownTime = cooldown; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power skyhook $m[] $distance:i[]") - @CommandDocumentation("$command.rpgitem.skyhook") - @CommandGroup("item_power_skyhook") - public void skyHook(CommandSender sender, RPGItem item, Material material, int distance) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerSkyHook pow = new PowerSkyHook(); - pow.item = item; - pow.railMaterial = material; - pow.hookDistance = distance; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power potiontick $amplifier:i[] $effect:s[]") - @CommandDocumentation("$command.rpgitem.potiontick") - @CommandGroup("item_power_potiontick") - public void potionTick(CommandSender sender, RPGItem item, int amplifier, String effect) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerPotionTick pow = new PowerPotionTick(); - pow.item = item; - pow.amplifier = amplifier; - pow.effect = PotionEffectType.getByName(effect); - if (pow.effect == null) { - sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.effect", locale), effect)); - return; - } - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } - - @CommandString("rpgitem $n[] power food $foodpoints:i[]") - @CommandDocumentation("$command.rpgitem.food") - @CommandGroup("item_power_food") - public void food(CommandSender sender, RPGItem item, int foodpoints) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - PowerFood pow = new PowerFood(); - pow.item = item; - pow.foodpoints = foodpoints; - item.addPower(pow); - ItemManager.save(Plugin.plugin); - sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); - } + @CommandString("rpgitem $n[] power arrow") + @CommandDocumentation("$command.rpgitem.arrow") + @CommandGroup("item_power_arrow") + public void arrow(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerArrow pow = new PowerArrow(); + pow.cooldownTime = 20; + pow.item = item; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power arrow $cooldown:i[]") + @CommandDocumentation("$command.rpgitem.arrow.full") + @CommandGroup("item_power_arrow") + public void arrow(CommandSender sender, RPGItem item, int cooldown) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerArrow pow = new PowerArrow(); + pow.item = item; + pow.cooldownTime = cooldown; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power command $cooldown:i[] $o[left,right] $display:s[] $command:s[]") + @CommandDocumentation("$command.rpgitem.command") + @CommandGroup("item_power_command_b") + public void command(CommandSender sender, RPGItem item, int cooldown, String mouse, String displayText, String command) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerCommand com = new PowerCommand(); + com.cooldownTime = cooldown; + command = command.trim(); + if (command.charAt(0) == '/') { + command = command.substring(1); + } + com.isRight = mouse.equals("right"); + com.display = displayText; + com.command = command; + com.item = item; + item.addPower(com); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power command $cooldown:i[] $o[left,right] $display:s[] $command:s[] $permission:s[]") + @CommandDocumentation("$command.rpgitem.command.full") + @CommandGroup("item_power_command_a") + public void command(CommandSender sender, RPGItem item, int cooldown, String mouse, String displayText, String command, String permission) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerCommand com = new PowerCommand(); + com.cooldownTime = cooldown; + command = command.trim(); + if (command.charAt(0) == '/') { + command = command.substring(1); + } + com.isRight = mouse.equals("right"); + com.display = displayText; + com.command = command; + com.permission = permission; + com.item = item; + item.addPower(com); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power command $cooldown:i[] $o[left,right] $details:s[]") + @CommandDocumentation("$command.rpgitem.command.old") + @CommandGroup("item_power_command_c") + public void command(CommandSender sender, RPGItem item, int cooldown, String mouse, String details) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + String[] pArgs = details.split("\\|"); + if (pArgs.length < 2) { + sender.sendMessage(ChatColor.RED + Locale.get("message.error.command.format", locale)); + return; + } + String display = pArgs[0].trim(); + String command = pArgs[1].trim(); + if (command.charAt(0) == '/') { + command = command.substring(1); + } + String permission = ""; + if (pArgs.length > 2) { + permission = pArgs[2].trim(); + } + + PowerCommand com = new PowerCommand(); + com.cooldownTime = cooldown; + + com.isRight = mouse.equals("right"); + com.item = item; + com.display = display; + com.command = command; + com.permission = permission; + + item.addPower(com); + item.rebuild(); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power consume") + @CommandDocumentation("$command.rpgitem.consume") + @CommandGroup("item_power_consume") + public void consume(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerConsume pow = new PowerConsume(); + pow.item = item; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power fireball") + @CommandDocumentation("$command.rpgitem.fireball") + @CommandGroup("item_power_fireball") + public void fireball(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerFireball pow = new PowerFireball(); + pow.cooldownTime = 20; + pow.item = item; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power fireball $cooldown:i[]") + @CommandDocumentation("$command.rpgitem.fireball.full") + @CommandGroup("item_power_fireball") + public void fireball(CommandSender sender, RPGItem item, int cooldown) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerFireball pow = new PowerFireball(); + pow.item = item; + pow.cooldownTime = cooldown; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power flame") + @CommandDocumentation("$command.rpgitem.flame") + @CommandGroup("item_power_flame") + public void flame(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerFlame pow = new PowerFlame(); + pow.burnTime = 20; + pow.item = item; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power flame $burntime:i[]") + @CommandDocumentation("$command.rpgitem.flame.full") + @CommandGroup("item_power_flame") + public void flame(CommandSender sender, RPGItem item, int burnTime) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerFlame pow = new PowerFlame(); + pow.item = item; + pow.burnTime = burnTime; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power lifesteal $chance:i[]") + @CommandDocumentation("$command.rpgitem.lifesteal") + @CommandGroup("item_power_lifesteal") + public void lifsteal(CommandSender sender, RPGItem item, int chance) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerLifeSteal pow = new PowerLifeSteal(); + pow.item = item; + pow.chance = chance; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power ice") + @CommandDocumentation("$command.rpgitem.ice") + @CommandGroup("item_power_ice") + public void ice(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerIce pow = new PowerIce(); + pow.cooldownTime = 20; + pow.item = item; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power ice $cooldown:i[]") + @CommandDocumentation("$command.rpgitem.ice.full") + @CommandGroup("item_power_ice") + public void ice(CommandSender sender, RPGItem item, int cooldown) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerIce pow = new PowerIce(); + pow.item = item; + pow.cooldownTime = cooldown; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power knockup") + @CommandDocumentation("$command.rpgitem.knockup") + @CommandGroup("item_power_knockup") + public void knockup(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerKnockup pow = new PowerKnockup(); + pow.item = item; + pow.chance = 20; + pow.power = 2; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power knockup $chance:i[] $power:f[]") + @CommandDocumentation("$command.rpgitem.knockup.full") + @CommandGroup("item_power_knockup") + public void knockup(CommandSender sender, RPGItem item, int chance, double power) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerKnockup pow = new PowerKnockup(); + pow.item = item; + pow.chance = chance; + pow.power = power; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power lightning") + @CommandDocumentation("$command.rpgitem.lightning") + @CommandGroup("item_power_lightning") + public void lightning(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerLightning pow = new PowerLightning(); + pow.item = item; + pow.chance = 20; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power lightning $chance:i[]") + @CommandDocumentation("$command.rpgitem.lightning.full") + @CommandGroup("item_power_lightning") + public void lightning(CommandSender sender, RPGItem item, int chance) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerLightning pow = new PowerLightning(); + pow.item = item; + pow.chance = chance; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power potionhit $chance:i[] $duration:i[] $amplifier:i[] $effect:s[]") + @CommandDocumentation("$command.rpgitem.potionhit+PotionEffectType") + @CommandGroup("item_power_potionhit") + public void potionhit(CommandSender sender, RPGItem item, int chance, int duration, int amplifier, String effect) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerPotionHit pow = new PowerPotionHit(); + pow.item = item; + pow.chance = chance; + pow.duration = duration; + pow.amplifier = amplifier; + pow.type = PotionEffectType.getByName(effect); + if (pow.type == null) { + sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.effect", locale), effect)); + return; + } + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power potionself $cooldown:i[] $duration:i[] $amplifier:i[] $effect:s[]") + @CommandDocumentation("$command.rpgitem.potionself+PotionEffectType") + @CommandGroup("item_power_potionself") + public void potionself(CommandSender sender, RPGItem item, int ccoldown, int duration, int amplifier, String effect) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerPotionSelf pow = new PowerPotionSelf(); + pow.item = item; + pow.cooldownTime = ccoldown; + pow.time = duration; + pow.amplifier = amplifier; + pow.type = PotionEffectType.getByName(effect); + if (pow.type == null) { + sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.effect", locale), effect)); + return; + } + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power rainbow") + @CommandDocumentation("$command.rpgitem.rainbow") + @CommandGroup("item_power_rainbow") + public void rainbow(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerRainbow pow = new PowerRainbow(); + pow.cooldownTime = 20; + pow.count = 5; + pow.item = item; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power rainbow $cooldown:i[] $count:i[]") + @CommandDocumentation("$command.rpgitem.rainbow.full") + @CommandGroup("item_power_rainbow") + public void rainbow(CommandSender sender, RPGItem item, int cooldown, int count) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerRainbow pow = new PowerRainbow(); + pow.cooldownTime = cooldown; + pow.count = count; + pow.item = item; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power rumble $cooldown:i[] $power:i[] $distance:i[]") + @CommandDocumentation("$command.rpgitem.rumble") + @CommandGroup("item_power_rumble") + public void rumble(CommandSender sender, RPGItem item, int cooldown, int power, int distance) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerRumble pow = new PowerRumble(); + pow.item = item; + pow.cooldownTime = cooldown; + pow.power = power; + pow.distance = distance; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power teleport") + @CommandDocumentation("$command.rpgitem.teleport") + @CommandGroup("item_power_teleport") + public void teleport(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerTeleport pow = new PowerTeleport(); + pow.item = item; + pow.cooldownTime = 20; + pow.distance = 5; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power teleport $cooldown:i[] $distance:i[]") + @CommandDocumentation("$command.rpgitem.teleport.full") + @CommandGroup("item_power_teleport") + public void teleport(CommandSender sender, RPGItem item, int cooldown, int distance) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerTeleport pow = new PowerTeleport(); + pow.item = item; + pow.cooldownTime = cooldown; + pow.distance = distance; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power tntcannon") + @CommandDocumentation("$command.rpgitem.tntcannon") + @CommandGroup("item_power_tntcannon") + public void tntcannon(CommandSender sender, RPGItem item) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerTNTCannon pow = new PowerTNTCannon(); + pow.item = item; + pow.cooldownTime = 20; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power tntcannon $cooldown:i[]") + @CommandDocumentation("$command.rpgitem.tntcannon.full") + @CommandGroup("item_power_tntcannon") + public void tntcannon(CommandSender sender, RPGItem item, int cooldown) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerTNTCannon pow = new PowerTNTCannon(); + pow.item = item; + pow.cooldownTime = cooldown; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power skyhook $m[] $distance:i[]") + @CommandDocumentation("$command.rpgitem.skyhook") + @CommandGroup("item_power_skyhook") + public void skyHook(CommandSender sender, RPGItem item, Material material, int distance) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerSkyHook pow = new PowerSkyHook(); + pow.item = item; + pow.railMaterial = material; + pow.hookDistance = distance; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power potiontick $amplifier:i[] $effect:s[]") + @CommandDocumentation("$command.rpgitem.potiontick") + @CommandGroup("item_power_potiontick") + public void potionTick(CommandSender sender, RPGItem item, int amplifier, String effect) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerPotionTick pow = new PowerPotionTick(); + pow.item = item; + pow.amplifier = amplifier; + pow.effect = PotionEffectType.getByName(effect); + if (pow.effect == null) { + sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.effect", locale), effect)); + return; + } + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } + + @CommandString("rpgitem $n[] power food $foodpoints:i[]") + @CommandDocumentation("$command.rpgitem.food") + @CommandGroup("item_power_food") + public void food(CommandSender sender, RPGItem item, int foodpoints) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + PowerFood pow = new PowerFood(); + pow.item = item; + pow.foodpoints = foodpoints; + item.addPower(pow); + ItemManager.save(Plugin.plugin); + sender.sendMessage(ChatColor.AQUA + Locale.get("message.power.ok", locale)); + } } diff --git a/src/main/java/think/rpgitems/Updater.java b/src/main/java/think/rpgitems/Updater.java index b2b87390..8807ea61 100644 --- a/src/main/java/think/rpgitems/Updater.java +++ b/src/main/java/think/rpgitems/Updater.java @@ -6,6 +6,12 @@ package think.rpgitems; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + import java.io.*; import java.net.MalformedURLException; import java.net.URL; @@ -14,19 +20,13 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.Plugin; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - /** * Check dev.bukkit.org to find updates for a given plugin, and download the updates if needed. - *

+ *

* VERY, VERY IMPORTANT: Because there are no standards for adding auto-update toggles in your plugin's config, this system provides NO CHECK WITH YOUR CONFIG to make sure the user has allowed auto-updating.
* It is a BUKKIT POLICY that you include a boolean value in your config that prevents the auto-updater from running AT ALL.
* If you fail to include this option in your config, your plugin will be REJECTED when you attempt to submit it to dev.bukkit.org. - *

+ *

* An example of a good configuration option would be something similar to 'auto-update: true' - if this value is set to false you may NOT run the auto-updater.
* If you are unsure about these rules, please read the plugin submission guidelines: http://goo.gl/8iU5l * @@ -36,470 +36,465 @@ public class Updater { - private Plugin plugin; - private UpdateType type; - private String versionName; - private String versionLink; - private String versionType; - private String versionGameVersion; - - private boolean announce; // Whether to announce file downloads - - private URL url; // Connecting to RSS - private File file; // The plugin's file - private Thread thread; // Updater thread - - private int id = -1; // Project's Curse ID - private String apiKey = null; // BukkitDev ServerMods API key - private static final String TITLE_VALUE = "name"; // Gets remote file's title - private static final String LINK_VALUE = "downloadUrl"; // Gets remote file's download link - private static final String TYPE_VALUE = "releaseType"; // Gets remote file's release type - private static final String VERSION_VALUE = "gameVersion"; // Gets remote file's build version - private static final String QUERY = "/servermods/files?projectIds="; // Path to GET - private static final String HOST = "https://api.curseforge.com"; // Slugs will be appended to this to get to the project's RSS feed - - private static final String[] NO_UPDATE_TAG = { "-DEV", "-PRE", "-SNAPSHOT" }; // If the version number contains one of these, don't update. - private static final int BYTE_SIZE = 1024; // Used for downloading files - private YamlConfiguration config; // Config file - private String updateFolder;// The folder that downloads will be placed in - private Updater.UpdateResult result = Updater.UpdateResult.SUCCESS; // Used for determining the outcome of the update process - - /** - * Gives the dev the result of the update process. Can be obtained by called getResult(). - */ - public enum UpdateResult { - /** - * The updater found an update, and has readied it to be loaded the next time the server restarts/reloads. - */ - SUCCESS, /** - * The updater did not find an update, and nothing was downloaded. - */ - NO_UPDATE, /** - * The server administrator has disabled the updating system - */ - DISABLED, /** - * The updater found an update, but was unable to download it. - */ - FAIL_DOWNLOAD, /** - * For some reason, the updater was unable to contact dev.bukkit.org to download the file. - */ - FAIL_DBO, /** - * When running the version check, the file on DBO did not contain the a version in the format 'vVersion' such as 'v1.0'. - */ - FAIL_NOVERSION, /** - * The id provided by the plugin running the updater was invalid and doesn't exist on DBO. - */ - FAIL_BADID, /** - * The server administrator has improperly configured their API key in the configuration - */ - FAIL_APIKEY, /** - * The updater found an update, but because of the UpdateType being set to NO_DOWNLOAD, it wasn't downloaded. - */ - UPDATE_AVAILABLE - } - - /** - * Allows the dev to specify the type of update that will be run. - */ - public enum UpdateType { - /** - * Run a version check, and then if the file is out of date, download the newest version. - */ - DEFAULT, /** - * Don't run a version check, just find the latest update and download it. - */ - NO_VERSION_CHECK, /** - * Get information about the version and the download size, but don't actually download anything. - */ - NO_DOWNLOAD - } - - /** - * Initialize the updater - * - * @param plugin - * The plugin that is checking for an update. - * @param id - * The dev.bukkit.org id of the project - * @param file - * The file that the plugin is running from, get this by doing this.getFile() from within your main class. - * @param type - * Specify the type of update this will be. See {@link UpdateType} - * @param announce - * True if the program should announce the progress of new updates in console - */ - public Updater(Plugin plugin, int id, File file, UpdateType type, boolean announce) { - this.plugin = plugin; - this.type = type; - this.announce = announce; - this.file = file; - this.id = id; - this.updateFolder = plugin.getServer().getUpdateFolder(); - - final File pluginFile = plugin.getDataFolder().getParentFile(); - final File updaterFile = new File(pluginFile, "Updater"); - final File updaterConfigFile = new File(updaterFile, "config.yml"); - - if (!updaterFile.exists()) { - updaterFile.mkdir(); - } - if (!updaterConfigFile.exists()) { - try { - updaterConfigFile.createNewFile(); - } catch (final IOException e) { - plugin.getLogger().severe("The updater could not create a configuration in " + updaterFile.getAbsolutePath()); - e.printStackTrace(); - } - } - this.config = YamlConfiguration.loadConfiguration(updaterConfigFile); - - this.config.options().header("This configuration file affects all plugins using the Updater system (version 2+ - http://forums.bukkit.org/threads/96681/ )" + '\n' + "If you wish to use your API key, read http://wiki.bukkit.org/ServerMods_API and place it below." + '\n' - + "Some updating systems will not adhere to the disabled value, but these may be turned off in their plugin's configuration."); - this.config.addDefault("api-key", "PUT_API_KEY_HERE"); - this.config.addDefault("disable", false); - - if (this.config.get("api-key", null) == null) { - this.config.options().copyDefaults(true); - try { - this.config.save(updaterConfigFile); - } catch (final IOException e) { - plugin.getLogger().severe("The updater could not save the configuration in " + updaterFile.getAbsolutePath()); - e.printStackTrace(); - } - } - - if (this.config.getBoolean("disable")) { - this.result = UpdateResult.DISABLED; - return; - } - - String key = this.config.getString("api-key"); - if (key.equalsIgnoreCase("PUT_API_KEY_HERE") || key.equals("")) { - key = null; - } - - this.apiKey = key; - - try { - this.url = new URL(Updater.HOST + Updater.QUERY + id); - } catch (final MalformedURLException e) { - plugin.getLogger().severe("The project ID provided for updating, " + id + " is invalid."); - this.result = UpdateResult.FAIL_BADID; - e.printStackTrace(); - } - - this.thread = new Thread(new UpdateRunnable()); - this.thread.start(); - } - - /** - * Get the result of the update process. - */ - public Updater.UpdateResult getResult() { - this.waitForThread(); - return this.result; - } - - /** - * Get the latest version's release type (release, beta, or alpha). - */ - public String getLatestType() { - this.waitForThread(); - return this.versionType; - } - - /** - * Get the latest version's game version. - */ - public String getLatestGameVersion() { - this.waitForThread(); - return this.versionGameVersion; - } - - /** - * Get the latest version's name. - */ - public String getLatestName() { - this.waitForThread(); - return this.versionName; - } - - /** - * Get the latest version's file link. - */ - public String getLatestFileLink() { - this.waitForThread(); - return this.versionLink; - } - - /** - * As the result of Updater output depends on the thread's completion, it is necessary to wait for the thread to finish before allowing anyone to check the result. - */ - private void waitForThread() { - if ((this.thread != null) && this.thread.isAlive()) { - try { - this.thread.join(); - } catch (final InterruptedException e) { - e.printStackTrace(); - } - } - } - - /** - * Save an update from dev.bukkit.org into the server's update folder. - */ - private void saveFile(File folder, String file, String u) { - if (!folder.exists()) { - folder.mkdir(); - } - BufferedInputStream in = null; - FileOutputStream fout = null; - try { - // Download the file - final URL url = new URL(u); - final int fileLength = url.openConnection().getContentLength(); - in = new BufferedInputStream(url.openStream()); - fout = new FileOutputStream(folder.getAbsolutePath() + "/" + file); - - final byte[] data = new byte[Updater.BYTE_SIZE]; - int count; - if (this.announce) { - this.plugin.getLogger().info("About to download a new update: " + this.versionName); - } - long downloaded = 0; - while ((count = in.read(data, 0, Updater.BYTE_SIZE)) != -1) { - downloaded += count; - fout.write(data, 0, count); - final int percent = (int) ((downloaded * 100) / fileLength); - if (this.announce && ((percent % 10) == 0)) { - this.plugin.getLogger().info("Downloading update: " + percent + "% of " + fileLength + " bytes."); - } - } - // Just a quick check to make sure we didn't leave any files from last time... - for (final File xFile : new File(this.plugin.getDataFolder().getParent(), this.updateFolder).listFiles()) { - if (xFile.getName().endsWith(".zip")) { - xFile.delete(); - } - } - // Check to see if it's a zip file, if it is, unzip it. - final File dFile = new File(folder.getAbsolutePath() + "/" + file); - if (dFile.getName().endsWith(".zip")) { - // Unzip - this.unzip(dFile.getCanonicalPath()); - } - if (this.announce) { - this.plugin.getLogger().info("Finished updating."); - } - } catch (final Exception ex) { - this.plugin.getLogger().warning("The auto-updater tried to download a new update, but was unsuccessful."); - this.result = Updater.UpdateResult.FAIL_DOWNLOAD; - } finally { - try { - if (in != null) { - in.close(); - } - if (fout != null) { - fout.close(); - } - } catch (final Exception ex) { - } - } - } - - /** - * Part of Zip-File-Extractor, modified by Gravity for use with Bukkit - */ - private void unzip(String file) { - try { - final File fSourceZip = new File(file); - final String zipPath = file.substring(0, file.length() - 4); - ZipFile zipFile = new ZipFile(fSourceZip); - Enumeration e = zipFile.entries(); - while (e.hasMoreElements()) { - ZipEntry entry = e.nextElement(); - File destinationFilePath = new File(zipPath, entry.getName()); - destinationFilePath.getParentFile().mkdirs(); - if (entry.isDirectory()) { - continue; - } else { - final BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry)); - int b; - final byte buffer[] = new byte[Updater.BYTE_SIZE]; - final FileOutputStream fos = new FileOutputStream(destinationFilePath); - final BufferedOutputStream bos = new BufferedOutputStream(fos, Updater.BYTE_SIZE); - while ((b = bis.read(buffer, 0, Updater.BYTE_SIZE)) != -1) { - bos.write(buffer, 0, b); - } - bos.flush(); - bos.close(); - bis.close(); - final String name = destinationFilePath.getName(); - if (name.endsWith(".jar") && this.pluginFile(name)) { - destinationFilePath.renameTo(new File(this.plugin.getDataFolder().getParent(), this.updateFolder + "/" + name)); - } - } - entry = null; - destinationFilePath = null; - } - e = null; - zipFile.close(); - zipFile = null; - - // Move any plugin data folders that were included to the right place, Bukkit won't do this for us. - for (final File dFile : new File(zipPath).listFiles()) { - if (dFile.isDirectory()) { - if (this.pluginFile(dFile.getName())) { - final File oFile = new File(this.plugin.getDataFolder().getParent(), dFile.getName()); // Get current dir - final File[] contents = oFile.listFiles(); // List of existing files in the current dir - for (final File cFile : dFile.listFiles()) // Loop through all the files in the new dir - { - boolean found = false; - for (final File xFile : contents) // Loop through contents to see if it exists - { - if (xFile.getName().equals(cFile.getName())) { - found = true; - break; - } - } - if (!found) { - // Move the new file into the current dir - cFile.renameTo(new File(oFile.getCanonicalFile() + "/" + cFile.getName())); - } else { - // This file already exists, so we don't need it anymore. - cFile.delete(); - } - } - } - } - dFile.delete(); - } - new File(zipPath).delete(); - fSourceZip.delete(); - } catch (final IOException ex) { - this.plugin.getLogger().warning("The auto-updater tried to unzip a new update file, but was unsuccessful."); - this.result = Updater.UpdateResult.FAIL_DOWNLOAD; - ex.printStackTrace(); - } - new File(file).delete(); - } - - /** - * Check if the name of a jar is one of the plugins currently installed, used for extracting the correct files out of a zip. - */ - private boolean pluginFile(String name) { - for (final File file : new File("plugins").listFiles()) { - if (file.getName().equals(name)) { - return true; - } - } - return false; - } - - /** - * Check to see if the program should continue by evaluation whether the plugin is already updated, or shouldn't be updated - */ - private boolean versionCheck(String title) { - if (this.type != UpdateType.NO_VERSION_CHECK) { - final String version = this.plugin.getDescription().getVersion(); - if (title.split(" v").length == 2) { - final String remoteVersion = title.split(" v")[1].split(" ")[0]; // Get the newest file's version number - - if (this.hasTag(version) || version.equalsIgnoreCase(remoteVersion)) { - // We already have the latest version, or this build is tagged for no-update - this.result = Updater.UpdateResult.NO_UPDATE; - return false; - } - } else { - // The file's name did not contain the string 'vVersion' - final String authorInfo = this.plugin.getDescription().getAuthors().size() == 0 ? "" : " (" + this.plugin.getDescription().getAuthors().get(0) + ")"; - this.plugin.getLogger().warning("The author of this plugin" + authorInfo + " has misconfigured their Auto Update system"); - this.plugin.getLogger().warning("File versions should follow the format 'PluginName vVERSION'"); - this.plugin.getLogger().warning("Please notify the author of this error."); - this.result = Updater.UpdateResult.FAIL_NOVERSION; - return false; - } - } - return true; - } - - /** - * Evaluate whether the version number is marked showing that it should not be updated by this program - */ - private boolean hasTag(String version) { - for (final String string : Updater.NO_UPDATE_TAG) { - if (version.contains(string)) { - return true; - } - } - return false; - } - - private boolean read() { - try { - final URLConnection conn = this.url.openConnection(); - conn.setConnectTimeout(5000); - - if (this.apiKey != null) { - conn.addRequestProperty("X-API-Key", this.apiKey); - } - conn.addRequestProperty("User-Agent", "Updater (by Gravity)"); - - conn.setDoOutput(true); - - final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); - final String response = reader.readLine(); - - final JSONArray array = (JSONArray) JSONValue.parse(response); - - if (array.size() == 0) { - this.plugin.getLogger().warning("The updater could not find any files for the project id " + this.id); - this.result = UpdateResult.FAIL_BADID; - return false; - } - - this.versionName = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.TITLE_VALUE); - this.versionLink = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.LINK_VALUE); - this.versionType = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.TYPE_VALUE); - this.versionGameVersion = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.VERSION_VALUE); - - return true; - } catch (final IOException e) { - if (e.getMessage().contains("HTTP response code: 403")) { - this.plugin.getLogger().warning("dev.bukkit.org rejected the API key provided in plugins/Updater/config.yml"); - this.plugin.getLogger().warning("Please double-check your configuration to ensure it is correct."); - this.result = UpdateResult.FAIL_APIKEY; - } else { - this.plugin.getLogger().warning("The updater could not contact dev.bukkit.org for updating."); - this.plugin.getLogger().warning("If you have not recently modified your configuration and this is the first time you are seeing this message, the site may be experiencing temporary downtime."); - this.result = UpdateResult.FAIL_DBO; - } - e.printStackTrace(); - return false; - } - } - - private class UpdateRunnable implements Runnable { - - @Override - public void run() { - if (Updater.this.url != null) { - // Obtain the results of the project's file feed - if (Updater.this.read()) { - if (Updater.this.versionCheck(Updater.this.versionName)) { - if ((Updater.this.versionLink != null) && (Updater.this.type != UpdateType.NO_DOWNLOAD)) { - String name = Updater.this.file.getName(); - // If it's a zip file, it shouldn't be downloaded as the plugin's name - if (Updater.this.versionLink.endsWith(".zip")) { - final String[] split = Updater.this.versionLink.split("/"); - name = split[split.length - 1]; - } - Updater.this.saveFile(new File(Updater.this.plugin.getDataFolder().getParent(), Updater.this.updateFolder), name, Updater.this.versionLink); - } else { - Updater.this.result = UpdateResult.UPDATE_AVAILABLE; - } - } - } - } - } - } + private Plugin plugin; + private UpdateType type; + private String versionName; + private String versionLink; + private String versionType; + private String versionGameVersion; + + private boolean announce; // Whether to announce file downloads + + private URL url; // Connecting to RSS + private File file; // The plugin's file + private Thread thread; // Updater thread + + private int id = -1; // Project's Curse ID + private String apiKey = null; // BukkitDev ServerMods API key + private static final String TITLE_VALUE = "name"; // Gets remote file's title + private static final String LINK_VALUE = "downloadUrl"; // Gets remote file's download link + private static final String TYPE_VALUE = "releaseType"; // Gets remote file's release type + private static final String VERSION_VALUE = "gameVersion"; // Gets remote file's build version + private static final String QUERY = "/servermods/files?projectIds="; // Path to GET + private static final String HOST = "https://api.curseforge.com"; // Slugs will be appended to this to get to the project's RSS feed + + private static final String[] NO_UPDATE_TAG = {"-DEV", "-PRE", "-SNAPSHOT"}; // If the version number contains one of these, don't update. + private static final int BYTE_SIZE = 1024; // Used for downloading files + private YamlConfiguration config; // Config file + private String updateFolder;// The folder that downloads will be placed in + private Updater.UpdateResult result = Updater.UpdateResult.SUCCESS; // Used for determining the outcome of the update process + + /** + * Gives the dev the result of the update process. Can be obtained by called getResult(). + */ + public enum UpdateResult { + /** + * The updater found an update, and has readied it to be loaded the next time the server restarts/reloads. + */ + SUCCESS, /** + * The updater did not find an update, and nothing was downloaded. + */ + NO_UPDATE, /** + * The server administrator has disabled the updating system + */ + DISABLED, /** + * The updater found an update, but was unable to download it. + */ + FAIL_DOWNLOAD, /** + * For some reason, the updater was unable to contact dev.bukkit.org to download the file. + */ + FAIL_DBO, /** + * When running the version check, the file on DBO did not contain the a version in the format 'vVersion' such as 'v1.0'. + */ + FAIL_NOVERSION, /** + * The id provided by the plugin running the updater was invalid and doesn't exist on DBO. + */ + FAIL_BADID, /** + * The server administrator has improperly configured their API key in the configuration + */ + FAIL_APIKEY, /** + * The updater found an update, but because of the UpdateType being set to NO_DOWNLOAD, it wasn't downloaded. + */ + UPDATE_AVAILABLE + } + + /** + * Allows the dev to specify the type of update that will be run. + */ + public enum UpdateType { + /** + * Run a version check, and then if the file is out of date, download the newest version. + */ + DEFAULT, /** + * Don't run a version check, just find the latest update and download it. + */ + NO_VERSION_CHECK, /** + * Get information about the version and the download size, but don't actually download anything. + */ + NO_DOWNLOAD + } + + /** + * Initialize the updater + * + * @param plugin The plugin that is checking for an update. + * @param id The dev.bukkit.org id of the project + * @param file The file that the plugin is running from, get this by doing this.getFile() from within your main class. + * @param type Specify the type of update this will be. See {@link UpdateType} + * @param announce True if the program should announce the progress of new updates in console + */ + public Updater(Plugin plugin, int id, File file, UpdateType type, boolean announce) { + this.plugin = plugin; + this.type = type; + this.announce = announce; + this.file = file; + this.id = id; + this.updateFolder = plugin.getServer().getUpdateFolder(); + + final File pluginFile = plugin.getDataFolder().getParentFile(); + final File updaterFile = new File(pluginFile, "Updater"); + final File updaterConfigFile = new File(updaterFile, "config.yml"); + + if (!updaterFile.exists()) { + updaterFile.mkdir(); + } + if (!updaterConfigFile.exists()) { + try { + updaterConfigFile.createNewFile(); + } catch (final IOException e) { + plugin.getLogger().severe("The updater could not create a configuration in " + updaterFile.getAbsolutePath()); + e.printStackTrace(); + } + } + this.config = YamlConfiguration.loadConfiguration(updaterConfigFile); + + this.config.options().header("This configuration file affects all plugins using the Updater system (version 2+ - http://forums.bukkit.org/threads/96681/ )" + '\n' + "If you wish to use your API key, read http://wiki.bukkit.org/ServerMods_API and place it below." + '\n' + + "Some updating systems will not adhere to the disabled value, but these may be turned off in their plugin's configuration."); + this.config.addDefault("api-key", "PUT_API_KEY_HERE"); + this.config.addDefault("disable", false); + + if (this.config.get("api-key", null) == null) { + this.config.options().copyDefaults(true); + try { + this.config.save(updaterConfigFile); + } catch (final IOException e) { + plugin.getLogger().severe("The updater could not save the configuration in " + updaterFile.getAbsolutePath()); + e.printStackTrace(); + } + } + + if (this.config.getBoolean("disable")) { + this.result = UpdateResult.DISABLED; + return; + } + + String key = this.config.getString("api-key"); + if (key.equalsIgnoreCase("PUT_API_KEY_HERE") || key.equals("")) { + key = null; + } + + this.apiKey = key; + + try { + this.url = new URL(Updater.HOST + Updater.QUERY + id); + } catch (final MalformedURLException e) { + plugin.getLogger().severe("The project ID provided for updating, " + id + " is invalid."); + this.result = UpdateResult.FAIL_BADID; + e.printStackTrace(); + } + + this.thread = new Thread(new UpdateRunnable()); + this.thread.start(); + } + + /** + * Get the result of the update process. + */ + public Updater.UpdateResult getResult() { + this.waitForThread(); + return this.result; + } + + /** + * Get the latest version's release type (release, beta, or alpha). + */ + public String getLatestType() { + this.waitForThread(); + return this.versionType; + } + + /** + * Get the latest version's game version. + */ + public String getLatestGameVersion() { + this.waitForThread(); + return this.versionGameVersion; + } + + /** + * Get the latest version's name. + */ + public String getLatestName() { + this.waitForThread(); + return this.versionName; + } + + /** + * Get the latest version's file link. + */ + public String getLatestFileLink() { + this.waitForThread(); + return this.versionLink; + } + + /** + * As the result of Updater output depends on the thread's completion, it is necessary to wait for the thread to finish before allowing anyone to check the result. + */ + private void waitForThread() { + if ((this.thread != null) && this.thread.isAlive()) { + try { + this.thread.join(); + } catch (final InterruptedException e) { + e.printStackTrace(); + } + } + } + + /** + * Save an update from dev.bukkit.org into the server's update folder. + */ + private void saveFile(File folder, String file, String u) { + if (!folder.exists()) { + folder.mkdir(); + } + BufferedInputStream in = null; + FileOutputStream fout = null; + try { + // Download the file + final URL url = new URL(u); + final int fileLength = url.openConnection().getContentLength(); + in = new BufferedInputStream(url.openStream()); + fout = new FileOutputStream(folder.getAbsolutePath() + "/" + file); + + final byte[] data = new byte[Updater.BYTE_SIZE]; + int count; + if (this.announce) { + this.plugin.getLogger().info("About to download a new update: " + this.versionName); + } + long downloaded = 0; + while ((count = in.read(data, 0, Updater.BYTE_SIZE)) != -1) { + downloaded += count; + fout.write(data, 0, count); + final int percent = (int) ((downloaded * 100) / fileLength); + if (this.announce && ((percent % 10) == 0)) { + this.plugin.getLogger().info("Downloading update: " + percent + "% of " + fileLength + " bytes."); + } + } + // Just a quick check to make sure we didn't leave any files from last time... + for (final File xFile : new File(this.plugin.getDataFolder().getParent(), this.updateFolder).listFiles()) { + if (xFile.getName().endsWith(".zip")) { + xFile.delete(); + } + } + // Check to see if it's a zip file, if it is, unzip it. + final File dFile = new File(folder.getAbsolutePath() + "/" + file); + if (dFile.getName().endsWith(".zip")) { + // Unzip + this.unzip(dFile.getCanonicalPath()); + } + if (this.announce) { + this.plugin.getLogger().info("Finished updating."); + } + } catch (final Exception ex) { + this.plugin.getLogger().warning("The auto-updater tried to download a new update, but was unsuccessful."); + this.result = Updater.UpdateResult.FAIL_DOWNLOAD; + } finally { + try { + if (in != null) { + in.close(); + } + if (fout != null) { + fout.close(); + } + } catch (final Exception ex) { + } + } + } + + /** + * Part of Zip-File-Extractor, modified by Gravity for use with Bukkit + */ + private void unzip(String file) { + try { + final File fSourceZip = new File(file); + final String zipPath = file.substring(0, file.length() - 4); + ZipFile zipFile = new ZipFile(fSourceZip); + Enumeration e = zipFile.entries(); + while (e.hasMoreElements()) { + ZipEntry entry = e.nextElement(); + File destinationFilePath = new File(zipPath, entry.getName()); + destinationFilePath.getParentFile().mkdirs(); + if (entry.isDirectory()) { + continue; + } else { + final BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry)); + int b; + final byte buffer[] = new byte[Updater.BYTE_SIZE]; + final FileOutputStream fos = new FileOutputStream(destinationFilePath); + final BufferedOutputStream bos = new BufferedOutputStream(fos, Updater.BYTE_SIZE); + while ((b = bis.read(buffer, 0, Updater.BYTE_SIZE)) != -1) { + bos.write(buffer, 0, b); + } + bos.flush(); + bos.close(); + bis.close(); + final String name = destinationFilePath.getName(); + if (name.endsWith(".jar") && this.pluginFile(name)) { + destinationFilePath.renameTo(new File(this.plugin.getDataFolder().getParent(), this.updateFolder + "/" + name)); + } + } + entry = null; + destinationFilePath = null; + } + e = null; + zipFile.close(); + zipFile = null; + + // Move any plugin data folders that were included to the right place, Bukkit won't do this for us. + for (final File dFile : new File(zipPath).listFiles()) { + if (dFile.isDirectory()) { + if (this.pluginFile(dFile.getName())) { + final File oFile = new File(this.plugin.getDataFolder().getParent(), dFile.getName()); // Get current dir + final File[] contents = oFile.listFiles(); // List of existing files in the current dir + for (final File cFile : dFile.listFiles()) // Loop through all the files in the new dir + { + boolean found = false; + for (final File xFile : contents) // Loop through contents to see if it exists + { + if (xFile.getName().equals(cFile.getName())) { + found = true; + break; + } + } + if (!found) { + // Move the new file into the current dir + cFile.renameTo(new File(oFile.getCanonicalFile() + "/" + cFile.getName())); + } else { + // This file already exists, so we don't need it anymore. + cFile.delete(); + } + } + } + } + dFile.delete(); + } + new File(zipPath).delete(); + fSourceZip.delete(); + } catch (final IOException ex) { + this.plugin.getLogger().warning("The auto-updater tried to unzip a new update file, but was unsuccessful."); + this.result = Updater.UpdateResult.FAIL_DOWNLOAD; + ex.printStackTrace(); + } + new File(file).delete(); + } + + /** + * Check if the name of a jar is one of the plugins currently installed, used for extracting the correct files out of a zip. + */ + private boolean pluginFile(String name) { + for (final File file : new File("plugins").listFiles()) { + if (file.getName().equals(name)) { + return true; + } + } + return false; + } + + /** + * Check to see if the program should continue by evaluation whether the plugin is already updated, or shouldn't be updated + */ + private boolean versionCheck(String title) { + if (this.type != UpdateType.NO_VERSION_CHECK) { + final String version = this.plugin.getDescription().getVersion(); + if (title.split(" v").length == 2) { + final String remoteVersion = title.split(" v")[1].split(" ")[0]; // Get the newest file's version number + + if (this.hasTag(version) || version.equalsIgnoreCase(remoteVersion)) { + // We already have the latest version, or this build is tagged for no-update + this.result = Updater.UpdateResult.NO_UPDATE; + return false; + } + } else { + // The file's name did not contain the string 'vVersion' + final String authorInfo = this.plugin.getDescription().getAuthors().size() == 0 ? "" : " (" + this.plugin.getDescription().getAuthors().get(0) + ")"; + this.plugin.getLogger().warning("The author of this plugin" + authorInfo + " has misconfigured their Auto Update system"); + this.plugin.getLogger().warning("File versions should follow the format 'PluginName vVERSION'"); + this.plugin.getLogger().warning("Please notify the author of this error."); + this.result = Updater.UpdateResult.FAIL_NOVERSION; + return false; + } + } + return true; + } + + /** + * Evaluate whether the version number is marked showing that it should not be updated by this program + */ + private boolean hasTag(String version) { + for (final String string : Updater.NO_UPDATE_TAG) { + if (version.contains(string)) { + return true; + } + } + return false; + } + + private boolean read() { + try { + final URLConnection conn = this.url.openConnection(); + conn.setConnectTimeout(5000); + + if (this.apiKey != null) { + conn.addRequestProperty("X-API-Key", this.apiKey); + } + conn.addRequestProperty("User-Agent", "Updater (by Gravity)"); + + conn.setDoOutput(true); + + final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + final String response = reader.readLine(); + + final JSONArray array = (JSONArray) JSONValue.parse(response); + + if (array.size() == 0) { + this.plugin.getLogger().warning("The updater could not find any files for the project id " + this.id); + this.result = UpdateResult.FAIL_BADID; + return false; + } + + this.versionName = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.TITLE_VALUE); + this.versionLink = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.LINK_VALUE); + this.versionType = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.TYPE_VALUE); + this.versionGameVersion = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.VERSION_VALUE); + + return true; + } catch (final IOException e) { + if (e.getMessage().contains("HTTP response code: 403")) { + this.plugin.getLogger().warning("dev.bukkit.org rejected the API key provided in plugins/Updater/config.yml"); + this.plugin.getLogger().warning("Please double-check your configuration to ensure it is correct."); + this.result = UpdateResult.FAIL_APIKEY; + } else { + this.plugin.getLogger().warning("The updater could not contact dev.bukkit.org for updating."); + this.plugin.getLogger().warning("If you have not recently modified your configuration and this is the first time you are seeing this message, the site may be experiencing temporary downtime."); + this.result = UpdateResult.FAIL_DBO; + } + e.printStackTrace(); + return false; + } + } + + private class UpdateRunnable implements Runnable { + + @Override + public void run() { + if (Updater.this.url != null) { + // Obtain the results of the project's file feed + if (Updater.this.read()) { + if (Updater.this.versionCheck(Updater.this.versionName)) { + if ((Updater.this.versionLink != null) && (Updater.this.type != UpdateType.NO_DOWNLOAD)) { + String name = Updater.this.file.getName(); + // If it's a zip file, it shouldn't be downloaded as the plugin's name + if (Updater.this.versionLink.endsWith(".zip")) { + final String[] split = Updater.this.versionLink.split("/"); + name = split[split.length - 1]; + } + Updater.this.saveFile(new File(Updater.this.plugin.getDataFolder().getParent(), Updater.this.updateFolder), name, Updater.this.versionLink); + } else { + Updater.this.result = UpdateResult.UPDATE_AVAILABLE; + } + } + } + } + } + } } \ No newline at end of file diff --git a/src/main/java/think/rpgitems/api/RPGItems.java b/src/main/java/think/rpgitems/api/RPGItems.java index b10ac497..7f706c50 100644 --- a/src/main/java/think/rpgitems/api/RPGItems.java +++ b/src/main/java/think/rpgitems/api/RPGItems.java @@ -1,20 +1,18 @@ package think.rpgitems.api; import org.bukkit.inventory.ItemStack; - import think.rpgitems.item.ItemManager; import think.rpgitems.item.RPGItem; public class RPGItems { - /** - * If the itemstack is a RPGItem this will return the RPGItem version of the item. If the itemstack isn't a RPGItem this will return null. - * - * @param itemstack - * The item to converted - * @return The RPGItem or null - */ - public RPGItem toRPGItem(ItemStack itemstack) { - return ItemManager.toRPGItem(itemstack); - } + /** + * If the itemstack is a RPGItem this will return the RPGItem version of the item. If the itemstack isn't a RPGItem this will return null. + * + * @param itemstack The item to converted + * @return The RPGItem or null + */ + public RPGItem toRPGItem(ItemStack itemstack) { + return ItemManager.toRPGItem(itemstack); + } } diff --git a/src/main/java/think/rpgitems/commands/CommandDocumentation.java b/src/main/java/think/rpgitems/commands/CommandDocumentation.java index 7290cab2..b03e6703 100644 --- a/src/main/java/think/rpgitems/commands/CommandDocumentation.java +++ b/src/main/java/think/rpgitems/commands/CommandDocumentation.java @@ -8,5 +8,5 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface CommandDocumentation { - String value(); + String value(); } diff --git a/src/main/java/think/rpgitems/commands/CommandGroup.java b/src/main/java/think/rpgitems/commands/CommandGroup.java index 7f0bc4d8..0cfdb44e 100644 --- a/src/main/java/think/rpgitems/commands/CommandGroup.java +++ b/src/main/java/think/rpgitems/commands/CommandGroup.java @@ -8,5 +8,5 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface CommandGroup { - String value(); + String value(); } diff --git a/src/main/java/think/rpgitems/commands/CommandString.java b/src/main/java/think/rpgitems/commands/CommandString.java index c438fd07..2b0b38fa 100644 --- a/src/main/java/think/rpgitems/commands/CommandString.java +++ b/src/main/java/think/rpgitems/commands/CommandString.java @@ -8,7 +8,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface CommandString { - String value(); + String value(); - boolean handlePermissions() default false; + boolean handlePermissions() default false; } diff --git a/src/main/java/think/rpgitems/commands/Commands.java b/src/main/java/think/rpgitems/commands/Commands.java index 00839016..0e28363a 100644 --- a/src/main/java/think/rpgitems/commands/Commands.java +++ b/src/main/java/think/rpgitems/commands/Commands.java @@ -17,1236 +17,1222 @@ package think.rpgitems.commands; import gnu.trove.map.hash.TCharObjectHashMap; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; -import java.util.SimpleTimeZone; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; - import think.rpgitems.Plugin; import think.rpgitems.data.Locale; import think.rpgitems.item.ItemManager; import think.rpgitems.item.RPGItem; +import java.io.*; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Map.Entry; + abstract public class Commands { - private static HashMap> commands = new HashMap>(); - private static TCharObjectHashMap> argTypes = new TCharObjectHashMap>(); - - static { - argTypes.put('s', ArgumentString.class); - argTypes.put('i', ArgumentInteger.class); - argTypes.put('f', ArgumentDouble.class); - argTypes.put('p', ArgumentPlayer.class); - argTypes.put('o', ArgumentOption.class); - argTypes.put('n', ArgumentItem.class); - argTypes.put('m', ArgumentMaterial.class); - argTypes.put('e', ArgumentEnum.class); - } - - public static void exec(CommandSender sender, String com) { - com = com.trim(); - if (com.length() == 0) - return; - String comName; - int pos = com.indexOf(' '); - if (pos == -1) { - comName = com; - } else { - comName = com.substring(0, pos); - } - com = com.substring(pos + 1); - - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - - ArrayList command = commands.get(comName); - if (command == null) { - sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.unknown.command", locale), comName)); - return; - } - - if (pos == -1) { - for (CommandDef c : command) { - if (c.arguments.length == 0) { - try { - if (c.handlePermissions || sender.hasPermission("rpgitem")) - c.method.invoke(c.handler, sender); - else - sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); - } catch (IllegalAccessException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InvocationTargetException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return; - } - } - // Print usage - if (sender.hasPermission("rpgitem")) { - sender.sendMessage(String.format(ChatColor.GREEN + Locale.get("message.command.usage", locale), comName, Plugin.plugin.getDescription().getVersion())); - for (CommandDef c : command) { - StringBuilder buf = new StringBuilder(); - buf.append(ChatColor.GREEN).append('/').append(comName); - for (CommandArgument a : c.arguments) { - buf.append(' '); - if (a.name.length() != 0) { - buf.append(ChatColor.RED); - buf.append(Locale.get("command.info." + a.name, locale)); - } - buf.append(a.isConst() ? ChatColor.GREEN : ChatColor.GOLD); - buf.append(a.printable(locale)); - } - sender.sendMessage(buf.toString()); - } - sender.sendMessage(ChatColor.GREEN + Locale.get("message.command.info", locale)); - } else - sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); - return; - } - ArrayList args = new ArrayList(); - while (true) { - int end; - if (com.length() == 0) { - break; - } - boolean quote = false; - if (com.charAt(0) == '`') { - com = com.substring(1); - end = com.indexOf('`'); - quote = true; - } else { - end = com.indexOf(' '); - } - if (end == -1) { - args.add(com); - } else { - args.add(com.substring(0, end)); - } - if (quote) { - com = com.substring(end + 1); - end = com.indexOf(' '); - } - if (end != -1) { - com = com.substring(end + 1); - } else { - break; - } - } - CommandError lastError = null; - comLoop: for (CommandDef c : command) { - if (c.arguments.length != args.size()) { - if (c.arguments.length != 0 && c.arguments[c.arguments.length - 1] instanceof ArgumentString) { - if (args.size() < c.arguments.length) - continue; - } else { - continue; - } - } - ArrayList outArgs = new ArrayList(); - outArgs.add(sender); - for (int i = 0; i < c.arguments.length; i++) { - CommandArgument a = c.arguments[i]; - if (!a.isConst()) { - if (i == c.arguments.length - 1) { - // Special case for strings so they do not need to be quoted - if (a instanceof ArgumentString) { - StringBuilder joined = new StringBuilder(); - for (int j = i; j < args.size(); j++) { - joined.append(args.get(j)).append(' '); - } - args.set(i, joined.toString().trim()); - } - } - Object res = a.parse(args.get(i), locale); - if (res instanceof CommandError) { - lastError = (CommandError) res; - continue comLoop; - } - outArgs.add(res); - } else { - ArgumentConst cst = (ArgumentConst) a; - if (!cst.value.equals(args.get(i))) { - continue comLoop; - } - } - } - try { - if (c.handlePermissions || sender.hasPermission("rpgitem")) - c.method.invoke(c.handler, outArgs.toArray()); - else - sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); - } catch (IllegalAccessException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InvocationTargetException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return; - } - if (sender.hasPermission("rpgitem")) { - if (lastError != null) { - sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.command", locale), lastError.error)); - } else { - ArrayList consts = new ArrayList(); - comLoop: for (CommandDef c : command) { - for (int i = 0; i < c.arguments.length; i++) { - if (i >= args.size()) - break; - CommandArgument a = c.arguments[i]; - if (!a.isConst()) { - if (i == c.arguments.length - 1) { - // Special case for strings so they do not need to be quoted - if (a instanceof ArgumentString) { - StringBuilder joined = new StringBuilder(); - for (int j = i; j < args.size(); j++) { - joined.append(args.get(j)).append(' '); - } - args.set(i, joined.toString().trim()); - } - } - Object res = a.parse(args.get(i), locale); - if (res instanceof CommandError) { - lastError = (CommandError) res; - continue comLoop; - } - } else { - ArgumentConst cst = (ArgumentConst) a; - if (!cst.value.equals(args.get(i))) { - continue comLoop; - } else { - consts.add(cst.value); - } - } - } - } - StringBuilder search = new StringBuilder(); - for (String term : consts) { - search.append(term).append(' '); - } - searchHelp(sender, search.toString()); - } - } else - sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); - } - - public static List complete(CommandSender sender, String com) { - com = com.trim(); - if (com.length() == 0) { - return new ArrayList(); - } - String comName; - int pos = com.indexOf(' '); - if (pos == -1) { - comName = com; - } else { - comName = com.substring(0, pos); - } - com = com.substring(pos + 1); - - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - - ArrayList command = commands.get(comName); - - if (command == null) { - if (pos == -1) { - ArrayList out = new ArrayList(); - for (String n : commands.keySet()) { - if (n.startsWith(comName)) { - out.add("/" + n); - } - } - return out; - } - return new ArrayList(); - } - ArrayList args = new ArrayList(); - while (true) { - int end; - if (com.length() == 0) { - break; - } - boolean quote = false; - if (com.charAt(0) == '`') { - com = com.substring(1); - end = com.indexOf('`'); - quote = true; - } else { - end = com.indexOf(' '); - } - if (end == -1) { - args.add(com); - } else { - args.add(com.substring(0, end)); - } - if (quote) { - com = com.substring(end + 1); - end = com.indexOf(' '); - } - if (end != -1) { - com = com.substring(end + 1); - } else { - break; - } - } - HashMap out = new HashMap(); - - comLoop: for (CommandDef c : command) { - for (int i = 0; i < c.arguments.length; i++) { - CommandArgument a = c.arguments[i]; - if (i == args.size() - 1) { - List res = a.tabComplete(args.get(i)); - if (res != null) { - for (String s : res) { - out.put(s, true); - } - continue comLoop; - } - } else { - if (!a.isConst()) { - Object res = a.parse(args.get(i), locale); - if (res instanceof CommandError) { - continue comLoop; - } - } else { - ArgumentConst cst = (ArgumentConst) a; - if (!cst.value.equals(args.get(i))) { - continue comLoop; - } - } - } - } - } - ArrayList outList = new ArrayList(); - for (String s : out.keySet()) { - outList.add(s); - } - return outList; - } - - public static void register(CommandHandler handler) { - Method[] methods = handler.getClass().getMethods(); - for (Method method : methods) { - Class[] params = method.getParameterTypes(); - CommandString comString = method.getAnnotation(CommandString.class); - if (comString == null) { - continue; - } - if (params.length == 0 || !params[0].isAssignableFrom(CommandSender.class)) { - throw new RuntimeException("First argument must be CommandSender @ " + method.getName()); - } - add(comString.value(), method, handler); - } - Collection> coms = commands.values(); - for (ArrayList c : coms) { - Collections.sort(c); - } - } - - private static void add(String com, Method method, CommandHandler handler) { - com = com.trim(); - int pos = com.indexOf(' '); - String comName; - if (pos == -1) { - comName = com; - } else { - comName = com.substring(0, pos); - } - - CommandDef def = new CommandDef(); - def.commandString = com; - def.method = method; - def.handler = handler; - Class[] params = method.getParameterTypes(); - if (method.isAnnotationPresent(CommandDocumentation.class)) { - def.documentation = method.getAnnotation(CommandDocumentation.class).value(); - } else { - def.documentation = ""; - } - if (method.isAnnotationPresent(CommandGroup.class)) { - def.sortKey = method.getAnnotation(CommandGroup.class).value(); - } else { - def.sortKey = ""; - } - CommandString comString = method.getAnnotation(CommandString.class); - def.handlePermissions = comString.handlePermissions(); - - if (!commands.containsKey(comName)) { - commands.put(comName, new ArrayList()); - } - commands.get(comName).add(def); - if (pos == -1) { - def.arguments = new CommandArgument[0]; - return; - } - com = com.substring(pos + 1); - ArrayList arguments = new ArrayList(); - int realArgumentsCount = 0; - while (true) { - pos = com.indexOf(' '); - String a; - if (pos == -1) { - a = com; - } else { - a = com.substring(0, pos); - com = com.substring(pos + 1); - } - if (a.charAt(0) == '$') { // Variable - String name = ""; - if (a.contains(":")) { - String[] as = a.split(":"); - name = as[0].substring(1); - a = "$" + as[1]; - } - char t = a.charAt(1); - Class cAT = argTypes.get(t); - if (cAT == null) { - throw new RuntimeException("Invalid command argument type " + t); - } - CommandArgument arg; - try { - arg = cAT.newInstance(); - arg.init(a.substring(3, a.length() - 1)); - if (!params[realArgumentsCount + 1].isAssignableFrom(arg.getType())) { - throw new RuntimeException("Type mismatch for " + method.getName()); - } - arg.name = name; - arguments.add(arg); - realArgumentsCount++; - } catch (Exception e) { - e.printStackTrace(); - } - } else { // Const - arguments.add(new ArgumentConst(a)); - } - if (pos == -1) { - break; - } - } - if (params.length != realArgumentsCount + 1) { - throw new RuntimeException("Argument count mis-match for " + method.getName()); - } - def.arguments = new CommandArgument[arguments.size()]; - arguments.toArray(def.arguments); - } - - static { - register(new CommandHandler() { - - @CommandString("rpgitem help $terms:s[]") - @CommandDocumentation("$command.rpgitem.help") - @CommandGroup("help") - public void help(CommandSender sender, String query) { - searchHelp(sender, query); - } - }); - } - - public static void searchHelp(CommandSender sender, String terms) { - if (terms.equalsIgnoreCase("_genhelp")) { - for (String locale : Locale.getLocales()) { - generateHelp(locale); - } - return; - } - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - sender.sendMessage(ChatColor.GREEN + String.format(Locale.get("message.help.for", locale), terms)); - String[] term = terms.toLowerCase().split(" "); - for (Entry> command : commands.entrySet()) { - for (CommandDef c : command.getValue()) { - int count = 0; - for (String t : term) { - if (c.commandString.toLowerCase().contains(t)) { - count++; - } - } - if (count == term.length) { - StringBuilder buf = new StringBuilder(); - buf.append(ChatColor.GREEN).append(ChatColor.BOLD).append('/').append(command.getKey()); - for (CommandArgument a : c.arguments) { - buf.append(' '); - if (a.name.length() != 0) { - buf.append(ChatColor.RED).append(ChatColor.BOLD); - buf.append(Locale.get("command.info." + a.name, locale)); - } - buf.append(a.isConst() ? ChatColor.GREEN : ChatColor.GOLD).append(ChatColor.BOLD); - buf.append(a.printable(locale)); - } - sender.sendMessage(buf.toString()); - String docStr = c.documentation; - if (docStr.charAt(0) == '$') { - if (docStr.contains("+")) { - String[] dArgs = docStr.split("\\+"); - docStr = Locale.get(dArgs[0].substring(1), locale); - if (dArgs[1].equalsIgnoreCase("PotionEffectType")) { - StringBuilder out = new StringBuilder(); - for (PotionEffectType type : PotionEffectType.values()) { - if (type != null) - out.append(type.getName().toLowerCase()).append(", "); - } - docStr += out.toString(); - } - } else { - docStr = Locale.get(docStr.substring(1), locale); - } - } - docStr = docStr.replaceAll("@", "" + ChatColor.BLUE).replaceAll("#", "" + ChatColor.WHITE); - - StringBuilder docBuf = new StringBuilder(); - char[] chars = docStr.toCharArray(); - docBuf.append(ChatColor.WHITE); - for (int i = 0; i < chars.length; i++) { - char l = chars[i]; - if (l == '&') { - i++; - l = chars[i]; - switch (l) { - case '0': - docBuf.append(ChatColor.BLACK); - break; - case '1': - docBuf.append(ChatColor.DARK_BLUE); - break; - case '2': - docBuf.append(ChatColor.DARK_GREEN); - break; - case '3': - docBuf.append(ChatColor.DARK_AQUA); - break; - case '4': - docBuf.append(ChatColor.DARK_RED); - break; - case '5': - docBuf.append(ChatColor.DARK_PURPLE); - break; - case '6': - docBuf.append(ChatColor.GOLD); - break; - case '7': - docBuf.append(ChatColor.GRAY); - break; - case '8': - docBuf.append(ChatColor.DARK_GRAY); - break; - case '9': - docBuf.append(ChatColor.BLUE); - break; - case 'a': - docBuf.append(ChatColor.GREEN); - break; - case 'b': - docBuf.append(ChatColor.AQUA); - break; - case 'c': - docBuf.append(ChatColor.RED); - break; - case 'd': - docBuf.append(ChatColor.LIGHT_PURPLE); - break; - case 'e': - docBuf.append(ChatColor.YELLOW); - break; - case 'f': - docBuf.append(ChatColor.WHITE); - break; - case 'r': - docBuf.append(ChatColor.WHITE); - break; - } - } else { - docBuf.append(l); - } - } - sender.sendMessage(docBuf.toString()); - } - } - } - } - - private static HashMap getMap() { - HashMap langMap = new HashMap(); - langMap.put("en_US", "English (US)"); - BufferedReader r = null; - try { - r = new BufferedReader(new InputStreamReader(Plugin.plugin.getResource("languages.txt"), "UTF-8")); - String line = null; - while ((line = r.readLine()) != null) { - String[] args = line.split("="); - langMap.put(args[0], args[1]); - } - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - try { - r.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - return langMap; - } - - public static void generateHelp(String locale) { - BufferedWriter w = null; - - HashMap langMap = getMap(); - - try { - File out = new File(Plugin.plugin.getDataFolder(), Calendar.getInstance().get(Calendar.YEAR) + "-" + Calendar.getInstance().get(Calendar.MONTH) + "-" + Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "-" + locale + ".md"); - if (out.exists()) { - out.delete(); - } - w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out), "UTF-8")); - w.write("---\n"); - w.write("layout: locale\n"); - w.write("title: " + langMap.get(locale) + "\n"); - w.write("permalink: " + locale + ".html\n"); - w.write("---\n"); - for (Entry> command : commands.entrySet()) { - w.write(String.format("## Commands /%s ", command.getKey())); - w.write("\n\n"); - for (CommandDef c : command.getValue()) { - StringBuilder buf = new StringBuilder(); - buf.append("### /"); - buf.append(command.getKey()).append(" "); - for (CommandArgument a : c.arguments) { - if (a.name.length() != 0) { - buf.append(""); - buf.append(Locale.get("command.info." + a.name, locale)); - buf.append(""); - } - if (a.isConst()) - buf.append(""); - else - buf.append(""); - buf.append(a.printable(locale)); - buf.append(" "); - } - buf.append("\n"); - String docStr = c.documentation; - if (docStr.charAt(0) == '$') { - if (docStr.contains("+")) { - String[] dArgs = docStr.split("\\+"); - docStr = Locale.get(dArgs[0].substring(1), locale); - if (dArgs[1].equalsIgnoreCase("PotionEffectType")) { - StringBuilder out2 = new StringBuilder(); - for (PotionEffectType type : PotionEffectType.values()) { - if (type != null) - out2.append(type.getName().toLowerCase()).append(", "); - } - docStr += out2.toString(); - } - } else { - docStr = Locale.get(docStr.substring(1), locale); - } - } - docStr = docStr.replaceAll("#", "").replaceAll("@", "").replaceAll("`", "`` ` ``"); - StringBuilder docBuf = new StringBuilder(); - char[] chars = docStr.toCharArray(); - for (int i = 0; i < chars.length; i++) { - char l = chars[i]; - if (l == '&') { - i++; - l = chars[i]; - if (l != 'r') { - docBuf.append(""); - } else { - docBuf.append(l); - } - } - buf.append(docBuf.toString()); - buf.append("\n\n"); - w.write(buf.toString()); - } - } - w.write("\n\n"); - w.write("Generated at: "); - SimpleDateFormat sdf = new SimpleDateFormat(); - sdf.setTimeZone(new SimpleTimeZone(0, "GMT")); - sdf.applyPattern("dd MMM yyyy HH:mm:ss z"); - w.write(sdf.format(new Date())); - - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - w.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + private static HashMap> commands = new HashMap>(); + private static TCharObjectHashMap> argTypes = new TCharObjectHashMap>(); + + static { + argTypes.put('s', ArgumentString.class); + argTypes.put('i', ArgumentInteger.class); + argTypes.put('f', ArgumentDouble.class); + argTypes.put('p', ArgumentPlayer.class); + argTypes.put('o', ArgumentOption.class); + argTypes.put('n', ArgumentItem.class); + argTypes.put('m', ArgumentMaterial.class); + argTypes.put('e', ArgumentEnum.class); + } + + public static void exec(CommandSender sender, String com) { + com = com.trim(); + if (com.length() == 0) + return; + String comName; + int pos = com.indexOf(' '); + if (pos == -1) { + comName = com; + } else { + comName = com.substring(0, pos); + } + com = com.substring(pos + 1); + + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + + ArrayList command = commands.get(comName); + if (command == null) { + sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.unknown.command", locale), comName)); + return; + } + + if (pos == -1) { + for (CommandDef c : command) { + if (c.arguments.length == 0) { + try { + if (c.handlePermissions || sender.hasPermission("rpgitem")) + c.method.invoke(c.handler, sender); + else + sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return; + } + } + // Print usage + if (sender.hasPermission("rpgitem")) { + sender.sendMessage(String.format(ChatColor.GREEN + Locale.get("message.command.usage", locale), comName, Plugin.plugin.getDescription().getVersion())); + for (CommandDef c : command) { + StringBuilder buf = new StringBuilder(); + buf.append(ChatColor.GREEN).append('/').append(comName); + for (CommandArgument a : c.arguments) { + buf.append(' '); + if (a.name.length() != 0) { + buf.append(ChatColor.RED); + buf.append(Locale.get("command.info." + a.name, locale)); + } + buf.append(a.isConst() ? ChatColor.GREEN : ChatColor.GOLD); + buf.append(a.printable(locale)); + } + sender.sendMessage(buf.toString()); + } + sender.sendMessage(ChatColor.GREEN + Locale.get("message.command.info", locale)); + } else + sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); + return; + } + ArrayList args = new ArrayList(); + while (true) { + int end; + if (com.length() == 0) { + break; + } + boolean quote = false; + if (com.charAt(0) == '`') { + com = com.substring(1); + end = com.indexOf('`'); + quote = true; + } else { + end = com.indexOf(' '); + } + if (end == -1) { + args.add(com); + } else { + args.add(com.substring(0, end)); + } + if (quote) { + com = com.substring(end + 1); + end = com.indexOf(' '); + } + if (end != -1) { + com = com.substring(end + 1); + } else { + break; + } + } + CommandError lastError = null; + comLoop: + for (CommandDef c : command) { + if (c.arguments.length != args.size()) { + if (c.arguments.length != 0 && c.arguments[c.arguments.length - 1] instanceof ArgumentString) { + if (args.size() < c.arguments.length) + continue; + } else { + continue; + } + } + ArrayList outArgs = new ArrayList(); + outArgs.add(sender); + for (int i = 0; i < c.arguments.length; i++) { + CommandArgument a = c.arguments[i]; + if (!a.isConst()) { + if (i == c.arguments.length - 1) { + // Special case for strings so they do not need to be quoted + if (a instanceof ArgumentString) { + StringBuilder joined = new StringBuilder(); + for (int j = i; j < args.size(); j++) { + joined.append(args.get(j)).append(' '); + } + args.set(i, joined.toString().trim()); + } + } + Object res = a.parse(args.get(i), locale); + if (res instanceof CommandError) { + lastError = (CommandError) res; + continue comLoop; + } + outArgs.add(res); + } else { + ArgumentConst cst = (ArgumentConst) a; + if (!cst.value.equals(args.get(i))) { + continue comLoop; + } + } + } + try { + if (c.handlePermissions || sender.hasPermission("rpgitem")) + c.method.invoke(c.handler, outArgs.toArray()); + else + sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return; + } + if (sender.hasPermission("rpgitem")) { + if (lastError != null) { + sender.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.command", locale), lastError.error)); + } else { + ArrayList consts = new ArrayList(); + comLoop: + for (CommandDef c : command) { + for (int i = 0; i < c.arguments.length; i++) { + if (i >= args.size()) + break; + CommandArgument a = c.arguments[i]; + if (!a.isConst()) { + if (i == c.arguments.length - 1) { + // Special case for strings so they do not need to be quoted + if (a instanceof ArgumentString) { + StringBuilder joined = new StringBuilder(); + for (int j = i; j < args.size(); j++) { + joined.append(args.get(j)).append(' '); + } + args.set(i, joined.toString().trim()); + } + } + Object res = a.parse(args.get(i), locale); + if (res instanceof CommandError) { + lastError = (CommandError) res; + continue comLoop; + } + } else { + ArgumentConst cst = (ArgumentConst) a; + if (!cst.value.equals(args.get(i))) { + continue comLoop; + } else { + consts.add(cst.value); + } + } + } + } + StringBuilder search = new StringBuilder(); + for (String term : consts) { + search.append(term).append(' '); + } + searchHelp(sender, search.toString()); + } + } else + sender.sendMessage(ChatColor.RED + Locale.get("message.error.permission", locale)); + } + + public static List complete(CommandSender sender, String com) { + com = com.trim(); + if (com.length() == 0) { + return new ArrayList(); + } + String comName; + int pos = com.indexOf(' '); + if (pos == -1) { + comName = com; + } else { + comName = com.substring(0, pos); + } + com = com.substring(pos + 1); + + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + + ArrayList command = commands.get(comName); + + if (command == null) { + if (pos == -1) { + ArrayList out = new ArrayList(); + for (String n : commands.keySet()) { + if (n.startsWith(comName)) { + out.add("/" + n); + } + } + return out; + } + return new ArrayList(); + } + ArrayList args = new ArrayList(); + while (true) { + int end; + if (com.length() == 0) { + break; + } + boolean quote = false; + if (com.charAt(0) == '`') { + com = com.substring(1); + end = com.indexOf('`'); + quote = true; + } else { + end = com.indexOf(' '); + } + if (end == -1) { + args.add(com); + } else { + args.add(com.substring(0, end)); + } + if (quote) { + com = com.substring(end + 1); + end = com.indexOf(' '); + } + if (end != -1) { + com = com.substring(end + 1); + } else { + break; + } + } + HashMap out = new HashMap(); + + comLoop: + for (CommandDef c : command) { + for (int i = 0; i < c.arguments.length; i++) { + CommandArgument a = c.arguments[i]; + if (i == args.size() - 1) { + List res = a.tabComplete(args.get(i)); + if (res != null) { + for (String s : res) { + out.put(s, true); + } + continue comLoop; + } + } else { + if (!a.isConst()) { + Object res = a.parse(args.get(i), locale); + if (res instanceof CommandError) { + continue comLoop; + } + } else { + ArgumentConst cst = (ArgumentConst) a; + if (!cst.value.equals(args.get(i))) { + continue comLoop; + } + } + } + } + } + ArrayList outList = new ArrayList(); + for (String s : out.keySet()) { + outList.add(s); + } + return outList; + } + + public static void register(CommandHandler handler) { + Method[] methods = handler.getClass().getMethods(); + for (Method method : methods) { + Class[] params = method.getParameterTypes(); + CommandString comString = method.getAnnotation(CommandString.class); + if (comString == null) { + continue; + } + if (params.length == 0 || !params[0].isAssignableFrom(CommandSender.class)) { + throw new RuntimeException("First argument must be CommandSender @ " + method.getName()); + } + add(comString.value(), method, handler); + } + Collection> coms = commands.values(); + for (ArrayList c : coms) { + Collections.sort(c); + } + } + + private static void add(String com, Method method, CommandHandler handler) { + com = com.trim(); + int pos = com.indexOf(' '); + String comName; + if (pos == -1) { + comName = com; + } else { + comName = com.substring(0, pos); + } + + CommandDef def = new CommandDef(); + def.commandString = com; + def.method = method; + def.handler = handler; + Class[] params = method.getParameterTypes(); + if (method.isAnnotationPresent(CommandDocumentation.class)) { + def.documentation = method.getAnnotation(CommandDocumentation.class).value(); + } else { + def.documentation = ""; + } + if (method.isAnnotationPresent(CommandGroup.class)) { + def.sortKey = method.getAnnotation(CommandGroup.class).value(); + } else { + def.sortKey = ""; + } + CommandString comString = method.getAnnotation(CommandString.class); + def.handlePermissions = comString.handlePermissions(); + + if (!commands.containsKey(comName)) { + commands.put(comName, new ArrayList()); + } + commands.get(comName).add(def); + if (pos == -1) { + def.arguments = new CommandArgument[0]; + return; + } + com = com.substring(pos + 1); + ArrayList arguments = new ArrayList(); + int realArgumentsCount = 0; + while (true) { + pos = com.indexOf(' '); + String a; + if (pos == -1) { + a = com; + } else { + a = com.substring(0, pos); + com = com.substring(pos + 1); + } + if (a.charAt(0) == '$') { // Variable + String name = ""; + if (a.contains(":")) { + String[] as = a.split(":"); + name = as[0].substring(1); + a = "$" + as[1]; + } + char t = a.charAt(1); + Class cAT = argTypes.get(t); + if (cAT == null) { + throw new RuntimeException("Invalid command argument type " + t); + } + CommandArgument arg; + try { + arg = cAT.newInstance(); + arg.init(a.substring(3, a.length() - 1)); + if (!params[realArgumentsCount + 1].isAssignableFrom(arg.getType())) { + throw new RuntimeException("Type mismatch for " + method.getName()); + } + arg.name = name; + arguments.add(arg); + realArgumentsCount++; + } catch (Exception e) { + e.printStackTrace(); + } + } else { // Const + arguments.add(new ArgumentConst(a)); + } + if (pos == -1) { + break; + } + } + if (params.length != realArgumentsCount + 1) { + throw new RuntimeException("Argument count mis-match for " + method.getName()); + } + def.arguments = new CommandArgument[arguments.size()]; + arguments.toArray(def.arguments); + } + + static { + register(new CommandHandler() { + + @CommandString("rpgitem help $terms:s[]") + @CommandDocumentation("$command.rpgitem.help") + @CommandGroup("help") + public void help(CommandSender sender, String query) { + searchHelp(sender, query); + } + }); + } + + public static void searchHelp(CommandSender sender, String terms) { + if (terms.equalsIgnoreCase("_genhelp")) { + for (String locale : Locale.getLocales()) { + generateHelp(locale); + } + return; + } + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + sender.sendMessage(ChatColor.GREEN + String.format(Locale.get("message.help.for", locale), terms)); + String[] term = terms.toLowerCase().split(" "); + for (Entry> command : commands.entrySet()) { + for (CommandDef c : command.getValue()) { + int count = 0; + for (String t : term) { + if (c.commandString.toLowerCase().contains(t)) { + count++; + } + } + if (count == term.length) { + StringBuilder buf = new StringBuilder(); + buf.append(ChatColor.GREEN).append(ChatColor.BOLD).append('/').append(command.getKey()); + for (CommandArgument a : c.arguments) { + buf.append(' '); + if (a.name.length() != 0) { + buf.append(ChatColor.RED).append(ChatColor.BOLD); + buf.append(Locale.get("command.info." + a.name, locale)); + } + buf.append(a.isConst() ? ChatColor.GREEN : ChatColor.GOLD).append(ChatColor.BOLD); + buf.append(a.printable(locale)); + } + sender.sendMessage(buf.toString()); + String docStr = c.documentation; + if (docStr.charAt(0) == '$') { + if (docStr.contains("+")) { + String[] dArgs = docStr.split("\\+"); + docStr = Locale.get(dArgs[0].substring(1), locale); + if (dArgs[1].equalsIgnoreCase("PotionEffectType")) { + StringBuilder out = new StringBuilder(); + for (PotionEffectType type : PotionEffectType.values()) { + if (type != null) + out.append(type.getName().toLowerCase()).append(", "); + } + docStr += out.toString(); + } + } else { + docStr = Locale.get(docStr.substring(1), locale); + } + } + docStr = docStr.replaceAll("@", "" + ChatColor.BLUE).replaceAll("#", "" + ChatColor.WHITE); + + StringBuilder docBuf = new StringBuilder(); + char[] chars = docStr.toCharArray(); + docBuf.append(ChatColor.WHITE); + for (int i = 0; i < chars.length; i++) { + char l = chars[i]; + if (l == '&') { + i++; + l = chars[i]; + switch (l) { + case '0': + docBuf.append(ChatColor.BLACK); + break; + case '1': + docBuf.append(ChatColor.DARK_BLUE); + break; + case '2': + docBuf.append(ChatColor.DARK_GREEN); + break; + case '3': + docBuf.append(ChatColor.DARK_AQUA); + break; + case '4': + docBuf.append(ChatColor.DARK_RED); + break; + case '5': + docBuf.append(ChatColor.DARK_PURPLE); + break; + case '6': + docBuf.append(ChatColor.GOLD); + break; + case '7': + docBuf.append(ChatColor.GRAY); + break; + case '8': + docBuf.append(ChatColor.DARK_GRAY); + break; + case '9': + docBuf.append(ChatColor.BLUE); + break; + case 'a': + docBuf.append(ChatColor.GREEN); + break; + case 'b': + docBuf.append(ChatColor.AQUA); + break; + case 'c': + docBuf.append(ChatColor.RED); + break; + case 'd': + docBuf.append(ChatColor.LIGHT_PURPLE); + break; + case 'e': + docBuf.append(ChatColor.YELLOW); + break; + case 'f': + docBuf.append(ChatColor.WHITE); + break; + case 'r': + docBuf.append(ChatColor.WHITE); + break; + } + } else { + docBuf.append(l); + } + } + sender.sendMessage(docBuf.toString()); + } + } + } + } + + private static HashMap getMap() { + HashMap langMap = new HashMap(); + langMap.put("en_US", "English (US)"); + BufferedReader r = null; + try { + r = new BufferedReader(new InputStreamReader(Plugin.plugin.getResource("languages.txt"), "UTF-8")); + String line = null; + while ((line = r.readLine()) != null) { + String[] args = line.split("="); + langMap.put(args[0], args[1]); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + try { + r.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return langMap; + } + + public static void generateHelp(String locale) { + BufferedWriter w = null; + + HashMap langMap = getMap(); + + try { + File out = new File(Plugin.plugin.getDataFolder(), Calendar.getInstance().get(Calendar.YEAR) + "-" + Calendar.getInstance().get(Calendar.MONTH) + "-" + Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "-" + locale + ".md"); + if (out.exists()) { + out.delete(); + } + w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out), "UTF-8")); + w.write("---\n"); + w.write("layout: locale\n"); + w.write("title: " + langMap.get(locale) + "\n"); + w.write("permalink: " + locale + ".html\n"); + w.write("---\n"); + for (Entry> command : commands.entrySet()) { + w.write(String.format("## Commands /%s ", command.getKey())); + w.write("\n\n"); + for (CommandDef c : command.getValue()) { + StringBuilder buf = new StringBuilder(); + buf.append("### /"); + buf.append(command.getKey()).append(" "); + for (CommandArgument a : c.arguments) { + if (a.name.length() != 0) { + buf.append(""); + buf.append(Locale.get("command.info." + a.name, locale)); + buf.append(""); + } + if (a.isConst()) + buf.append(""); + else + buf.append(""); + buf.append(a.printable(locale)); + buf.append(" "); + } + buf.append("\n"); + String docStr = c.documentation; + if (docStr.charAt(0) == '$') { + if (docStr.contains("+")) { + String[] dArgs = docStr.split("\\+"); + docStr = Locale.get(dArgs[0].substring(1), locale); + if (dArgs[1].equalsIgnoreCase("PotionEffectType")) { + StringBuilder out2 = new StringBuilder(); + for (PotionEffectType type : PotionEffectType.values()) { + if (type != null) + out2.append(type.getName().toLowerCase()).append(", "); + } + docStr += out2.toString(); + } + } else { + docStr = Locale.get(docStr.substring(1), locale); + } + } + docStr = docStr.replaceAll("#", "").replaceAll("@", "").replaceAll("`", "`` ` ``"); + StringBuilder docBuf = new StringBuilder(); + char[] chars = docStr.toCharArray(); + for (int i = 0; i < chars.length; i++) { + char l = chars[i]; + if (l == '&') { + i++; + l = chars[i]; + if (l != 'r') { + docBuf.append(""); + } else { + docBuf.append(l); + } + } + buf.append(docBuf.toString()); + buf.append("\n\n"); + w.write(buf.toString()); + } + } + w.write("\n\n"); + w.write("Generated at: "); + SimpleDateFormat sdf = new SimpleDateFormat(); + sdf.setTimeZone(new SimpleTimeZone(0, "GMT")); + sdf.applyPattern("dd MMM yyyy HH:mm:ss z"); + w.write(sdf.format(new Date())); + + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + w.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } } class CommandDef implements Comparable { - public boolean handlePermissions; - public String commandString; - public CommandHandler handler; - public Method method; - public CommandArgument[] arguments; - public String documentation; - public String sortKey; - - @Override - public int compareTo(CommandDef o) { - return sortKey.compareToIgnoreCase(o.sortKey); - } + public boolean handlePermissions; + public String commandString; + public CommandHandler handler; + public Method method; + public CommandArgument[] arguments; + public String documentation; + public String sortKey; + + @Override + public int compareTo(CommandDef o) { + return sortKey.compareToIgnoreCase(o.sortKey); + } } abstract class CommandArgument { - public abstract void init(String a); + public abstract void init(String a); - public abstract Object parse(String in, String locale); + public abstract Object parse(String in, String locale); - public abstract List tabComplete(String in); + public abstract List tabComplete(String in); - public abstract String printable(String locale); + public abstract String printable(String locale); - public abstract Class getType(); + public abstract Class getType(); - public String name = ""; + public String name = ""; - public boolean isConst() { - return false; - } + public boolean isConst() { + return false; + } } class CommandError { - public String error; + public String error; - public CommandError(String error) { - this.error = error; - } + public CommandError(String error) { + this.error = error; + } } class ArgumentInteger extends CommandArgument { - private boolean hasLimits; - private int min; - private int max; - - @Override - public void init(String a) { - if (a.length() == 0) { - hasLimits = false; - } else { - hasLimits = true; - String[] args = a.split(","); - if (args.length != 2) { - throw new RuntimeException("ArgumentInteger limits errror"); - } - min = Integer.parseInt(args[0]); - max = Integer.parseInt(args[1]); - } - } - - @Override - public Object parse(String in, String locale) { - if (hasLimits) { - try { - int i = Integer.parseInt(in); - if (i < min || i > max) { - return new CommandError(String.format(Locale.get("message.error.integer.limit", locale), min, max)); - } - return i; - } catch (NumberFormatException e) { - return new CommandError(String.format(Locale.get("message.error.integer.format", locale), in)); - } - } else { - try { - int i = Integer.parseInt(in); - return i; - } catch (NumberFormatException e) { - return new CommandError(String.format(Locale.get("message.error.integer.format", locale), in)); - } - } - } - - @Override - public List tabComplete(String in) { - return new ArrayList(); - } - - @Override - public String printable(String locale) { - if (hasLimits) { - return String.format(Locale.get("command.info.integer.limit", locale), min, max); - } - return Locale.get("command.info.integer", locale); - } - - @Override - public Class getType() { - return int.class; - } + private boolean hasLimits; + private int min; + private int max; + + @Override + public void init(String a) { + if (a.length() == 0) { + hasLimits = false; + } else { + hasLimits = true; + String[] args = a.split(","); + if (args.length != 2) { + throw new RuntimeException("ArgumentInteger limits errror"); + } + min = Integer.parseInt(args[0]); + max = Integer.parseInt(args[1]); + } + } + + @Override + public Object parse(String in, String locale) { + if (hasLimits) { + try { + int i = Integer.parseInt(in); + if (i < min || i > max) { + return new CommandError(String.format(Locale.get("message.error.integer.limit", locale), min, max)); + } + return i; + } catch (NumberFormatException e) { + return new CommandError(String.format(Locale.get("message.error.integer.format", locale), in)); + } + } else { + try { + int i = Integer.parseInt(in); + return i; + } catch (NumberFormatException e) { + return new CommandError(String.format(Locale.get("message.error.integer.format", locale), in)); + } + } + } + + @Override + public List tabComplete(String in) { + return new ArrayList(); + } + + @Override + public String printable(String locale) { + if (hasLimits) { + return String.format(Locale.get("command.info.integer.limit", locale), min, max); + } + return Locale.get("command.info.integer", locale); + } + + @Override + public Class getType() { + return int.class; + } } class ArgumentDouble extends CommandArgument { - private boolean hasLimits; - private double min; - private double max; - - @Override - public void init(String a) { - if (a.length() == 0) { - hasLimits = false; - } else { - hasLimits = true; - String[] args = a.split(","); - if (args.length != 2) { - throw new RuntimeException("ArgumentDouble limits errror"); - } - min = Double.parseDouble(args[0]); - max = Double.parseDouble(args[1]); - } - } - - @Override - public Object parse(String in, String locale) { - if (hasLimits) { - try { - double i = Double.parseDouble(in); - if (i < min || i > max) { - return new CommandError(String.format(Locale.get("message.error.double.limit", locale), min, max)); - } - return i; - } catch (NumberFormatException e) { - return new CommandError(String.format(Locale.get("message.error.double.format", locale), in)); - } - } else { - try { - double i = Double.parseDouble(in); - return i; - } catch (NumberFormatException e) { - return new CommandError(String.format(Locale.get("message.error.double.format", locale), in)); - } - } - } - - @Override - public List tabComplete(String in) { - return new ArrayList(); - } - - @Override - public String printable(String locale) { - if (hasLimits) { - return String.format(Locale.get("command.info.double.limit", locale), min, max); - } - return Locale.get("command.info.double", locale); - } - - @Override - public Class getType() { - return double.class; - } + private boolean hasLimits; + private double min; + private double max; + + @Override + public void init(String a) { + if (a.length() == 0) { + hasLimits = false; + } else { + hasLimits = true; + String[] args = a.split(","); + if (args.length != 2) { + throw new RuntimeException("ArgumentDouble limits errror"); + } + min = Double.parseDouble(args[0]); + max = Double.parseDouble(args[1]); + } + } + + @Override + public Object parse(String in, String locale) { + if (hasLimits) { + try { + double i = Double.parseDouble(in); + if (i < min || i > max) { + return new CommandError(String.format(Locale.get("message.error.double.limit", locale), min, max)); + } + return i; + } catch (NumberFormatException e) { + return new CommandError(String.format(Locale.get("message.error.double.format", locale), in)); + } + } else { + try { + double i = Double.parseDouble(in); + return i; + } catch (NumberFormatException e) { + return new CommandError(String.format(Locale.get("message.error.double.format", locale), in)); + } + } + } + + @Override + public List tabComplete(String in) { + return new ArrayList(); + } + + @Override + public String printable(String locale) { + if (hasLimits) { + return String.format(Locale.get("command.info.double.limit", locale), min, max); + } + return Locale.get("command.info.double", locale); + } + + @Override + public Class getType() { + return double.class; + } } class ArgumentString extends CommandArgument { - private int maxLength; - - @Override - public void init(String a) { - if (a.length() == 0) { - maxLength = 0; - } else { - maxLength = Integer.parseInt(a); - } - } - - @Override - public Object parse(String in, String locale) { - if (maxLength != 0 && in.length() > maxLength) - return new CommandError(String.format(Locale.get("message.error.string.length", locale), in, maxLength)); - return in; - } - - @Override - public List tabComplete(String in) { - return new ArrayList(); - } - - @Override - public String printable(String locale) { - if (maxLength != 0) - return String.format(Locale.get("command.info.string.limit", locale), maxLength); - return Locale.get("command.info.string", locale); - } - - @Override - public Class getType() { - return String.class; - } + private int maxLength; + + @Override + public void init(String a) { + if (a.length() == 0) { + maxLength = 0; + } else { + maxLength = Integer.parseInt(a); + } + } + + @Override + public Object parse(String in, String locale) { + if (maxLength != 0 && in.length() > maxLength) + return new CommandError(String.format(Locale.get("message.error.string.length", locale), in, maxLength)); + return in; + } + + @Override + public List tabComplete(String in) { + return new ArrayList(); + } + + @Override + public String printable(String locale) { + if (maxLength != 0) + return String.format(Locale.get("command.info.string.limit", locale), maxLength); + return Locale.get("command.info.string", locale); + } + + @Override + public Class getType() { + return String.class; + } } class ArgumentConst extends CommandArgument { - public String value; - - public ArgumentConst(String v) { - value = v; - } - - @Override - public void init(String a) { - throw new RuntimeException("Const cannot be init'ed"); - } - - @Override - public Object parse(String in, String locale) { - return null; - } - - @Override - public List tabComplete(String in) { - ArrayList a = new ArrayList(); - String lValue = value; - if (lValue.startsWith(in)) - a.add(lValue); - return a; - } - - @Override - public String printable(String locale) { - return value; - } - - @Override - public boolean isConst() { - return true; - } - - @Override - public Class getType() { - return null; - } + public String value; + + public ArgumentConst(String v) { + value = v; + } + + @Override + public void init(String a) { + throw new RuntimeException("Const cannot be init'ed"); + } + + @Override + public Object parse(String in, String locale) { + return null; + } + + @Override + public List tabComplete(String in) { + ArrayList a = new ArrayList(); + String lValue = value; + if (lValue.startsWith(in)) + a.add(lValue); + return a; + } + + @Override + public String printable(String locale) { + return value; + } + + @Override + public boolean isConst() { + return true; + } + + @Override + public Class getType() { + return null; + } } class ArgumentPlayer extends CommandArgument { - @Override - public void init(String a) { - } - - @Override - public Object parse(String in, String locale) { - Player player = Bukkit.getPlayer(in); - if (player == null) - return new CommandError(String.format(Locale.get("message.error.player", locale), in)); - return player; - } - - @Override - public List tabComplete(String in) { - List players = Bukkit.matchPlayer(in); - ArrayList out = new ArrayList(); - for (Player player : players) { - out.add(player.getName()); - } - return out; - } - - @Override - public String printable(String locale) { - return Locale.get("command.info.player", locale); - } - - @Override - public Class getType() { - return Player.class; - } + @Override + public void init(String a) { + } + + @Override + public Object parse(String in, String locale) { + Player player = Bukkit.getPlayer(in); + if (player == null) + return new CommandError(String.format(Locale.get("message.error.player", locale), in)); + return player; + } + + @Override + public List tabComplete(String in) { + List players = Bukkit.matchPlayer(in); + ArrayList out = new ArrayList(); + for (Player player : players) { + out.add(player.getName()); + } + return out; + } + + @Override + public String printable(String locale) { + return Locale.get("command.info.player", locale); + } + + @Override + public Class getType() { + return Player.class; + } } class ArgumentOption extends CommandArgument { - private String[] options; - private String shortVersion = ""; - - @Override - public void init(String a) { - if (a.contains("@")) { - String[] args = a.split("@"); - shortVersion = args[0]; - a = args[1]; - - } - options = a.split(","); - for (int i = 0; i < options.length; i++) { - options[i] = options[i].trim(); - } - } - - @Override - public Object parse(String in, String locale) { - for (String o : options) { - if (o.equalsIgnoreCase(in)) { - return o; - } - } - return new CommandError(String.format(Locale.get("message.error.option", locale), in)); - } - - @Override - public List tabComplete(String in) { - ArrayList out = new ArrayList(); - in = in.toLowerCase(); - for (String o : options) { - if (o.startsWith(in)) { - out.add(o); - } - } - return out; - } - - @Override - public String printable(String locale) { - if (shortVersion.length() == 0) { - StringBuilder out = new StringBuilder(); - out.append('['); - for (int i = 0; i < options.length; i++) { - out.append(options[i]).append(i == options.length - 1 ? ']' : ','); - } - return out.toString(); - } else { - return "[" + shortVersion + "]"; - } - } - - @Override - public Class getType() { - return String.class; - } + private String[] options; + private String shortVersion = ""; + + @Override + public void init(String a) { + if (a.contains("@")) { + String[] args = a.split("@"); + shortVersion = args[0]; + a = args[1]; + + } + options = a.split(","); + for (int i = 0; i < options.length; i++) { + options[i] = options[i].trim(); + } + } + + @Override + public Object parse(String in, String locale) { + for (String o : options) { + if (o.equalsIgnoreCase(in)) { + return o; + } + } + return new CommandError(String.format(Locale.get("message.error.option", locale), in)); + } + + @Override + public List tabComplete(String in) { + ArrayList out = new ArrayList(); + in = in.toLowerCase(); + for (String o : options) { + if (o.startsWith(in)) { + out.add(o); + } + } + return out; + } + + @Override + public String printable(String locale) { + if (shortVersion.length() == 0) { + StringBuilder out = new StringBuilder(); + out.append('['); + for (int i = 0; i < options.length; i++) { + out.append(options[i]).append(i == options.length - 1 ? ']' : ','); + } + return out.toString(); + } else { + return "[" + shortVersion + "]"; + } + } + + @Override + public Class getType() { + return String.class; + } } class ArgumentItem extends CommandArgument { - @Override - public void init(String a) { - - } - - @Override - public Object parse(String in, String locale) { - in = in.toLowerCase(); - RPGItem item = ItemManager.getItemByName(in); - if (item == null) { - return new CommandError(String.format(Locale.get("message.error.item", locale), in)); - } - return item; - } - - @Override - public List tabComplete(String in) { - in = in.toLowerCase(); - ArrayList out = new ArrayList(); - for (String i : ItemManager.itemByName.keySet()) { - if (i.startsWith(in)) { - out.add(i); - } - } - return out; - } - - @Override - public String printable(String locale) { - return Locale.get("command.info.item", locale); - } - - @Override - public Class getType() { - return RPGItem.class; - } + @Override + public void init(String a) { + + } + + @Override + public Object parse(String in, String locale) { + in = in.toLowerCase(); + RPGItem item = ItemManager.getItemByName(in); + if (item == null) { + return new CommandError(String.format(Locale.get("message.error.item", locale), in)); + } + return item; + } + + @Override + public List tabComplete(String in) { + in = in.toLowerCase(); + ArrayList out = new ArrayList(); + for (String i : ItemManager.itemByName.keySet()) { + if (i.startsWith(in)) { + out.add(i); + } + } + return out; + } + + @Override + public String printable(String locale) { + return Locale.get("command.info.item", locale); + } + + @Override + public Class getType() { + return RPGItem.class; + } } class ArgumentMaterial extends CommandArgument { - @Override - public void init(String a) { - - } - - @Override - public Object parse(String in, String locale) { - Material mat = Material.matchMaterial(in); - if (mat == null) { - return new CommandError(String.format(Locale.get("message.error.material", locale), in)); - } - return mat; - } - - @Override - public List tabComplete(String in) { - ArrayList out = new ArrayList(); - String it = in.toUpperCase(); - for (Material m : Material.values()) { - if (m.toString().startsWith(it)) { - out.add(m.toString()); - } - } - return out; - } - - @Override - public String printable(String locale) { - return Locale.get("command.info.material", locale); - } - - @Override - public Class getType() { - return Material.class; - } + @Override + public void init(String a) { + + } + + @Override + public Object parse(String in, String locale) { + Material mat = Material.matchMaterial(in); + if (mat == null) { + return new CommandError(String.format(Locale.get("message.error.material", locale), in)); + } + return mat; + } + + @Override + public List tabComplete(String in) { + ArrayList out = new ArrayList(); + String it = in.toUpperCase(); + for (Material m : Material.values()) { + if (m.toString().startsWith(it)) { + out.add(m.toString()); + } + } + return out; + } + + @Override + public String printable(String locale) { + return Locale.get("command.info.material", locale); + } + + @Override + public Class getType() { + return Material.class; + } } class ArgumentEnum extends CommandArgument { - private Class e; - private List enumConsts; - - @Override - public void init(String a) { - try { - e = Class.forName(a); - if (!e.isEnum()) { - throw new RuntimeException(a + " is not an enum"); - } - enumConsts = Arrays.asList(e.getEnumConstants()); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Object parse(String in, String locale) { - Enum en = null; - try { - en = Enum.valueOf((Class) e, in.toUpperCase()); - } catch (IllegalArgumentException ex) { - return new CommandError(String.format("%s is not a %s", in, e.getSimpleName())); - } - return en; - } - - @Override - public List tabComplete(String in) { - ArrayList out = new ArrayList(); - String it = in.toUpperCase(); - for (Object en : enumConsts) { - if (en.toString().startsWith(it)) { - out.add(en.toString()); - } - } - return out; - } - - @Override - public String printable(String locale) { - return "[" + e.getSimpleName() + "]"; - } - - @Override - public Class getType() { - return e; - } + private Class e; + private List enumConsts; + + @Override + public void init(String a) { + try { + e = Class.forName(a); + if (!e.isEnum()) { + throw new RuntimeException(a + " is not an enum"); + } + enumConsts = Arrays.asList(e.getEnumConstants()); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + @Override + public Object parse(String in, String locale) { + Enum en = null; + try { + en = Enum.valueOf((Class) e, in.toUpperCase()); + } catch (IllegalArgumentException ex) { + return new CommandError(String.format("%s is not a %s", in, e.getSimpleName())); + } + return en; + } + + @Override + public List tabComplete(String in) { + ArrayList out = new ArrayList(); + String it = in.toUpperCase(); + for (Object en : enumConsts) { + if (en.toString().startsWith(it)) { + out.add(en.toString()); + } + } + return out; + } + + @Override + public String printable(String locale) { + return "[" + e.getSimpleName() + "]"; + } + + @Override + public Class getType() { + return e; + } } \ No newline at end of file diff --git a/src/main/java/think/rpgitems/config/ConfigUpdater.java b/src/main/java/think/rpgitems/config/ConfigUpdater.java index 652aa2e0..af7d3821 100644 --- a/src/main/java/think/rpgitems/config/ConfigUpdater.java +++ b/src/main/java/think/rpgitems/config/ConfigUpdater.java @@ -16,57 +16,56 @@ */ package think.rpgitems.config; -import java.util.HashMap; - import org.bukkit.configuration.ConfigurationSection; - import think.rpgitems.Plugin; +import java.util.HashMap; + public class ConfigUpdater { - final static String CONFIG_VERSION = "0.5"; + final static String CONFIG_VERSION = "0.5"; - static HashMap updates; + static HashMap updates; - static { - updates = new HashMap(); - updates.put("0.1", new Update01To02()); - updates.put("0.2", new Update02To03()); - updates.put("0.3", new Update03To04()); - updates.put("0.4", new Update04To05()); - } + static { + updates = new HashMap(); + updates.put("0.1", new Update01To02()); + updates.put("0.2", new Update02To03()); + updates.put("0.3", new Update03To04()); + updates.put("0.4", new Update04To05()); + } - public static void updateConfig(ConfigurationSection conf) { - while (!conf.getString("version", "0.0").equals(CONFIG_VERSION)) { - if (!conf.contains("version")) { - if (!conf.contains("autoupdate")) { - conf.set("autoupdate", true); - } - if (!conf.contains("defaults.hand")) { - conf.set("defaults.hand", "One handed"); - } - if (!conf.contains("defaults.sword")) { - conf.set("defaults.sword", "Sword"); - } - if (!conf.contains("defaults.damage")) { - conf.set("defaults.damage", "Damage"); - } - if (!conf.contains("defaults.armour")) { - conf.set("defaults.armour", "Armour"); - } - if (!conf.contains("support.worldguard")) { - conf.set("support.worldguard", false); - } - conf.set("version", "0.1"); - Plugin.plugin.saveConfig(); - } else { - if (updates.containsKey(conf.get("version"))) { - updates.get(conf.get("version")).update(conf); - } else { - break; - } - } - } - updates.clear(); - } + public static void updateConfig(ConfigurationSection conf) { + while (!conf.getString("version", "0.0").equals(CONFIG_VERSION)) { + if (!conf.contains("version")) { + if (!conf.contains("autoupdate")) { + conf.set("autoupdate", true); + } + if (!conf.contains("defaults.hand")) { + conf.set("defaults.hand", "One handed"); + } + if (!conf.contains("defaults.sword")) { + conf.set("defaults.sword", "Sword"); + } + if (!conf.contains("defaults.damage")) { + conf.set("defaults.damage", "Damage"); + } + if (!conf.contains("defaults.armour")) { + conf.set("defaults.armour", "Armour"); + } + if (!conf.contains("support.worldguard")) { + conf.set("support.worldguard", false); + } + conf.set("version", "0.1"); + Plugin.plugin.saveConfig(); + } else { + if (updates.containsKey(conf.get("version"))) { + updates.get(conf.get("version")).update(conf); + } else { + break; + } + } + } + updates.clear(); + } } diff --git a/src/main/java/think/rpgitems/config/Update01To02.java b/src/main/java/think/rpgitems/config/Update01To02.java index d0b3d072..f811e827 100644 --- a/src/main/java/think/rpgitems/config/Update01To02.java +++ b/src/main/java/think/rpgitems/config/Update01To02.java @@ -16,42 +16,41 @@ */ package think.rpgitems.config; -import java.io.File; -import java.io.IOException; - import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; - import think.rpgitems.Plugin; +import java.io.File; +import java.io.IOException; + public class Update01To02 implements Updater { - @Override - public void update(ConfigurationSection section) { - - File iFile = new File(Plugin.plugin.getDataFolder(), "items.yml"); - YamlConfiguration itemStorage = YamlConfiguration.loadConfiguration(iFile); - ConfigurationSection iSection = itemStorage.getConfigurationSection("items"); - - if (iSection != null) { - for (String key : iSection.getKeys(false)) { - ConfigurationSection item = iSection.getConfigurationSection(key); - if (item.contains("armour")) { - int dam = item.getInt("armour"); - item.set("armour", (int) ((((double) dam) / 20d) * 100d)); - } - } - } - - section.set("version", "0.2"); - - try { - itemStorage.save(iFile); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Plugin.plugin.saveConfig(); - } + @Override + public void update(ConfigurationSection section) { + + File iFile = new File(Plugin.plugin.getDataFolder(), "items.yml"); + YamlConfiguration itemStorage = YamlConfiguration.loadConfiguration(iFile); + ConfigurationSection iSection = itemStorage.getConfigurationSection("items"); + + if (iSection != null) { + for (String key : iSection.getKeys(false)) { + ConfigurationSection item = iSection.getConfigurationSection(key); + if (item.contains("armour")) { + int dam = item.getInt("armour"); + item.set("armour", (int) ((((double) dam) / 20d) * 100d)); + } + } + } + + section.set("version", "0.2"); + + try { + itemStorage.save(iFile); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Plugin.plugin.saveConfig(); + } } diff --git a/src/main/java/think/rpgitems/config/Update02To03.java b/src/main/java/think/rpgitems/config/Update02To03.java index 1c2dd999..c372107c 100644 --- a/src/main/java/think/rpgitems/config/Update02To03.java +++ b/src/main/java/think/rpgitems/config/Update02To03.java @@ -1,12 +1,5 @@ package think.rpgitems.config; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.Material; @@ -16,7 +9,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; - import think.rpgitems.Plugin; import think.rpgitems.data.Locale; import think.rpgitems.item.ItemManager; @@ -24,152 +16,159 @@ import think.rpgitems.item.RPGItem; import think.rpgitems.power.Power; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + public class Update02To03 implements Updater { - @SuppressWarnings("unchecked") - @Override - public void update(ConfigurationSection section) { - Plugin plugin = Plugin.plugin; - try { - FileInputStream in = null; - YamlConfiguration itemStorage = null; - try { - File f = new File(plugin.getDataFolder(), "items.yml"); - in = new FileInputStream(f); - byte[] data = new byte[(int) f.length()]; - in.read(data); - itemStorage = new YamlConfiguration(); - String str = new String(data, "UTF-8"); - itemStorage.loadFromString(str); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (InvalidConfigurationException e) { - e.printStackTrace(); - } finally { - try { - if (in != null) - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - int currentPos = itemStorage.getInt("pos", 0); - ConfigurationSection itemSection = itemStorage.getConfigurationSection("items"); - if (itemSection != null) { - for (String itemKey : itemSection.getKeys(false)) { - ConfigurationSection s = itemSection.getConfigurationSection(itemKey); - String name = s.getString("name"); - int id = s.getInt("id"); - String displayName = null, type = null, hand = null, lore = null; - try { - if (s.contains("display")) { - displayName = s.getString("display"); - } else { - displayName = new String(byte[].class.cast(s.get("display_bin", "")), "UTF-8"); - } - if (s.contains("type")) { - type = s.getString("type", Plugin.plugin.getConfig().getString("defaults.sword", "Sword")); - } else { - if (s.contains("type_bin")) { - type = new String(byte[].class.cast(s.get("type_bin", "")), "UTF-8"); - } else { - type = Plugin.plugin.getConfig().getString("defaults.sword", "Sword"); - } - } - if (s.contains("hand")) { - hand = s.getString("hand", Plugin.plugin.getConfig().getString("defaults.hand", "One handed")); - } else { - if (s.contains("hand_bin")) { - hand = new String(byte[].class.cast(s.get("hand_bin", "")), "UTF-8"); - } else { - hand = Plugin.plugin.getConfig().getString("defaults.hand", "One handed"); - } - } - if (s.contains("lore")) { - lore = s.getString("lore"); - } else { - if (s.contains("lore_bin")) { - lore = new String(byte[].class.cast(s.get("lore_bin", "")), "UTF-8"); - } else { - lore = ""; - } - } - } catch (Exception e) { - e.printStackTrace(); - } - List description = (List) s.getList("description", new ArrayList()); - for (int i = 0; i < description.size(); i++) { - description.set(i, ChatColor.translateAlternateColorCodes('&', description.get(i))); - } - Quality quality = Quality.valueOf(s.getString("quality")); - int damageMin = s.getInt("damageMin"); - int damageMax = s.getInt("damageMax"); - int armour = s.getInt("armour", 0); - ItemStack item = new ItemStack(Material.valueOf(s.getString("item"))); - ItemMeta meta = item.getItemMeta(); - if (meta instanceof LeatherArmorMeta) { - ((LeatherArmorMeta) meta).setColor(Color.fromRGB(s.getInt("item_colour", 0))); - } else { - item.setDurability((short) s.getInt("item_data", 0)); - } - boolean ignoreWorldGuard = s.getBoolean("ignoreWorldGuard", false); + @SuppressWarnings("unchecked") + @Override + public void update(ConfigurationSection section) { + Plugin plugin = Plugin.plugin; + try { + FileInputStream in = null; + YamlConfiguration itemStorage = null; + try { + File f = new File(plugin.getDataFolder(), "items.yml"); + in = new FileInputStream(f); + byte[] data = new byte[(int) f.length()]; + in.read(data); + itemStorage = new YamlConfiguration(); + String str = new String(data, "UTF-8"); + itemStorage.loadFromString(str); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InvalidConfigurationException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + int currentPos = itemStorage.getInt("pos", 0); + ConfigurationSection itemSection = itemStorage.getConfigurationSection("items"); + if (itemSection != null) { + for (String itemKey : itemSection.getKeys(false)) { + ConfigurationSection s = itemSection.getConfigurationSection(itemKey); + String name = s.getString("name"); + int id = s.getInt("id"); + String displayName = null, type = null, hand = null, lore = null; + try { + if (s.contains("display")) { + displayName = s.getString("display"); + } else { + displayName = new String(byte[].class.cast(s.get("display_bin", "")), "UTF-8"); + } + if (s.contains("type")) { + type = s.getString("type", Plugin.plugin.getConfig().getString("defaults.sword", "Sword")); + } else { + if (s.contains("type_bin")) { + type = new String(byte[].class.cast(s.get("type_bin", "")), "UTF-8"); + } else { + type = Plugin.plugin.getConfig().getString("defaults.sword", "Sword"); + } + } + if (s.contains("hand")) { + hand = s.getString("hand", Plugin.plugin.getConfig().getString("defaults.hand", "One handed")); + } else { + if (s.contains("hand_bin")) { + hand = new String(byte[].class.cast(s.get("hand_bin", "")), "UTF-8"); + } else { + hand = Plugin.plugin.getConfig().getString("defaults.hand", "One handed"); + } + } + if (s.contains("lore")) { + lore = s.getString("lore"); + } else { + if (s.contains("lore_bin")) { + lore = new String(byte[].class.cast(s.get("lore_bin", "")), "UTF-8"); + } else { + lore = ""; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + List description = (List) s.getList("description", new ArrayList()); + for (int i = 0; i < description.size(); i++) { + description.set(i, ChatColor.translateAlternateColorCodes('&', description.get(i))); + } + Quality quality = Quality.valueOf(s.getString("quality")); + int damageMin = s.getInt("damageMin"); + int damageMax = s.getInt("damageMax"); + int armour = s.getInt("armour", 0); + ItemStack item = new ItemStack(Material.valueOf(s.getString("item"))); + ItemMeta meta = item.getItemMeta(); + if (meta instanceof LeatherArmorMeta) { + ((LeatherArmorMeta) meta).setColor(Color.fromRGB(s.getInt("item_colour", 0))); + } else { + item.setDurability((short) s.getInt("item_data", 0)); + } + boolean ignoreWorldGuard = s.getBoolean("ignoreWorldGuard", false); - ConfigurationSection powerSection = s.getConfigurationSection("powers"); - ArrayList powers = new ArrayList(); - if (powerSection != null) { - for (String key : powerSection.getKeys(false)) { - try { - if (!Power.powers.containsKey(key)) { - // Invalid power - continue; - } - Power pow = Power.powers.get(key).newInstance(); - pow.init(powerSection.getConfigurationSection(key)); - // pow.item = this; - powers.add(pow); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } + ConfigurationSection powerSection = s.getConfigurationSection("powers"); + ArrayList powers = new ArrayList(); + if (powerSection != null) { + for (String key : powerSection.getKeys(false)) { + try { + if (!Power.powers.containsKey(key)) { + // Invalid power + continue; + } + Power pow = Power.powers.get(key).newInstance(); + pow.init(powerSection.getConfigurationSection(key)); + // pow.item = this; + powers.add(pow); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } - RPGItem newItem = new RPGItem(name, id); - newItem.setDisplay(displayName, false); - newItem.setType(type, false); - newItem.setHand(hand, false); - newItem.setLore(lore, false); - newItem.setItem(item.getType()); - for (String locales : Locale.getLocales()) { - newItem.setLocaleMeta(locales, meta); - } - newItem.setItem(item.getType(), false); - newItem.setDataValue(item.getDurability(), false); - newItem.setArmour(armour, false); - newItem.setDamage(damageMin, damageMax); - newItem.setQuality(quality, false); - newItem.ignoreWorldGuard = ignoreWorldGuard; - newItem.description = description; + RPGItem newItem = new RPGItem(name, id); + newItem.setDisplay(displayName, false); + newItem.setType(type, false); + newItem.setHand(hand, false); + newItem.setLore(lore, false); + newItem.setItem(item.getType()); + for (String locales : Locale.getLocales()) { + newItem.setLocaleMeta(locales, meta); + } + newItem.setItem(item.getType(), false); + newItem.setDataValue(item.getDurability(), false); + newItem.setArmour(armour, false); + newItem.setDamage(damageMin, damageMax); + newItem.setQuality(quality, false); + newItem.ignoreWorldGuard = ignoreWorldGuard; + newItem.description = description; - for (Power power : powers) { - newItem.addPower(power, false); - } - ItemManager.itemById.put(newItem.getID(), newItem); - ItemManager.itemByName.put(newItem.getName(), newItem); - } - } - ItemManager.currentPos = currentPos; + for (Power power : powers) { + newItem.addPower(power, false); + } + ItemManager.itemById.put(newItem.getID(), newItem); + ItemManager.itemByName.put(newItem.getName(), newItem); + } + } + ItemManager.currentPos = currentPos; - ItemManager.save(plugin); - ItemManager.itemByName.clear(); - ItemManager.itemById.clear(); - } catch (Exception e) { - e.printStackTrace(); - } - section.set("version", "0.3"); - } + ItemManager.save(plugin); + ItemManager.itemByName.clear(); + ItemManager.itemById.clear(); + } catch (Exception e) { + e.printStackTrace(); + } + section.set("version", "0.3"); + } } diff --git a/src/main/java/think/rpgitems/config/Update03To04.java b/src/main/java/think/rpgitems/config/Update03To04.java index fb911f3c..306f6b2f 100644 --- a/src/main/java/think/rpgitems/config/Update03To04.java +++ b/src/main/java/think/rpgitems/config/Update03To04.java @@ -1,9 +1,6 @@ package think.rpgitems.config; -import java.util.Iterator; - import org.bukkit.configuration.ConfigurationSection; - import think.rpgitems.Plugin; import think.rpgitems.item.ItemManager; import think.rpgitems.item.RPGItem; @@ -11,34 +8,36 @@ import think.rpgitems.power.PowerUnbreakable; import think.rpgitems.power.PowerUnbreaking; +import java.util.Iterator; + public class Update03To04 implements Updater { - @Override - public void update(ConfigurationSection section) { - Plugin plugin = Plugin.plugin; - - ItemManager.load(plugin); - - for (RPGItem item : ItemManager.itemByName.values()) { - Iterator it = item.powers.iterator(); - while (it.hasNext()) { - Power power = it.next(); - if (power instanceof PowerUnbreakable) { - item.setMaxDurability(-1, false); - it.remove(); - } - if (power instanceof PowerUnbreaking) { - PowerUnbreaking ub = (PowerUnbreaking) power; - item.setMaxDurability((int) ((double) item.getMaxDurability() * (1d + (double) (ub.level) / 2d))); - it.remove(); - } - } - } - - ItemManager.save(plugin); - ItemManager.itemByName.clear(); - ItemManager.itemById.clear(); - section.set("version", "0.4"); - } + @Override + public void update(ConfigurationSection section) { + Plugin plugin = Plugin.plugin; + + ItemManager.load(plugin); + + for (RPGItem item : ItemManager.itemByName.values()) { + Iterator it = item.powers.iterator(); + while (it.hasNext()) { + Power power = it.next(); + if (power instanceof PowerUnbreakable) { + item.setMaxDurability(-1, false); + it.remove(); + } + if (power instanceof PowerUnbreaking) { + PowerUnbreaking ub = (PowerUnbreaking) power; + item.setMaxDurability((int) ((double) item.getMaxDurability() * (1d + (double) (ub.level) / 2d))); + it.remove(); + } + } + } + + ItemManager.save(plugin); + ItemManager.itemByName.clear(); + ItemManager.itemById.clear(); + section.set("version", "0.4"); + } } diff --git a/src/main/java/think/rpgitems/config/Update04To05.java b/src/main/java/think/rpgitems/config/Update04To05.java index b67c9754..ee8d77e4 100644 --- a/src/main/java/think/rpgitems/config/Update04To05.java +++ b/src/main/java/think/rpgitems/config/Update04To05.java @@ -1,12 +1,5 @@ package think.rpgitems.config; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.Material; @@ -16,7 +9,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; - import think.rpgitems.Plugin; import think.rpgitems.data.Locale; import think.rpgitems.item.ItemManager; @@ -24,169 +16,176 @@ import think.rpgitems.item.RPGItem; import think.rpgitems.power.Power; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + public class Update04To05 implements Updater { - @SuppressWarnings("unchecked") - @Override - public void update(ConfigurationSection section) { - Plugin plugin = Plugin.plugin; - try { - FileInputStream in = null; - YamlConfiguration itemStorage = null; - try { - File f = new File(plugin.getDataFolder(), "items.yml"); - in = new FileInputStream(f); - byte[] data = new byte[(int) f.length()]; - in.read(data); - itemStorage = new YamlConfiguration(); - String str = new String(data, "UTF-8"); - itemStorage.loadFromString(str); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (InvalidConfigurationException e) { - e.printStackTrace(); - } finally { - try { - if (in != null) - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - int currentPos = itemStorage.getInt("pos", 0); - ConfigurationSection itemSection = itemStorage.getConfigurationSection("items"); - if (itemSection != null) { - for (String itemKey : itemSection.getKeys(false)) { - ConfigurationSection s = itemSection.getConfigurationSection(itemKey); - String name = s.getString("name"); - int id = s.getInt("id"); - String displayName = null, type = null, hand = null, lore = null, permission = null, haspermissiontemp = null; - try { - if (s.contains("display")) { - displayName = s.getString("display"); - } else { - displayName = new String(byte[].class.cast(s.get("display_bin", "")), "UTF-8"); - } - if (s.contains("permission")) { - permission = s.getString("permission"); - } else { - permission = new String(byte[].class.cast(s.get("permission_bin", "")), "UTF-8"); - } - if (s.contains("haspermission")) { - haspermissiontemp = s.getString("haspermission"); - } else { - haspermissiontemp = new String(byte[].class.cast(s.get("haspermision_bin", "")), "UTF-8"); - } - if (s.contains("type")) { - type = s.getString("type", Plugin.plugin.getConfig().getString("defaults.sword", "Sword")); - } else { - if (s.contains("type_bin")) { - type = new String(byte[].class.cast(s.get("type_bin", "")), "UTF-8"); - } else { - type = Plugin.plugin.getConfig().getString("defaults.sword", "Sword"); - } - } - if (s.contains("hand")) { - hand = s.getString("hand", Plugin.plugin.getConfig().getString("defaults.hand", "One handed")); - } else { - if (s.contains("hand_bin")) { - hand = new String(byte[].class.cast(s.get("hand_bin", "")), "UTF-8"); - } else { - hand = Plugin.plugin.getConfig().getString("defaults.hand", "One handed"); - } - } - if (s.contains("lore")) { - lore = s.getString("lore"); - } else { - if (s.contains("lore_bin")) { - lore = new String(byte[].class.cast(s.get("lore_bin", "")), "UTF-8"); - } else { - lore = ""; - } - } - } catch (Exception e) { - e.printStackTrace(); - } - List description = (List) s.getList("description", new ArrayList()); - for (int i = 0; i < description.size(); i++) { - description.set(i, ChatColor.translateAlternateColorCodes('&', description.get(i))); - } - Quality quality = Quality.valueOf(s.getString("quality")); - int damageMin = s.getInt("damageMin"); - int damageMax = s.getInt("damageMax"); - int armour = s.getInt("armour", 0); - ItemStack item = new ItemStack(Material.valueOf(s.getString("item"))); - ItemMeta meta = item.getItemMeta(); - if (meta instanceof LeatherArmorMeta) { - ((LeatherArmorMeta) meta).setColor(Color.fromRGB(s.getInt("item_colour", 0))); - } else { - item.setDurability((short) s.getInt("item_data", 0)); - } - boolean ignoreWorldGuard = s.getBoolean("ignoreWorldGuard", false); - boolean haspermission = false; - if (haspermissiontemp == "true") { - haspermission = true; - } else { - haspermission = false; - } - ConfigurationSection powerSection = s.getConfigurationSection("powers"); - ArrayList powers = new ArrayList(); - if (powerSection != null) { - for (String key : powerSection.getKeys(false)) { - try { - if (!Power.powers.containsKey(key)) { - // Invalid power - continue; - } - Power pow = Power.powers.get(key).newInstance(); - pow.init(powerSection.getConfigurationSection(key)); - // pow.item = this; - powers.add(pow); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } + @SuppressWarnings("unchecked") + @Override + public void update(ConfigurationSection section) { + Plugin plugin = Plugin.plugin; + try { + FileInputStream in = null; + YamlConfiguration itemStorage = null; + try { + File f = new File(plugin.getDataFolder(), "items.yml"); + in = new FileInputStream(f); + byte[] data = new byte[(int) f.length()]; + in.read(data); + itemStorage = new YamlConfiguration(); + String str = new String(data, "UTF-8"); + itemStorage.loadFromString(str); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InvalidConfigurationException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + int currentPos = itemStorage.getInt("pos", 0); + ConfigurationSection itemSection = itemStorage.getConfigurationSection("items"); + if (itemSection != null) { + for (String itemKey : itemSection.getKeys(false)) { + ConfigurationSection s = itemSection.getConfigurationSection(itemKey); + String name = s.getString("name"); + int id = s.getInt("id"); + String displayName = null, type = null, hand = null, lore = null, permission = null, haspermissiontemp = null; + try { + if (s.contains("display")) { + displayName = s.getString("display"); + } else { + displayName = new String(byte[].class.cast(s.get("display_bin", "")), "UTF-8"); + } + if (s.contains("permission")) { + permission = s.getString("permission"); + } else { + permission = new String(byte[].class.cast(s.get("permission_bin", "")), "UTF-8"); + } + if (s.contains("haspermission")) { + haspermissiontemp = s.getString("haspermission"); + } else { + haspermissiontemp = new String(byte[].class.cast(s.get("haspermision_bin", "")), "UTF-8"); + } + if (s.contains("type")) { + type = s.getString("type", Plugin.plugin.getConfig().getString("defaults.sword", "Sword")); + } else { + if (s.contains("type_bin")) { + type = new String(byte[].class.cast(s.get("type_bin", "")), "UTF-8"); + } else { + type = Plugin.plugin.getConfig().getString("defaults.sword", "Sword"); + } + } + if (s.contains("hand")) { + hand = s.getString("hand", Plugin.plugin.getConfig().getString("defaults.hand", "One handed")); + } else { + if (s.contains("hand_bin")) { + hand = new String(byte[].class.cast(s.get("hand_bin", "")), "UTF-8"); + } else { + hand = Plugin.plugin.getConfig().getString("defaults.hand", "One handed"); + } + } + if (s.contains("lore")) { + lore = s.getString("lore"); + } else { + if (s.contains("lore_bin")) { + lore = new String(byte[].class.cast(s.get("lore_bin", "")), "UTF-8"); + } else { + lore = ""; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + List description = (List) s.getList("description", new ArrayList()); + for (int i = 0; i < description.size(); i++) { + description.set(i, ChatColor.translateAlternateColorCodes('&', description.get(i))); + } + Quality quality = Quality.valueOf(s.getString("quality")); + int damageMin = s.getInt("damageMin"); + int damageMax = s.getInt("damageMax"); + int armour = s.getInt("armour", 0); + ItemStack item = new ItemStack(Material.valueOf(s.getString("item"))); + ItemMeta meta = item.getItemMeta(); + if (meta instanceof LeatherArmorMeta) { + ((LeatherArmorMeta) meta).setColor(Color.fromRGB(s.getInt("item_colour", 0))); + } else { + item.setDurability((short) s.getInt("item_data", 0)); + } + boolean ignoreWorldGuard = s.getBoolean("ignoreWorldGuard", false); + boolean haspermission = false; + if (haspermissiontemp == "true") { + haspermission = true; + } else { + haspermission = false; + } + ConfigurationSection powerSection = s.getConfigurationSection("powers"); + ArrayList powers = new ArrayList(); + if (powerSection != null) { + for (String key : powerSection.getKeys(false)) { + try { + if (!Power.powers.containsKey(key)) { + // Invalid power + continue; + } + Power pow = Power.powers.get(key).newInstance(); + pow.init(powerSection.getConfigurationSection(key)); + // pow.item = this; + powers.add(pow); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } - RPGItem newItem = new RPGItem(name, id); - newItem.setDisplay(displayName, false); - newItem.setHaspermission(haspermission, false); - newItem.setPermission(permission, false); - newItem.setType(type, false); - newItem.setHand(hand, false); - newItem.setLore(lore, false); - newItem.setItem(item.getType()); - for (String locales : Locale.getLocales()) { - newItem.setLocaleMeta(locales, meta); - } - newItem.setItem(item.getType(), false); - newItem.setDataValue(item.getDurability(), false); - newItem.setArmour(armour, false); - newItem.setDamage(damageMin, damageMax); - newItem.setQuality(quality, false); - newItem.ignoreWorldGuard = ignoreWorldGuard; - newItem.description = description; + RPGItem newItem = new RPGItem(name, id); + newItem.setDisplay(displayName, false); + newItem.setHaspermission(haspermission, false); + newItem.setPermission(permission, false); + newItem.setType(type, false); + newItem.setHand(hand, false); + newItem.setLore(lore, false); + newItem.setItem(item.getType()); + for (String locales : Locale.getLocales()) { + newItem.setLocaleMeta(locales, meta); + } + newItem.setItem(item.getType(), false); + newItem.setDataValue(item.getDurability(), false); + newItem.setArmour(armour, false); + newItem.setDamage(damageMin, damageMax); + newItem.setQuality(quality, false); + newItem.ignoreWorldGuard = ignoreWorldGuard; + newItem.description = description; - for (Power power : powers) { - newItem.addPower(power, false); - } - ItemManager.itemById.put(newItem.getID(), newItem); - ItemManager.itemByName.put(newItem.getName(), newItem); - } - } - ItemManager.currentPos = currentPos; + for (Power power : powers) { + newItem.addPower(power, false); + } + ItemManager.itemById.put(newItem.getID(), newItem); + ItemManager.itemByName.put(newItem.getName(), newItem); + } + } + ItemManager.currentPos = currentPos; - ItemManager.save(plugin); - ItemManager.itemByName.clear(); - ItemManager.itemById.clear(); - } catch (Exception e) { - e.printStackTrace(); - } - section.set("version", "0.5"); - } + ItemManager.save(plugin); + ItemManager.itemByName.clear(); + ItemManager.itemById.clear(); + } catch (Exception e) { + e.printStackTrace(); + } + section.set("version", "0.5"); + } } diff --git a/src/main/java/think/rpgitems/config/Updater.java b/src/main/java/think/rpgitems/config/Updater.java index bacc9997..6a52d85e 100644 --- a/src/main/java/think/rpgitems/config/Updater.java +++ b/src/main/java/think/rpgitems/config/Updater.java @@ -19,5 +19,5 @@ import org.bukkit.configuration.ConfigurationSection; public interface Updater { - public void update(ConfigurationSection section); + public void update(ConfigurationSection section); } diff --git a/src/main/java/think/rpgitems/data/Font.java b/src/main/java/think/rpgitems/data/Font.java index 18158669..0c02a2c7 100644 --- a/src/main/java/think/rpgitems/data/Font.java +++ b/src/main/java/think/rpgitems/data/Font.java @@ -16,25 +16,25 @@ */ package think.rpgitems.data; +import think.rpgitems.Plugin; + import java.io.IOException; import java.io.InputStream; -import think.rpgitems.Plugin; - public class Font { - public static int[] widths; + public static int[] widths; - public static void load() { - widths = new int[0xFFFF]; + public static void load() { + widths = new int[0xFFFF]; - try { - InputStream in = Plugin.plugin.getResource("font.bin"); - for (int i = 0; i < widths.length; i++) { - widths[i] = in.read(); - } - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } + try { + InputStream in = Plugin.plugin.getResource("font.bin"); + for (int i = 0; i < widths.length; i++) { + widths[i] = in.read(); + } + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/think/rpgitems/data/Locale.java b/src/main/java/think/rpgitems/data/Locale.java index acaab3d3..b2a36463 100644 --- a/src/main/java/think/rpgitems/data/Locale.java +++ b/src/main/java/think/rpgitems/data/Locale.java @@ -16,176 +16,169 @@ */ package think.rpgitems.data; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Set; - import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; - import think.rpgitems.Plugin; import think.rpgitems.item.ItemManager; import think.rpgitems.item.RPGItem; +import java.io.*; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Set; + public class Locale extends BukkitRunnable { - private static HashMap> localeStrings = new HashMap>(); - private static FileConfiguration config = think.rpgitems.Plugin.config; - private Plugin plugin; - private long lastUpdate = 0; - private File dataFolder; - private String version; - - private Locale(Plugin plugin) { - this.plugin = plugin; - lastUpdate = plugin.getConfig().getLong("lastLocaleUpdate", 0); - version = plugin.getDescription().getVersion(); - if (!plugin.getConfig().getString("pluginVersion", "0.0").equals(version)) { - lastUpdate = 0; - plugin.getConfig().set("pluginVersion", version); - plugin.saveConfig(); - } - dataFolder = plugin.getDataFolder(); - reloadLocales(plugin); - if (!plugin.getConfig().contains("localeDownload")) { - plugin.getConfig().set("localeDownload", true); - plugin.saveConfig(); - } - if (!plugin.getConfig().contains("language")) { - plugin.getConfig().set("language", "en_GB"); - plugin.saveConfig(); - } - } - - private final static String localeUpdateURL = "http://198.199.127.128/rpgitems/index.php?page=localeget&lastupdate="; - private final static String localeDownloadURL = "http://www.rpgitems2.bugs3.com/locale/%s/%s.lang"; - - public static Set getLocales() { - return localeStrings.keySet(); - } - - @Override - public void run() { - if (!plugin.getConfig().getBoolean("localeDownload", true)) { - cancel(); - } - try { - URL updateURL = new URL(localeUpdateURL + lastUpdate); - lastUpdate = System.currentTimeMillis(); - URLConnection conn = updateURL.openConnection(); - BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); - ArrayList locales = new ArrayList(); - String line = null; - while ((line = reader.readLine()) != null) { - locales.add(line); - } - reader.close(); - File localesFolder = new File(dataFolder, "locale/"); - localesFolder.mkdirs(); - for (String locale : locales) { - URL downloadURL = new URL(String.format(localeDownloadURL, version, locale)); - File outFile = new File(dataFolder, "locale/" + locale + ".lang"); - InputStream in = downloadURL.openStream(); - FileOutputStream out = new FileOutputStream(outFile); - byte[] buf = new byte[1024]; - int bytesRead; - while ((bytesRead = in.read(buf)) != -1) { - out.write(buf, 0, bytesRead); - } - in.close(); - out.close(); - } - } catch (Exception e) { - return; - } - (new BukkitRunnable() { - @Override - public void run() { - ConfigurationSection config = plugin.getConfig(); - config.set("lastLocaleUpdate", lastUpdate); - plugin.saveConfig(); - reloadLocales(plugin); - for (RPGItem item : ItemManager.itemById.valueCollection()) { - item.rebuild(); - } - } - }).runTask(plugin); - } - - public static void reloadLocales(Plugin plugin) { - localeStrings.clear(); - localeStrings.put("en_GB", loadLocaleStream(plugin.getResource("locale/en_GB.lang"))); - localeStrings.put("fr_FR", loadLocaleStream(plugin.getResource("locale/fr_FR.lang"))); - localeStrings.put("es_ES", loadLocaleStream(plugin.getResource("locale/es_ES.lang"))); - } - - private static HashMap loadLocaleStream(InputStream in, HashMap map) { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); - String line = null; - while ((line = reader.readLine()) != null) { - if (line.startsWith("#")) - continue; - String[] args = line.split("="); - map.put(args[0].trim(), args[1].trim()); - } - return map; - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - private static HashMap loadLocaleStream(InputStream in) { - return loadLocaleStream(in, new HashMap()); - } - - public static String getPlayerLocale(Player player) { - String language = config.getString("language"); - - if (language.equals("es_ES")) { - return "es_ES"; - } else if (language.equals("fr_FR")) { - return "fr_FR"; - } else if (language.equals("en_GB")) { - return "en_GB"; - } else { - Plugin.plugin.getLogger().warning("Error language you've set : '" + language + "' isn't supported or don't exist ! Languages aviables are es_ES, fr_FR and en_GB"); - return "en_GB"; - } - } - - public static void init(Plugin plugin) { - (new Locale(plugin)).runTaskTimerAsynchronously(plugin, 0, 24l * 60l * 60l * 20l); - } - - public static String get(String key, String locale) { - if (!localeStrings.containsKey(locale)) - return get(key); - HashMap strings = localeStrings.get(locale); - if (strings == null || !strings.containsKey(key)) { - return get(key); - } - return strings.get(key); - } - - private static String get(String key) { - HashMap strings = localeStrings.get("en_GB"); - if (!strings.containsKey(key)) - return "!" + key + "!"; - return strings.get(key); - } + private static HashMap> localeStrings = new HashMap>(); + private static FileConfiguration config = think.rpgitems.Plugin.config; + private Plugin plugin; + private long lastUpdate = 0; + private File dataFolder; + private String version; + + private Locale(Plugin plugin) { + this.plugin = plugin; + lastUpdate = plugin.getConfig().getLong("lastLocaleUpdate", 0); + version = plugin.getDescription().getVersion(); + if (!plugin.getConfig().getString("pluginVersion", "0.0").equals(version)) { + lastUpdate = 0; + plugin.getConfig().set("pluginVersion", version); + plugin.saveConfig(); + } + dataFolder = plugin.getDataFolder(); + reloadLocales(plugin); + if (!plugin.getConfig().contains("localeDownload")) { + plugin.getConfig().set("localeDownload", true); + plugin.saveConfig(); + } + if (!plugin.getConfig().contains("language")) { + plugin.getConfig().set("language", "en_GB"); + plugin.saveConfig(); + } + } + + private final static String localeUpdateURL = "http://198.199.127.128/rpgitems/index.php?page=localeget&lastupdate="; + private final static String localeDownloadURL = "http://www.rpgitems2.bugs3.com/locale/%s/%s.lang"; + + public static Set getLocales() { + return localeStrings.keySet(); + } + + @Override + public void run() { + if (!plugin.getConfig().getBoolean("localeDownload", true)) { + cancel(); + } + try { + URL updateURL = new URL(localeUpdateURL + lastUpdate); + lastUpdate = System.currentTimeMillis(); + URLConnection conn = updateURL.openConnection(); + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + ArrayList locales = new ArrayList(); + String line = null; + while ((line = reader.readLine()) != null) { + locales.add(line); + } + reader.close(); + File localesFolder = new File(dataFolder, "locale/"); + localesFolder.mkdirs(); + for (String locale : locales) { + URL downloadURL = new URL(String.format(localeDownloadURL, version, locale)); + File outFile = new File(dataFolder, "locale/" + locale + ".lang"); + InputStream in = downloadURL.openStream(); + FileOutputStream out = new FileOutputStream(outFile); + byte[] buf = new byte[1024]; + int bytesRead; + while ((bytesRead = in.read(buf)) != -1) { + out.write(buf, 0, bytesRead); + } + in.close(); + out.close(); + } + } catch (Exception e) { + return; + } + (new BukkitRunnable() { + @Override + public void run() { + ConfigurationSection config = plugin.getConfig(); + config.set("lastLocaleUpdate", lastUpdate); + plugin.saveConfig(); + reloadLocales(plugin); + for (RPGItem item : ItemManager.itemById.valueCollection()) { + item.rebuild(); + } + } + }).runTask(plugin); + } + + public static void reloadLocales(Plugin plugin) { + localeStrings.clear(); + localeStrings.put("en_GB", loadLocaleStream(plugin.getResource("locale/en_GB.lang"))); + localeStrings.put("fr_FR", loadLocaleStream(plugin.getResource("locale/fr_FR.lang"))); + localeStrings.put("es_ES", loadLocaleStream(plugin.getResource("locale/es_ES.lang"))); + } + + private static HashMap loadLocaleStream(InputStream in, HashMap map) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); + String line = null; + while ((line = reader.readLine()) != null) { + if (line.startsWith("#")) + continue; + String[] args = line.split("="); + map.put(args[0].trim(), args[1].trim()); + } + return map; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private static HashMap loadLocaleStream(InputStream in) { + return loadLocaleStream(in, new HashMap()); + } + + public static String getPlayerLocale(Player player) { + String language = config.getString("language"); + + if (language.equals("es_ES")) { + return "es_ES"; + } else if (language.equals("fr_FR")) { + return "fr_FR"; + } else if (language.equals("en_GB")) { + return "en_GB"; + } else { + Plugin.plugin.getLogger().warning("Error language you've set : '" + language + "' isn't supported or don't exist ! Languages aviables are es_ES, fr_FR and en_GB"); + return "en_GB"; + } + } + + public static void init(Plugin plugin) { + (new Locale(plugin)).runTaskTimerAsynchronously(plugin, 0, 24l * 60l * 60l * 20l); + } + + public static String get(String key, String locale) { + if (!localeStrings.containsKey(locale)) + return get(key); + HashMap strings = localeStrings.get(locale); + if (strings == null || !strings.containsKey(key)) { + return get(key); + } + return strings.get(key); + } + + private static String get(String key) { + HashMap strings = localeStrings.get("en_GB"); + if (!strings.containsKey(key)) + return "!" + key + "!"; + return strings.get(key); + } } diff --git a/src/main/java/think/rpgitems/data/RPGMetadata.java b/src/main/java/think/rpgitems/data/RPGMetadata.java index c4238d8a..5f28db1e 100644 --- a/src/main/java/think/rpgitems/data/RPGMetadata.java +++ b/src/main/java/think/rpgitems/data/RPGMetadata.java @@ -2,191 +2,189 @@ import gnu.trove.iterator.TIntObjectIterator; import gnu.trove.map.hash.TIntObjectHashMap; - -import java.io.UnsupportedEncodingException; -import java.util.List; - import org.bukkit.ChatColor; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import java.io.UnsupportedEncodingException; +import java.util.List; + /** * RPGMetadata is a (bad) way of tagging extra data onto an item without it showing up on the item itself. This uses a similar system to Notch's entity metadata system. The data will be encoded in minecraft colour codes which makes this really inefficient because 1 byte -> 2 bytes(Hex) -> 4 bytes( * Colour codes). RPGMetadatais prefixed with CAFE to allow it to be easily detected. - * */ public class RPGMetadata extends TIntObjectHashMap { - private final static String METADATA_PREFIX = ChatColor.COLOR_CHAR + "c" + ChatColor.COLOR_CHAR + "a" + ChatColor.COLOR_CHAR + "f" + ChatColor.COLOR_CHAR + "e"; - - public static final int DURABILITY = 0; - - public static boolean hasRPGMetadata(ItemStack item) { - if (!item.hasItemMeta()) - return false; - ItemMeta meta = item.getItemMeta(); - if (!meta.hasLore()) - return false; - List lore = meta.getLore(); - if (lore.size() == 0) - return false; - return lore.get(0).contains(METADATA_PREFIX); - } - - public static RPGMetadata parseLoreline(String lore) { - RPGMetadata meta = new RPGMetadata(); - int pos = lore.indexOf(METADATA_PREFIX); - if (pos == -1) { - return meta; - } - String lenStr = lore.substring(pos + METADATA_PREFIX.length(), pos + METADATA_PREFIX.length() + 8); - int length = parseShort(lenStr, 0); - String data = lore.substring(pos + METADATA_PREFIX.length() + 8, pos + METADATA_PREFIX.length() + 8 + length); - int off = 0; - while (off < length) { - int index = parseByte(data, off); - off += 4; - int key = index & 0x1F; - int type = index >> 5; - switch (type) { - case 0: // Byte - int byteValue = parseByte(data, off); - off += 4; - meta.put(key, Byte.valueOf((byte) byteValue)); - break; - case 1: // Short - int shortValue = parseShort(data, off); - off += 8; - meta.put(key, Short.valueOf((short) shortValue)); - break; - case 2: // Int - int intValue = parseInt(data, off); - off += 16; - meta.put(key, Integer.valueOf(intValue)); - break; - case 3: // Float - int floatValueBits = parseInt(data, off); - off += 16; - meta.put(key, Float.intBitsToFloat(floatValueBits)); - break; - case 4: // String - int stringLength = parseShort(data, off); - off += 8; - byte[] bytes = new byte[stringLength]; - for (int i = 0; i < stringLength; i++) { - bytes[i] = (byte) parseByte(data, off); - off += 4; - } - try { - meta.put(key, new String(bytes, "UTF-8")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - break; - } - } - return meta; - } - - private static int parseInt(String iStr, int off) { - return (parseShort(iStr, off + 0) << 16) | parseShort(iStr, off + 8); - } - - private static int parseShort(String sStr, int off) { - return (parseByte(sStr, off + 0) << 8) | parseByte(sStr, off + 4); - } - - private static int parseByte(String bStr, int off) { - return Integer.parseInt("" + bStr.charAt(off + 1) + bStr.charAt(off + 3), 16); - } - - public RPGMetadata() { - - } - - public String toMCString() { - StringBuilder out = new StringBuilder(); - out.append(METADATA_PREFIX); - TIntObjectIterator it = iterator(); - while (it.hasNext()) { - it.advance(); - int key = it.key(); - Object value = it.value(); - int index = key & 0x1F; - if (value instanceof Byte) { - index |= 0 << 5; - writeByte(out, index); - writeByte(out, ((Byte) value).intValue()); - } else if (value instanceof Short) { - index |= 1 << 5; - writeByte(out, index); - writeShort(out, ((Short) value).intValue()); - } else if (value instanceof Integer) { - index |= 2 << 5; - writeByte(out, index); - writeInt(out, ((Integer) value).intValue()); - } else if (value instanceof Float) { - index |= 3 << 5; - writeByte(out, index); - writeInt(out, Float.floatToIntBits((Float) value)); - } else if (value instanceof String) { - index |= 4 << 5; - writeByte(out, index); - writeString(out, (String) value); - } - } - int size = out.length() - METADATA_PREFIX.length(); - insertShort(out, METADATA_PREFIX.length(), size); - return out.toString(); - } - - private void writeString(StringBuilder out, String value) { - try { - byte[] data = value.getBytes("UTF-8"); - writeShort(out, data.length); - for (byte b : data) { - writeByte(out, b); - } - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - } - - private void writeByte(StringBuilder out, int b) { - String hex = Integer.toString(b, 16); - out.append(ChatColor.COLOR_CHAR); - out.append(hex.length() == 1 ? "0" : hex.charAt(0)); - out.append(ChatColor.COLOR_CHAR); - out.append(hex.charAt(hex.length() - 1)); - } - - private void writeShort(StringBuilder out, int s) { - writeByte(out, s >> 8); - writeByte(out, s & 0xFF); - } - - private void writeInt(StringBuilder out, int s) { - writeShort(out, s >> 16); - writeShort(out, s & 0xFFFF); - } - - private void insertByte(StringBuilder out, int offset, int b) { - String hex = Integer.toString(b, 16); - out.insert(offset, ChatColor.COLOR_CHAR); - out.insert(offset + 1, hex.length() == 1 ? "0" : hex.charAt(0)); - out.insert(offset + 2, ChatColor.COLOR_CHAR); - out.insert(offset + 3, hex.charAt(hex.length() - 1)); - } - - private void insertShort(StringBuilder out, int offset, int s) { - insertByte(out, offset, s >> 8); - insertByte(out, offset + 4, s & 0xFF); - } - - // Unused - // private void insertInt(StringBuilder out, int offset, int s) { - // insertShort(out, offset, s >> 16); - // insertShort(out, offset + 8, s & 0xFFFF); - // } + private final static String METADATA_PREFIX = ChatColor.COLOR_CHAR + "c" + ChatColor.COLOR_CHAR + "a" + ChatColor.COLOR_CHAR + "f" + ChatColor.COLOR_CHAR + "e"; + + public static final int DURABILITY = 0; + + public static boolean hasRPGMetadata(ItemStack item) { + if (!item.hasItemMeta()) + return false; + ItemMeta meta = item.getItemMeta(); + if (!meta.hasLore()) + return false; + List lore = meta.getLore(); + if (lore.size() == 0) + return false; + return lore.get(0).contains(METADATA_PREFIX); + } + + public static RPGMetadata parseLoreline(String lore) { + RPGMetadata meta = new RPGMetadata(); + int pos = lore.indexOf(METADATA_PREFIX); + if (pos == -1) { + return meta; + } + String lenStr = lore.substring(pos + METADATA_PREFIX.length(), pos + METADATA_PREFIX.length() + 8); + int length = parseShort(lenStr, 0); + String data = lore.substring(pos + METADATA_PREFIX.length() + 8, pos + METADATA_PREFIX.length() + 8 + length); + int off = 0; + while (off < length) { + int index = parseByte(data, off); + off += 4; + int key = index & 0x1F; + int type = index >> 5; + switch (type) { + case 0: // Byte + int byteValue = parseByte(data, off); + off += 4; + meta.put(key, Byte.valueOf((byte) byteValue)); + break; + case 1: // Short + int shortValue = parseShort(data, off); + off += 8; + meta.put(key, Short.valueOf((short) shortValue)); + break; + case 2: // Int + int intValue = parseInt(data, off); + off += 16; + meta.put(key, Integer.valueOf(intValue)); + break; + case 3: // Float + int floatValueBits = parseInt(data, off); + off += 16; + meta.put(key, Float.intBitsToFloat(floatValueBits)); + break; + case 4: // String + int stringLength = parseShort(data, off); + off += 8; + byte[] bytes = new byte[stringLength]; + for (int i = 0; i < stringLength; i++) { + bytes[i] = (byte) parseByte(data, off); + off += 4; + } + try { + meta.put(key, new String(bytes, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + break; + } + } + return meta; + } + + private static int parseInt(String iStr, int off) { + return (parseShort(iStr, off + 0) << 16) | parseShort(iStr, off + 8); + } + + private static int parseShort(String sStr, int off) { + return (parseByte(sStr, off + 0) << 8) | parseByte(sStr, off + 4); + } + + private static int parseByte(String bStr, int off) { + return Integer.parseInt("" + bStr.charAt(off + 1) + bStr.charAt(off + 3), 16); + } + + public RPGMetadata() { + + } + + public String toMCString() { + StringBuilder out = new StringBuilder(); + out.append(METADATA_PREFIX); + TIntObjectIterator it = iterator(); + while (it.hasNext()) { + it.advance(); + int key = it.key(); + Object value = it.value(); + int index = key & 0x1F; + if (value instanceof Byte) { + index |= 0 << 5; + writeByte(out, index); + writeByte(out, ((Byte) value).intValue()); + } else if (value instanceof Short) { + index |= 1 << 5; + writeByte(out, index); + writeShort(out, ((Short) value).intValue()); + } else if (value instanceof Integer) { + index |= 2 << 5; + writeByte(out, index); + writeInt(out, ((Integer) value).intValue()); + } else if (value instanceof Float) { + index |= 3 << 5; + writeByte(out, index); + writeInt(out, Float.floatToIntBits((Float) value)); + } else if (value instanceof String) { + index |= 4 << 5; + writeByte(out, index); + writeString(out, (String) value); + } + } + int size = out.length() - METADATA_PREFIX.length(); + insertShort(out, METADATA_PREFIX.length(), size); + return out.toString(); + } + + private void writeString(StringBuilder out, String value) { + try { + byte[] data = value.getBytes("UTF-8"); + writeShort(out, data.length); + for (byte b : data) { + writeByte(out, b); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + } + + private void writeByte(StringBuilder out, int b) { + String hex = Integer.toString(b, 16); + out.append(ChatColor.COLOR_CHAR); + out.append(hex.length() == 1 ? "0" : hex.charAt(0)); + out.append(ChatColor.COLOR_CHAR); + out.append(hex.charAt(hex.length() - 1)); + } + + private void writeShort(StringBuilder out, int s) { + writeByte(out, s >> 8); + writeByte(out, s & 0xFF); + } + + private void writeInt(StringBuilder out, int s) { + writeShort(out, s >> 16); + writeShort(out, s & 0xFFFF); + } + + private void insertByte(StringBuilder out, int offset, int b) { + String hex = Integer.toString(b, 16); + out.insert(offset, ChatColor.COLOR_CHAR); + out.insert(offset + 1, hex.length() == 1 ? "0" : hex.charAt(0)); + out.insert(offset + 2, ChatColor.COLOR_CHAR); + out.insert(offset + 3, hex.charAt(hex.length() - 1)); + } + + private void insertShort(StringBuilder out, int offset, int s) { + insertByte(out, offset, s >> 8); + insertByte(out, offset + 4, s & 0xFF); + } + + // Unused + // private void insertInt(StringBuilder out, int offset, int s) { + // insertShort(out, offset, s >> 16); + // insertShort(out, offset + 8, s & 0xFFFF); + // } } diff --git a/src/main/java/think/rpgitems/data/RPGValue.java b/src/main/java/think/rpgitems/data/RPGValue.java index 17821988..e7b60022 100644 --- a/src/main/java/think/rpgitems/data/RPGValue.java +++ b/src/main/java/think/rpgitems/data/RPGValue.java @@ -16,65 +16,64 @@ */ package think.rpgitems.data; -import java.util.HashMap; - import org.bukkit.entity.Player; - import think.rpgitems.item.RPGItem; +import java.util.HashMap; + public class RPGValue { - Object value; + Object value; - static HashMap map = new HashMap(); + static HashMap map = new HashMap(); - public static RPGValue get(Player player, RPGItem item, String name) { - return map.get(player.getName() + "." + item.getID() + "." + name); - } + public static RPGValue get(Player player, RPGItem item, String name) { + return map.get(player.getName() + "." + item.getID() + "." + name); + } - public RPGValue(Player player, RPGItem item, String name, Object value) { - this.value = value; - map.put(player.getName() + "." + item.getID() + "." + name, this); - } + public RPGValue(Player player, RPGItem item, String name, Object value) { + this.value = value; + map.put(player.getName() + "." + item.getID() + "." + name, this); + } - public void set(Object value) { - this.value = value; - } + public void set(Object value) { + this.value = value; + } - public boolean asBoolean() { - return (Boolean) value; - } + public boolean asBoolean() { + return (Boolean) value; + } - public byte asByte() { - return (Byte) value; - } + public byte asByte() { + return (Byte) value; + } - public double asDouble() { - return (Double) value; - } + public double asDouble() { + return (Double) value; + } - public float asFloat() { - return (Float) value; - } + public float asFloat() { + return (Float) value; + } - public int asInt() { - return (Integer) value; - } + public int asInt() { + return (Integer) value; + } - public long asLong() { - return (Long) value; - } + public long asLong() { + return (Long) value; + } - public short asShort() { - return (Short) value; - } + public short asShort() { + return (Short) value; + } - public String asString() { - return (String) value; - } + public String asString() { + return (String) value; + } - public Object value() { - return value; - } + public Object value() { + return value; + } } diff --git a/src/main/java/think/rpgitems/item/ItemGroup.java b/src/main/java/think/rpgitems/item/ItemGroup.java index 322a4f82..8d260c82 100644 --- a/src/main/java/think/rpgitems/item/ItemGroup.java +++ b/src/main/java/think/rpgitems/item/ItemGroup.java @@ -1,29 +1,29 @@ package think.rpgitems.item; +import org.bukkit.configuration.ConfigurationSection; + import java.util.ArrayList; import java.util.List; -import org.bukkit.configuration.ConfigurationSection; - public class ItemGroup { - private String name; - private List items = new ArrayList(); + private String name; + private List items = new ArrayList(); - public ItemGroup(String name) { - this.name = name; - } + public ItemGroup(String name) { + this.name = name; + } - public ItemGroup(ConfigurationSection s) { - name = s.getString("name"); - items = s.getIntegerList("items"); - } + public ItemGroup(ConfigurationSection s) { + name = s.getString("name"); + items = s.getIntegerList("items"); + } - public void save(ConfigurationSection s) { - s.set("name", name); - s.set("items", items); - } + public void save(ConfigurationSection s) { + s.set("name", name); + s.set("items", items); + } - public String getName() { - return name; - } + public String getName() { + return name; + } } diff --git a/src/main/java/think/rpgitems/item/ItemManager.java b/src/main/java/think/rpgitems/item/ItemManager.java index 3693c2b8..7e55f389 100644 --- a/src/main/java/think/rpgitems/item/ItemManager.java +++ b/src/main/java/think/rpgitems/item/ItemManager.java @@ -17,17 +17,6 @@ package think.rpgitems.item; import gnu.trove.map.hash.TIntObjectHashMap; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.io.UnsupportedEncodingException; -import java.util.HashMap; -import java.util.Map.Entry; - import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.InvalidConfigurationException; @@ -35,182 +24,185 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.FileUtil; - import think.rpgitems.Plugin; import think.rpgitems.power.Power; +import java.io.*; +import java.util.HashMap; +import java.util.Map.Entry; + public class ItemManager { - public static TIntObjectHashMap itemById = new TIntObjectHashMap(); - public static HashMap itemByName = new HashMap(); - public static HashMap groups = new HashMap(); - public static int currentPos = 0; - - public static void load(Plugin plugin) { - try { - FileInputStream in = null; - YamlConfiguration itemStorage = null; - try { - File f = new File(plugin.getDataFolder(), "items.yml"); - in = new FileInputStream(f); - byte[] data = new byte[(int) f.length()]; - in.read(data); - itemStorage = new YamlConfiguration(); - String str = new String(data, "UTF-8"); - itemStorage.loadFromString(str); - } catch (FileNotFoundException e) { - } catch (IOException e) { - e.printStackTrace(); - } catch (InvalidConfigurationException e) { - e.printStackTrace(); - } finally { - try { - if (in != null) - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - currentPos = itemStorage.getInt("pos", 0); - ConfigurationSection section = itemStorage.getConfigurationSection("items"); - if (section == null) - return; - for (String key : section.getKeys(false)) { - RPGItem item = new RPGItem(section.getConfigurationSection(key)); - itemById.put(item.getID(), item); - itemByName.put(item.getName(), item); - for (Power power : item.powers) { - Power.powerUsage.put(power.getName(), Power.powerUsage.get(power.getName()) + 1); - } - } - - if (itemStorage.contains("groups")) { - ConfigurationSection gSection = itemStorage.getConfigurationSection("groups"); - for (String key : gSection.getKeys(false)) { - ItemGroup group = new ItemGroup(gSection.getConfigurationSection(key)); - groups.put(group.getName(), group); - } - } - } catch (Exception e) { - // Something went wrong - plugin.getLogger().severe("Error loading items.yml. Creating backup"); - File file = new File(plugin.getDataFolder(), "items.yml"); - long time = System.currentTimeMillis(); - File backup = new File(plugin.getDataFolder(), time + "-items.yml"); - FileUtil.copy(file, backup); - File log = new File(plugin.getDataFolder(), time + "-log.txt"); - PrintStream ps = null; - try { - ps = new PrintStream(log); - ps.printf("RPGItems (%s) ItemManager.load\r\n", plugin.getDescription().getVersion()); - e.printStackTrace(ps); - } catch (FileNotFoundException e1) { - e1.printStackTrace(); - } finally { - ps.close(); - } - } - } - - public static void save(Plugin plugin) { - - YamlConfiguration itemStorage = new YamlConfiguration(); - - itemStorage.set("items", null); - itemStorage.set("pos", currentPos); - ConfigurationSection newSection = itemStorage.createSection("items"); - for (RPGItem item : itemById.valueCollection()) { - ConfigurationSection itemSection = newSection.getConfigurationSection(item.getName()); - if (itemSection == null) { - itemSection = newSection.createSection(item.getName()); - } - item.save(itemSection); - } - - ConfigurationSection groupsSection = itemStorage.createSection("groups"); - - for (Entry group : groups.entrySet()) { - ConfigurationSection groupSection = groupsSection.createSection(group.getKey()); - group.getValue().save(groupSection); - } - - FileOutputStream out = null; - try { - File f = new File(plugin.getDataFolder(), "items.yml"); - out = new FileOutputStream(f); - out.write(itemStorage.saveToString().getBytes("UTF-8")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (out != null) - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static RPGItem toRPGItem(ItemStack item) { - if (item == null) - return null; - if (!item.hasItemMeta()) - return null; - ItemMeta meta = item.getItemMeta(); - if (!meta.hasDisplayName()) - return null; - try { - int id = ItemManager.decodeId(meta.getDisplayName()); - RPGItem rItem = ItemManager.getItemById(id); - return rItem; - } catch (Exception e) { - return null; - } - } - - public static RPGItem newItem(String name) { - if (itemByName.containsKey(name)) - return null; - int free = 0; - while (true) { - free = currentPos++; - if (!itemById.containsKey(free)) - break; - } - RPGItem item = new RPGItem(name, free); - itemById.put(free, item); - itemByName.put(name, item); - return item; - } - - public static RPGItem getItemById(int id) { - return itemById.get(id); - } - - public static RPGItem getItemByName(String uid) { - return itemByName.get(uid); - } - - public static int decodeId(String str) throws Exception { - if (str.length() < 16) { - throw new Exception(); - } - StringBuilder out = new StringBuilder(); - for (int i = 0; i < 16; i++) { - if (str.charAt(i) != ChatColor.COLOR_CHAR) - throw new Exception(); - i++; - out.append(str.charAt(i)); - } - return Integer.parseInt(out.toString(), 16); - } - - public static void remove(RPGItem item) { - itemByName.remove(item.getName()); - itemById.remove(item.getID()); - } + public static TIntObjectHashMap itemById = new TIntObjectHashMap(); + public static HashMap itemByName = new HashMap(); + public static HashMap groups = new HashMap(); + public static int currentPos = 0; + + public static void load(Plugin plugin) { + try { + FileInputStream in = null; + YamlConfiguration itemStorage = null; + try { + File f = new File(plugin.getDataFolder(), "items.yml"); + in = new FileInputStream(f); + byte[] data = new byte[(int) f.length()]; + in.read(data); + itemStorage = new YamlConfiguration(); + String str = new String(data, "UTF-8"); + itemStorage.loadFromString(str); + } catch (FileNotFoundException e) { + } catch (IOException e) { + e.printStackTrace(); + } catch (InvalidConfigurationException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + currentPos = itemStorage.getInt("pos", 0); + ConfigurationSection section = itemStorage.getConfigurationSection("items"); + if (section == null) + return; + for (String key : section.getKeys(false)) { + RPGItem item = new RPGItem(section.getConfigurationSection(key)); + itemById.put(item.getID(), item); + itemByName.put(item.getName(), item); + for (Power power : item.powers) { + Power.powerUsage.put(power.getName(), Power.powerUsage.get(power.getName()) + 1); + } + } + + if (itemStorage.contains("groups")) { + ConfigurationSection gSection = itemStorage.getConfigurationSection("groups"); + for (String key : gSection.getKeys(false)) { + ItemGroup group = new ItemGroup(gSection.getConfigurationSection(key)); + groups.put(group.getName(), group); + } + } + } catch (Exception e) { + // Something went wrong + plugin.getLogger().severe("Error loading items.yml. Creating backup"); + File file = new File(plugin.getDataFolder(), "items.yml"); + long time = System.currentTimeMillis(); + File backup = new File(plugin.getDataFolder(), time + "-items.yml"); + FileUtil.copy(file, backup); + File log = new File(plugin.getDataFolder(), time + "-log.txt"); + PrintStream ps = null; + try { + ps = new PrintStream(log); + ps.printf("RPGItems (%s) ItemManager.load\r\n", plugin.getDescription().getVersion()); + e.printStackTrace(ps); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } finally { + ps.close(); + } + } + } + + public static void save(Plugin plugin) { + + YamlConfiguration itemStorage = new YamlConfiguration(); + + itemStorage.set("items", null); + itemStorage.set("pos", currentPos); + ConfigurationSection newSection = itemStorage.createSection("items"); + for (RPGItem item : itemById.valueCollection()) { + ConfigurationSection itemSection = newSection.getConfigurationSection(item.getName()); + if (itemSection == null) { + itemSection = newSection.createSection(item.getName()); + } + item.save(itemSection); + } + + ConfigurationSection groupsSection = itemStorage.createSection("groups"); + + for (Entry group : groups.entrySet()) { + ConfigurationSection groupSection = groupsSection.createSection(group.getKey()); + group.getValue().save(groupSection); + } + + FileOutputStream out = null; + try { + File f = new File(plugin.getDataFolder(), "items.yml"); + out = new FileOutputStream(f); + out.write(itemStorage.saveToString().getBytes("UTF-8")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static RPGItem toRPGItem(ItemStack item) { + if (item == null) + return null; + if (!item.hasItemMeta()) + return null; + ItemMeta meta = item.getItemMeta(); + if (!meta.hasDisplayName()) + return null; + try { + int id = ItemManager.decodeId(meta.getDisplayName()); + RPGItem rItem = ItemManager.getItemById(id); + return rItem; + } catch (Exception e) { + return null; + } + } + + public static RPGItem newItem(String name) { + if (itemByName.containsKey(name)) + return null; + int free = 0; + while (true) { + free = currentPos++; + if (!itemById.containsKey(free)) + break; + } + RPGItem item = new RPGItem(name, free); + itemById.put(free, item); + itemByName.put(name, item); + return item; + } + + public static RPGItem getItemById(int id) { + return itemById.get(id); + } + + public static RPGItem getItemByName(String uid) { + return itemByName.get(uid); + } + + public static int decodeId(String str) throws Exception { + if (str.length() < 16) { + throw new Exception(); + } + StringBuilder out = new StringBuilder(); + for (int i = 0; i < 16; i++) { + if (str.charAt(i) != ChatColor.COLOR_CHAR) + throw new Exception(); + i++; + out.append(str.charAt(i)); + } + return Integer.parseInt(out.toString(), 16); + } + + public static void remove(RPGItem item) { + itemByName.remove(item.getName()); + itemById.remove(item.getID()); + } } diff --git a/src/main/java/think/rpgitems/item/LocaleInventory.java b/src/main/java/think/rpgitems/item/LocaleInventory.java index 68008312..02ce3aa6 100644 --- a/src/main/java/think/rpgitems/item/LocaleInventory.java +++ b/src/main/java/think/rpgitems/item/LocaleInventory.java @@ -1,7 +1,5 @@ package think.rpgitems.item; -import java.util.Iterator; - import org.bukkit.Bukkit; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; @@ -11,73 +9,74 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; - import think.rpgitems.data.Locale; +import java.util.Iterator; + public class LocaleInventory extends InventoryView { - private Player player; - private InventoryView view; - private Inventory real; - private Inventory fake; - private String locale; + private Player player; + private InventoryView view; + private Inventory real; + private Inventory fake; + private String locale; - public LocaleInventory(Player player, InventoryView inventoryView) { - locale = Locale.getPlayerLocale(player); - this.player = player; - real = inventoryView.getTopInventory(); - view = inventoryView; - fake = Bukkit.createInventory(real.getHolder(), real.getSize(), real.getTitle()); - reload(); - } + public LocaleInventory(Player player, InventoryView inventoryView) { + locale = Locale.getPlayerLocale(player); + this.player = player; + real = inventoryView.getTopInventory(); + view = inventoryView; + fake = Bukkit.createInventory(real.getHolder(), real.getSize(), real.getTitle()); + reload(); + } - public InventoryView getView() { - return view; - } + public InventoryView getView() { + return view; + } - public void reload() { - fake.setContents(real.getContents()); - Iterator it = fake.iterator(); - while (it.hasNext()) { - ItemStack item = it.next(); - RPGItem rItem = ItemManager.toRPGItem(item); - if (rItem == null) - continue; - item.setType(rItem.getItem()); - ItemMeta meta = rItem.getLocaleMeta(locale); - if (!(meta instanceof LeatherArmorMeta) && rItem.getItem().isBlock()) - item.setDurability(rItem.getDataValue()); - item.setItemMeta(meta); - } - fake.setContents(fake.getContents()); - } + public void reload() { + fake.setContents(real.getContents()); + Iterator it = fake.iterator(); + while (it.hasNext()) { + ItemStack item = it.next(); + RPGItem rItem = ItemManager.toRPGItem(item); + if (rItem == null) + continue; + item.setType(rItem.getItem()); + ItemMeta meta = rItem.getLocaleMeta(locale); + if (!(meta instanceof LeatherArmorMeta) && rItem.getItem().isBlock()) + item.setDurability(rItem.getDataValue()); + item.setItemMeta(meta); + } + fake.setContents(fake.getContents()); + } - public Inventory getReal() { - return real; - } + public Inventory getReal() { + return real; + } - @Override - public Inventory getBottomInventory() { - return player.getInventory(); - } + @Override + public Inventory getBottomInventory() { + return player.getInventory(); + } - @Override - public HumanEntity getPlayer() { - return player; - } + @Override + public HumanEntity getPlayer() { + return player; + } - @Override - public Inventory getTopInventory() { - return fake; - } + @Override + public Inventory getTopInventory() { + return fake; + } - @Override - public InventoryType getType() { - return InventoryType.CHEST; - } + @Override + public InventoryType getType() { + return InventoryType.CHEST; + } - public void sumbitChanges() { - real.setContents(fake.getContents()); - } + public void sumbitChanges() { + real.setContents(fake.getContents()); + } } diff --git a/src/main/java/think/rpgitems/item/Quality.java b/src/main/java/think/rpgitems/item/Quality.java index 809029a2..62796b35 100644 --- a/src/main/java/think/rpgitems/item/Quality.java +++ b/src/main/java/think/rpgitems/item/Quality.java @@ -19,13 +19,13 @@ import org.bukkit.ChatColor; public enum Quality { - TRASH(ChatColor.GRAY.toString(), "7"), COMMON(ChatColor.WHITE.toString(), "f"), UNCOMMON(ChatColor.GREEN.toString(), "a"), RARE(ChatColor.BLUE.toString(), "9"), EPIC(ChatColor.DARK_PURPLE.toString(), "5"), LEGENDARY(ChatColor.GOLD.toString(), "6"); + TRASH(ChatColor.GRAY.toString(), "7"), COMMON(ChatColor.WHITE.toString(), "f"), UNCOMMON(ChatColor.GREEN.toString(), "a"), RARE(ChatColor.BLUE.toString(), "9"), EPIC(ChatColor.DARK_PURPLE.toString(), "5"), LEGENDARY(ChatColor.GOLD.toString(), "6"); - public final String colour; - public final String cCode; + public final String colour; + public final String cCode; - Quality(String colour, String code) { - this.colour = colour; - this.cCode = code; - } + Quality(String colour, String code) { + this.colour = colour; + this.cCode = code; + } } diff --git a/src/main/java/think/rpgitems/item/RPGItem.java b/src/main/java/think/rpgitems/item/RPGItem.java index 1d95f7b1..2953f0e6 100644 --- a/src/main/java/think/rpgitems/item/RPGItem.java +++ b/src/main/java/think/rpgitems/item/RPGItem.java @@ -16,15 +16,7 @@ */ package think.rpgitems.item; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - +import gnu.trove.map.hash.TObjectDoubleHashMap; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -41,833 +33,830 @@ import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; - -import gnu.trove.map.hash.TObjectDoubleHashMap; import think.rpgitems.Events; import think.rpgitems.Plugin; import think.rpgitems.data.Font; import think.rpgitems.data.Locale; import think.rpgitems.data.RPGMetadata; import think.rpgitems.power.Power; -import think.rpgitems.power.types.PowerHit; -import think.rpgitems.power.types.PowerLeftClick; -import think.rpgitems.power.types.PowerProjectileHit; -import think.rpgitems.power.types.PowerRightClick; -import think.rpgitems.power.types.PowerTick; +import think.rpgitems.power.types.*; + +import java.util.*; +import java.util.Map.Entry; public class RPGItem { - private ItemStack item; - - private HashMap localeMeta = new HashMap(); - - private int id; - private String name; - private String encodedID; - - private boolean haspermission; - private String permission; - private String displayName; - private Quality quality = Quality.TRASH; - private int damageMin = 0, damageMax = 3; - private int armour = 0; - private String loreText = ""; - private String type = Plugin.plugin.getConfig().getString("defaults.sword", "Sword"); - private String hand = Plugin.plugin.getConfig().getString("defaults.hand", "One handed"); - public boolean ignoreWorldGuard = false; - public List description = new ArrayList(); - - // Powers - public ArrayList powers = new ArrayList(); - private ArrayList powerLeftClick = new ArrayList(); - private ArrayList powerRightClick = new ArrayList(); - private ArrayList powerProjectileHit = new ArrayList(); - private ArrayList powerHit = new ArrayList(); - private ArrayList powerTick = new ArrayList(); - - // Recipes - public int recipechance = 6; - public boolean hasRecipe = false; - public List recipe = null; - - // Drops - public TObjectDoubleHashMap dropChances = new TObjectDoubleHashMap(); - - private int tooltipWidth = 150; - - // Durability - private int maxDurability; - private boolean hasBar = false; - private boolean forceBar = false; - - public RPGItem(String name, int id) { - this.name = name; - this.id = id; - encodedID = getMCEncodedID(id); - item = new ItemStack(Material.WOOD_SWORD); - - displayName = item.getType().toString(); - - localeMeta.put("en_GB", item.getItemMeta()); - - rebuild(); - } - - @SuppressWarnings("unchecked") - public RPGItem(ConfigurationSection s) { - - name = s.getString("name"); - id = s.getInt("id"); - setDisplay(s.getString("display"), false); - setType(s.getString("type", Plugin.plugin.getConfig().getString("defaults.sword", "Sword")), false); - setHand(s.getString("hand", Plugin.plugin.getConfig().getString("defaults.hand", "One handed")), false); - setLore(s.getString("lore"), false); - description = (List) s.getList("description", new ArrayList()); - for (int i = 0; i < description.size(); i++) { - description.set(i, ChatColor.translateAlternateColorCodes('&', description.get(i))); - } - quality = Quality.valueOf(s.getString("quality")); - damageMin = s.getInt("damageMin"); - damageMax = s.getInt("damageMax"); - armour = s.getInt("armour", 0); - item = new ItemStack(Material.valueOf(s.getString("item"))); - ItemMeta meta = item.getItemMeta(); - if (meta instanceof LeatherArmorMeta) { - ((LeatherArmorMeta) meta).setColor(Color.fromRGB(s.getInt("item_colour", 0))); - } else { - item.setDurability((short) s.getInt("item_data", 0)); - } - for (String locale : Locale.getLocales()) { - localeMeta.put(locale, meta.clone()); - } - ignoreWorldGuard = s.getBoolean("ignoreWorldGuard", false); - - // Powers - ConfigurationSection powerList = s.getConfigurationSection("powers"); - if (powerList != null) { - for (String sectionKey : powerList.getKeys(false)) { - ConfigurationSection section = powerList.getConfigurationSection(sectionKey); - try { - if (!Power.powers.containsKey(section.getString("powerName"))) { - // Invalid power - continue; - } - Power pow = Power.powers.get(section.getString("powerName")).newInstance(); - pow.init(section); - pow.item = this; - addPower(pow, false); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - - encodedID = getMCEncodedID(id); - haspermission = s.getBoolean("haspermission", false); - permission = s.getString("permission", "a.default.permission"); - // Recipes - recipechance = s.getInt("recipechance", 6); - hasRecipe = s.getBoolean("hasRecipe", false); - if (hasRecipe) { - recipe = (List) s.getList("recipe"); - } - - ConfigurationSection drops = s.getConfigurationSection("dropChances"); - if (drops != null) { - for (String key : drops.getKeys(false)) { - double chance = drops.getDouble(key, 0.0); - chance = Math.min(chance, 100.0); - if (chance > 0) { - dropChances.put(key, chance); - if (!Events.drops.containsKey(key)) { - Events.drops.put(key, new HashSet()); - } - Set set = Events.drops.get(key); - set.add(getID()); - } else { - dropChances.remove(key); - if (Events.drops.containsKey(key)) { - Set set = Events.drops.get(key); - set.remove(getID()); - } - } - dropChances.put(key, chance); - } - } - if (item.getType().getMaxDurability() != 0) { - hasBar = true; - } - maxDurability = s.getInt("maxDurability", item.getType().getMaxDurability()); - forceBar = s.getBoolean("forceBar", false); - - if (maxDurability == 0) { - maxDurability = -1; - } - - rebuild(); - } - - public void save(ConfigurationSection s) { - s.set("name", name); - s.set("id", id); - s.set("haspermission", haspermission); - s.set("permission", permission); - s.set("display", displayName.replaceAll("" + ChatColor.COLOR_CHAR, "&")); - s.set("quality", quality.toString()); - s.set("damageMin", damageMin); - s.set("damageMax", damageMax); - s.set("armour", armour); - s.set("type", type.replaceAll("" + ChatColor.COLOR_CHAR, "&")); - s.set("hand", hand.replaceAll("" + ChatColor.COLOR_CHAR, "&")); - s.set("lore", loreText.replaceAll("" + ChatColor.COLOR_CHAR, "&")); - ArrayList descriptionConv = new ArrayList(description); - for (int i = 0; i < descriptionConv.size(); i++) { - descriptionConv.set(i, descriptionConv.get(i).replaceAll("" + ChatColor.COLOR_CHAR, "&")); - } - s.set("description", descriptionConv); - s.set("item", item.getType().toString()); - s.set("ignoreWorldGuard", ignoreWorldGuard); - - ItemMeta meta = localeMeta.get("en_GB"); - if (meta instanceof LeatherArmorMeta) { - s.set("item_colour", ((LeatherArmorMeta) meta).getColor().asRGB()); - } else { - s.set("item_data", item.getDurability()); - } - ConfigurationSection powerConfigs = s.createSection("powers"); - int i = 0; - for (Power p : powers) { - MemoryConfiguration pConfig = new MemoryConfiguration(); - pConfig.set("powerName", p.getName()); - p.save(pConfig); - powerConfigs.set(Integer.toString(i), pConfig); - i++; - } - - // Recipes - s.set("recipechance", recipechance); - s.set("hasRecipe", hasRecipe); - if (hasRecipe) { - s.set("recipe", recipe); - } - - ConfigurationSection drops = s.createSection("dropChances"); - for (String key : dropChances.keySet()) { - drops.set(key, dropChances.get(key)); - } - - s.set("maxDurability", maxDurability); - s.set("forceBar", forceBar); - } - - public void resetRecipe(boolean removeOld) { - if (removeOld) { - Iterator it = Bukkit.recipeIterator(); - while (it.hasNext()) { - Recipe recipe = it.next(); - RPGItem rpgitem = ItemManager.toRPGItem(recipe.getResult()); - if (rpgitem == null) - continue; - if (rpgitem.getID() == getID()) { - it.remove(); - } - } - } - if (hasRecipe) { - Set iSet = new HashSet(); - for (ItemStack m : recipe) { - iSet.add(m); - } - ItemStack[] iList = iSet.toArray(new ItemStack[iSet.size()]); - item.setItemMeta(getLocaleMeta("en_GB")); - ShapedRecipe shapedRecipe = new ShapedRecipe(item); - int i = 0; - Map iMap = new HashMap(); - for (ItemStack m : iList) { - iMap.put(m, (char) (65 + i)); - i++; - } - iMap.put(null, ' '); - StringBuilder out = new StringBuilder(); - for (ItemStack m : recipe) { - out.append(iMap.get(m)); - } - String shape = out.toString(); - shapedRecipe.shape(new String[] { shape.substring(0, 3), shape.substring(3, 6), shape.substring(6, 9) }); - for (Entry e : iMap.entrySet()) { - if (e.getKey() != null) { - shapedRecipe.setIngredient(e.getValue(), e.getKey().getData()); - } - } - Bukkit.addRecipe(shapedRecipe); - } - } - - public void leftClick(Player player) { - for (PowerLeftClick power : powerLeftClick) { - power.leftClick(player); - } - } - - public void rightClick(Player player) { - for (PowerRightClick power : powerRightClick) { - power.rightClick(player); - } - } - - public void projectileHit(Player player, Projectile arrow) { - for (PowerProjectileHit power : powerProjectileHit) { - power.projectileHit(player, arrow); - } - } - - public void hit(Player player, LivingEntity e, double d) { - for (PowerHit power : powerHit) { - power.hit(player, e, d); - } - } - - public void tick(Player player) { - for (PowerTick power : powerTick) { - power.tick(player); - } - } - - public void rebuild() { - for (String locale : Locale.getLocales()) { - if (!localeMeta.containsKey(locale)) - localeMeta.put(locale, getLocaleMeta("en_GB")); - } - for (String locale : Locale.getLocales()) { - List lines = getTooltipLines(locale); - ItemMeta meta = getLocaleMeta(locale); - meta.setDisplayName(lines.get(0)); - lines.remove(0); - meta.setLore(lines); - setLocaleMeta(locale, meta); - // item.setItemMeta(meta); - } - - for (Player player : Bukkit.getOnlinePlayers()) { - Iterator it = player.getInventory().iterator(); - String locale = Locale.getPlayerLocale(player); - while (it.hasNext()) { - ItemStack item = it.next(); - if (ItemManager.toRPGItem(item) != null) - updateItem(item, locale, false); - } - for (ItemStack item : player.getInventory().getArmorContents()) { - if (ItemManager.toRPGItem(item) != null) - updateItem(item, locale, false); - - } - } - resetRecipe(true); - } - - public static RPGMetadata getMetadata(ItemStack item) { - // Check for broken item - if (!item.hasItemMeta() || !item.getItemMeta().hasLore() || item.getItemMeta().getLore().size() == 0) { - // Broken item - return new RPGMetadata(); - } - return RPGMetadata.parseLoreline(item.getItemMeta().getLore().get(0)); - } - - public static void updateItem(ItemStack item, String locale) { - updateItem(item, locale, getMetadata(item)); - } - - public static void updateItem(ItemStack item, String locale, RPGMetadata rpgMeta) { - updateItem(item, locale, rpgMeta, false); - } - - public static void updateItem(ItemStack item, String locale, boolean updateDurability) { - updateItem(item, locale, getMetadata(item), false); - } - - public static void updateItem(ItemStack item, String locale, RPGMetadata rpgMeta, boolean updateDurability) { - RPGItem rItem = ItemManager.toRPGItem(item); - if (rItem == null) - return; - item.setType(rItem.item.getType()); - ItemMeta meta = rItem.getLocaleMeta(locale); - if (!(meta instanceof LeatherArmorMeta) && updateDurability) { - item.setDurability(rItem.item.getDurability()); - } - List lore = meta.getLore(); - rItem.addExtra(rpgMeta, item, lore); - lore.set(0, meta.getLore().get(0) + rpgMeta.toMCString()); - meta.setLore(lore); - item.setItemMeta(meta); - } - - public void addExtra(RPGMetadata rpgMeta, ItemStack item, List lore) { - if (maxDurability > 0) { - if (!rpgMeta.containsKey(RPGMetadata.DURABILITY)) { - rpgMeta.put(RPGMetadata.DURABILITY, Integer.valueOf(maxDurability)); - } - int durability = ((Number) rpgMeta.get(RPGMetadata.DURABILITY)).intValue(); - - if (!hasBar || forceBar) { - StringBuilder out = new StringBuilder(); - char boxChar = '\u25A0'; - int boxCount = tooltipWidth / 4; - int mid = (int) ((double) boxCount * ((double) durability / (double) maxDurability)); - for (int i = 0; i < boxCount; i++) { - out.append(i < mid ? ChatColor.GREEN : i == mid ? ChatColor.YELLOW : ChatColor.RED); - out.append(boxChar); - } - lore.add(out.toString()); - } - if (hasBar) { - item.setDurability((short) (item.getType().getMaxDurability() - ((short) ((double) item.getType().getMaxDurability() * ((double) durability / (double) maxDurability))))); - } - } else if (maxDurability <= 0) { - item.setDurability(hasBar ? (short) 0 : this.item.getDurability()); - } - } - - public List getTooltipLines(String locale) { - ArrayList output = new ArrayList(); - int width = 150; - output.add(encodedID + quality.colour + ChatColor.BOLD + displayName); - int dWidth = getStringWidthBold(ChatColor.stripColor(displayName)); - if (dWidth > width) - width = dWidth; - - dWidth = getStringWidth(ChatColor.stripColor(hand + " " + type)); - if (dWidth > width) - width = dWidth; - String damageStr = null; - if (damageMin == 0 && damageMax == 0 && armour != 0) { - damageStr = armour + "% " + Plugin.plugin.getConfig().getString("defaults.armour", "Armour"); - } else if (armour == 0 && damageMin == 0 && damageMax == 0) { - damageStr = null; - } else if (damageMin == damageMax) { - damageStr = damageMin + " " + Plugin.plugin.getConfig().getString("defaults.damage", "Damage"); - } else { - damageStr = damageMin + "-" + damageMax + " " + Plugin.plugin.getConfig().getString("defaults.damage", "Damage"); - } - if (damageMin != 0 || damageMax != 0 || armour != 0) { - dWidth = getStringWidth(damageStr); - if (dWidth > width) - width = dWidth; - } - - for (Power p : powers) { - dWidth = getStringWidth(ChatColor.stripColor(p.displayText(locale))); - if (dWidth > width) - width = dWidth; - } - - for (String s : description) { - dWidth = getStringWidth(ChatColor.stripColor(s)); - if (dWidth > width) - width = dWidth; - } - - tooltipWidth = width; - - output.add(ChatColor.WHITE + hand + StringUtils.repeat(" ", (width - getStringWidth(ChatColor.stripColor(hand + type))) / 4) + type); - if (damageStr != null) { - output.add(ChatColor.WHITE + damageStr); - } - - for (Power p : powers) { - output.add(p.displayText(locale)); - } - if (loreText.length() != 0) { - int cWidth = 0; - int tWidth = 0; - StringBuilder out = new StringBuilder(); - StringBuilder temp = new StringBuilder(); - out.append(ChatColor.YELLOW); - out.append(ChatColor.ITALIC); - String currentColour = ChatColor.YELLOW.toString(); - String dMsg = "\"" + loreText + "\""; - for (int i = 0; i < dMsg.length(); i++) { - char c = dMsg.charAt(i); - temp.append(c); - if (c == ChatColor.COLOR_CHAR || c == '&') { - i += 1; - temp.append(dMsg.charAt(i)); - currentColour = ChatColor.COLOR_CHAR + "" + dMsg.charAt(i); - continue; - } - if (c == ' ') - tWidth += 4; - else - tWidth += Font.widths[c] + 1; - if (c == ' ' || i == dMsg.length() - 1) { - if (cWidth + tWidth > width) { - cWidth = 0; - cWidth += tWidth; - tWidth = 0; - output.add(out.toString()); - out = new StringBuilder(); - out.append(currentColour); - out.append(ChatColor.ITALIC); - out.append(temp); - temp = new StringBuilder(); - } else { - out.append(temp); - temp = new StringBuilder(); - cWidth += tWidth; - tWidth = 0; - } - } - } - out.append(temp); - output.add(out.toString()); - } - - for (String s : description) { - output.add(s); - } - return output; - } - - public ItemStack toItemStack(String locale) { - ItemStack rStack = item.clone(); - RPGMetadata rpgMeta = new RPGMetadata(); - ItemMeta meta = getLocaleMeta(locale); - List lore = meta.getLore(); - lore.set(0, meta.getLore().get(0) + rpgMeta.toMCString()); - addExtra(rpgMeta, rStack, lore); - meta.setLore(lore); - rStack.setItemMeta(meta); - return rStack; - } - - public ItemMeta getLocaleMeta(String locale) { - ItemMeta meta = localeMeta.get(locale); - if (meta == null) - meta = localeMeta.get("en_GB"); - return meta.clone(); - } - - public void setLocaleMeta(String locale, ItemMeta meta) { - localeMeta.put(locale, meta); - } - - public String getName() { - return name; - } - - public int getID() { - return id; - } - - public String getMCEncodedID() { - return encodedID; - } - - public static String getMCEncodedID(int id) { - String hex = String.format("%08x", id); - StringBuilder out = new StringBuilder(); - for (char h : hex.toCharArray()) { - out.append(ChatColor.COLOR_CHAR); - out.append(h); - } - return out.toString(); - } - - private static int getStringWidth(String str) { - int width = 0; - for (int i = 0; i < str.length(); i++) { - char c = str.charAt(i); - width += Font.widths[c] + 1; - } - return width; - } - - private static int getStringWidthBold(String str) { - int width = 0; - for (int i = 0; i < str.length(); i++) { - char c = str.charAt(i); - width += Font.widths[c] + 2; - } - return width; - } - - public void print(CommandSender sender) { - String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; - List lines = getTooltipLines(locale); - for (String s : lines) { - sender.sendMessage(s); - } - sender.sendMessage(String.format(Locale.get("message.print.durability", locale), maxDurability)); - } - - public void setDisplay(String str) { - setDisplay(str, true); - } - - public void setDisplay(String str, boolean update) { - displayName = ChatColor.translateAlternateColorCodes('&', str); - if (update) - rebuild(); - } - - public String getDisplay() { - return quality.colour + ChatColor.BOLD + displayName; - } - - public void setType(String str) { - setType(str, true); - } - - public void setType(String str, boolean update) { - type = ChatColor.translateAlternateColorCodes('&', str); - if (update) - rebuild(); - } - - public String getType() { - return type; - } - - public void setHand(String h) { - setHand(h, true); - } - - public void setHand(String h, boolean update) { - hand = ChatColor.translateAlternateColorCodes('&', h); - if (update) - rebuild(); - } - - public String getHand() { - return hand; - } - - public void setDamage(int min, int max) { - setDamage(min, max, true); - } - - public void setDamage(int min, int max, boolean update) { - damageMin = min; - damageMax = max; - armour = 0; - if (update) - rebuild(); - } - - public int getDamageMin() { - return damageMin; - } - - public int getDamageMax() { - return damageMax; - } - - public int getRecipeChance() { - return recipechance; - } - - public void setRecipeChance(int p) { - setRecipeChance(p, true); - } - - public void setRecipeChance(int p, boolean update) { - recipechance = p; - if (update) - rebuild(); - } - - public String getPermission() { - return permission; - } - - public boolean getHasPermission() { - return haspermission; - } - - public void setPermission(String p) { - setPermission(p, true); - } - - public void setPermission(String p, boolean update) { - permission = p; - if (update) - rebuild(); - } - - public void setHaspermission(boolean b) { - setHaspermission(b, true); - } - - public void setHaspermission(boolean b, boolean update) { - haspermission = b; - if (update) - rebuild(); - } - - public void setArmour(int a) { - setArmour(a, true); - } - - public void setArmour(int a, boolean update) { - armour = a; - damageMin = damageMax = 0; - if (update) - rebuild(); - } - - public int getArmour() { - return armour; - } - - public void setLore(String str) { - setLore(str, true); - } - - public void setLore(String str, boolean update) { - loreText = ChatColor.translateAlternateColorCodes('&', str); - if (update) - rebuild(); - } - - public String getLore() { - return loreText; - } - - public void setQuality(Quality q) { - setQuality(q, true); - } - - public void setQuality(Quality q, boolean update) { - quality = q; - if (update) - rebuild(); - } - - public Quality getQuality() { - return quality; - } - - public void setItem(Material mat) { - setItem(mat, true); - } - - public void setItem(Material mat, boolean update) { - if (maxDurability == item.getType().getMaxDurability()) { - maxDurability = mat.getMaxDurability(); - } - item.setType(mat); - if (update) - rebuild(); - } - - public void setDataValue(short value, boolean update) { - item.setDurability(value); - if (update) - rebuild(); - } - - public void setDataValue(short value) { - item.setDurability(value); - } - - public short getDataValue() { - return item.getDurability(); - } - - public Material getItem() { - return item.getType(); - } - - public void setMaxDurability(int newVal) { - setMaxDurability(newVal, true); - } - - public void setMaxDurability(int newVal, boolean update) { - maxDurability = newVal; - if (update) - rebuild(); - } - - public int getMaxDurability() { - return maxDurability <= 0 ? -1 : maxDurability; - } - - public void give(Player player) { - player.getInventory().addItem(toItemStack(Locale.getPlayerLocale(player))); - } - - public void addPower(Power power) { - addPower(power, true); - } - - public void addPower(Power power, boolean update) { - powers.add(power); - Power.powerUsage.put(power.getName(), Power.powerUsage.get(power.getName()) + 1); - if (power instanceof PowerHit) { - powerHit.add((PowerHit) power); - } - if (power instanceof PowerLeftClick) { - powerLeftClick.add((PowerLeftClick) power); - } - if (power instanceof PowerRightClick) { - powerRightClick.add((PowerRightClick) power); - } - if (power instanceof PowerProjectileHit) { - powerProjectileHit.add((PowerProjectileHit) power); - } - if (power instanceof PowerTick) { - powerTick.add((PowerTick) power); - } - if (update) - rebuild(); - } - - public boolean removePower(String pow) { - Iterator it = powers.iterator(); - Power power = null; - while (it.hasNext()) { - Power p = it.next(); - if (p.getName().equalsIgnoreCase(pow)) { - it.remove(); - power = p; - rebuild(); - break; - } - } - if (power != null) { - if (power instanceof PowerHit) { - powerHit.remove((PowerHit) power); - } - if (power instanceof PowerLeftClick) { - powerLeftClick.remove(power); - } - if (power instanceof PowerRightClick) { - powerRightClick.remove(power); - } - if (power instanceof PowerProjectileHit) { - powerProjectileHit.remove(power); - } - if (power instanceof PowerTick) { - powerTick.remove(power); - } - } - return power != null; - } - - public void addDescription(String str) { - addDescription(str, true); - } - - public void addDescription(String str, boolean update) { - description.add(ChatColor.translateAlternateColorCodes('&', str)); - if (update) - rebuild(); - } - - public void toggleBar() { - forceBar = !forceBar; - rebuild(); - } + private ItemStack item; + + private HashMap localeMeta = new HashMap(); + + private int id; + private String name; + private String encodedID; + + private boolean haspermission; + private String permission; + private String displayName; + private Quality quality = Quality.TRASH; + private int damageMin = 0, damageMax = 3; + private int armour = 0; + private String loreText = ""; + private String type = Plugin.plugin.getConfig().getString("defaults.sword", "Sword"); + private String hand = Plugin.plugin.getConfig().getString("defaults.hand", "One handed"); + public boolean ignoreWorldGuard = false; + public List description = new ArrayList(); + + // Powers + public ArrayList powers = new ArrayList(); + private ArrayList powerLeftClick = new ArrayList(); + private ArrayList powerRightClick = new ArrayList(); + private ArrayList powerProjectileHit = new ArrayList(); + private ArrayList powerHit = new ArrayList(); + private ArrayList powerTick = new ArrayList(); + + // Recipes + public int recipechance = 6; + public boolean hasRecipe = false; + public List recipe = null; + + // Drops + public TObjectDoubleHashMap dropChances = new TObjectDoubleHashMap(); + + private int tooltipWidth = 150; + + // Durability + private int maxDurability; + private boolean hasBar = false; + private boolean forceBar = false; + + public RPGItem(String name, int id) { + this.name = name; + this.id = id; + encodedID = getMCEncodedID(id); + item = new ItemStack(Material.WOOD_SWORD); + + displayName = item.getType().toString(); + + localeMeta.put("en_GB", item.getItemMeta()); + + rebuild(); + } + + @SuppressWarnings("unchecked") + public RPGItem(ConfigurationSection s) { + + name = s.getString("name"); + id = s.getInt("id"); + setDisplay(s.getString("display"), false); + setType(s.getString("type", Plugin.plugin.getConfig().getString("defaults.sword", "Sword")), false); + setHand(s.getString("hand", Plugin.plugin.getConfig().getString("defaults.hand", "One handed")), false); + setLore(s.getString("lore"), false); + description = (List) s.getList("description", new ArrayList()); + for (int i = 0; i < description.size(); i++) { + description.set(i, ChatColor.translateAlternateColorCodes('&', description.get(i))); + } + quality = Quality.valueOf(s.getString("quality")); + damageMin = s.getInt("damageMin"); + damageMax = s.getInt("damageMax"); + armour = s.getInt("armour", 0); + item = new ItemStack(Material.valueOf(s.getString("item"))); + ItemMeta meta = item.getItemMeta(); + if (meta instanceof LeatherArmorMeta) { + ((LeatherArmorMeta) meta).setColor(Color.fromRGB(s.getInt("item_colour", 0))); + } else { + item.setDurability((short) s.getInt("item_data", 0)); + } + for (String locale : Locale.getLocales()) { + localeMeta.put(locale, meta.clone()); + } + ignoreWorldGuard = s.getBoolean("ignoreWorldGuard", false); + + // Powers + ConfigurationSection powerList = s.getConfigurationSection("powers"); + if (powerList != null) { + for (String sectionKey : powerList.getKeys(false)) { + ConfigurationSection section = powerList.getConfigurationSection(sectionKey); + try { + if (!Power.powers.containsKey(section.getString("powerName"))) { + // Invalid power + continue; + } + Power pow = Power.powers.get(section.getString("powerName")).newInstance(); + pow.init(section); + pow.item = this; + addPower(pow, false); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + encodedID = getMCEncodedID(id); + haspermission = s.getBoolean("haspermission", false); + permission = s.getString("permission", "a.default.permission"); + // Recipes + recipechance = s.getInt("recipechance", 6); + hasRecipe = s.getBoolean("hasRecipe", false); + if (hasRecipe) { + recipe = (List) s.getList("recipe"); + } + + ConfigurationSection drops = s.getConfigurationSection("dropChances"); + if (drops != null) { + for (String key : drops.getKeys(false)) { + double chance = drops.getDouble(key, 0.0); + chance = Math.min(chance, 100.0); + if (chance > 0) { + dropChances.put(key, chance); + if (!Events.drops.containsKey(key)) { + Events.drops.put(key, new HashSet()); + } + Set set = Events.drops.get(key); + set.add(getID()); + } else { + dropChances.remove(key); + if (Events.drops.containsKey(key)) { + Set set = Events.drops.get(key); + set.remove(getID()); + } + } + dropChances.put(key, chance); + } + } + if (item.getType().getMaxDurability() != 0) { + hasBar = true; + } + maxDurability = s.getInt("maxDurability", item.getType().getMaxDurability()); + forceBar = s.getBoolean("forceBar", false); + + if (maxDurability == 0) { + maxDurability = -1; + } + + rebuild(); + } + + public void save(ConfigurationSection s) { + s.set("name", name); + s.set("id", id); + s.set("haspermission", haspermission); + s.set("permission", permission); + s.set("display", displayName.replaceAll("" + ChatColor.COLOR_CHAR, "&")); + s.set("quality", quality.toString()); + s.set("damageMin", damageMin); + s.set("damageMax", damageMax); + s.set("armour", armour); + s.set("type", type.replaceAll("" + ChatColor.COLOR_CHAR, "&")); + s.set("hand", hand.replaceAll("" + ChatColor.COLOR_CHAR, "&")); + s.set("lore", loreText.replaceAll("" + ChatColor.COLOR_CHAR, "&")); + ArrayList descriptionConv = new ArrayList(description); + for (int i = 0; i < descriptionConv.size(); i++) { + descriptionConv.set(i, descriptionConv.get(i).replaceAll("" + ChatColor.COLOR_CHAR, "&")); + } + s.set("description", descriptionConv); + s.set("item", item.getType().toString()); + s.set("ignoreWorldGuard", ignoreWorldGuard); + + ItemMeta meta = localeMeta.get("en_GB"); + if (meta instanceof LeatherArmorMeta) { + s.set("item_colour", ((LeatherArmorMeta) meta).getColor().asRGB()); + } else { + s.set("item_data", item.getDurability()); + } + ConfigurationSection powerConfigs = s.createSection("powers"); + int i = 0; + for (Power p : powers) { + MemoryConfiguration pConfig = new MemoryConfiguration(); + pConfig.set("powerName", p.getName()); + p.save(pConfig); + powerConfigs.set(Integer.toString(i), pConfig); + i++; + } + + // Recipes + s.set("recipechance", recipechance); + s.set("hasRecipe", hasRecipe); + if (hasRecipe) { + s.set("recipe", recipe); + } + + ConfigurationSection drops = s.createSection("dropChances"); + for (String key : dropChances.keySet()) { + drops.set(key, dropChances.get(key)); + } + + s.set("maxDurability", maxDurability); + s.set("forceBar", forceBar); + } + + public void resetRecipe(boolean removeOld) { + if (removeOld) { + Iterator it = Bukkit.recipeIterator(); + while (it.hasNext()) { + Recipe recipe = it.next(); + RPGItem rpgitem = ItemManager.toRPGItem(recipe.getResult()); + if (rpgitem == null) + continue; + if (rpgitem.getID() == getID()) { + it.remove(); + } + } + } + if (hasRecipe) { + Set iSet = new HashSet(); + for (ItemStack m : recipe) { + iSet.add(m); + } + ItemStack[] iList = iSet.toArray(new ItemStack[iSet.size()]); + item.setItemMeta(getLocaleMeta("en_GB")); + ShapedRecipe shapedRecipe = new ShapedRecipe(item); + int i = 0; + Map iMap = new HashMap(); + for (ItemStack m : iList) { + iMap.put(m, (char) (65 + i)); + i++; + } + iMap.put(null, ' '); + StringBuilder out = new StringBuilder(); + for (ItemStack m : recipe) { + out.append(iMap.get(m)); + } + String shape = out.toString(); + shapedRecipe.shape(new String[]{shape.substring(0, 3), shape.substring(3, 6), shape.substring(6, 9)}); + for (Entry e : iMap.entrySet()) { + if (e.getKey() != null) { + shapedRecipe.setIngredient(e.getValue(), e.getKey().getData()); + } + } + Bukkit.addRecipe(shapedRecipe); + } + } + + public void leftClick(Player player) { + for (PowerLeftClick power : powerLeftClick) { + power.leftClick(player); + } + } + + public void rightClick(Player player) { + for (PowerRightClick power : powerRightClick) { + power.rightClick(player); + } + } + + public void projectileHit(Player player, Projectile arrow) { + for (PowerProjectileHit power : powerProjectileHit) { + power.projectileHit(player, arrow); + } + } + + public void hit(Player player, LivingEntity e, double d) { + for (PowerHit power : powerHit) { + power.hit(player, e, d); + } + } + + public void tick(Player player) { + for (PowerTick power : powerTick) { + power.tick(player); + } + } + + public void rebuild() { + for (String locale : Locale.getLocales()) { + if (!localeMeta.containsKey(locale)) + localeMeta.put(locale, getLocaleMeta("en_GB")); + } + for (String locale : Locale.getLocales()) { + List lines = getTooltipLines(locale); + ItemMeta meta = getLocaleMeta(locale); + meta.setDisplayName(lines.get(0)); + lines.remove(0); + meta.setLore(lines); + setLocaleMeta(locale, meta); + // item.setItemMeta(meta); + } + + for (Player player : Bukkit.getOnlinePlayers()) { + Iterator it = player.getInventory().iterator(); + String locale = Locale.getPlayerLocale(player); + while (it.hasNext()) { + ItemStack item = it.next(); + if (ItemManager.toRPGItem(item) != null) + updateItem(item, locale, false); + } + for (ItemStack item : player.getInventory().getArmorContents()) { + if (ItemManager.toRPGItem(item) != null) + updateItem(item, locale, false); + + } + } + resetRecipe(true); + } + + public static RPGMetadata getMetadata(ItemStack item) { + // Check for broken item + if (!item.hasItemMeta() || !item.getItemMeta().hasLore() || item.getItemMeta().getLore().size() == 0) { + // Broken item + return new RPGMetadata(); + } + return RPGMetadata.parseLoreline(item.getItemMeta().getLore().get(0)); + } + + public static void updateItem(ItemStack item, String locale) { + updateItem(item, locale, getMetadata(item)); + } + + public static void updateItem(ItemStack item, String locale, RPGMetadata rpgMeta) { + updateItem(item, locale, rpgMeta, false); + } + + public static void updateItem(ItemStack item, String locale, boolean updateDurability) { + updateItem(item, locale, getMetadata(item), false); + } + + public static void updateItem(ItemStack item, String locale, RPGMetadata rpgMeta, boolean updateDurability) { + RPGItem rItem = ItemManager.toRPGItem(item); + if (rItem == null) + return; + item.setType(rItem.item.getType()); + ItemMeta meta = rItem.getLocaleMeta(locale); + if (!(meta instanceof LeatherArmorMeta) && updateDurability) { + item.setDurability(rItem.item.getDurability()); + } + List lore = meta.getLore(); + rItem.addExtra(rpgMeta, item, lore); + lore.set(0, meta.getLore().get(0) + rpgMeta.toMCString()); + meta.setLore(lore); + item.setItemMeta(meta); + } + + public void addExtra(RPGMetadata rpgMeta, ItemStack item, List lore) { + if (maxDurability > 0) { + if (!rpgMeta.containsKey(RPGMetadata.DURABILITY)) { + rpgMeta.put(RPGMetadata.DURABILITY, Integer.valueOf(maxDurability)); + } + int durability = ((Number) rpgMeta.get(RPGMetadata.DURABILITY)).intValue(); + + if (!hasBar || forceBar) { + StringBuilder out = new StringBuilder(); + char boxChar = '\u25A0'; + int boxCount = tooltipWidth / 4; + int mid = (int) ((double) boxCount * ((double) durability / (double) maxDurability)); + for (int i = 0; i < boxCount; i++) { + out.append(i < mid ? ChatColor.GREEN : i == mid ? ChatColor.YELLOW : ChatColor.RED); + out.append(boxChar); + } + lore.add(out.toString()); + } + if (hasBar) { + item.setDurability((short) (item.getType().getMaxDurability() - ((short) ((double) item.getType().getMaxDurability() * ((double) durability / (double) maxDurability))))); + } + } else if (maxDurability <= 0) { + item.setDurability(hasBar ? (short) 0 : this.item.getDurability()); + } + } + + public List getTooltipLines(String locale) { + ArrayList output = new ArrayList(); + int width = 150; + output.add(encodedID + quality.colour + ChatColor.BOLD + displayName); + int dWidth = getStringWidthBold(ChatColor.stripColor(displayName)); + if (dWidth > width) + width = dWidth; + + dWidth = getStringWidth(ChatColor.stripColor(hand + " " + type)); + if (dWidth > width) + width = dWidth; + String damageStr = null; + if (damageMin == 0 && damageMax == 0 && armour != 0) { + damageStr = armour + "% " + Plugin.plugin.getConfig().getString("defaults.armour", "Armour"); + } else if (armour == 0 && damageMin == 0 && damageMax == 0) { + damageStr = null; + } else if (damageMin == damageMax) { + damageStr = damageMin + " " + Plugin.plugin.getConfig().getString("defaults.damage", "Damage"); + } else { + damageStr = damageMin + "-" + damageMax + " " + Plugin.plugin.getConfig().getString("defaults.damage", "Damage"); + } + if (damageMin != 0 || damageMax != 0 || armour != 0) { + dWidth = getStringWidth(damageStr); + if (dWidth > width) + width = dWidth; + } + + for (Power p : powers) { + dWidth = getStringWidth(ChatColor.stripColor(p.displayText(locale))); + if (dWidth > width) + width = dWidth; + } + + for (String s : description) { + dWidth = getStringWidth(ChatColor.stripColor(s)); + if (dWidth > width) + width = dWidth; + } + + tooltipWidth = width; + + output.add(ChatColor.WHITE + hand + StringUtils.repeat(" ", (width - getStringWidth(ChatColor.stripColor(hand + type))) / 4) + type); + if (damageStr != null) { + output.add(ChatColor.WHITE + damageStr); + } + + for (Power p : powers) { + output.add(p.displayText(locale)); + } + if (loreText.length() != 0) { + int cWidth = 0; + int tWidth = 0; + StringBuilder out = new StringBuilder(); + StringBuilder temp = new StringBuilder(); + out.append(ChatColor.YELLOW); + out.append(ChatColor.ITALIC); + String currentColour = ChatColor.YELLOW.toString(); + String dMsg = "\"" + loreText + "\""; + for (int i = 0; i < dMsg.length(); i++) { + char c = dMsg.charAt(i); + temp.append(c); + if (c == ChatColor.COLOR_CHAR || c == '&') { + i += 1; + temp.append(dMsg.charAt(i)); + currentColour = ChatColor.COLOR_CHAR + "" + dMsg.charAt(i); + continue; + } + if (c == ' ') + tWidth += 4; + else + tWidth += Font.widths[c] + 1; + if (c == ' ' || i == dMsg.length() - 1) { + if (cWidth + tWidth > width) { + cWidth = 0; + cWidth += tWidth; + tWidth = 0; + output.add(out.toString()); + out = new StringBuilder(); + out.append(currentColour); + out.append(ChatColor.ITALIC); + out.append(temp); + temp = new StringBuilder(); + } else { + out.append(temp); + temp = new StringBuilder(); + cWidth += tWidth; + tWidth = 0; + } + } + } + out.append(temp); + output.add(out.toString()); + } + + for (String s : description) { + output.add(s); + } + return output; + } + + public ItemStack toItemStack(String locale) { + ItemStack rStack = item.clone(); + RPGMetadata rpgMeta = new RPGMetadata(); + ItemMeta meta = getLocaleMeta(locale); + List lore = meta.getLore(); + lore.set(0, meta.getLore().get(0) + rpgMeta.toMCString()); + addExtra(rpgMeta, rStack, lore); + meta.setLore(lore); + rStack.setItemMeta(meta); + return rStack; + } + + public ItemMeta getLocaleMeta(String locale) { + ItemMeta meta = localeMeta.get(locale); + if (meta == null) + meta = localeMeta.get("en_GB"); + return meta.clone(); + } + + public void setLocaleMeta(String locale, ItemMeta meta) { + localeMeta.put(locale, meta); + } + + public String getName() { + return name; + } + + public int getID() { + return id; + } + + public String getMCEncodedID() { + return encodedID; + } + + public static String getMCEncodedID(int id) { + String hex = String.format("%08x", id); + StringBuilder out = new StringBuilder(); + for (char h : hex.toCharArray()) { + out.append(ChatColor.COLOR_CHAR); + out.append(h); + } + return out.toString(); + } + + private static int getStringWidth(String str) { + int width = 0; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + width += Font.widths[c] + 1; + } + return width; + } + + private static int getStringWidthBold(String str) { + int width = 0; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + width += Font.widths[c] + 2; + } + return width; + } + + public void print(CommandSender sender) { + String locale = sender instanceof Player ? Locale.getPlayerLocale((Player) sender) : "en_GB"; + List lines = getTooltipLines(locale); + for (String s : lines) { + sender.sendMessage(s); + } + sender.sendMessage(String.format(Locale.get("message.print.durability", locale), maxDurability)); + } + + public void setDisplay(String str) { + setDisplay(str, true); + } + + public void setDisplay(String str, boolean update) { + displayName = ChatColor.translateAlternateColorCodes('&', str); + if (update) + rebuild(); + } + + public String getDisplay() { + return quality.colour + ChatColor.BOLD + displayName; + } + + public void setType(String str) { + setType(str, true); + } + + public void setType(String str, boolean update) { + type = ChatColor.translateAlternateColorCodes('&', str); + if (update) + rebuild(); + } + + public String getType() { + return type; + } + + public void setHand(String h) { + setHand(h, true); + } + + public void setHand(String h, boolean update) { + hand = ChatColor.translateAlternateColorCodes('&', h); + if (update) + rebuild(); + } + + public String getHand() { + return hand; + } + + public void setDamage(int min, int max) { + setDamage(min, max, true); + } + + public void setDamage(int min, int max, boolean update) { + damageMin = min; + damageMax = max; + armour = 0; + if (update) + rebuild(); + } + + public int getDamageMin() { + return damageMin; + } + + public int getDamageMax() { + return damageMax; + } + + public int getRecipeChance() { + return recipechance; + } + + public void setRecipeChance(int p) { + setRecipeChance(p, true); + } + + public void setRecipeChance(int p, boolean update) { + recipechance = p; + if (update) + rebuild(); + } + + public String getPermission() { + return permission; + } + + public boolean getHasPermission() { + return haspermission; + } + + public void setPermission(String p) { + setPermission(p, true); + } + + public void setPermission(String p, boolean update) { + permission = p; + if (update) + rebuild(); + } + + public void setHaspermission(boolean b) { + setHaspermission(b, true); + } + + public void setHaspermission(boolean b, boolean update) { + haspermission = b; + if (update) + rebuild(); + } + + public void setArmour(int a) { + setArmour(a, true); + } + + public void setArmour(int a, boolean update) { + armour = a; + damageMin = damageMax = 0; + if (update) + rebuild(); + } + + public int getArmour() { + return armour; + } + + public void setLore(String str) { + setLore(str, true); + } + + public void setLore(String str, boolean update) { + loreText = ChatColor.translateAlternateColorCodes('&', str); + if (update) + rebuild(); + } + + public String getLore() { + return loreText; + } + + public void setQuality(Quality q) { + setQuality(q, true); + } + + public void setQuality(Quality q, boolean update) { + quality = q; + if (update) + rebuild(); + } + + public Quality getQuality() { + return quality; + } + + public void setItem(Material mat) { + setItem(mat, true); + } + + public void setItem(Material mat, boolean update) { + if (maxDurability == item.getType().getMaxDurability()) { + maxDurability = mat.getMaxDurability(); + } + item.setType(mat); + if (update) + rebuild(); + } + + public void setDataValue(short value, boolean update) { + item.setDurability(value); + if (update) + rebuild(); + } + + public void setDataValue(short value) { + item.setDurability(value); + } + + public short getDataValue() { + return item.getDurability(); + } + + public Material getItem() { + return item.getType(); + } + + public void setMaxDurability(int newVal) { + setMaxDurability(newVal, true); + } + + public void setMaxDurability(int newVal, boolean update) { + maxDurability = newVal; + if (update) + rebuild(); + } + + public int getMaxDurability() { + return maxDurability <= 0 ? -1 : maxDurability; + } + + public void give(Player player) { + player.getInventory().addItem(toItemStack(Locale.getPlayerLocale(player))); + } + + public void addPower(Power power) { + addPower(power, true); + } + + public void addPower(Power power, boolean update) { + powers.add(power); + Power.powerUsage.put(power.getName(), Power.powerUsage.get(power.getName()) + 1); + if (power instanceof PowerHit) { + powerHit.add((PowerHit) power); + } + if (power instanceof PowerLeftClick) { + powerLeftClick.add((PowerLeftClick) power); + } + if (power instanceof PowerRightClick) { + powerRightClick.add((PowerRightClick) power); + } + if (power instanceof PowerProjectileHit) { + powerProjectileHit.add((PowerProjectileHit) power); + } + if (power instanceof PowerTick) { + powerTick.add((PowerTick) power); + } + if (update) + rebuild(); + } + + public boolean removePower(String pow) { + Iterator it = powers.iterator(); + Power power = null; + while (it.hasNext()) { + Power p = it.next(); + if (p.getName().equalsIgnoreCase(pow)) { + it.remove(); + power = p; + rebuild(); + break; + } + } + if (power != null) { + if (power instanceof PowerHit) { + powerHit.remove((PowerHit) power); + } + if (power instanceof PowerLeftClick) { + powerLeftClick.remove(power); + } + if (power instanceof PowerRightClick) { + powerRightClick.remove(power); + } + if (power instanceof PowerProjectileHit) { + powerProjectileHit.remove(power); + } + if (power instanceof PowerTick) { + powerTick.remove(power); + } + } + return power != null; + } + + public void addDescription(String str) { + addDescription(str, true); + } + + public void addDescription(String str, boolean update) { + description.add(ChatColor.translateAlternateColorCodes('&', str)); + if (update) + rebuild(); + } + + public void toggleBar() { + forceBar = !forceBar; + rebuild(); + } } diff --git a/src/main/java/think/rpgitems/power/Power.java b/src/main/java/think/rpgitems/power/Power.java index 44f38b8a..3c1b8cb5 100644 --- a/src/main/java/think/rpgitems/power/Power.java +++ b/src/main/java/think/rpgitems/power/Power.java @@ -17,48 +17,46 @@ package think.rpgitems.power; import gnu.trove.map.hash.TObjectIntHashMap; - -import java.util.HashMap; -import java.util.HashSet; - import org.bukkit.Location; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Entity; - import think.rpgitems.item.RPGItem; +import java.util.HashMap; +import java.util.HashSet; + public abstract class Power { - public static HashMap> powers = new HashMap>(); - public static TObjectIntHashMap powerUsage = new TObjectIntHashMap(); + public static HashMap> powers = new HashMap>(); + public static TObjectIntHashMap powerUsage = new TObjectIntHashMap(); - public RPGItem item; + public RPGItem item; - public Power() { + public Power() { - } + } - public abstract void init(ConfigurationSection s); + public abstract void init(ConfigurationSection s); - public abstract void save(ConfigurationSection s); + public abstract void save(ConfigurationSection s); - public abstract String getName(); + public abstract String getName(); - public abstract String displayText(String locale); + public abstract String displayText(String locale); - public static Entity[] getNearbyEntities(Location l, double radius) { - int iRadius = (int) radius; - int chunkRadius = iRadius < 16 ? 1 : (iRadius - (iRadius % 16)) / 16; - HashSet radiusEntities = new HashSet(); - for (int chX = 0 - chunkRadius; chX <= chunkRadius; chX++) { - for (int chZ = 0 - chunkRadius; chZ <= chunkRadius; chZ++) { - int x = (int) l.getX(), y = (int) l.getY(), z = (int) l.getZ(); - for (Entity e : new Location(l.getWorld(), x + (chX * 16), y, z + (chZ * 16)).getChunk().getEntities()) { - if (e.getLocation().distance(l) <= radius && e.getLocation().getBlock() != l.getBlock()) - radiusEntities.add(e); - } - } - } - return radiusEntities.toArray(new Entity[radiusEntities.size()]); - } + public static Entity[] getNearbyEntities(Location l, double radius) { + int iRadius = (int) radius; + int chunkRadius = iRadius < 16 ? 1 : (iRadius - (iRadius % 16)) / 16; + HashSet radiusEntities = new HashSet(); + for (int chX = 0 - chunkRadius; chX <= chunkRadius; chX++) { + for (int chZ = 0 - chunkRadius; chZ <= chunkRadius; chZ++) { + int x = (int) l.getX(), y = (int) l.getY(), z = (int) l.getZ(); + for (Entity e : new Location(l.getWorld(), x + (chX * 16), y, z + (chZ * 16)).getChunk().getEntities()) { + if (e.getLocation().distance(l) <= radius && e.getLocation().getBlock() != l.getBlock()) + radiusEntities.add(e); + } + } + } + return radiusEntities.toArray(new Entity[radiusEntities.size()]); + } } diff --git a/src/main/java/think/rpgitems/power/PowerArrow.java b/src/main/java/think/rpgitems/power/PowerArrow.java index 4cd0705e..29dd37d5 100644 --- a/src/main/java/think/rpgitems/power/PowerArrow.java +++ b/src/main/java/think/rpgitems/power/PowerArrow.java @@ -21,7 +21,6 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Arrow; import org.bukkit.entity.Player; - import think.rpgitems.Events; import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; @@ -29,48 +28,48 @@ public class PowerArrow extends Power implements PowerRightClick { - public long cooldownTime = 20; + public long cooldownTime = 20; - @Override - public void rightClick(Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "arrow.cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "arrow.cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); - Arrow arrow = player.launchProjectile(Arrow.class); - Events.removeArrows.put(arrow.getEntityId(), (byte) 1); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } + @Override + public void rightClick(Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "arrow.cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "arrow.cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); + Arrow arrow = player.launchProjectile(Arrow.class); + Events.removeArrows.put(arrow.getEntityId(), (byte) 1); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.arrow", locale), (double) cooldownTime / 20d); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.arrow", locale), (double) cooldownTime / 20d); + } - @Override - public String getName() { - return "arrow"; - } + @Override + public String getName() { + return "arrow"; + } - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown", 20); - } + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown", 20); + } - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - } + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + } } diff --git a/src/main/java/think/rpgitems/power/PowerCommand.java b/src/main/java/think/rpgitems/power/PowerCommand.java index 2b53d8d1..27644942 100644 --- a/src/main/java/think/rpgitems/power/PowerCommand.java +++ b/src/main/java/think/rpgitems/power/PowerCommand.java @@ -20,7 +20,6 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionAttachment; - import think.rpgitems.Plugin; import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; @@ -29,110 +28,110 @@ public class PowerCommand extends Power implements PowerRightClick, PowerLeftClick { - public String command = ""; - public String display = "Runs command"; - public String permission = ""; - public boolean isRight = true; - public long cooldownTime = 20; + public String command = ""; + public String display = "Runs command"; + public String permission = ""; + public boolean isRight = true; + public long cooldownTime = 20; - @Override - public void rightClick(Player player) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - if (isRight) { - long cooldown; - RPGValue value = RPGValue.get(player, item, "command." + command + ".cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "command." + command + ".cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - if (permission.length() != 0 && !permission.equals("*")) { - PermissionAttachment attachment = player.addAttachment(Plugin.plugin, 1); - String[] perms = permission.split("\\."); - StringBuilder p = new StringBuilder(); - for (int i = 0; i < perms.length; i++) { - p.append(perms[i]); - attachment.setPermission(p.toString(), true); - p.append('.'); - } - } - boolean wasOp = player.isOp(); - if (permission.equals("*")) - player.setOp(true); - player.chat("/" + command.replaceAll("\\{player\\}", player.getName())); - if (permission.equals("*")) - player.setOp(wasOp); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } - } + @Override + public void rightClick(Player player) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + if (isRight) { + long cooldown; + RPGValue value = RPGValue.get(player, item, "command." + command + ".cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "command." + command + ".cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + if (permission.length() != 0 && !permission.equals("*")) { + PermissionAttachment attachment = player.addAttachment(Plugin.plugin, 1); + String[] perms = permission.split("\\."); + StringBuilder p = new StringBuilder(); + for (int i = 0; i < perms.length; i++) { + p.append(perms[i]); + attachment.setPermission(p.toString(), true); + p.append('.'); + } + } + boolean wasOp = player.isOp(); + if (permission.equals("*")) + player.setOp(true); + player.chat("/" + command.replaceAll("\\{player\\}", player.getName())); + if (permission.equals("*")) + player.setOp(wasOp); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } + } - @Override - public void leftClick(Player player) { - if (!isRight) { - long cooldown; - RPGValue value = RPGValue.get(player, item, "command." + command + ".cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "command." + command + ".cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - if (permission.length() != 0 && !permission.equals("*")) { - PermissionAttachment attachment = player.addAttachment(Plugin.plugin, 1); - String[] perms = permission.split("\\."); - StringBuilder p = new StringBuilder(); - for (int i = 0; i < perms.length; i++) { - p.append(perms[i]); - attachment.setPermission(p.toString(), true); - p.append('.'); - } - } - boolean wasOp = player.isOp(); - if (permission.equals("*")) - player.setOp(true); - player.chat("/" + command.replaceAll("\\{player\\}", player.getName())); - if (permission.equals("*")) - player.setOp(wasOp); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } + @Override + public void leftClick(Player player) { + if (!isRight) { + long cooldown; + RPGValue value = RPGValue.get(player, item, "command." + command + ".cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "command." + command + ".cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + if (permission.length() != 0 && !permission.equals("*")) { + PermissionAttachment attachment = player.addAttachment(Plugin.plugin, 1); + String[] perms = permission.split("\\."); + StringBuilder p = new StringBuilder(); + for (int i = 0; i < perms.length; i++) { + p.append(perms[i]); + attachment.setPermission(p.toString(), true); + p.append('.'); + } + } + boolean wasOp = player.isOp(); + if (permission.equals("*")) + player.setOp(true); + player.chat("/" + command.replaceAll("\\{player\\}", player.getName())); + if (permission.equals("*")) + player.setOp(wasOp); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + display; - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + display; + } - @Override - public String getName() { - return "command"; - } + @Override + public String getName() { + return "command"; + } - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown", 20); - command = s.getString("command", ""); - display = s.getString("display", ""); - isRight = s.getBoolean("isRight", true); - permission = s.getString("permission", ""); - } + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown", 20); + command = s.getString("command", ""); + display = s.getString("display", ""); + isRight = s.getBoolean("isRight", true); + permission = s.getString("permission", ""); + } - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - s.set("command", command); - s.set("display", display); - s.set("isRight", isRight); - s.set("permission", permission); - } + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + s.set("command", command); + s.set("display", display); + s.set("isRight", isRight); + s.set("permission", permission); + } } diff --git a/src/main/java/think/rpgitems/power/PowerConsume.java b/src/main/java/think/rpgitems/power/PowerConsume.java index 933fc51f..a0dc3ca0 100644 --- a/src/main/java/think/rpgitems/power/PowerConsume.java +++ b/src/main/java/think/rpgitems/power/PowerConsume.java @@ -21,45 +21,44 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerRightClick; public class PowerConsume extends Power implements PowerRightClick { - @Override - public void rightClick(Player player) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - ItemStack item = player.getInventory().getItemInHand(); - int count = item.getAmount() - 1; - if (count == 0) { - item.setAmount(0); - item.setType(Material.AIR); - player.setItemInHand(null); - } else { - item.setAmount(count); - } - } - } + @Override + public void rightClick(Player player) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + ItemStack item = player.getInventory().getItemInHand(); + int count = item.getAmount() - 1; + if (count == 0) { + item.setAmount(0); + item.setType(Material.AIR); + player.setItemInHand(null); + } else { + item.setAmount(count); + } + } + } - @Override - public void init(ConfigurationSection s) { + @Override + public void init(ConfigurationSection s) { - } + } - @Override - public void save(ConfigurationSection s) { + @Override + public void save(ConfigurationSection s) { - } + } - @Override - public String getName() { - return "consume"; - } + @Override + public String getName() { + return "consume"; + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + Locale.get("power.consume", locale); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + Locale.get("power.consume", locale); + } } diff --git a/src/main/java/think/rpgitems/power/PowerFireball.java b/src/main/java/think/rpgitems/power/PowerFireball.java index d8a02940..48bccf8f 100644 --- a/src/main/java/think/rpgitems/power/PowerFireball.java +++ b/src/main/java/think/rpgitems/power/PowerFireball.java @@ -21,54 +21,53 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.entity.SmallFireball; - import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; import think.rpgitems.power.types.PowerRightClick; public class PowerFireball extends Power implements PowerRightClick { - public long cooldownTime = 20; + public long cooldownTime = 20; - @Override - public void rightClick(Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "tnt.fireball"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "tnt.fireball", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - player.playSound(player.getLocation(), Sound.GHAST_FIREBALL, 1.0f, 1.0f); - player.launchProjectile(SmallFireball.class); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } + @Override + public void rightClick(Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "tnt.fireball"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "tnt.fireball", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + player.playSound(player.getLocation(), Sound.GHAST_FIREBALL, 1.0f, 1.0f); + player.launchProjectile(SmallFireball.class); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.fireball", locale), (double) cooldownTime / 20d); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.fireball", locale), (double) cooldownTime / 20d); + } - @Override - public String getName() { - return "fireball"; - } + @Override + public String getName() { + return "fireball"; + } - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown", 20); - } + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown", 20); + } - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - } + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + } } diff --git a/src/main/java/think/rpgitems/power/PowerFlame.java b/src/main/java/think/rpgitems/power/PowerFlame.java index b83eb121..4adf1a17 100644 --- a/src/main/java/think/rpgitems/power/PowerFlame.java +++ b/src/main/java/think/rpgitems/power/PowerFlame.java @@ -20,39 +20,38 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerHit; public class PowerFlame extends Power implements PowerHit { - public int burnTime = 20; - - @Override - public void hit(Player player, LivingEntity e, double damage) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - e.setFireTicks(burnTime); - } - } - - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.flame", locale), (double) burnTime / 20d); - } - - @Override - public String getName() { - return "flame"; - } - - @Override - public void init(ConfigurationSection s) { - burnTime = s.getInt("burntime"); - } - - @Override - public void save(ConfigurationSection s) { - s.set("burntime", burnTime); - } + public int burnTime = 20; + + @Override + public void hit(Player player, LivingEntity e, double damage) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + e.setFireTicks(burnTime); + } + } + + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.flame", locale), (double) burnTime / 20d); + } + + @Override + public String getName() { + return "flame"; + } + + @Override + public void init(ConfigurationSection s) { + burnTime = s.getInt("burntime"); + } + + @Override + public void save(ConfigurationSection s) { + s.set("burntime", burnTime); + } } diff --git a/src/main/java/think/rpgitems/power/PowerFood.java b/src/main/java/think/rpgitems/power/PowerFood.java index 37d17c9b..6b544785 100644 --- a/src/main/java/think/rpgitems/power/PowerFood.java +++ b/src/main/java/think/rpgitems/power/PowerFood.java @@ -21,48 +21,47 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerRightClick; public class PowerFood extends Power implements PowerRightClick { - public int foodpoints; + public int foodpoints; - @Override - public void rightClick(Player player) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - ItemStack item = player.getInventory().getItemInHand(); - int count = item.getAmount() - 1; - if (count == 0) { - player.setFoodLevel(player.getFoodLevel() + foodpoints); - item.setAmount(0); - item.setType(Material.AIR); - player.setItemInHand(item); - } else { - player.setFoodLevel(player.getFoodLevel() + foodpoints); - item.setAmount(count); - } - } - } + @Override + public void rightClick(Player player) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + ItemStack item = player.getInventory().getItemInHand(); + int count = item.getAmount() - 1; + if (count == 0) { + player.setFoodLevel(player.getFoodLevel() + foodpoints); + item.setAmount(0); + item.setType(Material.AIR); + player.setItemInHand(item); + } else { + player.setFoodLevel(player.getFoodLevel() + foodpoints); + item.setAmount(count); + } + } + } - @Override - public void init(ConfigurationSection s) { - foodpoints = s.getInt("foodpoints"); - } + @Override + public void init(ConfigurationSection s) { + foodpoints = s.getInt("foodpoints"); + } - @Override - public void save(ConfigurationSection s) { - s.set("foodpoints", foodpoints); - } + @Override + public void save(ConfigurationSection s) { + s.set("foodpoints", foodpoints); + } - @Override - public String getName() { - return "food"; - } + @Override + public String getName() { + return "food"; + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.food", locale), foodpoints); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.food", locale), foodpoints); + } } diff --git a/src/main/java/think/rpgitems/power/PowerIce.java b/src/main/java/think/rpgitems/power/PowerIce.java index 797ca481..79e664b6 100644 --- a/src/main/java/think/rpgitems/power/PowerIce.java +++ b/src/main/java/think/rpgitems/power/PowerIce.java @@ -17,168 +17,162 @@ package think.rpgitems.power; import gnu.trove.map.hash.TObjectLongHashMap; - -import java.util.List; -import java.util.Random; - -import org.bukkit.ChatColor; -import org.bukkit.Effect; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Entity; import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; - import think.rpgitems.Plugin; import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; import think.rpgitems.power.types.PowerRightClick; +import java.util.List; +import java.util.Random; + public class PowerIce extends Power implements PowerRightClick { - public long cooldownTime = 20; - - @SuppressWarnings("deprecation") - @Override - public void rightClick(final Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "ice.cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "ice.cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - player.playSound(player.getLocation(), Sound.FIZZ, 1.0f, 0.1f); - final FallingBlock block = player.getWorld().spawnFallingBlock(player.getLocation().add(0, 1.8, 0), Material.ICE, (byte) 0); - block.setVelocity(player.getLocation().getDirection().multiply(2d)); - block.setDropItem(false); - BukkitRunnable run = new BukkitRunnable() { - - public void run() { - boolean hit = false; - World world = block.getWorld(); - Location bLoc = block.getLocation(); - loop: for (int x = -1; x < 2; x++) { - for (int y = -1; y < 2; y++) { - for (int z = -1; z < 2; z++) { - Location loc = block.getLocation().add(x, y, z); - if (world.getBlockAt(loc).getType() != Material.AIR) { - Block b = world.getBlockAt(loc); - if (b.getType().isSolid()) { - if (checkBlock(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), 1, 1, 1, bLoc.getX() - 0.5d, bLoc.getY() - 0.5d, bLoc.getZ() - 0.5d, 1, 1, 1)) { - hit = true; - break loop; - } - } - } - } - } - } - if (!hit) { - List entities = block.getNearbyEntities(1, 1, 1); - for (Entity e : entities) { - if (e != player) { - hit = true; - break; - } - } - } - if (block.isDead() || hit) { - block.remove(); - if (!block.getLocation().getBlock().getType().isSolid() && !block.getLocation().getBlock().getType().toString().contains("SIGN")) - block.getLocation().getBlock().setType(Material.AIR); - cancel(); - final TObjectLongHashMap changedBlocks = new gnu.trove.map.hash.TObjectLongHashMap(); - for (int x = -1; x < 2; x++) { - for (int y = -1; y < 3; y++) { - for (int z = -1; z < 2; z++) { - Location loc = block.getLocation().add(x, y, z); - Block b = world.getBlockAt(loc); - if (!b.getType().isSolid() && !b.getType().toString().contains("SIGN")) { - changedBlocks.put(b.getLocation(), b.getTypeId() | (b.getData() << 16)); - b.setType(Material.ICE); - } - } - } - } - (new BukkitRunnable() { - Random random = new Random(); - - @Override - public void run() { - for (int i = 0; i < 4; i++) { - if (changedBlocks.isEmpty()) { - cancel(); - return; - } - int index = random.nextInt(changedBlocks.size()); - long data = changedBlocks.values()[index]; - Location position = (Location) changedBlocks.keys()[index]; - changedBlocks.remove(position); - Block c = position.getBlock(); - position.getWorld().playEffect(position, Effect.STEP_SOUND, c.getTypeId()); - c.setTypeId((int) (data & 0xFFFF)); - c.setData((byte) (data >> 16)); - } - - } - }).runTaskTimer(Plugin.plugin, 4 * 20 + new Random().nextInt(40), 3); - } - - } - }; - run.runTaskTimer(Plugin.plugin, 0, 1); - - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } - - private boolean checkBlock(double x1, double y1, double z1, double w1, double h1, double d1, double x2, double y2, double z2, double w2, double h2, double d2) { - if (x1 + w1 < x2) - return false; - if (x2 + w2 < x1) - return false; - if (y1 + h1 < y2) - return false; - if (y2 + h2 < y1) - return false; - if (z1 + d1 < z2) - return false; - if (z2 + d2 < z1) - return false; - - return true; - } - - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.ice", locale), (double) cooldownTime / 20d); - } - - @Override - public String getName() { - return "ice"; - } - - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown", 20); - } - - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - } + public long cooldownTime = 20; + + @SuppressWarnings("deprecation") + @Override + public void rightClick(final Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "ice.cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "ice.cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + player.playSound(player.getLocation(), Sound.FIZZ, 1.0f, 0.1f); + final FallingBlock block = player.getWorld().spawnFallingBlock(player.getLocation().add(0, 1.8, 0), Material.ICE, (byte) 0); + block.setVelocity(player.getLocation().getDirection().multiply(2d)); + block.setDropItem(false); + BukkitRunnable run = new BukkitRunnable() { + + public void run() { + boolean hit = false; + World world = block.getWorld(); + Location bLoc = block.getLocation(); + loop: + for (int x = -1; x < 2; x++) { + for (int y = -1; y < 2; y++) { + for (int z = -1; z < 2; z++) { + Location loc = block.getLocation().add(x, y, z); + if (world.getBlockAt(loc).getType() != Material.AIR) { + Block b = world.getBlockAt(loc); + if (b.getType().isSolid()) { + if (checkBlock(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), 1, 1, 1, bLoc.getX() - 0.5d, bLoc.getY() - 0.5d, bLoc.getZ() - 0.5d, 1, 1, 1)) { + hit = true; + break loop; + } + } + } + } + } + } + if (!hit) { + List entities = block.getNearbyEntities(1, 1, 1); + for (Entity e : entities) { + if (e != player) { + hit = true; + break; + } + } + } + if (block.isDead() || hit) { + block.remove(); + if (!block.getLocation().getBlock().getType().isSolid() && !block.getLocation().getBlock().getType().toString().contains("SIGN")) + block.getLocation().getBlock().setType(Material.AIR); + cancel(); + final TObjectLongHashMap changedBlocks = new gnu.trove.map.hash.TObjectLongHashMap(); + for (int x = -1; x < 2; x++) { + for (int y = -1; y < 3; y++) { + for (int z = -1; z < 2; z++) { + Location loc = block.getLocation().add(x, y, z); + Block b = world.getBlockAt(loc); + if (!b.getType().isSolid() && !b.getType().toString().contains("SIGN")) { + changedBlocks.put(b.getLocation(), b.getTypeId() | (b.getData() << 16)); + b.setType(Material.ICE); + } + } + } + } + (new BukkitRunnable() { + Random random = new Random(); + + @Override + public void run() { + for (int i = 0; i < 4; i++) { + if (changedBlocks.isEmpty()) { + cancel(); + return; + } + int index = random.nextInt(changedBlocks.size()); + long data = changedBlocks.values()[index]; + Location position = (Location) changedBlocks.keys()[index]; + changedBlocks.remove(position); + Block c = position.getBlock(); + position.getWorld().playEffect(position, Effect.STEP_SOUND, c.getTypeId()); + c.setTypeId((int) (data & 0xFFFF)); + c.setData((byte) (data >> 16)); + } + + } + }).runTaskTimer(Plugin.plugin, 4 * 20 + new Random().nextInt(40), 3); + } + + } + }; + run.runTaskTimer(Plugin.plugin, 0, 1); + + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } + + private boolean checkBlock(double x1, double y1, double z1, double w1, double h1, double d1, double x2, double y2, double z2, double w2, double h2, double d2) { + if (x1 + w1 < x2) + return false; + if (x2 + w2 < x1) + return false; + if (y1 + h1 < y2) + return false; + if (y2 + h2 < y1) + return false; + if (z1 + d1 < z2) + return false; + if (z2 + d2 < z1) + return false; + + return true; + } + + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.ice", locale), (double) cooldownTime / 20d); + } + + @Override + public String getName() { + return "ice"; + } + + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown", 20); + } + + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + } } diff --git a/src/main/java/think/rpgitems/power/PowerKnockup.java b/src/main/java/think/rpgitems/power/PowerKnockup.java index ff408a0f..f16f4f84 100644 --- a/src/main/java/think/rpgitems/power/PowerKnockup.java +++ b/src/main/java/think/rpgitems/power/PowerKnockup.java @@ -16,50 +16,49 @@ */ package think.rpgitems.power; -import java.util.Random; - import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerHit; +import java.util.Random; + public class PowerKnockup extends Power implements PowerHit { - public int chance = 20; - public double power = 2; + public int chance = 20; + public double power = 2; - private Random rand = new Random(); + private Random rand = new Random(); - @Override - public void hit(Player player, LivingEntity e, double damage) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else if (rand.nextInt(chance) == 0) - e.setVelocity(player.getLocation().getDirection().setY(power)); - } + @Override + public void hit(Player player, LivingEntity e, double damage) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else if (rand.nextInt(chance) == 0) + e.setVelocity(player.getLocation().getDirection().setY(power)); + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.knockup", locale), (int) ((1d / (double) chance) * 100d)); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.knockup", locale), (int) ((1d / (double) chance) * 100d)); + } - @Override - public String getName() { - return "knockup"; - } + @Override + public String getName() { + return "knockup"; + } - @Override - public void init(ConfigurationSection s) { - chance = s.getInt("chance"); - power = s.getDouble("power", 2); - } + @Override + public void init(ConfigurationSection s) { + chance = s.getInt("chance"); + power = s.getDouble("power", 2); + } - @Override - public void save(ConfigurationSection s) { - s.set("chance", chance); - s.set("power", power); - } + @Override + public void save(ConfigurationSection s) { + s.set("chance", chance); + s.set("power", power); + } } diff --git a/src/main/java/think/rpgitems/power/PowerLifeSteal.java b/src/main/java/think/rpgitems/power/PowerLifeSteal.java index 2491d341..97e51141 100644 --- a/src/main/java/think/rpgitems/power/PowerLifeSteal.java +++ b/src/main/java/think/rpgitems/power/PowerLifeSteal.java @@ -16,49 +16,48 @@ */ package think.rpgitems.power; -import java.util.Random; - import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerHit; -public class PowerLifeSteal extends Power implements PowerHit { - - public int chance = 20; - private Random random = new Random(); - - @Override - public void hit(Player player, LivingEntity e, double damage) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else if (random.nextInt(chance) == 0) { - if ((player.getHealth() + damage) >= player.getMaxHealth()) { - player.setHealth(player.getMaxHealth()); - } else - player.setHealth(player.getHealth() + damage); - } - } - - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.lifesteal", locale), (double) chance); - } - - @Override - public String getName() { - return "lifesteal"; - } +import java.util.Random; - @Override - public void init(ConfigurationSection s) { - chance = s.getInt("chance"); - } +public class PowerLifeSteal extends Power implements PowerHit { - @Override - public void save(ConfigurationSection s) { - s.set("chance", chance); - } + public int chance = 20; + private Random random = new Random(); + + @Override + public void hit(Player player, LivingEntity e, double damage) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else if (random.nextInt(chance) == 0) { + if ((player.getHealth() + damage) >= player.getMaxHealth()) { + player.setHealth(player.getMaxHealth()); + } else + player.setHealth(player.getHealth() + damage); + } + } + + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.lifesteal", locale), (double) chance); + } + + @Override + public String getName() { + return "lifesteal"; + } + + @Override + public void init(ConfigurationSection s) { + chance = s.getInt("chance"); + } + + @Override + public void save(ConfigurationSection s) { + s.set("chance", chance); + } } diff --git a/src/main/java/think/rpgitems/power/PowerLightning.java b/src/main/java/think/rpgitems/power/PowerLightning.java index d7472d3c..65650f0f 100644 --- a/src/main/java/think/rpgitems/power/PowerLightning.java +++ b/src/main/java/think/rpgitems/power/PowerLightning.java @@ -16,55 +16,54 @@ */ package think.rpgitems.power; -import java.util.Random; - import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerHit; import think.rpgitems.power.types.PowerProjectileHit; +import java.util.Random; + public class PowerLightning extends Power implements PowerHit, PowerProjectileHit { - public int chance = 20; - private Random random = new Random(); + public int chance = 20; + private Random random = new Random(); - @Override - public void hit(Player player, LivingEntity e, double damage) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else if (random.nextInt(chance) == 0) - e.getWorld().strikeLightning(e.getLocation()); - } + @Override + public void hit(Player player, LivingEntity e, double damage) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else if (random.nextInt(chance) == 0) + e.getWorld().strikeLightning(e.getLocation()); + } - @Override - public void projectileHit(Player player, Projectile p) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); - } else if (random.nextInt(chance) == 0) - p.getWorld().strikeLightning(p.getLocation()); - } + @Override + public void projectileHit(Player player, Projectile p) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); + } else if (random.nextInt(chance) == 0) + p.getWorld().strikeLightning(p.getLocation()); + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.lightning", locale), (int) ((1d / (double) chance) * 100d)); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.lightning", locale), (int) ((1d / (double) chance) * 100d)); + } - @Override - public String getName() { - return "lightning"; - } + @Override + public String getName() { + return "lightning"; + } - @Override - public void init(ConfigurationSection s) { - chance = s.getInt("chance"); - } + @Override + public void init(ConfigurationSection s) { + chance = s.getInt("chance"); + } - @Override - public void save(ConfigurationSection s) { - s.set("chance", chance); - } + @Override + public void save(ConfigurationSection s) { + s.set("chance", chance); + } } diff --git a/src/main/java/think/rpgitems/power/PowerPotionHit.java b/src/main/java/think/rpgitems/power/PowerPotionHit.java index 0984e28c..51b4c6f4 100644 --- a/src/main/java/think/rpgitems/power/PowerPotionHit.java +++ b/src/main/java/think/rpgitems/power/PowerPotionHit.java @@ -16,56 +16,55 @@ */ package think.rpgitems.power; -import java.util.Random; - import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerHit; +import java.util.Random; + public class PowerPotionHit extends Power implements PowerHit { - public int chance = 20; - private Random random = new Random(); - public PotionEffectType type = PotionEffectType.HARM; - public int duration = 20; - public int amplifier = 1; + public int chance = 20; + private Random random = new Random(); + public PotionEffectType type = PotionEffectType.HARM; + public int duration = 20; + public int amplifier = 1; - @Override - public void hit(Player player, LivingEntity e, double damage) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else if (random.nextInt(chance) == 0) - e.addPotionEffect(new PotionEffect(type, duration, amplifier)); - } + @Override + public void hit(Player player, LivingEntity e, double damage) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else if (random.nextInt(chance) == 0) + e.addPotionEffect(new PotionEffect(type, duration, amplifier)); + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.potionhit", locale), (int) ((1d / (double) chance) * 100d), type.getName().toLowerCase().replace('_', ' ')); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.potionhit", locale), (int) ((1d / (double) chance) * 100d), type.getName().toLowerCase().replace('_', ' ')); + } - @Override - public String getName() { - return "potionhit"; - } + @Override + public String getName() { + return "potionhit"; + } - @Override - public void init(ConfigurationSection s) { - chance = s.getInt("chance", 20); - duration = s.getInt("duration", 20); - amplifier = s.getInt("amplifier", 1); - type = PotionEffectType.getByName(s.getString("type", PotionEffectType.HARM.getName())); - } + @Override + public void init(ConfigurationSection s) { + chance = s.getInt("chance", 20); + duration = s.getInt("duration", 20); + amplifier = s.getInt("amplifier", 1); + type = PotionEffectType.getByName(s.getString("type", PotionEffectType.HARM.getName())); + } - @Override - public void save(ConfigurationSection s) { - s.set("chance", chance); - s.set("duration", duration); - s.set("amplifier", amplifier); - s.set("type", type.getName()); - } + @Override + public void save(ConfigurationSection s) { + s.set("chance", chance); + s.set("duration", duration); + s.set("amplifier", amplifier); + s.set("type", type.getName()); + } } diff --git a/src/main/java/think/rpgitems/power/PowerPotionSelf.java b/src/main/java/think/rpgitems/power/PowerPotionSelf.java index eede20a1..e8b0bd6a 100644 --- a/src/main/java/think/rpgitems/power/PowerPotionSelf.java +++ b/src/main/java/think/rpgitems/power/PowerPotionSelf.java @@ -21,63 +21,62 @@ import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; - import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; import think.rpgitems.power.types.PowerRightClick; public class PowerPotionSelf extends Power implements PowerRightClick { - public long cooldownTime = 20; - public int amplifier = 3; - public int time = 20; - public PotionEffectType type = PotionEffectType.HEAL; + public long cooldownTime = 20; + public int amplifier = 3; + public int time = 20; + public PotionEffectType type = PotionEffectType.HEAL; - @Override - public void rightClick(Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "potionself.cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "potionself.cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - player.addPotionEffect(new PotionEffect(type, time, amplifier)); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } + @Override + public void rightClick(Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "potionself.cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "potionself.cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + player.addPotionEffect(new PotionEffect(type, time, amplifier)); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown"); - amplifier = s.getInt("amp"); - time = s.getInt("time"); - type = PotionEffectType.getByName(s.getString("type", "heal")); - } + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown"); + amplifier = s.getInt("amp"); + time = s.getInt("time"); + type = PotionEffectType.getByName(s.getString("type", "heal")); + } - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - s.set("amp", amplifier); - s.set("time", time); - s.set("type", type.getName()); - } + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + s.set("amp", amplifier); + s.set("time", time); + s.set("type", type.getName()); + } - @Override - public String getName() { - return "potionself"; - } + @Override + public String getName() { + return "potionself"; + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.potionself", locale), type.getName().toLowerCase().replaceAll("_", " "), amplifier + 1, ((double) time) / 20d); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.potionself", locale), type.getName().toLowerCase().replaceAll("_", " "), amplifier + 1, ((double) time) / 20d); + } } diff --git a/src/main/java/think/rpgitems/power/PowerPotionTick.java b/src/main/java/think/rpgitems/power/PowerPotionTick.java index 0e43550d..77c2233e 100644 --- a/src/main/java/think/rpgitems/power/PowerPotionTick.java +++ b/src/main/java/think/rpgitems/power/PowerPotionTick.java @@ -5,57 +5,56 @@ import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerTick; public class PowerPotionTick extends Power implements PowerTick { - public int amplifier = 2; - public PotionEffectType effect = PotionEffectType.SPEED; - - @Override - public void tick(Player player) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); - } else { - boolean hasEffect = false; - for (PotionEffect potionEffect : player.getActivePotionEffects()) { - if (potionEffect.getType().equals(effect) && potionEffect.getDuration() == 25) { - player.addPotionEffect(new PotionEffect(effect, 30, amplifier, true), true); - hasEffect = true; - break; - } - } - if (!hasEffect) { - player.addPotionEffect(new PotionEffect(effect, 30, amplifier, true), true); - } - } - - } - - @Override - public void init(ConfigurationSection s) { - amplifier = s.getInt("amplifier"); - effect = PotionEffectType.getByName(s.getString("effect", "heal")); - - } - - @Override - public void save(ConfigurationSection s) { - s.set("amplifier", amplifier); - s.set("effect", effect.getName()); - - } - - @Override - public String getName() { - return "potiontick"; - } - - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.potiontick", locale), effect.getName().toLowerCase().replaceAll("_", " "), amplifier + 1); - } + public int amplifier = 2; + public PotionEffectType effect = PotionEffectType.SPEED; + + @Override + public void tick(Player player) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + player.sendMessage(ChatColor.RED + String.format(Locale.get("message.error.permission", Locale.getPlayerLocale(player)))); + } else { + boolean hasEffect = false; + for (PotionEffect potionEffect : player.getActivePotionEffects()) { + if (potionEffect.getType().equals(effect) && potionEffect.getDuration() == 25) { + player.addPotionEffect(new PotionEffect(effect, 30, amplifier, true), true); + hasEffect = true; + break; + } + } + if (!hasEffect) { + player.addPotionEffect(new PotionEffect(effect, 30, amplifier, true), true); + } + } + + } + + @Override + public void init(ConfigurationSection s) { + amplifier = s.getInt("amplifier"); + effect = PotionEffectType.getByName(s.getString("effect", "heal")); + + } + + @Override + public void save(ConfigurationSection s) { + s.set("amplifier", amplifier); + s.set("effect", effect.getName()); + + } + + @Override + public String getName() { + return "potiontick"; + } + + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.potiontick", locale), effect.getName().toLowerCase().replaceAll("_", " "), amplifier + 1); + } } diff --git a/src/main/java/think/rpgitems/power/PowerRainbow.java b/src/main/java/think/rpgitems/power/PowerRainbow.java index 0babdde2..93c6273e 100644 --- a/src/main/java/think/rpgitems/power/PowerRainbow.java +++ b/src/main/java/think/rpgitems/power/PowerRainbow.java @@ -16,119 +16,114 @@ */ package think.rpgitems.power; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Random; - -import org.bukkit.ChatColor; -import org.bukkit.Effect; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; - import think.rpgitems.Plugin; import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; import think.rpgitems.power.types.PowerRightClick; -public class PowerRainbow extends Power implements PowerRightClick { - - public long cooldownTime = 20; - public int count = 5; - private Random random = new Random(); - - @SuppressWarnings("deprecation") - @Override - public void rightClick(Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "arrow.rainbow"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "arrow.rainbow", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); - final ArrayList blocks = new ArrayList(); - for (int i = 0; i < count; i++) { - FallingBlock block = player.getWorld().spawnFallingBlock(player.getLocation().add(0, 1.8, 0), Material.WOOL, (byte) random.nextInt(16)); - block.setVelocity(player.getLocation().getDirection().multiply(new Vector(random.nextDouble() * 2d + 0.5, random.nextDouble() * 2d + 0.5, random.nextDouble() * 2d + 0.5))); - block.setDropItem(false); - blocks.add(block); - } - (new BukkitRunnable() { - - ArrayList fallLocs = new ArrayList(); - Random random = new Random(); - - public void run() { - - Iterator l = fallLocs.iterator(); - while (l.hasNext()) { - Location loc = l.next(); - if (random.nextBoolean()) { - Block b = loc.getBlock(); - if (b.getType() == Material.WOOL) { - loc.getWorld().playEffect(loc, Effect.STEP_SOUND, Material.WOOL, b.getData()); - b.setType(Material.AIR); - } - l.remove(); - } - if (random.nextInt(5) == 0) { - break; - } - } - - Iterator it = blocks.iterator(); - while (it.hasNext()) { - FallingBlock block = it.next(); - if (block.isDead()) { - fallLocs.add(block.getLocation()); - it.remove(); - } - } - - if (fallLocs.isEmpty() && blocks.isEmpty()) { - cancel(); - } - - } - }).runTaskTimer(Plugin.plugin, 0, 5); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } - - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.rainbow", locale), count, (double) cooldownTime / 20d); - } - - @Override - public String getName() { - return "rainbow"; - } +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Random; - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown", 20); - count = s.getInt("count", 5); - } +public class PowerRainbow extends Power implements PowerRightClick { - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - s.set("count", count); - } + public long cooldownTime = 20; + public int count = 5; + private Random random = new Random(); + + @SuppressWarnings("deprecation") + @Override + public void rightClick(Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "arrow.rainbow"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "arrow.rainbow", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); + final ArrayList blocks = new ArrayList(); + for (int i = 0; i < count; i++) { + FallingBlock block = player.getWorld().spawnFallingBlock(player.getLocation().add(0, 1.8, 0), Material.WOOL, (byte) random.nextInt(16)); + block.setVelocity(player.getLocation().getDirection().multiply(new Vector(random.nextDouble() * 2d + 0.5, random.nextDouble() * 2d + 0.5, random.nextDouble() * 2d + 0.5))); + block.setDropItem(false); + blocks.add(block); + } + (new BukkitRunnable() { + + ArrayList fallLocs = new ArrayList(); + Random random = new Random(); + + public void run() { + + Iterator l = fallLocs.iterator(); + while (l.hasNext()) { + Location loc = l.next(); + if (random.nextBoolean()) { + Block b = loc.getBlock(); + if (b.getType() == Material.WOOL) { + loc.getWorld().playEffect(loc, Effect.STEP_SOUND, Material.WOOL, b.getData()); + b.setType(Material.AIR); + } + l.remove(); + } + if (random.nextInt(5) == 0) { + break; + } + } + + Iterator it = blocks.iterator(); + while (it.hasNext()) { + FallingBlock block = it.next(); + if (block.isDead()) { + fallLocs.add(block.getLocation()); + it.remove(); + } + } + + if (fallLocs.isEmpty() && blocks.isEmpty()) { + cancel(); + } + + } + }).runTaskTimer(Plugin.plugin, 0, 5); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } + + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.rainbow", locale), count, (double) cooldownTime / 20d); + } + + @Override + public String getName() { + return "rainbow"; + } + + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown", 20); + count = s.getInt("count", 5); + } + + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + s.set("count", count); + } } diff --git a/src/main/java/think/rpgitems/power/PowerRumble.java b/src/main/java/think/rpgitems/power/PowerRumble.java index 68d7b0f6..a9f912a2 100644 --- a/src/main/java/think/rpgitems/power/PowerRumble.java +++ b/src/main/java/think/rpgitems/power/PowerRumble.java @@ -16,8 +16,6 @@ */ package think.rpgitems.power; -import java.util.Random; - import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.Location; @@ -30,116 +28,117 @@ import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; - import think.rpgitems.Plugin; import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; import think.rpgitems.power.types.PowerRightClick; +import java.util.Random; + public class PowerRumble extends Power implements PowerRightClick { - public long cooldownTime = 20; - public int power = 2; - public int distance = 15; + public long cooldownTime = 20; + public int power = 2; + public int distance = 15; - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown", 20); - power = s.getInt("power", 2); - distance = s.getInt("distance", 15); - } + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown", 20); + power = s.getInt("power", 2); + distance = s.getInt("distance", 15); + } - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - s.set("power", power); - s.set("distance", distance); - } + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + s.set("power", power); + s.set("distance", distance); + } - @Override - public void rightClick(final Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "rumble.cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "rumble.cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - final Location location = player.getLocation().add(0, -0.2, 0); - final Vector direction = player.getLocation().getDirection(); - direction.setY(0); - direction.normalize(); - BukkitRunnable task = new BukkitRunnable() { + @Override + public void rightClick(final Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "rumble.cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "rumble.cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + final Location location = player.getLocation().add(0, -0.2, 0); + final Vector direction = player.getLocation().getDirection(); + direction.setY(0); + direction.normalize(); + BukkitRunnable task = new BukkitRunnable() { - private int count = 0; + private int count = 0; - public void run() { - Location above = location.clone().add(0, 1, 0); - if (above.getBlock().getType().isSolid() || !location.getBlock().getType().isSolid()) { - cancel(); - return; - } + public void run() { + Location above = location.clone().add(0, 1, 0); + if (above.getBlock().getType().isSolid() || !location.getBlock().getType().isSolid()) { + cancel(); + return; + } - Location temp = location.clone(); - for (int x = -2; x <= 2; x++) { - for (int z = -2; z <= 2; z++) { - temp.setX(x + location.getBlockX()); - temp.setZ(z + location.getBlockZ()); - Block block = temp.getBlock(); - temp.getWorld().playEffect(temp, Effect.STEP_SOUND, block.getType()); - } - } - Entity[] near = getNearbyEntities(location, 1.5); - boolean hit = false; - Random random = new Random(); - for (Entity e : near) { - if (e != player) { - hit = true; - break; - } - } - if (hit) { - near = getNearbyEntities(location, power + 1); - for (Entity e : near) { - if (e != player) { - if (e instanceof ItemFrame || e instanceof Painting) { - e.setMetadata("Rumble", new FixedMetadataValue(Plugin.plugin, null)); // Add metadata to protect hanging entities from the explosion - continue; - } - if (e.getLocation().distance(location) <= 2.5) - e.setVelocity(new Vector(random.nextGaussian() / 4d, 1d + random.nextDouble() * (double) power, random.nextGaussian() / 4d)); - } - } - location.getWorld().createExplosion(location.getX(), location.getY(), location.getZ(), power, false, false); // Trigger the explosion after all hanging entities have been protected - cancel(); - return; - } - location.add(direction); - if (count >= distance) { - cancel(); - } - count++; - } - }; - task.runTaskTimer(Plugin.plugin, 0, 3); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } + Location temp = location.clone(); + for (int x = -2; x <= 2; x++) { + for (int z = -2; z <= 2; z++) { + temp.setX(x + location.getBlockX()); + temp.setZ(z + location.getBlockZ()); + Block block = temp.getBlock(); + temp.getWorld().playEffect(temp, Effect.STEP_SOUND, block.getType()); + } + } + Entity[] near = getNearbyEntities(location, 1.5); + boolean hit = false; + Random random = new Random(); + for (Entity e : near) { + if (e != player) { + hit = true; + break; + } + } + if (hit) { + near = getNearbyEntities(location, power + 1); + for (Entity e : near) { + if (e != player) { + if (e instanceof ItemFrame || e instanceof Painting) { + e.setMetadata("Rumble", new FixedMetadataValue(Plugin.plugin, null)); // Add metadata to protect hanging entities from the explosion + continue; + } + if (e.getLocation().distance(location) <= 2.5) + e.setVelocity(new Vector(random.nextGaussian() / 4d, 1d + random.nextDouble() * (double) power, random.nextGaussian() / 4d)); + } + } + location.getWorld().createExplosion(location.getX(), location.getY(), location.getZ(), power, false, false); // Trigger the explosion after all hanging entities have been protected + cancel(); + return; + } + location.add(direction); + if (count >= distance) { + cancel(); + } + count++; + } + }; + task.runTaskTimer(Plugin.plugin, 0, 3); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } - @Override - public String getName() { - return "rumble"; - } + @Override + public String getName() { + return "rumble"; + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.rumble", locale), (double) cooldownTime / 20d); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.rumble", locale), (double) cooldownTime / 20d); + } } diff --git a/src/main/java/think/rpgitems/power/PowerRush.java b/src/main/java/think/rpgitems/power/PowerRush.java index fb96d555..179612d3 100644 --- a/src/main/java/think/rpgitems/power/PowerRush.java +++ b/src/main/java/think/rpgitems/power/PowerRush.java @@ -21,58 +21,57 @@ import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; - import think.rpgitems.data.RPGValue; import think.rpgitems.power.types.PowerRightClick; @Deprecated public class PowerRush extends Power implements PowerRightClick { - private long cd = 20; - private int speed = 3; - private int time = 20; + private long cd = 20; + private int speed = 3; + private int time = 20; - @Override - public void rightClick(Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "rush.cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "rush.cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cd); - player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, time, speed)); - } - } - } + @Override + public void rightClick(Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "rush.cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "rush.cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cd); + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, time, speed)); + } + } + } - @Override - public void init(ConfigurationSection s) { - cd = s.getLong("cooldown"); - speed = s.getInt("speed"); - time = s.getInt("time"); - } + @Override + public void init(ConfigurationSection s) { + cd = s.getLong("cooldown"); + speed = s.getInt("speed"); + time = s.getInt("time"); + } - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cd); - s.set("speed", speed); - s.set("time", time); - } + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cd); + s.set("speed", speed); + s.set("time", time); + } - @Override - public String getName() { - return "rush"; - } + @Override + public String getName() { + return "rush"; + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + "Gives temporary speed boost"; - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + "Gives temporary speed boost"; + } } diff --git a/src/main/java/think/rpgitems/power/PowerSkyHook.java b/src/main/java/think/rpgitems/power/PowerSkyHook.java index 1dcc3fad..3a8eeb87 100644 --- a/src/main/java/think/rpgitems/power/PowerSkyHook.java +++ b/src/main/java/think/rpgitems/power/PowerSkyHook.java @@ -9,7 +9,6 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; - import think.rpgitems.Plugin; import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; @@ -19,97 +18,97 @@ public class PowerSkyHook extends Power implements PowerRightClick { - public Material railMaterial = Material.GLASS; - public int hookDistance = 10; + public Material railMaterial = Material.GLASS; + public int hookDistance = 10; - @Override - public void rightClick(final Player player) { - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue isHooking = RPGValue.get(player, item, "skyhook.isHooking"); - if (isHooking == null) { - isHooking = new RPGValue(player, item, "skyhook.isHooking", false); - } - if (isHooking.asBoolean()) { - player.setVelocity(player.getLocation().getDirection()); - isHooking.set(false); - return; - } - Block block = player.getTargetBlock((Set) null, hookDistance); - if (block.getType() != railMaterial) { - player.sendMessage(ChatColor.AQUA + Locale.get("message.skyhook.fail", Locale.getPlayerLocale(player))); - return; - } - isHooking.set(true); - final Location location = player.getLocation(); - player.setAllowFlight(true); - player.setVelocity(location.getDirection().multiply(block.getLocation().distance(location) / 2d)); - player.setFlying(true); - (new BukkitRunnable() { + @Override + public void rightClick(final Player player) { + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue isHooking = RPGValue.get(player, item, "skyhook.isHooking"); + if (isHooking == null) { + isHooking = new RPGValue(player, item, "skyhook.isHooking", false); + } + if (isHooking.asBoolean()) { + player.setVelocity(player.getLocation().getDirection()); + isHooking.set(false); + return; + } + Block block = player.getTargetBlock((Set) null, hookDistance); + if (block.getType() != railMaterial) { + player.sendMessage(ChatColor.AQUA + Locale.get("message.skyhook.fail", Locale.getPlayerLocale(player))); + return; + } + isHooking.set(true); + final Location location = player.getLocation(); + player.setAllowFlight(true); + player.setVelocity(location.getDirection().multiply(block.getLocation().distance(location) / 2d)); + player.setFlying(true); + (new BukkitRunnable() { - private int delay = 0; + private int delay = 0; - @Override - public void run() { - if (!player.getAllowFlight()) { - cancel(); - RPGValue.get(player, item, "skyhook.isHooking").set(false); - return; - } - if (!RPGValue.get(player, item, "skyhook.isHooking").asBoolean()) { - player.setFlying(false); - if (player.getGameMode() != GameMode.CREATIVE) - player.setAllowFlight(false); - cancel(); - return; - } - player.setFlying(true); - player.getLocation(location); - location.add(0, 2.4, 0); - if (delay < 20) { - delay++; - if (location.getBlock().getType() == railMaterial) { - delay = 20; - } - return; - } - Vector dir = location.getDirection().setY(0).normalize(); - location.add(dir); - if (location.getBlock().getType() != railMaterial) { - player.setFlying(false); - if (player.getGameMode() != GameMode.CREATIVE) - player.setAllowFlight(false); - cancel(); - RPGValue.get(player, item, "skyhook.isHooking").set(false); - return; - } - player.setVelocity(dir.multiply(0.5)); + @Override + public void run() { + if (!player.getAllowFlight()) { + cancel(); + RPGValue.get(player, item, "skyhook.isHooking").set(false); + return; + } + if (!RPGValue.get(player, item, "skyhook.isHooking").asBoolean()) { + player.setFlying(false); + if (player.getGameMode() != GameMode.CREATIVE) + player.setAllowFlight(false); + cancel(); + return; + } + player.setFlying(true); + player.getLocation(location); + location.add(0, 2.4, 0); + if (delay < 20) { + delay++; + if (location.getBlock().getType() == railMaterial) { + delay = 20; + } + return; + } + Vector dir = location.getDirection().setY(0).normalize(); + location.add(dir); + if (location.getBlock().getType() != railMaterial) { + player.setFlying(false); + if (player.getGameMode() != GameMode.CREATIVE) + player.setAllowFlight(false); + cancel(); + RPGValue.get(player, item, "skyhook.isHooking").set(false); + return; + } + player.setVelocity(dir.multiply(0.5)); - } - }).runTaskTimer(Plugin.plugin, 0, 0); - } - } + } + }).runTaskTimer(Plugin.plugin, 0, 0); + } + } - @Override - public void init(ConfigurationSection s) { - railMaterial = Material.valueOf(s.getString("railMaterial", "GLASS")); - hookDistance = s.getInt("hookDistance", 10); - } + @Override + public void init(ConfigurationSection s) { + railMaterial = Material.valueOf(s.getString("railMaterial", "GLASS")); + hookDistance = s.getInt("hookDistance", 10); + } - @Override - public void save(ConfigurationSection s) { - s.set("railMaterial", railMaterial.toString()); - s.set("hookDistance", hookDistance); - } + @Override + public void save(ConfigurationSection s) { + s.set("railMaterial", railMaterial.toString()); + s.set("hookDistance", hookDistance); + } - @Override - public String getName() { - return "skyhook"; - } + @Override + public String getName() { + return "skyhook"; + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + Locale.get("power.skyhook", locale); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + Locale.get("power.skyhook", locale); + } } diff --git a/src/main/java/think/rpgitems/power/PowerTNTCannon.java b/src/main/java/think/rpgitems/power/PowerTNTCannon.java index 6f575b20..b8c5875b 100644 --- a/src/main/java/think/rpgitems/power/PowerTNTCannon.java +++ b/src/main/java/think/rpgitems/power/PowerTNTCannon.java @@ -21,55 +21,54 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; - import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; import think.rpgitems.power.types.PowerRightClick; public class PowerTNTCannon extends Power implements PowerRightClick { - public long cooldownTime = 20; + public long cooldownTime = 20; - @Override - public void rightClick(Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "tnt.cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "tnt.cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); - TNTPrimed tnt = player.getWorld().spawn(player.getLocation().add(0, 1.8, 0), TNTPrimed.class); - tnt.setVelocity(player.getLocation().getDirection().multiply(2d)); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } + @Override + public void rightClick(Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "tnt.cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "tnt.cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); + TNTPrimed tnt = player.getWorld().spawn(player.getLocation().add(0, 1.8, 0), TNTPrimed.class); + tnt.setVelocity(player.getLocation().getDirection().multiply(2d)); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.tntcannon", locale), (double) cooldownTime / 20d); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.tntcannon", locale), (double) cooldownTime / 20d); + } - @Override - public String getName() { - return "tntcannon"; - } + @Override + public String getName() { + return "tntcannon"; + } - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown", 20); - } + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown", 20); + } - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - } + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + } } diff --git a/src/main/java/think/rpgitems/power/PowerTeleport.java b/src/main/java/think/rpgitems/power/PowerTeleport.java index 4d969988..9db99920 100644 --- a/src/main/java/think/rpgitems/power/PowerTeleport.java +++ b/src/main/java/think/rpgitems/power/PowerTeleport.java @@ -16,18 +16,12 @@ */ package think.rpgitems.power; -import org.bukkit.ChatColor; -import org.bukkit.Effect; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.util.BlockIterator; - import think.rpgitems.data.Locale; import think.rpgitems.data.RPGValue; import think.rpgitems.power.types.PowerProjectileHit; @@ -35,109 +29,109 @@ public class PowerTeleport extends Power implements PowerRightClick, PowerProjectileHit { - public int distance = 5; - public long cooldownTime = 20; + public int distance = 5; + public long cooldownTime = 20; - @Override - public void rightClick(Player player) { - long cooldown; - if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { - } else { - RPGValue value = RPGValue.get(player, item, "teleport.cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "teleport.cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - // float dist = 0; - World world = player.getWorld(); - Location start = player.getLocation(); - start.setY(start.getY() + 1.6); - // Location current = new Location(world, 0, 0, 0); - Block lastSafe = world.getBlockAt(start); - // Keeping the old method because BlockIterator could get removed (irc) - // double dir = Math.toRadians(start.getYaw()) + (Math.PI / 2d); - // double dirY = Math.toRadians(start.getPitch()) + (Math.PI / 2d); - BlockIterator bi = new BlockIterator(player, distance); - // while (dist < distance) { - while (bi.hasNext()) { - // current.setX(start.getX() + dist * Math.cos(dir) * - // Math.sin(dirY)); - // current.setY(start.getY() + dist * Math.cos(dirY)); - // current.setZ(start.getZ() + dist * Math.sin(dir) * - // Math.sin(dirY)); - Block block = bi.next();// world.getBlockAt(current); - if (!block.getType().isSolid() || (block.getType() == Material.AIR)) { - lastSafe = block; - } else { - break; - } - // dist+= 0.5; - } - Location newLoc = lastSafe.getLocation(); - newLoc.setPitch(start.getPitch()); - newLoc.setYaw(start.getYaw()); - player.teleport(newLoc); - world.playEffect(newLoc, Effect.ENDER_SIGNAL, 0); - world.playSound(newLoc, Sound.ENDERMAN_TELEPORT, 1.0f, 0.3f); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } - } + @Override + public void rightClick(Player player) { + long cooldown; + if (item.getHasPermission() == true && player.hasPermission(item.getPermission()) == false) { + } else { + RPGValue value = RPGValue.get(player, item, "teleport.cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "teleport.cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + // float dist = 0; + World world = player.getWorld(); + Location start = player.getLocation(); + start.setY(start.getY() + 1.6); + // Location current = new Location(world, 0, 0, 0); + Block lastSafe = world.getBlockAt(start); + // Keeping the old method because BlockIterator could get removed (irc) + // double dir = Math.toRadians(start.getYaw()) + (Math.PI / 2d); + // double dirY = Math.toRadians(start.getPitch()) + (Math.PI / 2d); + BlockIterator bi = new BlockIterator(player, distance); + // while (dist < distance) { + while (bi.hasNext()) { + // current.setX(start.getX() + dist * Math.cos(dir) * + // Math.sin(dirY)); + // current.setY(start.getY() + dist * Math.cos(dirY)); + // current.setZ(start.getZ() + dist * Math.sin(dir) * + // Math.sin(dirY)); + Block block = bi.next();// world.getBlockAt(current); + if (!block.getType().isSolid() || (block.getType() == Material.AIR)) { + lastSafe = block; + } else { + break; + } + // dist+= 0.5; + } + Location newLoc = lastSafe.getLocation(); + newLoc.setPitch(start.getPitch()); + newLoc.setYaw(start.getYaw()); + player.teleport(newLoc); + world.playEffect(newLoc, Effect.ENDER_SIGNAL, 0); + world.playSound(newLoc, Sound.ENDERMAN_TELEPORT, 1.0f, 0.3f); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } + } - @Override - public void projectileHit(Player player, Projectile p) { - long cooldown; - RPGValue value = RPGValue.get(player, item, "teleport.cooldown"); - if (value == null) { - cooldown = System.currentTimeMillis() / 50; - value = new RPGValue(player, item, "teleport.cooldown", cooldown); - } else { - cooldown = value.asLong(); - } - if (cooldown <= System.currentTimeMillis() / 50) { - value.set(System.currentTimeMillis() / 50 + cooldownTime); - World world = player.getWorld(); - Location start = player.getLocation(); - Location newLoc = p.getLocation(); - if (start.distanceSquared(newLoc) >= distance * distance) { - player.sendMessage(ChatColor.AQUA + Locale.get("message.too.far", Locale.getPlayerLocale(player))); - return; - } - newLoc.setPitch(start.getPitch()); - ; - newLoc.setYaw(start.getYaw()); - player.teleport(newLoc); - world.playEffect(newLoc, Effect.ENDER_SIGNAL, 0); - world.playSound(newLoc, Sound.ENDERMAN_TELEPORT, 1.0f, 0.3f); - } else { - player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); - } - } + @Override + public void projectileHit(Player player, Projectile p) { + long cooldown; + RPGValue value = RPGValue.get(player, item, "teleport.cooldown"); + if (value == null) { + cooldown = System.currentTimeMillis() / 50; + value = new RPGValue(player, item, "teleport.cooldown", cooldown); + } else { + cooldown = value.asLong(); + } + if (cooldown <= System.currentTimeMillis() / 50) { + value.set(System.currentTimeMillis() / 50 + cooldownTime); + World world = player.getWorld(); + Location start = player.getLocation(); + Location newLoc = p.getLocation(); + if (start.distanceSquared(newLoc) >= distance * distance) { + player.sendMessage(ChatColor.AQUA + Locale.get("message.too.far", Locale.getPlayerLocale(player))); + return; + } + newLoc.setPitch(start.getPitch()); + ; + newLoc.setYaw(start.getYaw()); + player.teleport(newLoc); + world.playEffect(newLoc, Effect.ENDER_SIGNAL, 0); + world.playSound(newLoc, Sound.ENDERMAN_TELEPORT, 1.0f, 0.3f); + } else { + player.sendMessage(ChatColor.AQUA + String.format(Locale.get("message.cooldown", Locale.getPlayerLocale(player)), ((double) (cooldown - System.currentTimeMillis() / 50)) / 20d)); + } + } - @Override - public void init(ConfigurationSection s) { - cooldownTime = s.getLong("cooldown"); - distance = s.getInt("distance"); - } + @Override + public void init(ConfigurationSection s) { + cooldownTime = s.getLong("cooldown"); + distance = s.getInt("distance"); + } - @Override - public void save(ConfigurationSection s) { - s.set("cooldown", cooldownTime); - s.set("distance", distance); - } + @Override + public void save(ConfigurationSection s) { + s.set("cooldown", cooldownTime); + s.set("distance", distance); + } - @Override - public String getName() { - return "teleport"; - } + @Override + public String getName() { + return "teleport"; + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + String.format(Locale.get("power.teleport", locale), distance, (double) cooldownTime / 20d); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + String.format(Locale.get("power.teleport", locale), distance, (double) cooldownTime / 20d); + } } diff --git a/src/main/java/think/rpgitems/power/PowerTicker.java b/src/main/java/think/rpgitems/power/PowerTicker.java index 188709b4..56c7f880 100644 --- a/src/main/java/think/rpgitems/power/PowerTicker.java +++ b/src/main/java/think/rpgitems/power/PowerTicker.java @@ -4,28 +4,27 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; - import think.rpgitems.item.ItemManager; import think.rpgitems.item.RPGItem; public class PowerTicker extends BukkitRunnable { - @Override - public void run() { - for (Player player : Bukkit.getOnlinePlayers()) { - ItemStack[] armour = player.getInventory().getArmorContents(); - for (ItemStack part : armour) { - RPGItem item = ItemManager.toRPGItem(part); - if (item == null) - continue; - item.tick(player); - } - ItemStack part = player.getItemInHand(); - RPGItem item = ItemManager.toRPGItem(part); - if (item == null) - continue; - item.tick(player); - } - } + @Override + public void run() { + for (Player player : Bukkit.getOnlinePlayers()) { + ItemStack[] armour = player.getInventory().getArmorContents(); + for (ItemStack part : armour) { + RPGItem item = ItemManager.toRPGItem(part); + if (item == null) + continue; + item.tick(player); + } + ItemStack part = player.getItemInHand(); + RPGItem item = ItemManager.toRPGItem(part); + if (item == null) + continue; + item.tick(player); + } + } } diff --git a/src/main/java/think/rpgitems/power/PowerUnbreakable.java b/src/main/java/think/rpgitems/power/PowerUnbreakable.java index 54b0a0d1..7be8ce2d 100644 --- a/src/main/java/think/rpgitems/power/PowerUnbreakable.java +++ b/src/main/java/think/rpgitems/power/PowerUnbreakable.java @@ -20,35 +20,34 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerHit; public class PowerUnbreakable extends Power implements PowerHit { - @Override - public void hit(Player player, LivingEntity e, double damage) { - player.getItemInHand().setDurability((short) 0); - player.updateInventory(); - } + @Override + public void hit(Player player, LivingEntity e, double damage) { + player.getItemInHand().setDurability((short) 0); + player.updateInventory(); + } - @Override - public void init(ConfigurationSection s) { + @Override + public void init(ConfigurationSection s) { - } + } - @Override - public void save(ConfigurationSection s) { + @Override + public void save(ConfigurationSection s) { - } + } - @Override - public String getName() { - return "unbreakable"; - } + @Override + public String getName() { + return "unbreakable"; + } - @Override - public String displayText(String locale) { - return ChatColor.GREEN + Locale.get("power.unbreakable", locale); - } + @Override + public String displayText(String locale) { + return ChatColor.GREEN + Locale.get("power.unbreakable", locale); + } } diff --git a/src/main/java/think/rpgitems/power/PowerUnbreaking.java b/src/main/java/think/rpgitems/power/PowerUnbreaking.java index 534cd1d3..c44da68f 100644 --- a/src/main/java/think/rpgitems/power/PowerUnbreaking.java +++ b/src/main/java/think/rpgitems/power/PowerUnbreaking.java @@ -16,48 +16,47 @@ */ package think.rpgitems.power; -import java.util.Random; - import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; - import think.rpgitems.data.Locale; import think.rpgitems.power.types.PowerHit; +import java.util.Random; + public class PowerUnbreaking extends Power implements PowerHit { - public int level = 1; - private Random random = new Random(); - - @Override - public void hit(Player player, LivingEntity e, double damage) { - if (random.nextDouble() < ((double) level) / 100d) { - System.out.println(player.getItemInHand().getDurability()); - player.getItemInHand().setDurability((short) (player.getItemInHand().getDurability() - 1)); - System.out.println(player.getItemInHand().getDurability()); - player.updateInventory(); - } - } - - @Override - public void init(ConfigurationSection s) { - level = s.getInt("level", 1); - } - - @Override - public void save(ConfigurationSection s) { - s.set("level", level); - } - - @Override - public String getName() { - return "unbreaking"; - } - - @Override - public String displayText(String locale) { - return String.format(ChatColor.GREEN + Locale.get("power.unbreaking", locale), level); - } + public int level = 1; + private Random random = new Random(); + + @Override + public void hit(Player player, LivingEntity e, double damage) { + if (random.nextDouble() < ((double) level) / 100d) { + System.out.println(player.getItemInHand().getDurability()); + player.getItemInHand().setDurability((short) (player.getItemInHand().getDurability() - 1)); + System.out.println(player.getItemInHand().getDurability()); + player.updateInventory(); + } + } + + @Override + public void init(ConfigurationSection s) { + level = s.getInt("level", 1); + } + + @Override + public void save(ConfigurationSection s) { + s.set("level", level); + } + + @Override + public String getName() { + return "unbreaking"; + } + + @Override + public String displayText(String locale) { + return String.format(ChatColor.GREEN + Locale.get("power.unbreaking", locale), level); + } } diff --git a/src/main/java/think/rpgitems/power/types/Power.java b/src/main/java/think/rpgitems/power/types/Power.java index 65ab885b..6e9a2243 100644 --- a/src/main/java/think/rpgitems/power/types/Power.java +++ b/src/main/java/think/rpgitems/power/types/Power.java @@ -1,5 +1,5 @@ package think.rpgitems.power.types; public interface Power { - public String getName(); + public String getName(); } diff --git a/src/main/java/think/rpgitems/power/types/PowerHit.java b/src/main/java/think/rpgitems/power/types/PowerHit.java index d3ca9eb0..0acd6d1b 100644 --- a/src/main/java/think/rpgitems/power/types/PowerHit.java +++ b/src/main/java/think/rpgitems/power/types/PowerHit.java @@ -4,5 +4,5 @@ import org.bukkit.entity.Player; public interface PowerHit extends Power { - public void hit(Player player, LivingEntity e, double damage); + public void hit(Player player, LivingEntity e, double damage); } diff --git a/src/main/java/think/rpgitems/power/types/PowerLeftClick.java b/src/main/java/think/rpgitems/power/types/PowerLeftClick.java index 9ab953d1..fc6fe4c1 100644 --- a/src/main/java/think/rpgitems/power/types/PowerLeftClick.java +++ b/src/main/java/think/rpgitems/power/types/PowerLeftClick.java @@ -3,5 +3,5 @@ import org.bukkit.entity.Player; public interface PowerLeftClick extends Power { - public void leftClick(Player player); + public void leftClick(Player player); } diff --git a/src/main/java/think/rpgitems/power/types/PowerProjectileHit.java b/src/main/java/think/rpgitems/power/types/PowerProjectileHit.java index 26b6376c..09f8b702 100644 --- a/src/main/java/think/rpgitems/power/types/PowerProjectileHit.java +++ b/src/main/java/think/rpgitems/power/types/PowerProjectileHit.java @@ -4,5 +4,5 @@ import org.bukkit.entity.Projectile; public interface PowerProjectileHit extends Power { - public void projectileHit(Player player, Projectile arrow); + public void projectileHit(Player player, Projectile arrow); } diff --git a/src/main/java/think/rpgitems/power/types/PowerRightClick.java b/src/main/java/think/rpgitems/power/types/PowerRightClick.java index 942b1a14..9fbdafd1 100644 --- a/src/main/java/think/rpgitems/power/types/PowerRightClick.java +++ b/src/main/java/think/rpgitems/power/types/PowerRightClick.java @@ -3,5 +3,5 @@ import org.bukkit.entity.Player; public interface PowerRightClick extends Power { - public void rightClick(Player player); + public void rightClick(Player player); } diff --git a/src/main/java/think/rpgitems/power/types/PowerTick.java b/src/main/java/think/rpgitems/power/types/PowerTick.java index b245e87e..71c86a9a 100644 --- a/src/main/java/think/rpgitems/power/types/PowerTick.java +++ b/src/main/java/think/rpgitems/power/types/PowerTick.java @@ -3,5 +3,5 @@ import org.bukkit.entity.Player; public interface PowerTick extends Power { - public void tick(Player player); + public void tick(Player player); } diff --git a/src/main/java/think/rpgitems/support/WorldGuard.java b/src/main/java/think/rpgitems/support/WorldGuard.java index 24e2b1b7..ecdad83c 100644 --- a/src/main/java/think/rpgitems/support/WorldGuard.java +++ b/src/main/java/think/rpgitems/support/WorldGuard.java @@ -16,43 +16,42 @@ */ package think.rpgitems.support; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.flags.DefaultFlag; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -import com.sk89q.worldguard.bukkit.WorldGuardPlugin; -import com.sk89q.worldguard.protection.flags.DefaultFlag; - public class WorldGuard { - private static WorldGuardPlugin plugin; - private static boolean hasSupport = false; - public static boolean useWorldGuard = true; - - public static void init(think.rpgitems.Plugin plugin2) { - Plugin plugin = plugin2.getServer().getPluginManager().getPlugin("WorldGuard"); - useWorldGuard = plugin2.getConfig().getBoolean("support.worldguard", false); - if (plugin == null || !(plugin instanceof WorldGuardPlugin)) { - return; - } - hasSupport = true; - WorldGuard.plugin = (WorldGuardPlugin) plugin; - think.rpgitems.Plugin.logger.info("[RPG Items] World Guard found"); - } - - public static boolean isEnabled() { - return hasSupport; - } - - public static boolean canBuild(Player player, Location location) { - if (!hasSupport || !useWorldGuard) - return true; - return plugin.canBuild(player, location); - } - - public static boolean canPvP(Location location) { - if (!hasSupport || !useWorldGuard) - return true; - return plugin.getRegionManager(location.getWorld()).getApplicableRegions(location).allows(DefaultFlag.PVP); - } + private static WorldGuardPlugin plugin; + private static boolean hasSupport = false; + public static boolean useWorldGuard = true; + + public static void init(think.rpgitems.Plugin plugin2) { + Plugin plugin = plugin2.getServer().getPluginManager().getPlugin("WorldGuard"); + useWorldGuard = plugin2.getConfig().getBoolean("support.worldguard", false); + if (plugin == null || !(plugin instanceof WorldGuardPlugin)) { + return; + } + hasSupport = true; + WorldGuard.plugin = (WorldGuardPlugin) plugin; + think.rpgitems.Plugin.logger.info("[RPG Items] World Guard found"); + } + + public static boolean isEnabled() { + return hasSupport; + } + + public static boolean canBuild(Player player, Location location) { + if (!hasSupport || !useWorldGuard) + return true; + return plugin.canBuild(player, location); + } + + public static boolean canPvP(Location location) { + if (!hasSupport || !useWorldGuard) + return true; + return plugin.getRegionManager(location.getWorld()).getApplicableRegions(location).allows(DefaultFlag.PVP); + } }