/[projects]/miscJava/bukkit-minecraft-plugins/CreativeWorld/src/main/java/dk/thoerup/bukkit/creativeworld/WorldChanged.java
ViewVC logotype

Annotation of /miscJava/bukkit-minecraft-plugins/CreativeWorld/src/main/java/dk/thoerup/bukkit/creativeworld/WorldChanged.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1875 - (hide annotations) (download)
Thu Nov 29 20:18:25 2012 UTC (11 years, 6 months ago) by torben
File size: 5037 byte(s)
make enchanted items keep their enchantments when switching to creative
1 torben 1657 package dk.thoerup.bukkit.creativeworld;
2    
3     import org.bukkit.*;
4     import org.bukkit.entity.*;
5 torben 1681 import org.bukkit.event.*;
6 torben 1657 import org.bukkit.event.player.*;
7     import org.bukkit.configuration.*;
8     import org.bukkit.inventory.*;
9 torben 1875 import org.bukkit.enchantments.*;
10 torben 1657
11 torben 1875 import java.util.*;
12    
13 torben 1681 public class WorldChanged implements Listener {
14 torben 1658 final static String STACK_TYPE = ".type";
15     final static String STACK_AMOUNT = ".amount";
16     final static String STACK_DAMAGE = ".damage";
17     final static String STACK_DATA = ".data";
18 torben 1875 final static String STACK_ENCHANTMENT = ".enchantment";
19 torben 1657
20 torben 1658 final static String INVENTORY_CREATIVE = ".inventory.creative.";
21     final static String INVENTORY_CREATIVE_ARMOR = ".inventory.creative.armor.";
22    
23 torben 1657 CreativeMain plugin;
24     public WorldChanged(CreativeMain plugin) {
25     this.plugin = plugin;
26     }
27    
28 torben 1682
29 torben 1681 @EventHandler
30 torben 1682 public void onPlayerExpChange(PlayerExpChangeEvent event) {
31     if (event.getPlayer().getWorld().getName().equalsIgnoreCase("creative")) {
32     event.setAmount(0); //users don't acummulate xp points in creative mode
33     }
34     }
35    
36     @EventHandler
37 torben 1657 public void onPlayerChangedWorld(PlayerChangedWorldEvent event) {
38    
39    
40     Player player = event.getPlayer();
41    
42     System.out.println( player.getName() + " : " + event.getFrom().getName() + " -> " + player.getWorld().getName() );
43    
44     Configuration config = plugin.getConfig();
45    
46     if (player.getWorld().getName().equalsIgnoreCase("creative") ) {
47     player.sendMessage(ChatColor.YELLOW + "You are now in creative world - have fun");
48     config.set( player.getName() + ".iscreative", true);
49    
50     PlayerInventory inv = player.getInventory();
51    
52     for (int i=0; i<inv.getSize(); i++) {
53 torben 1658 String node = player.getName() + INVENTORY_CREATIVE + i;;
54 torben 1657 //config.set( node, inv.getItem(i) );
55     saveItemStack(config, node, inv.getItem(i) );
56     }
57    
58     ItemStack armor[] = inv.getArmorContents();
59     for (int i=0; i<armor.length; i++) {
60 torben 1658 String node = player.getName() + INVENTORY_CREATIVE_ARMOR + i;;
61 torben 1657 //config.set( node, armor[i] );
62     saveItemStack(config, node, armor[i] );
63     }
64    
65     plugin.saveConfig();
66    
67     inv.clear();
68    
69     player.setGameMode( GameMode.CREATIVE );
70    
71     } else if (event.getFrom().getName().equalsIgnoreCase("creative") ) {
72     player.sendMessage(ChatColor.YELLOW + "You are now in survival world - watch out !!!");
73     config.set( player.getName() + ".iscreative", false);
74     player.setGameMode( GameMode.SURVIVAL );
75    
76     PlayerInventory inv = player.getInventory();
77     inv.clear();
78    
79     ItemStack items[] = new ItemStack[ inv.getSize() ];
80    
81     for (int i=0; i<inv.getSize(); i++) {
82 torben 1658 String node = player.getName() + INVENTORY_CREATIVE + i;;
83 torben 1657 //items[i] = config.getItemStack(node);
84     items[i] = getItemStack(config, node);
85     }
86    
87    
88    
89     ItemStack armor[] = new ItemStack[ inv.getArmorContents().length];
90     for (int i=0; i<armor.length; i++) {
91 torben 1658 String node = player.getName() + INVENTORY_CREATIVE_ARMOR + i;
92 torben 1657 //armor[i] = config.getItemStack(node);
93     armor[i] = getItemStack(config, node);
94     }
95    
96     inv.setContents( items );
97     inv.setArmorContents( armor );
98     }
99     }
100    
101    
102     public void saveItemStack(Configuration config, String node, ItemStack stack) {
103 torben 1713 int type = 0;
104     int amount = 0;
105     int damage = 0;
106     int data = 0;
107 torben 1875 String enchantment = "";
108 torben 1713
109     if (stack != null) {
110     type = stack.getTypeId();
111     amount = stack.getAmount();
112     damage = stack.getDurability();
113     data = stack.getData().getData();
114 torben 1875 enchantment = getEnchantmentString(stack);
115 torben 1713 }
116    
117     config.set(node + STACK_TYPE, type );
118     config.set(node + STACK_AMOUNT, amount );
119     config.set(node + STACK_DAMAGE, damage );
120     config.set(node + STACK_DATA, data );
121 torben 1875 config.set(node + STACK_ENCHANTMENT, enchantment );
122 torben 1657 }
123    
124     public ItemStack getItemStack(Configuration config, String node) {
125 torben 1658 int type = config.getInt( node + STACK_TYPE);
126     int amount = config.getInt( node + STACK_AMOUNT);
127     short damage = (short) config.getInt(node + STACK_DAMAGE);
128     byte data = (byte) config.getInt(node + STACK_DATA);
129 torben 1875 String enc = config.getString(node + STACK_ENCHANTMENT );
130 torben 1657
131 torben 1663 ItemStack stack = new ItemStack(type,amount,damage,data);
132     stack.setDurability( damage ); //ItemStack constructor with Data value overrides durability
133 torben 1875 stack.addEnchantments( parseEnchantmentString(enc) );
134 torben 1663 return stack;
135 torben 1657 }
136 torben 1875
137     public String getEnchantmentString(ItemStack stack) {
138     StringBuilder sb = new StringBuilder();
139    
140     Map<Enchantment,Integer> map = stack.getEnchantments();
141     for(Enchantment enc : map.keySet() ) {
142     if (sb.length() > 0)
143     sb.append(";");
144    
145     Integer level = map.get(enc);
146     sb.append( enc.getName() ).append("=").append(level);
147     }
148    
149     return sb.toString();
150     }
151    
152     public Map<Enchantment,Integer> parseEnchantmentString(String input) {
153     Map<Enchantment,Integer> map = new HashMap<Enchantment,Integer>();
154    
155     if (input.length() == 0)
156     return map;
157    
158     String parts[] = input.split(";");
159     for(String part : parts) {
160     String keyval[] = part.split("=");
161    
162     Enchantment enc = Enchantment.getByName( keyval[0] );
163     int level = Integer.parseInt( keyval[1]);
164     map.put(enc, level);
165     }
166    
167     return map;
168     }
169 torben 1657
170     }

  ViewVC Help
Powered by ViewVC 1.1.20