--- miscJava/bukkit-minecraft-plugins/CreativeWorld/src/dk/thoerup/bukkit/creativeworld/WorldChanged.java 2011/12/13 18:24:47 1663 +++ miscJava/bukkit-minecraft-plugins/CreativeWorld/src/main/java/dk/thoerup/bukkit/creativeworld/WorldChanged.java 2012/11/29 20:18:25 1875 @@ -2,15 +2,20 @@ import org.bukkit.*; import org.bukkit.entity.*; +import org.bukkit.event.*; import org.bukkit.event.player.*; import org.bukkit.configuration.*; import org.bukkit.inventory.*; +import org.bukkit.enchantments.*; -public class WorldChanged extends PlayerListener { +import java.util.*; + +public class WorldChanged implements Listener { final static String STACK_TYPE = ".type"; final static String STACK_AMOUNT = ".amount"; final static String STACK_DAMAGE = ".damage"; final static String STACK_DATA = ".data"; + final static String STACK_ENCHANTMENT = ".enchantment"; final static String INVENTORY_CREATIVE = ".inventory.creative."; final static String INVENTORY_CREATIVE_ARMOR = ".inventory.creative.armor."; @@ -20,7 +25,15 @@ this.plugin = plugin; } - @Override + + @EventHandler + public void onPlayerExpChange(PlayerExpChangeEvent event) { + if (event.getPlayer().getWorld().getName().equalsIgnoreCase("creative")) { + event.setAmount(0); //users don't acummulate xp points in creative mode + } + } + + @EventHandler public void onPlayerChangedWorld(PlayerChangedWorldEvent event) { @@ -87,10 +100,25 @@ public void saveItemStack(Configuration config, String node, ItemStack stack) { - config.set(node + STACK_TYPE, stack.getTypeId() ); - config.set(node + STACK_AMOUNT, stack.getAmount() ); - config.set(node + STACK_DAMAGE, (int)stack.getDurability() ); - config.set(node + STACK_DATA, (int)stack.getData().getData() ); + int type = 0; + int amount = 0; + int damage = 0; + int data = 0; + String enchantment = ""; + + if (stack != null) { + type = stack.getTypeId(); + amount = stack.getAmount(); + damage = stack.getDurability(); + data = stack.getData().getData(); + enchantment = getEnchantmentString(stack); + } + + config.set(node + STACK_TYPE, type ); + config.set(node + STACK_AMOUNT, amount ); + config.set(node + STACK_DAMAGE, damage ); + config.set(node + STACK_DATA, data ); + config.set(node + STACK_ENCHANTMENT, enchantment ); } public ItemStack getItemStack(Configuration config, String node) { @@ -98,10 +126,45 @@ int amount = config.getInt( node + STACK_AMOUNT); short damage = (short) config.getInt(node + STACK_DAMAGE); byte data = (byte) config.getInt(node + STACK_DATA); + String enc = config.getString(node + STACK_ENCHANTMENT ); ItemStack stack = new ItemStack(type,amount,damage,data); stack.setDurability( damage ); //ItemStack constructor with Data value overrides durability + stack.addEnchantments( parseEnchantmentString(enc) ); return stack; } + + public String getEnchantmentString(ItemStack stack) { + StringBuilder sb = new StringBuilder(); + + Map map = stack.getEnchantments(); + for(Enchantment enc : map.keySet() ) { + if (sb.length() > 0) + sb.append(";"); + + Integer level = map.get(enc); + sb.append( enc.getName() ).append("=").append(level); + } + + return sb.toString(); + } + + public Map parseEnchantmentString(String input) { + Map map = new HashMap(); + + if (input.length() == 0) + return map; + + String parts[] = input.split(";"); + for(String part : parts) { + String keyval[] = part.split("="); + + Enchantment enc = Enchantment.getByName( keyval[0] ); + int level = Integer.parseInt( keyval[1]); + map.put(enc, level); + } + + return map; + } }