/[projects]/miscJava/bukkit-minecraft-plugins/HoerupUtils/src/main/java/dk/thoerup/bukkit/hoeruputils/chests/AdvancedChest.java
ViewVC logotype

Contents of /miscJava/bukkit-minecraft-plugins/HoerupUtils/src/main/java/dk/thoerup/bukkit/hoeruputils/chests/AdvancedChest.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1868 - (show annotations) (download)
Mon Nov 5 21:46:57 2012 UTC (11 years, 6 months ago) by torben
File size: 16375 byte(s)
prevent chest from being destroyed by fire
1 package dk.thoerup.bukkit.hoeruputils.chests;
2
3
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Set;
7 import java.util.TreeMap;
8 import java.util.TreeSet;
9
10 import org.bukkit.ChatColor;
11 import org.bukkit.Location;
12 import org.bukkit.Material;
13 import org.bukkit.OfflinePlayer;
14 import org.bukkit.Server;
15 import org.bukkit.World;
16 import org.bukkit.block.Block;
17 import org.bukkit.block.Chest;
18 import org.bukkit.block.DoubleChest;
19 import org.bukkit.command.Command;
20 import org.bukkit.command.CommandExecutor;
21 import org.bukkit.command.CommandSender;
22 import org.bukkit.entity.Player;
23 import org.bukkit.event.EventHandler;
24 import org.bukkit.event.Listener;
25 import org.bukkit.event.block.Action;
26 import org.bukkit.event.block.BlockBreakEvent;
27 import org.bukkit.event.block.BlockBurnEvent;
28 import org.bukkit.event.block.BlockPlaceEvent;
29 import org.bukkit.event.entity.EntityExplodeEvent;
30 import org.bukkit.event.inventory.InventoryCloseEvent;
31 import org.bukkit.event.inventory.InventoryOpenEvent;
32 import org.bukkit.event.player.PlayerInteractEvent;
33 import org.bukkit.inventory.InventoryHolder;
34 import org.bukkit.inventory.ItemStack;
35
36 import dk.thoerup.bukkit.hoeruputils.HoerupUtilsPlugin;
37 import dk.thoerup.bukkit.hoeruputils.Util;
38
39
40
41 public class AdvancedChest implements Listener, CommandExecutor{
42
43 class ItemCount extends TreeMap<Integer,Integer> {
44 private static final long serialVersionUID = 1L;
45 };
46
47 HashMap<String, ItemCount> contentMap = new HashMap<String, ItemCount>();
48
49
50 HashMap<Location,ChestBean> chestMap = new HashMap<Location, ChestBean>();
51
52
53 HoerupUtilsPlugin plugin;
54 Server server;
55
56 public AdvancedChest(HoerupUtilsPlugin plugin, Runnable r) {
57 this.plugin = plugin;
58 server = plugin.getServer();
59 try {
60 loadChests();
61 } catch (Exception e) {
62 e.printStackTrace();
63 //r.run();
64 loadChests();
65 }
66 }
67
68
69 @Override
70 public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
71 if (! (sender instanceof Player) ) {
72 sender.sendMessage("this is not a console command!");
73 return true;
74 }
75
76 Player player = (Player) sender;
77
78 if (args.length == 0) {
79 player.sendMessage("Usage:");
80 player.sendMessage("/chest (status|lock|snitch|remove|addplayer|removeplayer|setowner) [player]");
81 return true;
82 }
83
84
85 Block b = player.getTargetBlock(null, 30);
86
87 if (b.getTypeId() != 54) {
88 player.sendMessage("[Chest] Please look at the chest you want to protect");
89 return true;
90 }
91
92 Location loc = b.getLocation();
93 Location loc2 = getNeighborChest(loc);
94
95 ChestBean chest = chestMap.get(loc);
96 String cmd = args[0].toLowerCase();
97
98 if (cmd.equals("status")) {
99 if (chest != null) {
100 String mode = "";
101 switch (chest.getChestType()) {
102 case ChestBean.LOCKED:
103 mode = "locked";
104 break;
105 case ChestBean.SNITCHING:
106 mode = "snitching";
107 break;
108 default:
109 mode = "unknown ??";
110 }
111
112 player.sendMessage(ChatColor.GREEN + "Chest is a " + mode + " chest owned by " + chest.getOwner());
113 player.sendMessage(ChatColor.GREEN + "Allowed players: " + chest.getModifyPlayers() );
114 } else {
115 player.sendMessage(ChatColor.GREEN + "The chest is not protected");
116 }
117 return true;
118 }
119
120 if (cmd.equals("lock") || cmd.equals("snitch")) {
121 if (chest == null) {
122 chest = createChest(player.getName(), "", loc);
123 if (loc2 != null) {
124 chest.setDoublechest(true);
125 }
126 String modeStr = "";
127 if (cmd.equals("lock")) {
128 chest.setChestType( ChestBean.LOCKED);
129 modeStr = "locked";
130 } else {
131 chest.setChestType( ChestBean.SNITCHING);
132 modeStr = "snitching";
133 }
134 chest.setModifyPlayers("");
135 addChest(loc, chest);
136 player.sendMessage("Chest is now " + modeStr);
137 } else {
138 player.sendMessage("This chest is already protected");
139 }
140 return true;
141 }
142
143 if (cmd.equals("remove")) {
144 if (chest == null) {
145 player.sendMessage("This chest is not protected");
146 return true;
147 }
148 if (! chest.getOwner().equals( player.getName() ) ) {
149 player.sendMessage("You can not remove lock from a chest you don't own");
150 return true;
151 }
152
153 player.sendMessage("[LockedChest] Removing protection from chest");
154 removeChest(loc);
155
156 return true;
157 }
158
159 if (cmd.equals("setowner")) {
160 if (chest == null) {
161 player.sendMessage("This chest is not protected");
162 return true;
163 }
164 if (! chest.getOwner().equals( player.getName() ) ) {
165 player.sendMessage("You can not set new owner of a chest you dont own");
166 return true;
167 }
168 if (args.length != 2) {
169 player.sendMessage("You need to specify which player should own this chest");
170 return true;
171 }
172 OfflinePlayer p2 = server.getOfflinePlayer(args[1]);
173 if ( p2.hasPlayedBefore() == false && p2.isOnline() == false) {
174 player.sendMessage("Unknown user: " + args[1] );
175 return true;
176 }
177 chest.setOwner( p2.getName() );
178 plugin.getDatabase().save( chest );
179 player.sendMessage("ok");
180 return true;
181 }
182
183 if (cmd.equals("addplayer") || cmd.equals("removeplayer")) {
184 if (chest == null) {
185 player.sendMessage("This chest is not protected");
186 return true;
187 }
188 if (! chest.getOwner().equals( player.getName() ) ) {
189 player.sendMessage("You can not add/remove players from a chest you don't own");
190 return true;
191 }
192 if (args.length != 2) {
193 player.sendMessage("You need to specify which player to add or remove");
194 return true;
195 }
196 OfflinePlayer p2 = server.getOfflinePlayer(args[1]);
197 if ( p2.hasPlayedBefore() == false && p2.isOnline() == false) {
198 player.sendMessage("Unknown user: " + args[1] );
199 return true;
200 }
201
202 Set<String> players = Util.stringToSet( chest.getModifyPlayers() );
203 if (cmd.equals("addplayer")) {
204 players.add(p2.getName());
205 } else {
206 players.remove(p2.getName());
207 }
208
209 chest.setModifyPlayers( Util.setToString(players) );
210 plugin.getDatabase().save( chest );
211 player.sendMessage("ok");
212 return true;
213 }
214
215 /*
216 if (chest != null) {
217 if (chest.getOwner().equals(player.getName())) {
218 player.sendMessage("[LockedChest] Removing lock from chest");
219 removeChest(loc);
220 } else {
221 player.sendMessage("[LockedChest] Chest is already protected");
222 }
223
224 return true;
225 }
226
227 chest = createChest(player.getName(), "", loc);
228 if (loc2 != null) {
229 chest.setDoublechest(true);
230 }
231
232 addChest(loc, chest);
233
234
235 player.sendMessage("[LockedChest] Chest is now locked");
236 */
237
238 player.sendMessage("Unknown argument, " + cmd);
239
240 return true;
241 }
242
243 @EventHandler
244 public void onBlockBreak(BlockBreakEvent event) {
245 Location loc = event.getBlock().getLocation();
246 ChestBean chest = chestMap.get(loc);
247 if (chest != null) {
248 if (chest.getOwner().equals(event.getPlayer().getName())) {
249 removeChest(loc);
250 event.getPlayer().sendMessage("[AdvancedChest] The destroyed chest was locked or snitching");
251 } else {
252 event.setCancelled(true);
253 event.getPlayer().sendMessage("You can't destroy that chest");
254 server.getLogger().info( "[AdvancedChest] " + event.getPlayer().getName() + " tried breaking a chest owned by " + chest.getOwner() );
255 }
256 }
257 }
258 public void addChest(Location loc, ChestBean chest) {
259 chestMap.put(loc, chest);
260 if (chest.isDoublechest()) {
261 Location loc2 = getNeighborChest(loc);
262 chestMap.put(loc2, chest);
263 }
264 plugin.getDatabase().save(chest);
265
266 reloadChests();
267
268 }
269
270 void removeChest(Location loc) {
271 ChestBean chest = chestMap.remove(loc);
272 if (chest != null) {
273 if (chest.isDoublechest()){
274 Location loc2 = getNeighborChest(loc);
275 chestMap.remove(loc2);
276 }
277 plugin.getDatabase().delete(chest);
278 }
279 }
280
281 int loadChestsWorker() {
282 List<ChestBean> chestlist = plugin.getDatabase().find( ChestBean.class).findList();
283 for (ChestBean chest : chestlist) {
284 Location loc = getChestLocation(server, chest);
285 chestMap.put(loc, chest);
286
287 if (chest.isDoublechest()) {
288 Location loc2 = getNeighborChest(loc);
289 chestMap.put(loc2, chest);
290 }
291 }
292
293 return chestlist.size();
294 }
295
296 void reloadChests() {
297 chestMap.clear();
298 loadChestsWorker();
299 }
300
301 void loadChests() {
302 int count = loadChestsWorker();
303 server.getLogger().info("[AdvancedChest] loaded " + count + " chests");
304 }
305
306
307 public ChestBean createChest(String owner, String description, Location loc) {
308
309 ChestBean chest = new ChestBean();
310 chest.setOwner(owner);
311 chest.setDescription(description);
312 setChestLocation(chest, loc);
313
314 return chest;
315 }
316
317
318 public void setChestLocation(ChestBean chest, Location loc) {
319 chest.setWorld( loc.getWorld().getName() );
320 chest.setX( loc.getBlockX() );
321 chest.setY( loc.getBlockY() );
322 chest.setZ( loc.getBlockZ() );
323 }
324
325 public Location getChestLocation(Server server, ChestBean chest) {
326 World wrld = server.getWorld(chest.getWorld());
327 return new Location(wrld,chest.getX(),chest.getY(),chest.getZ());
328 }
329
330
331 /*
332 void saveChests() {
333
334 }*/
335
336 Location getNeighborChest(Location loc) {
337 World world = loc.getWorld();
338
339 Location target = new Location(world, loc.getX()+1, loc.getY(), loc.getZ() );
340 if (world.getBlockAt(target).getType() == Material.CHEST )
341 return target;
342
343 target = new Location(world, loc.getX()-1, loc.getY(), loc.getZ() );
344 if (world.getBlockAt(target).getType() == Material.CHEST )
345 return target;
346
347 target = new Location(world, loc.getX(), loc.getY(), loc.getZ() +1);
348 if (world.getBlockAt(target).getType() == Material.CHEST )
349 return target;
350
351 target = new Location(world, loc.getX(), loc.getY(), loc.getZ() -1);
352 if (world.getBlockAt(target).getType() == Material.CHEST )
353 return target;
354
355 return null;
356 }
357
358
359 Location getChestLocation(InventoryHolder holder) {
360 Location loc;
361 if ( holder instanceof Chest) {
362 loc = ( (Chest)holder).getLocation();
363 } else {
364 loc = ( (DoubleChest)holder).getLocation();
365 }
366
367 loc.setX( loc.getBlockX() ); //round to integer, since double chests apparently are placed at pos + 0.5
368 loc.setZ( loc.getBlockZ() ); // -- // --
369
370 return loc;
371 }
372
373 @EventHandler
374 public void onChestPlaced(BlockPlaceEvent event) {
375 Block block = event.getBlock();
376
377 if (block.getType() != Material.CHEST) {
378 return;
379 }
380
381 Location chestloc = getNeighborChest( block.getLocation() );
382 if (chestloc != null) {
383 ChestBean chest = chestMap.get(chestloc);
384
385 if (chest != null) { //the neighbor is a locked chest
386
387
388 chest.setDoublechest(true);
389 addChest(chestloc, chest);
390
391
392 event.getPlayer().sendMessage( "[AdvancedChest] Chest has been expanded" );
393 }
394
395 }
396 }
397
398
399 @EventHandler
400 public void onChestExplode(EntityExplodeEvent event) {
401 for (Block b : event.blockList() ) {
402 ChestBean chest = chestMap.get( b.getLocation() );
403 if (chest != null) {
404 server.getLogger().info( "[AdvancedChest] Prevented an explosion from destroying chest owned by " + chest.getOwner() );
405 event.setCancelled( true );
406 return;
407 }
408 }
409 }
410
411 @EventHandler
412 public void onChestBurn(BlockBurnEvent event) {
413 ChestBean chest = chestMap.get( event.getBlock().getLocation() );
414 if (chest != null) {
415 server.getLogger().info( "[AdvancedChest] prevented a fire from destrying chest owned by " + chest.getOwner() );
416 event.setCancelled( true);
417 }
418 }
419
420 // prevent a user from opening a chest
421 @EventHandler
422 public void onChestInteract(PlayerInteractEvent event) {
423 if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
424 Block b = event.getClickedBlock();
425
426 if (b.getType() == Material.CHEST) {
427
428 Location loc = b.getLocation();
429
430 ChestBean chest = chestMap.get( loc );
431 if (chest == null) {
432 return; //chest not surveyed by this plugin
433 }
434
435 if (chest.getChestType() != ChestBean.LOCKED ) {
436 return; //this is not a locked chests
437 }
438
439 Player player = (Player) event.getPlayer();
440 if (player.getName().equals(chest.getOwner() )) {
441 return; //chest is opened by it's owner
442 }
443
444 Set<String> players = Util.stringToSet( chest.getModifyPlayers() );
445 if ( players.contains(player.getName()) ) {
446 return; //this player is on the whitelist so he may open
447 }
448
449
450 server.getLogger().info( "[AdvancedChest] " + event.getPlayer().getName() + " tried opening a chest owned by " + chest.getOwner() );
451 player.sendMessage( ChatColor.BLUE + "Sorry but this chest is locked !");
452 event.setCancelled(true);
453 }
454 }
455 }
456
457 @EventHandler
458 public void onChestOpen(InventoryOpenEvent event) {
459
460 if (! (event.getPlayer() instanceof Player)) {
461 return;
462 }
463
464
465
466 InventoryHolder holder = event.getInventory().getHolder();
467 if (holder instanceof Chest || holder instanceof DoubleChest) {
468 Location loc = getChestLocation(holder);
469
470 ChestBean chest = chestMap.get( loc );
471 if (chest == null) {
472 return; //chest not surveyed by this plugin
473 }
474
475 if (chest.getChestType() != ChestBean.SNITCHING) {
476 return; // not a snitching chest
477 }
478
479
480 Player player = (Player) event.getPlayer();
481 if (player.getName().equals(chest.getOwner() )) {
482 return; //chest is owned by it's own player
483 }
484
485 Set<String> players = Util.stringToSet( chest.getModifyPlayers() );
486 if ( players.contains(player.getName()) ) {
487 return; //this player is on the whitelist so he may open
488 }
489
490
491 ItemCount contents = countItems( event.getInventory().getContents() );
492
493 contentMap.put(player.getName(), contents );
494 }
495 }
496
497 @EventHandler
498 public void onChestClose(InventoryCloseEvent event) {
499 if (! (event.getPlayer() instanceof Player)) {
500 return;
501 }
502
503
504 InventoryHolder holder = event.getInventory().getHolder();
505 if (holder instanceof Chest || holder instanceof DoubleChest) {
506 Location loc = getChestLocation(holder);
507 ChestBean chest = chestMap.get(loc);
508
509 if (chest == null) { //chest was not a snitching chest
510 return;
511 }
512
513 if (chest.getChestType() != ChestBean.SNITCHING) {
514 return; // not a snitching chest
515 }
516
517
518 OfflinePlayer owner = server.getOfflinePlayer( chest.getOwner() );
519
520
521 Player player = (Player) event.getPlayer();
522
523 ItemCount savedContent = contentMap.get( player.getName() );
524
525 if (savedContent == null) {
526 return;
527 }
528
529 contentMap.remove( player.getName() );
530
531 ItemCount content = countItems( event.getInventory().getContents() );
532
533 Set<Integer> combinedKeyset = new TreeSet<Integer>();
534 combinedKeyset.addAll( savedContent.keySet() );
535 combinedKeyset.addAll( content.keySet() );
536
537 for (Integer item : combinedKeyset ) {
538 Integer savedcount = savedContent.get(item);
539 Integer count = content.get(item);
540
541 if (savedcount == null)
542 savedcount = 0;
543 if (count == null)
544 count = 0;
545
546
547 int diff = Math.abs( savedcount - count);
548
549 if (diff > 0) {
550 String material = Material.getMaterial(item).name();
551 String msg = null;
552
553 if (count > savedcount) {
554 msg = player.getName() + " added " + diff + " units of " + material + "(" +item + ") to " + owner.getName() + "'s chest at " + loc.getWorld().getName() + "," + loc.getBlockX() + "," +loc.getBlockY() + "," + loc.getBlockZ();
555 } else { //(count < savedcount)
556 msg = player.getName() + " removed " + diff + " units of " + material + "(" +item + ") from " + owner.getName() + "'s chest at " + loc.getWorld().getName() + "," + loc.getBlockX() + "," +loc.getBlockY() + "," + loc.getBlockZ();
557 }
558
559
560 server.getLogger().info( "[AdvancedChest]" + msg);
561 plugin.getMessageWrapper().sendMessage("system", owner, msg);
562 }
563
564 }
565
566
567 }
568 }
569
570 ItemCount countItems(ItemStack[] input) {
571 ItemCount output = new ItemCount();
572 for (int i=0; i<input.length; i++) {
573 ItemStack current = input[i];
574 if (current == null)
575 continue;
576
577 int type = current.getTypeId();
578
579 Integer amount = output.get(type);
580 if (amount == null)
581 amount = 0;
582
583 output.put(type, amount + current.getAmount() );
584 }
585 return output;
586 }
587 /*
588 ItemStack[] cloneItemStacks(ItemStack[] input) {
589 ItemStack[] output = new ItemStack[ input.length ];
590 for (int i=0; i<input.length; i++) {
591 if (input[i] != null) {
592 output[i] = input[i].clone();
593 } else {
594 output[i] = new ItemStack(0, 0);
595 }
596 }
597 return output;
598 }*/
599
600
601 }

  ViewVC Help
Powered by ViewVC 1.1.20