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

Contents 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 - (show annotations) (download)
Thu Nov 29 20:18:25 2012 UTC (11 years, 5 months ago) by torben
File size: 5037 byte(s)
make enchanted items keep their enchantments when switching to creative
1 package dk.thoerup.bukkit.creativeworld;
2
3 import org.bukkit.*;
4 import org.bukkit.entity.*;
5 import org.bukkit.event.*;
6 import org.bukkit.event.player.*;
7 import org.bukkit.configuration.*;
8 import org.bukkit.inventory.*;
9 import org.bukkit.enchantments.*;
10
11 import java.util.*;
12
13 public class WorldChanged implements Listener {
14 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 final static String STACK_ENCHANTMENT = ".enchantment";
19
20 final static String INVENTORY_CREATIVE = ".inventory.creative.";
21 final static String INVENTORY_CREATIVE_ARMOR = ".inventory.creative.armor.";
22
23 CreativeMain plugin;
24 public WorldChanged(CreativeMain plugin) {
25 this.plugin = plugin;
26 }
27
28
29 @EventHandler
30 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 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 String node = player.getName() + INVENTORY_CREATIVE + i;;
54 //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 String node = player.getName() + INVENTORY_CREATIVE_ARMOR + i;;
61 //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 String node = player.getName() + INVENTORY_CREATIVE + i;;
83 //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 String node = player.getName() + INVENTORY_CREATIVE_ARMOR + i;
92 //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 int type = 0;
104 int amount = 0;
105 int damage = 0;
106 int data = 0;
107 String enchantment = "";
108
109 if (stack != null) {
110 type = stack.getTypeId();
111 amount = stack.getAmount();
112 damage = stack.getDurability();
113 data = stack.getData().getData();
114 enchantment = getEnchantmentString(stack);
115 }
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 config.set(node + STACK_ENCHANTMENT, enchantment );
122 }
123
124 public ItemStack getItemStack(Configuration config, String node) {
125 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 String enc = config.getString(node + STACK_ENCHANTMENT );
130
131 ItemStack stack = new ItemStack(type,amount,damage,data);
132 stack.setDurability( damage ); //ItemStack constructor with Data value overrides durability
133 stack.addEnchantments( parseEnchantmentString(enc) );
134 return stack;
135 }
136
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
170 }

  ViewVC Help
Powered by ViewVC 1.1.20