Advertisement
Guest User

BlockListener

a guest
May 10th, 2016
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 63.99 KB | None | 0 0
  1. package me.corperateraider.myworld;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7.  
  8. import me.corperateraider.dynmap.DynMap;
  9. import me.corperateraider.generator.Generator;
  10. import me.corperateraider.generator.MapsGenerator;
  11. import me.corperateraider.generator.MathHelper;
  12. import me.corperateraider.myworld.Prison.Prisoner;
  13. import me.corperateraider.recipes.RecipeManager;
  14. import me.corperateraider.recipes.XBlock;
  15. import me.corperateraider.reload.Jena;
  16. import me.corperateraider.reload.SpawnBuilder;
  17. import me.corperateraider.reload.SpawnManager;
  18. import me.corperateraider.weather.Weather;
  19. import net.minecraft.server.v1_7_R1.ChunkProviderServer;
  20.  
  21. import org.bukkit.Bukkit;
  22. import org.bukkit.Chunk;
  23. import org.bukkit.GameMode;
  24. import org.bukkit.Location;
  25. import org.bukkit.Material;
  26. import org.bukkit.SkullType;
  27. import org.bukkit.Statistic;
  28. import org.bukkit.World;
  29. import org.bukkit.block.Beacon;
  30. import org.bukkit.block.Block;
  31. import org.bukkit.block.BlockFace;
  32. import org.bukkit.block.BlockState;
  33. import org.bukkit.block.BrewingStand;
  34. import org.bukkit.block.Chest;
  35. import org.bukkit.block.Dispenser;
  36. import org.bukkit.block.Dropper;
  37. import org.bukkit.block.Furnace;
  38. import org.bukkit.block.Hopper;
  39. import org.bukkit.block.Sign;
  40. import org.bukkit.craftbukkit.v1_7_R1.CraftWorld;
  41. import org.bukkit.craftbukkit.v1_7_R1.util.LongHash;
  42. import org.bukkit.entity.Entity;
  43. import org.bukkit.entity.EntityType;
  44. import org.bukkit.entity.Player;
  45. import org.bukkit.entity.Skeleton;
  46. import org.bukkit.entity.Skeleton.SkeletonType;
  47. import org.bukkit.event.Event;
  48. import org.bukkit.event.EventHandler;
  49. import org.bukkit.event.EventPriority;
  50. import org.bukkit.event.Listener;
  51. import org.bukkit.event.block.BlockBreakEvent;
  52. import org.bukkit.event.block.BlockPlaceEvent;
  53. import org.bukkit.event.entity.CreatureSpawnEvent;
  54. import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
  55. import org.bukkit.event.entity.EntityExplodeEvent;
  56. import org.bukkit.event.inventory.CraftItemEvent;
  57. import org.bukkit.event.inventory.InventoryClickEvent;
  58. import org.bukkit.event.inventory.PrepareItemCraftEvent;
  59. import org.bukkit.event.player.AsyncPlayerChatEvent;
  60. import org.bukkit.event.player.PlayerInteractEvent;
  61. import org.bukkit.event.player.PlayerMoveEvent;
  62. import org.bukkit.event.server.ServerListPingEvent;
  63. import org.bukkit.event.vehicle.VehicleMoveEvent;
  64. import org.bukkit.event.world.StructureGrowEvent;
  65. import org.bukkit.event.world.WorldSaveEvent;
  66. import org.bukkit.help.HelpTopic;
  67. import org.bukkit.inventory.ItemStack;
  68. import org.bukkit.inventory.meta.SkullMeta;
  69. import org.bukkit.metadata.FixedMetadataValue;
  70. import org.bukkit.potion.PotionEffect;
  71. import org.bukkit.potion.PotionEffectType;
  72. import org.bukkit.scoreboard.DisplaySlot;
  73. import org.bukkit.scoreboard.Objective;
  74. import org.bukkit.scoreboard.Score;
  75. import org.bukkit.scoreboard.Scoreboard;
  76. import org.bukkit.util.CachedServerIcon;
  77. import org.bukkit.util.Vector;
  78.  
  79. import converter.Converter;
  80. import converter.MetaString;
  81. import converter.StringCompare;
  82.  
  83. public class BlockListener extends MathHelper implements Listener {
  84.    
  85.     public static String eventByKing="";
  86.     Location zero;
  87.     World myworld;
  88.     CachedServerIcon[] icon4season;
  89.     CachedServerIcon icon(){
  90.         return icon4season[((Weather.jetztTime()+32)/64)%4];
  91.     }
  92.    
  93.     public BlockListener(Plugin plugin) throws Exception {
  94.         plugin.getServer().getPluginManager().registerEvents(this, plugin);
  95.         zero = new Location(Bukkit.getWorld(Plugin.myWorldName), 0, 4800, 0);
  96.         icon4season = new CachedServerIcon[]{
  97.         Bukkit.loadServerIcon(new File(plugin.getDataFolder(), "icon.png")),
  98.         Bukkit.loadServerIcon(new File(plugin.getDataFolder(), "icon herbst.png")),
  99.         Bukkit.loadServerIcon(new File(plugin.getDataFolder(), "icon winter.png")),
  100.         Bukkit.loadServerIcon(new File(plugin.getDataFolder(), "icon spring.png"))
  101.         };
  102.     }
  103.    
  104.     long time;
  105.     public void onTimeDoWitherkill(){
  106.         if(time<System.currentTimeMillis()){   
  107.             time = System.currentTimeMillis()+1000;
  108.             Location z = new Location(myworld=Bukkit.getWorld(Plugin.myWorldName), 0, 4800, 0);
  109.             for(Entity e:z.getWorld().getEntities()){
  110.                 if((e.getType()==EntityType.WITHER || e.getType()==EntityType.ENDER_DRAGON) && disSquaredBorderY(z, trueLocation(e.getLocation()), 1250)){
  111.                     e.remove();
  112.                     Bukkit.broadcastMessage(Plugin.prefix+"The magical shield killed a "+(e.getType()==EntityType.ENDER_DRAGON?"dragon":"wither")+"...");
  113.                 }
  114.             }
  115.         }
  116.     }
  117.    
  118.     public static boolean disSquaredBorderY(Location l1, Location important, int border){
  119.         return important.getY()>border && sq(l1.getX()-important.getX())+sq(l1.getZ()-important.getZ())<25E6;
  120.     }
  121.    
  122.     /*@EventHandler(priority = EventPriority.HIGH)
  123.     public void onWebsiteRequest(HTTPRequestEvent event) throws InterruptedException{
  124.        
  125.         String req = event.getRequest().split(" ")[1];
  126.        
  127.         if(req.equals("/")){
  128.             req="/index.html";
  129.         } else if(req.startsWith("/_")){
  130.             DynMap.answer(event);
  131.             return;
  132.         }
  133.        
  134.         File f = new File(Plugin.instance.getDataFolder()+"/WWW"+req);
  135.         if(f.isDirectory()){
  136.             f = new File(f, "index.html");
  137.         }
  138.         if(f.exists() && !f.isDirectory()){
  139.             try {
  140.                 event.setImage(IOUtils.toByteArray(new FileInputStream(f)));
  141.                 if(f.getName().endsWith(".html")){
  142.                     event.setContentType("text/html");
  143.                 } else event.setContentType("* / *");
  144.             } catch (IOException e) {
  145.                 e.printStackTrace();
  146.             }
  147.         } else {
  148.             System.out.println("File not found: \""+req+"\" '"+f.getAbsolutePath()+"'");
  149.         }
  150.     }*/
  151.    
  152.     @EventHandler(priority = EventPriority.HIGH)
  153.     public void onChunkload(org.bukkit.event.world.ChunkLoadEvent event){
  154.         controlAnimals(event.getChunk());
  155.         if(!event.isNewChunk()){
  156.             Weather.load(event.getChunk(), true);
  157.         } else {
  158.             Weather.todo.add(new Weather.Remember(event.getChunk(), System.currentTimeMillis()+10000));
  159.         }
  160.     }
  161.    
  162.     public static void controlAnimals(Chunk ch){
  163.         /*int a=c.getEntities().length;
  164.         if(a>4){
  165.             for(Entity e:c.getEntities()){
  166.                 e.remove();
  167.                 if(a--<4)break;
  168.             }
  169.         }*/
  170.        
  171.         for(Chunk c:Plugin.world.getLoadedChunks()){
  172.             if(c.getEntities().length>5){
  173.                 for(Entity e:c.getEntities()){
  174.                     e.remove();
  175.                 }
  176.             }
  177.         }
  178.     }
  179.    
  180.     @EventHandler(priority = EventPriority.HIGH)
  181.     public void onChunkdeload(org.bukkit.event.world.ChunkUnloadEvent event){
  182.        
  183.         if(new File("C:/Users/Antonio").exists()) return;
  184.        
  185.         World world;
  186.         Chunk c = event.getChunk();
  187.         if((world=event.getWorld())!=Plugin.world){
  188.             if(!c.getBlock(0, 0, 0).hasMetadata(MetaString.save)){// der Chunk wurde durch einen Spieler verändert
  189.                 event.setCancelled(true);
  190.                 try {
  191.                     ChunkProviderServer cps = ((CraftWorld)world).getHandle().chunkProviderServer;
  192.                     cps.unloadQueue.remove(c.getX(), c.getZ());
  193.                     cps.chunks.remove(LongHash.toLong(c.getX(), c.getZ()));
  194.                 } catch(Exception e){
  195.                     Bukkit.broadcastMessage("§4Unload error! See log! @"+world.getName());
  196.                     e.printStackTrace();
  197.                 }
  198.             }
  199.         } else {
  200.             Position pc = new Position(BlockListener.trueLocation(new Location(world, c.getX()*16+8, 127, c.getZ()*16+8)));
  201.             boolean ok=false;
  202.             s:for(Player p:world.getPlayers()){        
  203.                 if(new Position(trueLocation(p.getLocation())).distSQy(pc, 4)<62500){
  204.                     ok=true;
  205.                     break s;
  206.                 }
  207.             }
  208.             if(!ok){// der Chunk darf ungeloaded werden ^^
  209.                 Weather.unload(event.getChunk());
  210.                 if(!c.getBlock(0, 0, 0).hasMetadata(MetaString.save)){// der Chunk wurde durch einen Spieler verändert
  211.                     event.setCancelled(true);
  212.                     try {
  213.                         ChunkProviderServer cps = ((CraftWorld)world).getHandle().chunkProviderServer;
  214.                         cps.unloadQueue.remove(c.getX(), c.getZ());
  215.                         cps.chunks.remove(LongHash.toLong(c.getX(), c.getZ()));
  216.                     } catch(Exception e){
  217.                         Bukkit.broadcastMessage("§4Unload error! See log! @"+world.getName());
  218.                         e.printStackTrace();
  219.                     }
  220.                 }
  221.                 // sonst mach einfach weiter :)
  222.             } else {
  223.                 event.setCancelled(true);
  224.             }
  225.         }
  226.     }
  227.    
  228.     @EventHandler(priority = EventPriority.HIGH)
  229.     public void onPlayerLeaveServer(org.bukkit.event.player.PlayerQuitEvent event){// logout
  230.         Player p = event.getPlayer();
  231.         event.setQuitMessage(Rank.getQuitMessage(p.getName()));
  232.         if(Plugin.isFlying(p.getName())){
  233.             p.teleport(Plugin.isFlying.get(p.getName()));
  234.             Plugin.isFlying.remove(p.getName());
  235.         }
  236.         Plugin.removeAfk(event.getPlayer().getName());
  237.         logIn.put(p.getName(), 100);
  238.     }
  239.    
  240.     @EventHandler(priority = EventPriority.HIGH)
  241.     public void onEating(org.bukkit.event.player.PlayerItemConsumeEvent event){
  242.         RecipeManager.event(event);
  243.     }
  244.    
  245.     /*@EventHandler(priority = EventPriority.HIGH)
  246.     public void onHoldingItem(org.bukkit.event.player.PlayerItemHeldEvent event){
  247.         RecipeManager.event(event);
  248.     }*/
  249.    
  250.     @SuppressWarnings("deprecation")
  251.     @EventHandler(priority = EventPriority.HIGH)
  252.     public void onSneaking(org.bukkit.event.player.PlayerToggleSneakEvent event){
  253.         if(Plugin.beta && event.getPlayer().getItemInHand()!=null && event.getPlayer().getItemInHand().getType()!=Material.AIR && event.getPlayer().getName().equalsIgnoreCase("Miner952x")){
  254.             ItemStack s = event.getPlayer().getItemInHand();
  255.             event.getPlayer().sendMessage(s.getTypeId()+":"+s.getData().getData()+", "+s.getDurability());
  256.         }
  257.         RecipeManager.event(event);
  258.     }
  259.    
  260.     @EventHandler(priority = EventPriority.HIGH)
  261.     public void onPrepareItemCraft(PrepareItemCraftEvent event){
  262.         RecipeManager.event(event);
  263.     }
  264.    
  265.     @EventHandler(priority = EventPriority.HIGH)
  266.     public void onItemMove(org.bukkit.event.inventory.InventoryClickEvent event){
  267.         RecipeManager.event(event);
  268.     }
  269.    
  270.     @EventHandler(priority = EventPriority.HIGH)
  271.     public void onCraftItem(CraftItemEvent event){
  272.         RecipeManager.event(event);
  273.     }
  274.    
  275.     @EventHandler(priority = EventPriority.HIGHEST)
  276.     public void onInventoryClick(InventoryClickEvent e){
  277.         // überprüfe die eigenen Blöcke...
  278.         if(XBlock.cancelInventoryClick(e.getWhoClicked(), e.getInventory(), e)){
  279.             e.setCancelled(true);
  280.         }
  281.     }
  282.    
  283.     @EventHandler(priority = EventPriority.HIGHEST)
  284.     public void onInventoryClose(org.bukkit.event.inventory.InventoryCloseEvent e){
  285.         // überprüfe die eigenen Blöcke... -> abspeichern :)
  286.         XBlock.closeInventory(e.getPlayer(), e.getInventory(), e);
  287.     }
  288.    
  289.     @EventHandler(priority = EventPriority.HIGHEST)
  290.     public void onInventoryInteract(org.bukkit.event.inventory.InventoryInteractEvent e){
  291.         // überprüfe die eigenen Blöcke... -> abspeichern :)
  292.         Bukkit.broadcastMessage(e.getEventName()+" "+e.getResult().name());
  293.     }
  294.    
  295.     @EventHandler(priority = EventPriority.HIGH)
  296.     public void onReleaseUnknownCommand(org.bukkit.event.player.PlayerCommandPreprocessEvent event){
  297.         if(!event.isCancelled() && event.getPlayer().getWorld()==Plugin.world){
  298.             String command;
  299.             if(Bukkit.getHelpMap().getHelpTopic(command=event.getMessage().split(" ")[0])==null){
  300.                
  301.                 int min = 10000, res;
  302.                 boolean multi=false;
  303.                 HelpTopic topic=null;
  304.                 String result="", name;
  305.                 for(HelpTopic top:Bukkit.getHelpMap().getHelpTopics()){
  306.                     if((res=StringCompare.computeLevenshteinDistance(command, name=top.getName()))<min){
  307.                         min=res;
  308.                         result=name;
  309.                         multi=false;
  310.                         topic=top;
  311.                     } else if(min==res){
  312.                         result+=" "+name;
  313.                         multi=true;
  314.                     }
  315.                 }
  316.                 if(multi){
  317.                     event.getPlayer().sendMessage("§cNo command called §f"+command+"§c aviable. What about these?\n   §f"+result);
  318.                 } else {
  319.                     event.getPlayer().sendMessage("§cNo command called §f"+command+"§c aviable. What about '§f"+result+"§c'?\n   Info: §f"+topic.getShortText());
  320.                 }
  321.                 event.setCancelled(true);
  322.             }
  323.         }
  324.     }
  325.    
  326.     @SuppressWarnings("deprecation")
  327.     @EventHandler(priority = EventPriority.HIGH)
  328.     public void onClick(PlayerInteractEvent event){
  329.        
  330.         onTimeDoWitherkill();
  331.        
  332.         if(event.getPlayer().getWorld()!=myworld && event.getClickedBlock().getTypeId()!=5) return;
  333.        
  334.         Player p = event.getPlayer();
  335.        
  336.         Block b = event.getClickedBlock();
  337.         switch(event.getAction()){
  338.         case LEFT_CLICK_AIR:
  339.             break;
  340.         case LEFT_CLICK_BLOCK:
  341.            
  342.             if(XBlock.cancelLeftClick(b, p, event)){
  343.                 event.setCancelled(true);
  344.                 return;
  345.             }
  346.            
  347.             int k, bid;
  348.             if((bid=b.getTypeId())==41){// auf Goldblock -> entweder Gold aus Hand in Bank einlagern oder von Bank abheben
  349.                 if(p.getItemInHand()==null || p.getItemInHand().getTypeId()==0){// nichts, hebe also Geld ab
  350.                     if(p.isSneaking()){// einzellnes Nugget
  351.                         if((k = (int) Bank.getBilance(p))>0){
  352.                             Bank.substract(p.getName().toLowerCase(), 1);
  353.                             p.getInventory().addItem(new ItemStack(371, 1));
  354.                         } else Bank.sendStatus(p);
  355.                     } else {// alles oder 64
  356.                         if((k = (int) Bank.getBilance(p))>63){
  357.                             Bank.substract(p.getName().toLowerCase(), 64);
  358.                             p.getInventory().addItem(new ItemStack(371, 64));
  359.                         } else {
  360.                             Bank.substract(p.getName().toLowerCase(), k);
  361.                             p.getInventory().addItem(new ItemStack(371, k));
  362.                         }
  363.                     }
  364.                 }
  365.             } else if(bid==121){
  366.                 // Drachenspawning :D
  367.                 SpawnManager.checkDragon(myworld, p, b.getX(), b.getY(), b.getZ());
  368.             }
  369.             break;
  370.         case PHYSICAL:
  371.             break;
  372.         case RIGHT_CLICK_AIR:
  373.            
  374.             if(p.getItemInHand().getType()==Material.MONSTER_EGG && p.getGameMode()==GameMode.CREATIVE){
  375.                 Location loc = p.getLocation();
  376.                 p.getWorld().regenerateChunk(loc.getBlockX()/16, loc.getBlockZ()/16);
  377.             }
  378.             break;
  379.         case RIGHT_CLICK_BLOCK:
  380.            
  381.             if(XBlock.cancelRightClick(b, p, event)){
  382.                 event.setCancelled(true);
  383.                 return;
  384.             }
  385.            
  386.             //if(p.getItemInHand().getType()==Material.WATER_BUCKET){ sinnvoll? vllt xD ehr wohl nicht, oder? naja ^^
  387.             //  b.getWorld().getBlockAt(event.getBlockFace().getModX(),event.getBlockFace().getModY(),event.getBlockFace().getModZ()).setType(Material.WATER);
  388.             //  return;
  389.             //}
  390.            
  391.             bid = b.getTypeId();
  392.             if(bid==41){// auf Goldblock -> Gold in Bank einlagern...
  393.                 if(p.getItemInHand()==null || p.getItemInHand().getTypeId()==0){
  394.                    
  395.                     // lagere alles! ein
  396.                    
  397.                     Bank.add(p.getName().toLowerCase(), (10000-Plugin.remove(p.getInventory(), Material.GOLD_BLOCK, 10000, (short) 0, null))*81);
  398.                     Bank.add(p.getName().toLowerCase(), (10000-Plugin.remove(p.getInventory(), Material.GOLD_INGOT, 10000, (short) 0, null))* 9);
  399.                     Bank.add(p.getName().toLowerCase(), (10000-Plugin.remove(p.getInventory(), Material.GOLD_NUGGET,10000, (short) 0, null))* 1);
  400.                    
  401.                     Bank.sendStatus(p);
  402.                    
  403.                     p.updateInventory();
  404.                    
  405.                 } else if((k=p.getItemInHand().getTypeId())==41){
  406.                    
  407.                     if(p.isSneaking()){// nur die Hand
  408.                         int amount = p.getItemInHand().getAmount();
  409.                         Bank.add(p.getName().toLowerCase(), (amount-Plugin.remove(p.getInventory(), Material.GOLD_BLOCK, amount, (short) 0, p.getItemInHand()))* 81);
  410.                     } else {// alles :)
  411.                         Bank.add(p.getName().toLowerCase(), (10000-Plugin.remove(p.getInventory(), Material.GOLD_BLOCK, 10000, (short) 0, p.getItemInHand()))* 81);
  412.                     }
  413.                    
  414.                     Bank.sendStatus(p);
  415.  
  416.                     p.updateInventory();
  417.                    
  418.                 } else if((k=p.getItemInHand().getTypeId())==266 && p.getItemInHand().getDurability()==0){// Barren in der Hand...
  419.                    
  420.                     if(p.isSneaking()){// nur die Hand
  421.                         int amount = p.getItemInHand().getAmount();
  422.                         Bank.add(p.getName().toLowerCase(), (amount-Plugin.remove(p.getInventory(), Material.GOLD_INGOT, amount, (short) 0, null))* 9);
  423.                     } else {// alles :)
  424.                         Bank.add(p.getName().toLowerCase(), (10000-Plugin.remove(p.getInventory(), Material.GOLD_INGOT, 10000, (short) 0, null))* 9);
  425.                     }
  426.                    
  427.                     Bank.sendStatus(p);
  428.  
  429.                     p.updateInventory();
  430.                    
  431.                 } else if(k==371){// nugget in der Hand...
  432.                    
  433.                     if(p.isSneaking()){// nur die Hand
  434.                         int amount = p.getItemInHand().getAmount();
  435.                         Bank.add(p.getName().toLowerCase(), amount-Plugin.remove(p.getInventory(), Material.GOLD_NUGGET, amount, (short) 0, null));
  436.                     } else {// alles :)
  437.                         Bank.add(p.getName().toLowerCase(), 10000-Plugin.remove(p.getInventory(), Material.GOLD_NUGGET, 10000, (short) 0, null));
  438.                     }
  439.                    
  440.                     Bank.sendStatus(p);
  441.  
  442.                     p.updateInventory();
  443.                    
  444.                 }
  445.             } else if(bid==68){// Schild an der Wand -> braucht Kiste im Umkreis von 1Block (drunter, links, rechts, oder drüber)
  446.                
  447.                 Sign s = (Sign) b.getState();
  448.                 int x=b.getLocation().getBlockX(), y=b.getLocation().getBlockY(), z=b.getLocation().getBlockZ();
  449.                 World w = b.getWorld();
  450.                
  451.                 String l0=s.getLine(0), l1=s.getLine(1), l2=s.getLine(2), l3=s.getLine(3);
  452.                
  453.                 if(l0.equalsIgnoreCase("Sell plot!")){
  454.                     // Sell plot!
  455.                     // <username>
  456.                     //  <price>
  457.                     // <plotname>
  458.                    
  459.                     int price;
  460.                     long bank;
  461.                     if(isName(l1) && (price=isNumber(l2))>-1){
  462.                         if(Grundstück.isPlotnameByOwnerAndRealplot(l3, l1, Generator.ori(s.getX()), Generator.ori(s.getZ()))){
  463.                             if(p.getName().equalsIgnoreCase(l1)){
  464.                                 p.sendMessage(Plugin.prefix+"This sign works now: you can sell your '"+l3+"' for "+price+"g.");
  465.                             } else if((bank=Bank.getBilance(p))>=price){
  466.                                 p.sendMessage(Plugin.prefix+"If you want to buy this plot, you should break this sign!\n"+Grundstück.getInfoAbout(l3, price));
  467.                             } else {
  468.                                 p.sendMessage("You cannot pay this price. You only have "+bank+"g.");
  469.                             }
  470.                         } else {
  471.                             p.sendMessage(Plugin.prefix+"This sign is damaged(any value is wrong). You cannot use it.");
  472.                         }
  473.                     } else p.sendMessage("241");
  474.                     return;
  475.                 }
  476.                
  477.                 Chest chest = getChest(w, x, y-1, z);
  478.                 if(chest == null){chest = getChest(w, x, y+1, z);}
  479.                
  480.                 if(l0==null || l1==null || l2==null || l3==null) return;
  481.                 if(chest==null){
  482.                     if(l0.equalsIgnoreCase(p.getName())){
  483.                         p.sendMessage(Plugin.serfix+"No chest found!");
  484.                     }
  485.                     return;
  486.                 }
  487.                
  488.                 int price, count;
  489.                 if(isName(l0) && l1.length()>0 && (price=isNumber(l2))>0 && (count=isNumber(l3))>-1){
  490.                    
  491.                     int[] is = getItemStackByName(l1, p);
  492.                     int id=is[0], meta=is[1];
  493.                     boolean exact = l1.split(":").length==2 || meta!=-1;
  494.                    
  495.                     if(is[0]==-1){
  496.                         p.sendMessage(Plugin.serfix+"[ChestShop] Unknown material!");
  497.                         return;
  498.                     }
  499.                    
  500.                     if(Plugin.count(chest.getBlockInventory(), Material.getMaterial(id), (short) (exact?meta:-1))>=count){
  501.                         if(l0.equalsIgnoreCase(event.getPlayer().getName()) || (p.getName().equalsIgnoreCase(Plugin.kingsname) && l0.equalsIgnoreCase("@king"))){
  502.                             event.getPlayer().sendMessage(Plugin.serfix+"Everything is great :)");
  503.                         } else if(Bank.getBilance(event.getPlayer())>=price){
  504.                            
  505.                             Plugin.fromTo(chest.getBlockInventory(), p.getInventory(), Material.getMaterial(id), count, (short) (exact?meta:-1), null);
  506.                            
  507.                             Bank.substract(p.getName().toLowerCase(), price);
  508.                             Bank.add(l0, price);
  509.                             Bank.sendStatus(p);
  510.                             p.updateInventory();
  511.                         } else {
  512.                             Bank.sendErrMessage(p, 1);
  513.                         }
  514.                     } else {
  515.                         if(l0.equalsIgnoreCase(p.getName()) || (p.getName().equals(Plugin.kingsname) && l0.equalsIgnoreCase("@king"))){
  516.                             p.sendMessage(Plugin.serfix+" Your shop needs something to sell.");
  517.                         } else {
  518.                             p.sendMessage("["+l0+"] Sorry. This shop is sold out!");
  519.                         }
  520.                     }
  521.                 }
  522.             } else if(bid == 54 || bid == 61 || bid == 62 || bid == 23 || bid == 158 || bid == 154 || bid == 146){
  523.                 if(!blockBreakIsOK(p, b)){
  524.                     event.getPlayer().closeInventory();
  525.                     event.setCancelled(true);
  526.                 } else if(b.getY()<16){// nimm die Kiste aus der anderen Welt oben -> Kisten unten sind Geheimverstecke :)
  527.                     event.setCancelled(true);
  528.  
  529.                     double[] c = cooOfNotherWorld(b.getLocation().getX(), b.getLocation().getY(), b.getLocation().getZ());
  530.                     p.sendMessage(c[0]+":"+c[1]+":"+c[2]+":"+b.getLocation().getX()+":"+b.getLocation().getY()+":"+b.getLocation().getZ());
  531.                     BlockState state = myworld.getBlockAt((int)c[0], (int)c[1], (int)c[2]).getState();
  532.                     if(state instanceof Chest){
  533.                         p.openInventory(((Chest)state).getBlockInventory());
  534.                     } else if(state instanceof Dropper){
  535.                         p.openInventory(((Dropper)state).getInventory());
  536.                     } else if(state instanceof Hopper){
  537.                         p.openInventory(((Hopper)state).getInventory());
  538.                     } else if(state instanceof Dispenser){
  539.                         p.openInventory(((Dispenser)state).getInventory());
  540.                     } else if(state instanceof BrewingStand){
  541.                         p.openInventory(((BrewingStand)state).getInventory());
  542.                     } else if(state instanceof Furnace){
  543.                         p.openInventory(((Furnace)state).getInventory());
  544.                     } else if(state instanceof Beacon){
  545.                         p.openInventory(((Beacon)state).getInventory());
  546.                     } else {
  547.                         p.sendMessage("§4This is an ERROR, caused at line 508 in BlockListener(onClick.Rightclickblock). Please inform your favorite admin! or create a report.");
  548.                     }
  549.                 }
  550.             } else if(bid==121){
  551.                 // Drachenspawning :D
  552.                 SpawnManager.checkDragon(myworld, p, b.getX(), b.getY(), b.getZ());
  553.             }
  554.             break;
  555.         default:
  556.             break;
  557.        
  558.         }
  559.     }
  560.  
  561.     @SuppressWarnings("deprecation")
  562.     private int[] getItemStackByName(String s, Player p) {
  563.         if(s.split(":").length==2){
  564.             if(isNumber(s.split(":")[0])>-1){
  565.                 return new int[]{isNumber(s.split(":")[0]), isNumber(s.split(":")[1])};
  566.             } else {
  567.                 Material mat = Material.getMaterial(s.split(":")[0]);
  568.                 if(mat!=null){
  569.                     return new int[]{new ItemStack(mat).getTypeId(), isNumber(s.split(":")[1])>-1?isNumber(s.split(":")[1]):0};
  570.                 } else {
  571.                     p.sendMessage("I am very sorry but this material is unknown.\n"
  572.                             + "If you think the server should add it, simply send a report with '/rep your message...'"
  573.                             + "If you want to use sell your things instand try to find out the id and meta of it and use them as your name. Example: '1:1' for granite");
  574.                     return new int[]{-1, -1};
  575.                 }
  576.             }
  577.         } else {
  578.             return new int[]{isNumber(s), -1};
  579.         }
  580.     }
  581.  
  582.     public static void checkPos(Event ev, final Entity e){
  583.         final Location l = e.getLocation();
  584.        
  585.         if(l.getBlockY()>256-16 && abs(l.getBlockX())<Plugin.width && abs(l.getBlockZ())<Plugin.width || (l.getBlockY()<16 && Generator.basey(l.getBlockX(), l.getBlockZ())==0)){
  586.             return;
  587.         }
  588.        
  589.         if(l.getBlockY()<16 || l.getBlockY()>256-16){
  590.  
  591.             float pitch = l.getPitch();
  592.             Vector vec = l.getDirection(), vel = e.getVelocity();
  593.             double[] ds=cooOfNotherWorld(l.getX(),l.getY(),l.getZ());
  594.            
  595.             final Location togo = new Location(l.getWorld(),ds[0],ds[1]+0.1,ds[2]).setDirection(vec);
  596.             if(e.getPassenger()!=null){
  597.                 if(ev.getEventName().equalsIgnoreCase("VehicleUpdateEvent") || ev.getEventName().equalsIgnoreCase("PlayerMoveEvent")){
  598.                     final Entity pass = e.getPassenger();
  599.                     // auswerfen
  600.                     e.eject();
  601.                     // tp
  602.                     e.teleport(togo);
  603.                     pass.teleport(togo);
  604.                     // weltchange
  605.                     if(pass instanceof Player){
  606.                         int y;
  607.                         if(l.getBlockY()<16){
  608.                             SpawnBuilder.change((Player)pass, y=Generator.basey(l.getBlockX(), l.getBlockZ())/224, y-1);
  609.                         } else {
  610.                             SpawnBuilder.change((Player)pass, y=Generator.basey(l.getBlockX(), l.getBlockZ())/224-1, y+1);
  611.                         }
  612.                        
  613.                         Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin.instance, new Runnable(){
  614.                             @Override public void run() {pass.teleport(togo);togo.add(0, 1, 0).getBlock().setType(Material.AIR);}
  615.                         }, 10L);
  616.                     }
  617.                     // aufsetzen
  618.                     e.setPassenger(pass);
  619.                     // geschwindigkeit zurückgeben
  620.                     e.setVelocity(vel);
  621.                 }
  622.             } else if(e.getVehicle()!=null){
  623.                 checkPos(ev, e.getVehicle());
  624.             } else {
  625.                 e.teleport(new Location(l.getWorld(),ds[0],ds[1],ds[2]).setDirection(vec));
  626.                 e.setVelocity(vel);
  627.                
  628.                 if(e instanceof Player){
  629.                     int y;
  630.                     if(l.getBlockY()<16){
  631.                         SpawnBuilder.change((Player)e, y=Generator.basey(l.getBlockX(), l.getBlockZ())/224, y-1);
  632.                     } else {
  633.                         SpawnBuilder.change((Player)e, y=Generator.basey(l.getBlockX(), l.getBlockZ())/224-1, y+1);
  634.                     }
  635.                    
  636.                     // hoffentlich sicherer...
  637.                     Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin.instance, new Runnable(){
  638.                         @Override public void run() {e.teleport(togo);}
  639.                     }, 10L);
  640.                 }
  641.                
  642.                 e.getLocation().setPitch(pitch);
  643.             }
  644.         }
  645.     }
  646.    
  647.     private static int abs(int i) {
  648.         return i<0?-i:i;
  649.     }
  650.    
  651.     @EventHandler
  652.     @SuppressWarnings("deprecation")
  653.     public void onPlayerPrelogin(org.bukkit.event.player.PlayerPreLoginEvent event){
  654.         System.out.println("Prelogin:"+event.getName()+" from "+event.getAddress().getHostAddress());
  655.     }
  656.    
  657.     @EventHandler
  658.     public void onPlayerHurt(org.bukkit.event.entity.EntityDamageByEntityEvent event){
  659.        
  660.         onTimeDoWitherkill();
  661.        
  662.         if(event.getEntity().getWorld()!=myworld){
  663.             return;
  664.         }
  665.        
  666.         if(event.getEntity() instanceof Player && Plugin.isAfk(((Player)event.getEntity()).getName())){
  667.             event.setCancelled(true);
  668.             return;
  669.         }
  670.        
  671.         if(event.getDamager() instanceof Player && Plugin.isFlying(((Player)event.getDamager()).getName())){
  672.             Player p = ((Player)event.getDamager());
  673.             p.sendMessage(Plugin.serfix+Sprache.select(p.getName(),
  674.                     "You can't make damage in spectator mode.",
  675.                     "Du darfst im Beobachtermodus niemandem Schaden zufügen, bist aber angreifbar!", null, null));
  676.             event.setCancelled(true);
  677.             return;
  678.         }
  679.        
  680.         Player aktiv, passiv;
  681.         if(trueLocation(event.getEntity().getLocation()).distanceSquared(zero) < 1E6 && Generator.basey(event.getEntity().getLocation().getBlockX(), event.getEntity().getLocation().getBlockZ())>4600){
  682.             if(event.getDamager() instanceof Player){
  683.                 aktiv = (Player) event.getDamager();
  684.                 if(event.getEntity() instanceof Player){
  685.                     passiv = (Player) event.getEntity();
  686.                     int dur;
  687.                     if(Rank.hasPermisson(aktiv.getName(), "pol") && (dur=justice(aktiv.getItemInHand()))>0){
  688.                         if(passiv.getName().equalsIgnoreCase(Plugin.kingsname)){
  689.                             aktiv.sendMessage(Plugin.prefix+"You cannot put your "+(Plugin.isQueen?"Queen":"King")+" into prison!");
  690.                         } else if(Rank.hasPermisson(passiv.getName(), "pol") && !Rank.hasPermisson(aktiv.getName(), "spol")){
  691.                             aktiv.sendMessage(Plugin.prefix+"All time, "+passiv.getDisplayName()+" is also part of the police, you cannnot put him into prison!(Super-police can)");
  692.                         } else {
  693.                             Prison.inside.add(new Prisoner(passiv.getName(), dur*1000+System.currentTimeMillis()));
  694.                         }
  695.                     }
  696.                     ((Player)event.getDamager()).sendMessage(Plugin.prefix+"PvP is disabled until 1000 blocks from the city centre!");
  697.                     event.setCancelled(true);
  698.                 } else switch(event.getEntityType()){// wenn man sich auf einem Grundstück befindet, kann man nur Monster töten, keine Tiere
  699.                 case BAT:
  700.                 case BOAT:
  701.                 case CHICKEN:
  702.                 case COW:
  703.                 case EGG:
  704.                 case HORSE:
  705.                 case IRON_GOLEM:
  706.                 case MINECART:
  707.                 case MINECART_CHEST:
  708.                 case MINECART_FURNACE:
  709.                 case MINECART_HOPPER:
  710.                 case MINECART_TNT:
  711.                 case MUSHROOM_COW:
  712.                 case OCELOT:
  713.                 case PAINTING:
  714.                 case PIG:
  715.                 case SHEEP:
  716.                 case SNOWMAN:
  717.                 case SQUID:
  718.                 case VILLAGER:
  719.                 case WITHER_SKULL:
  720.                 case WOLF:
  721.                     if(!blockBreakIsOK((Player) event.getDamager(), event.getEntity().getWorld().getBlockAt(event.getEntity().getLocation()))){
  722.                         event.setCancelled(true);
  723.                     }
  724.                     break;
  725.                 default:
  726.                 }
  727.             }
  728.         }
  729.     }
  730.    
  731.     private int justice(ItemStack i) {
  732.         if(i==null || !i.hasItemMeta()){
  733.             return 0;
  734.         } else if("Justice".equals(i.getItemMeta().getDisplayName())){
  735.             switch(i.getType()){
  736.             case DIAMOND_SWORD:
  737.                 return 3600*3;
  738.             case GOLD_SWORD:
  739.                 return 3600;
  740.             case IRON_SWORD:
  741.                 return 1200;
  742.             case WOOD_SWORD:
  743.                 return  420;
  744.             case STICK:
  745.                 return  120;
  746.             default:return 0;
  747.             }
  748.         } else return 0;
  749.     }
  750.    
  751.     @EventHandler
  752.     public void onCreatureSpawn(CreatureSpawnEvent event){
  753.        
  754.         onTimeDoWitherkill();
  755.        
  756.         Location l = event.getLocation();
  757.        
  758.         if(l.getWorld().getChunkAt(l).getEntities().length>30 || l.getWorld().getName().endsWith("_the_end")){
  759.             event.setCancelled(true);
  760.             return;
  761.         }
  762.        
  763.    
  764.         if((event.getSpawnReason()==SpawnReason.DEFAULT || event.getSpawnReason()==SpawnReason.NATURAL || event.getSpawnReason()==SpawnReason.CHUNK_GEN) && event.getEntityType()!=EntityType.SILVERFISH){
  765.             Location trueloc = trueLocation(event.getLocation());
  766.             if(SpawnManager.spawnEntityRemoveOld(event.getEntity(), event.getLocation(), trueloc.getBlockX(), event.getLocation().getBlockY(), trueloc.getBlockY(), trueloc.getBlockZ())){
  767.                 event.setCancelled(true);
  768.             }
  769.         }
  770.        
  771.         /*Location trueloc = trueLocation(event.getLocation());
  772.         if(trueloc.getBlockY()<224 && event.getEntityType()!=EntityType.ENDERMAN){
  773.             World w=trueloc.getWorld();
  774.             if(w.getBlockAt(event.getLocation().add(new Vector(0,1,0))).getType()==Material.AIR){
  775.                 trueloc.getWorld().spawnEntity(event.getLocation(), EntityType.ENDERMAN);
  776.             }
  777.            
  778.             event.setCancelled(true);
  779.         }*/
  780.         /*if(event.getSpawnReason()!=SpawnReason.NATURAL && event.getSpawnReason()!=SpawnReason.CUSTOM){
  781.             Bukkit.broadcastMessage(event.getSpawnReason().name());
  782.             event.getEntity().getWorld().spawnEntity(event.getEntity().getLocation(), EntityType.SHEEP);
  783.             event.setCancelled(true);
  784.         }
  785.        
  786.        
  787.         if(event.getEntity().getWorld()!=myworld){
  788.             if(event.getEntity()!=Bukkit.getWorlds().get(0)){
  789.                 event.setCancelled(true);
  790.             }
  791.         } else {
  792.             event.setCancelled(true);
  793.             Location trueLoc = trueLocation(event.getEntity().getLocation());
  794.             spawnmanager.get(event.getEntity(), event.getEntity().getLocation(), trueLoc.getBlockX(), event.getEntity().getLocation().getBlockY(), trueLoc.getBlockY(), trueLoc.getBlockZ());
  795.         }*/
  796.        
  797.        
  798.        
  799.        
  800.         /*Location trueloc;
  801.         double d = (trueloc=trueLocation(event.getEntity().getLocation())).distanceSquared(zero);
  802.         if((d-1E6)*0.00000044<Math.random() && Generator.basey(event.getEntity().getLocation().getBlockX(), event.getEntity().getLocation().getBlockZ())>4600){// in der Stadt
  803.             if(event.getEntityType()==EntityType.SKELETON && Math.random()<0.01){
  804.                 Skeleton sk = event.getLocation().getWorld().spawn(event.getLocation(), Skeleton.class);
  805.                 makeWitherskeleton(sk, trueloc);
  806.                 event.setCancelled(true);
  807.             }
  808.         } else {
  809.             if(event.getEntityType()==EntityType.SKELETON && ((Skeleton)event.getEntity()).getSkeletonType()==SkeletonType.NORMAL && Math.random()<0.7){
  810.                 Skeleton sk = event.getLocation().getWorld().spawn(event.getLocation(), Skeleton.class);
  811.                 makeWitherskeleton(sk, trueloc);
  812.                 event.setCancelled(true);
  813.             }
  814.         }
  815.        
  816.         if(d<25E6 && event.getEntityType()==EntityType.WITHER){
  817.             Bukkit.broadcastMessage(Plugin.prefix+"It is forbidden to spawn §4WITHER§f in the city! Should a wither reach the magical shild 5km around the city, he will be killed!");
  818.             event.setCancelled(true);
  819.         }*/
  820.     }
  821.    
  822.     @EventHandler(priority=EventPriority.HIGHEST)
  823.     public void onCreeperOderTNTExplosion(EntityExplodeEvent event){
  824.        
  825.         onTimeDoWitherkill();
  826.        
  827.         if(event.getLocation().getWorld().equals(Plugin.world)){
  828.             double d = trueLocation(event.getEntity().getLocation()).distanceSquared(zero);
  829.             if((d-1E6)*0.00000044<Math.random() && Generator.basey(event.getEntity().getLocation().getBlockX(), event.getEntity().getLocation().getBlockZ())>4600){
  830.                 event.setCancelled(true);
  831.             }
  832.         }
  833.     }
  834.    
  835.     @EventHandler
  836.     public void onBaumwachsevent(StructureGrowEvent event){//Baumwachsevent
  837.        
  838.         onTimeDoWitherkill();
  839.        
  840.         if(random()<Weather.wachstumsFaktor(event.getBlocks().get(0).getChunk())){
  841.             event.setCancelled(true);
  842.         }
  843.     }
  844.    
  845.     /*@EventHandler
  846.     public void onXPTeilchen(EntityTargetEvent event){//XP-Teilchen
  847.         if(event.getEntity().getLocation().getWorld().getName()==Plugin.myWorldName){
  848.             checkPos(event.getTarget());
  849.         }
  850.     }*/
  851.    
  852.     public static double distance(Location l1, Location l2){
  853.         return trueLocation(l1).distanceSquared(trueLocation(l2));
  854.     }
  855.    
  856.     public static Location trueLocation(Location falseLocation){return new Location(Plugin.world, Generator.ori(falseLocation.getBlockX()), Generator.basey(falseLocation.getBlockX(), falseLocation.getBlockZ())+falseLocation.getBlockY(), Generator.ori(falseLocation.getBlockZ()));}
  857.     public static HashMap<String, Integer> logIn = new HashMap<>();
  858.     public static boolean loggedIn(String name){
  859.         return logIn.containsKey(name) && logIn.get(name)==0;
  860.     }
  861.    
  862.     @EventHandler
  863.     public void onCommand(org.bukkit.event.player.PlayerCommandPreprocessEvent e){
  864.         if(loggedIn(e.getPlayer().getName())){
  865.             String command = e.getMessage().substring(1);
  866.             if(command.startsWith("login ") || command.startsWith("report ") || command.startsWith("help ")){
  867.                 //ok...
  868.             } else {
  869.                 e.getPlayer().sendMessage(Plugin.serfix+"You have to login first. Aviable commands: help, report, login");
  870.                 e.setCancelled(true);
  871.             }
  872.         }
  873.     }
  874.    
  875.     @EventHandler(priority=EventPriority.HIGHEST)//login
  876.     public void onJoin(org.bukkit.event.player.PlayerJoinEvent event){//Join
  877.         Player p = event.getPlayer();
  878.        
  879.         p.teleport(p.getLocation().add(0, 2, 0));
  880.        
  881.         boolean isNew = p.getStatistic(Statistic.PLAY_ONE_TICK)<100;
  882.         SpawnBuilder.onJoin(p, false, isNew);
  883.         String name = p.getName();
  884.        
  885.         if(isNew){
  886.             Rank.setNickNameGetJoinMessage(name, p);
  887.             event.setJoinMessage(SpawnBuilder.prefix+name+" joined the recivilisation project :)");
  888.         } else {
  889.             event.setJoinMessage(Rank.setNickNameGetJoinMessage(name, p));
  890.             p.sendMessage(Sprache.select(p.getName(), "It's ", "Es ist im Moment ", null, null)+Weather.nowTime(Sprache.select(p.getName(), "t", "f", null, null).equals("t"))+"§f.");
  891.         }
  892.        
  893.         if(Plugin.isServerInOffline){
  894.             if(Rank.hasPassword.contains(p.getName())){
  895.                 logIn.put(p.getName(), 0);
  896.                 p.sendMessage(Plugin.serfix+"§cPlease login first! When your are sure you are you, and you forgot your password you have so send a report via /report.");
  897.                 p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 10000000, 1000));
  898.             } else {
  899.                 p.sendMessage(Plugin.serfix+"§cThis server is running in §4offline mode§c. You can use '/login "+SpawnManager.getPassword(p.getName())+"'"+" to protect your account name.\n"
  900.                         + "Once you used it use'll have to use it forever.\n"
  901.                         + (p.getStatistic(Statistic.LEAVE_GAME)>0?"Your name was logged in allready so it might be insecure...[When a online player gets a problem the server mode will be changed to online!]":""));
  902.             }
  903.         }
  904.        
  905.        
  906.     }
  907.    
  908.     public static HashMap<String, Boolean> dolayout = new HashMap<>();
  909.    
  910.     @EventHandler
  911.     public void onSendChatmessage(AsyncPlayerChatEvent event){//XP-Teilchen
  912.        
  913.         // mache getannes noch zu kursivem §o
  914.        
  915.         onTimeDoWitherkill();
  916.        
  917.         Player p = event.getPlayer();
  918.         String message = event.getMessage();
  919.        
  920.         if(p.getName().equalsIgnoreCase(Plugin.kingsname)){
  921.             if(!dolayout.containsKey(p.getName())){
  922.                 dolayout.put(p.getName(), true);
  923.             }
  924.             if(dolayout.get(p.getName())){
  925.                 event.setMessage(message=StringCompare.convertIntoChat(message.replace('&', '§')));
  926.             }
  927.         } else if(p.getWorld()!=myworld){
  928.             event.setMessage(message=StringCompare.convertIntoChat(message));
  929.         } else {
  930.             Location l = trueLocation(p.getLocation());
  931.            
  932.             if(Rank.hasPermisson(p.getName(), "col")){
  933.                 message = message.replace('&', '§');
  934.             }
  935.            
  936.             if(!dolayout.containsKey(p.getName())){
  937.                 dolayout.put(p.getName(), true);
  938.             }
  939.             if(dolayout.get(p.getName())){
  940.                 message = StringCompare.convertIntoChat(message);
  941.             }
  942.                    
  943.             for(Player p2:Bukkit.getOnlinePlayers()){
  944.                 if(p.getWorld().equals(p2.getWorld())){
  945.                     double d = trueLocation(p2.getLocation()).distanceSquared(l);
  946.                     if(d<1E4){//100m
  947.                         p2.sendMessage("§f<"+p.getDisplayName()+"§f> "+message);
  948.                     } else if(d<6.25E4){//250m
  949.                         p2.sendMessage("§7<"+p.getDisplayName()+"§7> "+message);
  950.                     } else if(d<25E4){//500m
  951.                         p2.sendMessage("§8<"+p.getDisplayName()+"§8> "+message);
  952.                     } else if(d<6.25E6){//2500m
  953.                         p2.sendMessage("§0<"+p.getDisplayName()+"§0> "+message);
  954.                     } else if(p2.getName().equalsIgnoreCase("Miner952x")){
  955.                         p2.sendMessage("§1>"+p.getDisplayName()+"§1> "+message);
  956.                     }
  957.                 }
  958.             }
  959.             event.setCancelled(true);
  960.             if(p.getName().equalsIgnoreCase(p.getDisplayName())){
  961.                 System.out.println("<"+p.getName()+"> "+message);
  962.             } else {
  963.                 System.out.println("<"+p.getName()+"="+p.getDisplayName()+"> "+message);
  964.             }
  965.         }
  966.         DynMap.addMessage(p, System.currentTimeMillis(), message);
  967.     }
  968.    
  969.     public static boolean blockBreakIsOK(Player p, Block b){
  970.         if(p!=null){
  971.             if(Plugin.isFlying(p.getName())){
  972.                 p.sendMessage(Plugin.serfix+Sprache.select(p.getName(),
  973.                         "You can't build in spectator mode!",
  974.                         "Du darfst im Beobachtermodus nichts verändern!", null, null));
  975.                 return false;
  976.             }
  977.             int x=p.getLocation().getBlockX(), z=p.getLocation().getBlockZ(), y=Generator.basey(x, z)+p.getLocation().getBlockY();
  978.             x = Generator.ori(x);
  979.             z = Generator.ori(z);
  980.             if(b.hasMetadata(MetaString.deathProtected)){
  981.                 String s = b.getMetadata(MetaString.deathProtected).get(0).asString(), name=s.split(" ")[0];
  982.                 long last;
  983.                 if(name.equalsIgnoreCase(p.getName())){
  984.                     if((last=isNumber(s.split(" ")[1])-System.currentTimeMillis()/1000)>3600){
  985.                         p.sendMessage(Plugin.serfix+Sprache.select(p.getName(),
  986.                                 "You have broken the sigil! Your chest stays save the next hour.",
  987.                                 "Du hast das Sigil gebrochen! Deine Kiste ist noch 1h vor Räubern sicher.", null, null));
  988.                         b.setMetadata(MetaString.deathProtected, new FixedMetadataValue(Plugin.instance, p.getName()+" "+(System.currentTimeMillis()/1000+3600)));
  989.                     } else {
  990.                         String time = secondsToTime(last);
  991.                         p.sendMessage(Plugin.serfix+Sprache.select(p.getName(),
  992.                                 "You chest is only save for the next §4"+time+"!",
  993.                                 "Deine Kiste ist nur noch §4"+time+"§f sicher!", null, null));
  994.                     }
  995.                    
  996.                     return true;
  997.                 } else if((last=isNumber(s.split(" ")[1])-System.currentTimeMillis()/1000)>0){
  998.                     String time=secondsToTime(last);
  999.                     p.sendMessage(Plugin.serfix+Sprache.select(p.getName(),
  1000.                             "This Death Cheat(@"+name+") is still protected for the next "+time+"!",
  1001.                             "Diese Grabeskiste(@"+name+") ist noch für die nächsten "+time+" versiegelt!", null, null));
  1002.                     return false;
  1003.                 } else {
  1004.                     p.sendMessage(Plugin.serfix+Sprache.select(p.getName(),
  1005.                             "You found a deserted Death Chest!",
  1006.                             "Du hast eine verlassene Grabeskiste gefunden!", null, null));
  1007.                     b.removeMetadata(MetaString.deathProtected, Plugin.instance);
  1008.                     return true;
  1009.                 }
  1010.             }
  1011.             if(y>=4740){
  1012.                 if(Jena.type(x, z)<2){
  1013.                     if(x*x+z*z>900){
  1014.                         boolean king = p.getName().equalsIgnoreCase(Plugin.kingsname);
  1015.                         if(Grundstück.isGrundstück(x, z)){
  1016.                             Grundstück g = Grundstück.get(x, z);
  1017.                             if(g == null){
  1018.                                 // alles ok, mache später weiter
  1019.                                 // teste noch, ob keine Grundstücke in der Nähe sind...
  1020.                             } else {
  1021.                                 String owner = g.getOwner();
  1022.                                 if(owner.equalsIgnoreCase(p.getName())){
  1023.                                     // du bist der Besitzer...
  1024.                                     return true;
  1025.                                 } else if(king && owner.equals("@king")){
  1026.                                     // du bist der König und das Grundstück ist eines deines Reiches...
  1027.                                     return true;
  1028.                                 } else if(g.isChangeAllowed(p.getName())){// hier ist ein Grundstück, doch es gehört nicht wirklich dir... darfst du nach König drauf bauen?
  1029.                                     return true;
  1030.                                 } else {
  1031.                                     // fremdes Eigentum
  1032.                                     return false;
  1033.                                 }
  1034.                             }
  1035.                         }
  1036.                        
  1037.                         if(Grundstück.isNearProtectedGrundstück(p.getName(), x, z)){
  1038.                             // du hast hier keine Rechte, also raus...
  1039.                             return false;
  1040.                         } else {
  1041.                             // du darfst hier bauen, also Glück Auf!
  1042.                             return true;
  1043.                         }
  1044.                     } else if(sq(x+0.3)+sq(z+0.1)<263.46){
  1045.                         p.sendMessage(Plugin.prefix+Sprache.select(p.getName(),
  1046.                                 "The area belongs to the Bank!",
  1047.                                 "Dieses Gebiet gehört zur Bank!", null, null));
  1048.                         return false;
  1049.                     } else if(p.getName().equalsIgnoreCase(Plugin.kingsname)){
  1050.                         return true;
  1051.                     } else {
  1052.                         p.sendMessage(Plugin.prefix+Sprache.select(p.getName(),
  1053.                                 "Only the "+(Plugin.isQueen?"Queen":"King")+" can build in this area!",
  1054.                                 "Nur d"+(Plugin.isQueen?"ie Königin":"er König")+" kann hier bauen!", null, null));
  1055.                         return false;
  1056.                     }
  1057.                 }
  1058.             }
  1059.         }
  1060.         return true;
  1061.     }
  1062.    
  1063.     @SuppressWarnings("deprecation")
  1064.     @EventHandler(priority = EventPriority.HIGHEST)
  1065.     public void onBlockbreak(BlockBreakEvent event){
  1066.        
  1067.         onTimeDoWitherkill();
  1068.        
  1069.         if(event.getBlock().getWorld()!=myworld){
  1070.             if(event.getBlock().getWorld().getName().endsWith("_the_end") && !event.getPlayer().getName().equals("Miner952x")){
  1071.                 if(random()<0.05){
  1072.                     event.getPlayer().kickPlayer(Sprache.select(event.getPlayer().getName(),
  1073.                             "§4Don´t break blocks!",
  1074.                             "§4Mach nichts kaputt!", null, null));
  1075.                 }
  1076.                 event.setCancelled(true);
  1077.             } else {
  1078.                 event.getBlock().getChunk().getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, event.getPlayer().getName()));
  1079.             }
  1080.             return;
  1081.         }
  1082.        
  1083.         Block b = event.getBlock();
  1084.         Player p = event.getPlayer();
  1085.        
  1086.         if(b.getTypeId()==68){// Schild an der Wand -> braucht Kiste im Umkreis von 1Block (drunter, links, rechts, oder drüber)
  1087.            
  1088.             Sign s = (Sign) b.getState();
  1089.            
  1090.             int orix=Generator.ori(s.getX()), oriz=Generator.ori(s.getZ());
  1091.            
  1092.             if(orix*orix+oriz*oriz<900 && p.getName().equalsIgnoreCase(Plugin.kingsname)){
  1093.                 //Rank.analyseCommand(s.getLines(), p, true); <- wird nicht gebraucht, da die Linien hier noch nicht gesetzt werden :)
  1094.             } else if(s.getLine(0).equalsIgnoreCase("Sell plot!")){// hat schon s? eigentlich ja ja
  1095.                 // Sell plot!
  1096.                 // <username>
  1097.                 //  <price>
  1098.                 // <plotname>
  1099.                 String l1=s.getLine(1), l2=s.getLine(2), l3=s.getLine(3);
  1100.                 int price;
  1101.                 if(isName(l1) && (price=isNumber(l2))>-1){
  1102.                     if(Grundstück.isPlotnameByOwnerAndRealplot(l3, l1, orix, oriz)){
  1103.                         if(p.getName().equalsIgnoreCase(l1)){
  1104.                             p.sendMessage(Plugin.prefix+Sprache.select(p.getName(),
  1105.                                     "§eYou successfully removed your offer.",
  1106.                                     "§eDein Angebot wurde erfolgreich zurückgezogen.", null, null));
  1107.                             return;
  1108.                         } else if(Bank.getBilance(p)>=price){
  1109.                             try {
  1110.                                 if(Grundstück.changeOwner(l1, p.getName(), l3)){
  1111.                                     if(Bank.substract(p.getName(), price)){
  1112.                                         Bank.add(l1, price);
  1113.                                         p.sendMessage(Plugin.prefix+Sprache.select(p.getName(),
  1114.                                                 "§4Congratulations! You should chance the name of your plot to prevent bugs ;) /rename <originalname> <newname>",
  1115.                                                 "§4Herzlichen Glückwunsch! Du solltest sicherheitshalber den Grundstücksnamen ändern! /rename <jetziger Name> <neuer Name>", null, null));
  1116.                                         return;
  1117.                                     } else {
  1118.                                         Bank.sendErrMessage(p, 0);
  1119.                                         event.setCancelled(true);
  1120.                                         return;
  1121.                                     }
  1122.                                 } else {
  1123.                                     p.sendMessage(Plugin.prefix+Sprache.select(p.getName(),
  1124.                                             "§4I am very sorry, but plot transfer failed!",
  1125.                                             "§4Tut mir leid, aber die Eigentumsübergabe mislang!", null, null));
  1126.                                     event.setCancelled(true);
  1127.                                     return;
  1128.                                 }
  1129.                             } catch (IOException e) {
  1130.                                 e.printStackTrace();
  1131.                                 System.out.println("ERROR selling plot:"+l1+"."+l2+"."+l3);
  1132.                                 Bank.sendErrMessage(p, 0);
  1133.                                 event.setCancelled(true);
  1134.                                 return;
  1135.                             }
  1136.                         } else {
  1137.                             Bank.sendErrMessage(p, 1);
  1138.                             event.setCancelled(true);
  1139.                             return;
  1140.                         }
  1141.                     }
  1142.                 }
  1143.             }
  1144.         }
  1145.        
  1146.         Chunk c;
  1147.         if(!(c=b.getChunk()).getBlock(0, 0, 0).hasMetadata(MetaString.save)){
  1148.             int bx=c.getX()*16, bz=c.getZ()*16;
  1149.             boolean mustRefresh=false;
  1150.             f:for(int x=0;x<16;x++){
  1151.                 for(int z=0;z<16;z++){
  1152.                     if(Converter.getRealCubeID(bx+x, bz+z)==30){
  1153.                         mustRefresh = true;
  1154.                         break f;
  1155.                     }
  1156.                 }
  1157.             }
  1158.             if(mustRefresh){
  1159.                 MapsGenerator.ruinpop.populate(b.getWorld(), null, c);
  1160.             }
  1161.             c.getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, p.getName()));
  1162.         }
  1163.        
  1164.         if(p!=null && p.getGameMode()!=GameMode.CREATIVE && isGoodAsAHand(p.getItemInHand().getTypeId()) && !breakableByHand(b.getTypeId()) && !p.getName().equalsIgnoreCase("The_Aletheia")){
  1165.             if(Math.random()<0.1)p.sendMessage(Plugin.prefix+"You should try something different. #wooddoesntbreakbyhandsyouneedsticksfromleaves");
  1166.             event.setCancelled(true);
  1167.             return;
  1168.         }
  1169.        
  1170.         if(!blockBreakIsOK(p, b)){
  1171.             event.setCancelled(true);
  1172.             return;
  1173.         }
  1174.        
  1175.         if(XBlock.cancelBreak(b, p, event)){
  1176.             event.setCancelled(true);
  1177.             return;
  1178.         }
  1179.        
  1180.         if(b.hasMetadata(MetaString.deathProtected)){
  1181.             b.removeMetadata(MetaString.deathProtected, Plugin.instance);
  1182.         }
  1183.         final boolean save=true;//saveID(b.getTypeId());
  1184.         if(save){// Gras abzuspeichern ist überbewertet ^^
  1185.             b.getChunk().getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, event.getPlayer().getName()));
  1186.         }
  1187.        
  1188.         if(b.getWorld().equals(Plugin.world)){
  1189.             if(b.getLocation().getBlockY()<32 || b.getLocation().getBlockY()>256-32){
  1190.                 double[] ds = cooOfNotherWorld(b.getX(),b.getY(),b.getZ());
  1191.                 Block b2=b.getWorld().getBlockAt((int)ds[0],(int)ds[1],(int)ds[2]);
  1192.                 b2.setType(Material.AIR);
  1193.                 if(save)
  1194.                     b2.getChunk().getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, event.getPlayer().getName()));
  1195.             }
  1196.         }
  1197.        
  1198.         if(p!=null){
  1199.             if(p.getItemInHand()==null || p.getItemInHand().getTypeId()!=359){//Schere
  1200.                 if(b.getTypeId()==18 || b.getTypeId()==261){// Blätter
  1201.                     if(Math.random()<0.1){
  1202.                         b.getWorld().dropItem(b.getLocation(), new ItemStack(280, Math.random()<0.2?2:1));
  1203.                     }
  1204.                 } else if(b.getTypeId()==31){// Gras
  1205.                     if(random()<0.02){//Stöcker :)
  1206.                         b.getWorld().dropItem(b.getLocation(), new ItemStack(280));
  1207.                     } else if(random()<0.01){
  1208.                         b.getWorld().dropItem(b.getLocation(), new ItemStack(Material.SEEDS));
  1209.                     }
  1210.                 } else if(b.getTypeId()==2){
  1211.                     if(Math.random()<0.01){
  1212.                         b.getWorld().dropItem(b.getLocation(), new ItemStack(random.nextBoolean()?Material.CARROT_ITEM:Material.POTATO_ITEM));
  1213.                     }
  1214.                 }
  1215.             }
  1216.         }
  1217.     }
  1218.    
  1219.     /*private boolean saveID(int id) {
  1220.         switch(id){
  1221.         case 31:case 37:case 38:case 39:case 40:case 81:return false;
  1222.         }
  1223.         return true;
  1224.     }*/
  1225.  
  1226.     private boolean   isGoodAsAHand(int id) {return "-0-6-18-31-32-38-39-40-50-69-70-72-76-77-96-171-101-106-111-131-143-147-148-151-161-167-168-171-175-259-260-263-288-289-295-296-331-332-334-337-341-344-348-349-350-351-352-353-354-355-356-357-358-359-360-353-370-371-375-424-425-".contains("-"+id+"-");}
  1227.     private boolean breakableByHand(int id) {return "-6-12-18-20-30-31-32-37-38-39-40-59-61-69-72-76-77-78-79-80-81-82-83-85-86-96-171-102-103-104-105-106-107-111-131-141-142-143-161-171-".contains("-"+id+"-");}
  1228.    
  1229.     @EventHandler(priority=EventPriority.HIGHEST)
  1230.     public void onSignset(org.bukkit.event.block.SignChangeEvent event){
  1231.        
  1232.         Block b = event.getBlock();
  1233.         Player p = event.getPlayer();
  1234.        
  1235.         for(int i=0;i<event.getLines().length;i++){
  1236.             event.setLine(i, event.getLine(i).replace('&', '§').replace("\\§", "&"));
  1237.         }
  1238.        
  1239.         Plugin.removeAfk(p.getName());
  1240.        
  1241.         if(!blockBreakIsOK(p, b) || b.getWorld().getName().endsWith("_the_end")){
  1242.             if(p.getName().equalsIgnoreCase("Miner952x")){
  1243.                 event.getBlock().getChunk().getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, event.getPlayer().getName()));
  1244.             } else event.setCancelled(true);
  1245.             return;
  1246.         }
  1247.         // !!! signupdate fehlt noch
  1248.         if(b.getWorld().equals(Plugin.world)){
  1249.             if(p.getName().equalsIgnoreCase(Plugin.kingsname)){
  1250.                 if(sq(ori(b.getX()))+sq(ori(b.getZ()))<900){
  1251.                     Rank.analyseCommand(event.getLines(), p, false);
  1252.                 }
  1253.             } else if(event.getLine(0).equalsIgnoreCase("Sell plot!") && event.getLine(1).equalsIgnoreCase("@king")){
  1254.                 p.sendMessage(Plugin.prefix+Sprache.select(p.getName(),
  1255.                         "Don't cheat the "+(Plugin.isQueen?"Queen":"King")+"! If your are married the "+(Plugin.isQueen?"Queen":"King")+" has to split your properties.",
  1256.                         "Versuche nicht "+(Plugin.isQueen?"die Königin":"den König")+" zu hintergehen! When ihr verheiratet seid muss d"+(Plugin.isQueen?"ie Königin":"er König")+" sich um eure Besitzesaufteilung kümmern!", null, null));
  1257.                 event.setLine(1, "<§4null§f>");
  1258.             }
  1259.         }
  1260.        
  1261.         event.getBlock().getChunk().getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, event.getPlayer().getName()));
  1262.     }
  1263.    
  1264.     @SuppressWarnings("deprecation")
  1265.     @EventHandler(priority = EventPriority.HIGHEST)
  1266.     public void onBlockplace(final BlockPlaceEvent event){
  1267.        
  1268.         onTimeDoWitherkill();
  1269.        
  1270.         Plugin.removeAfk(event.getPlayer().getName());
  1271.        
  1272.         if(event.getBlock().getWorld()!=myworld){
  1273.             if(event.getBlock().getWorld().getName().endsWith("_the_end") && !event.getPlayer().getName().equals("Miner952x")){
  1274.                 event.setCancelled(true);
  1275.             } else {
  1276.                 event.getBlock().getChunk().getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, event.getPlayer().getName()));
  1277.             }
  1278.             return;
  1279.         }
  1280.        
  1281.         Block b = event.getBlock();
  1282.         Player p = event.getPlayer();
  1283.         final boolean change = (b.getTypeId()==43 && b.getData()==2) || (b.getTypeId()==125 && b.getData()==7);
  1284.        
  1285.         // naja Xray eine Chance gegen Hacking - so muss niemand anfangen bzw man ist gleich auf
  1286.         /*if(b.getLocation().distanceSquared(p.getLocation().add(0, 1, 0))<1){
  1287.             event.setCancelled(true);
  1288.             if(random()<0.3){
  1289.                 p.sendMessage(Plugin.prefix+"Sorry, Xray is disabled.\nPlease do not use texture/resource-packs, hacks or mods for that. Be a fair player!");
  1290.             }
  1291.             return;
  1292.         }*/
  1293.        
  1294.         if(!blockBreakIsOK(p, b)){
  1295.             event.setCancelled(true);
  1296.             return;
  1297.         }
  1298.        
  1299.         final byte data;
  1300.         if((data=XBlock.cancelPlace(b, p, p.getItemInHand(), event))==-1){
  1301.             event.setCancelled(true);
  1302.             return;
  1303.         }
  1304.        
  1305.         event.getBlock().getChunk().getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, event.getPlayer().getName()));
  1306.        
  1307.         if(b.getWorld().equals(Plugin.world)){
  1308.            
  1309.             if(change){
  1310.                 b.setTypeIdAndData(b.getTypeId()==43?3:170, (byte) 0, false);
  1311.             }
  1312.            
  1313.             if(b.getLocation().getBlockY()<32 || b.getLocation().getBlockY()>256-32){
  1314.                 double[] ds = cooOfNotherWorld(b.getX(), b.getY(), b.getZ());
  1315.                 final int d=(int)ds[0], e=(int)ds[1], f=(int)ds[2], g=b.getX(), h=b.getY(), i=b.getZ();
  1316.                
  1317.                 final World w = b.getWorld();
  1318.                
  1319.                 new Thread(new Runnable(){
  1320.                     @Override public void run() {
  1321.                         try {
  1322.                             Chunk c = w.getChunkAt(d, f);
  1323.                             if(!c.isLoaded()){
  1324.                                 c.load();
  1325.                             }
  1326.                             Thread.sleep(10);
  1327.                         } catch (InterruptedException e1) {}
  1328.                         Block b = w.getBlockAt(g, h, i);
  1329.                        
  1330.                         b.getChunk().getBlock(0, 0, 0).setMetadata(MetaString.save, new FixedMetadataValue(Plugin.instance, event.getPlayer().getName()));
  1331.                        
  1332.                         if(change){
  1333.                             w.getBlockAt(d,e,f).setTypeIdAndData(b.getTypeId()==43?3:170, (byte) 0, false);
  1334.                         } else {
  1335.                             w.getBlockAt(d,e,f).setTypeIdAndData(b.getTypeId(), data, true);
  1336.                         }
  1337.                     }
  1338.                 }).start();
  1339.             }
  1340.         }
  1341.     }
  1342.    
  1343.     @EventHandler
  1344.     public void onSave(WorldSaveEvent event){
  1345.        
  1346.         onTimeDoWitherkill();
  1347.        
  1348.         if(event.getWorld().getName().equalsIgnoreCase(Plugin.myWorldName)){
  1349.             try {
  1350.                 Plugin.save(false);
  1351.             } catch (IOException e) {
  1352.                 System.err.println("ERROR while saving data...");
  1353.                 e.printStackTrace();
  1354.             }
  1355.         }
  1356.     }
  1357.    
  1358.     private static String num(int i, int j){
  1359.         String s = "          "+i;
  1360.         return s.substring(s.length()-j);
  1361.     }
  1362.    
  1363.     HashMap<String, String> hs = new HashMap<>();
  1364.     public void updateScoreboard(Player p, boolean atSpawn){
  1365.         if(!hs.containsKey(p.getName())){
  1366.             hs.put(p.getName(), "");
  1367.         }
  1368.        
  1369.         int h;
  1370.         if(atSpawn){
  1371.             h = p.getLocation().getBlockY() + 814120;
  1372.         } else {
  1373.             h = (-4800+Generator.basey(p.getLocation().getBlockX(), p.getLocation().getBlockZ())+p.getLocation().getBlockY());
  1374.         }
  1375.        
  1376.         if(hs.get(p.getName())!=p.getLocation().getBlockX() + ":" + h + ":" + p.getLocation().getBlockZ()){
  1377.             hs.put(p.getName(), p.getLocation().getBlockX() + ":" + h + ":" + p.getLocation().getBlockZ());
  1378.             Scoreboard board = Bukkit.getScoreboardManager().getNewScoreboard();
  1379.            
  1380.             /*Objective name = board.registerNewObjective("213", "888");
  1381.             name.setDisplayName(p.getDisplayName()+"xD");
  1382.             name.setDisplaySlot(DisplaySlot.BELOW_NAME);
  1383.            
  1384.             name.getScore(Bukkit.getOfflinePlayer("Alexandra")).setScore(0);*/
  1385.            
  1386.             //OfflinePlayer op = p;
  1387.  
  1388.             /*Team team = board.registerNewTeam("Helden");
  1389.              
  1390.             team.setDisplayName("§cGronkh");
  1391.             team.setPrefix("0123456789abcdef");
  1392.             team.setSuffix("0123456789abcdef");
  1393.             team.setCanSeeFriendlyInvisibles(false);
  1394.            
  1395.            // team.addPlayer(op);
  1396.  
  1397.             for(Player online : Bukkit.getOnlinePlayers()){
  1398.                 team.addPlayer(online);
  1399.             }
  1400.            
  1401.             for(Player online : Bukkit.getOnlinePlayers()){
  1402.                 online.setScoreboard(board);
  1403.             }
  1404.             */
  1405.            
  1406.             Objective obj = board.registerNewObjective("213", "879");
  1407.            
  1408.             obj.setDisplayName(" = Stats = ");
  1409.             obj.setDisplaySlot(DisplaySlot.SIDEBAR);
  1410.            
  1411.             Score sc3 = obj.getScore(Bukkit.getOfflinePlayer("§cx"+num(ori(p.getLocation().getBlockX()), 7)));
  1412.             sc3.setScore(3);
  1413.            
  1414.             Score sc2 = obj.getScore(Bukkit.getOfflinePlayer("§ay"+num(h, 7)));
  1415.             sc2.setScore(2);
  1416.            
  1417.             Score sc1 = obj.getScore(Bukkit.getOfflinePlayer("§9z"+num(ori(p.getLocation().getBlockZ()), 7)));
  1418.             sc1.setScore(1);
  1419.             if(!atSpawn){
  1420.                 Score sc0 = obj.getScore(Bukkit.getOfflinePlayer("§6g"+num((int) Bank.getBilance(p), 7)));
  1421.                 sc0.setScore(0);
  1422.             }
  1423.            
  1424.             p.setScoreboard(board);
  1425.         }
  1426.     }
  1427.    
  1428.     @EventHandler
  1429.     public void onMinecartMove(VehicleMoveEvent event){//Hält Minecarts in der richtigen Welt
  1430.        
  1431.         onTimeDoWitherkill();
  1432.        
  1433.         if(event.getVehicle().getLocation().getWorld().getName().equalsIgnoreCase(Plugin.myWorldName)){
  1434.             checkPos(event, event.getVehicle());
  1435.         }
  1436.     }
  1437.    
  1438.     /*@EventHandler BlockFormEvent
  1439.     public void onX(org.bukkit.event.block.BlockFormEvent event){
  1440.         onTimeDoWitherkill();}*/
  1441.    
  1442.     @EventHandler
  1443.     public void onSeedsGrow(org.bukkit.event.block.BlockGrowEvent event){
  1444.  
  1445.         onTimeDoWitherkill();
  1446.        
  1447.         if((event.getBlock().getLightFromBlocks()<9 && trueLocation(event.getBlock().getLocation()).getBlockY()<4730) || random()<Weather.wachstumsFaktor(event.getBlock().getChunk())){
  1448.             event.setCancelled(true);
  1449.         }
  1450.     }
  1451.    
  1452.     /*@EventHandler BlockIgniteEvent
  1453.     public void onX(org.bukkit.event.block.BlockIgniteEvent event){
  1454.         onTimeDoWitherkill();}*/
  1455.    
  1456.     /**
  1457.      * A list of all possible pings :)
  1458.      * */
  1459.     public static final String[] pingString = new String[]{
  1460.         "§6RPG-Hardcore | §eProblems? Youtube: Antonio Noack :)",
  1461.         "§6RPG-Hardcore | §5Be a part of us!",
  1462.         "§6RPG-Hardcore | §aSpring is coming :D!",
  1463.         "§6RPG-Hardcore | §4Remember to use Conquest!"
  1464.     };
  1465.    
  1466.     @EventHandler(priority=EventPriority.MONITOR)
  1467.     public void onServerListPing(ServerListPingEvent event) throws IllegalArgumentException, UnsupportedOperationException, Exception {
  1468.         System.out.println("ping by "+betterByte(event.getAddress().getAddress()[0])+"."+betterByte(event.getAddress().getAddress()[1])+"."+betterByte(event.getAddress().getAddress()[2])+"."+betterByte(event.getAddress().getAddress()[3]));
  1469.         event.setMotd(short64(pingString[random.nextInt(pingString.length)]+(eventByKing.length()>0?("§4 | §f"+eventByKing):"")));
  1470.         //event.setMaxPlayers(9001);
  1471.         event.setServerIcon(icon());
  1472.     }
  1473.    
  1474.     private String short64(String s){
  1475.         return s.length()>64?s.substring(0, 64):s;
  1476.     }
  1477.    
  1478.     int betterByte(byte b){
  1479.         return b<0?(b&0x7f)+128:b;
  1480.     }
  1481.    
  1482.     /**kann theoretisch auf Karten wie auf Bilder malen*/
  1483.     /*BufferedImage img;
  1484.     @EventHandler(priority=EventPriority.MONITOR)
  1485.     public void onServerListPifng(org.bukkit.event.server.MapInitializeEvent event) throws IllegalArgumentException, UnsupportedOperationException, Exception {
  1486.         event.getMap().addRenderer(new org.bukkit.map.MapRenderer(){
  1487.             @Override
  1488.             public void render(org.bukkit.map.MapView view, org.bukkit.map.MapCanvas canvas, Player p) {
  1489.                 System.out.println("render"+view.getCenterX());
  1490.                 if(img==null){
  1491.                     try {
  1492.                         canvas.drawImage(0, 0, img=ImageIO.read(new File("C:/Users/Antonio/Desktop/Plugins/_Server/test.png")));
  1493.                     } catch (IOException e) {
  1494.                         e.printStackTrace();
  1495.                     }
  1496.                 } else {
  1497.                     canvas.drawImage(0, 0, img);
  1498.                 }
  1499.             }
  1500.         });
  1501.     }*/
  1502.    
  1503.     @EventHandler
  1504.     public void onDeath(org.bukkit.event.entity.EntityDeathEvent event){
  1505.         if(event.getEntity() instanceof Player){
  1506.             return;// unten drunter abgehandelt
  1507.         }
  1508.         if(event.getEntity().getType()==EntityType.SNOWMAN && random()<0.3){
  1509.             event.getDrops().add(new ItemStack(Material.PUMPKIN));
  1510.         }
  1511.         if(event.getEntity().getKiller()!=null){
  1512.             if(random()<0.01)event.getEntity().getWorld().dropItemNaturally(event.getEntity().getLocation(), playerHead(event.getEntityType()==EntityType.SKELETON && ((Skeleton)event.getEntity()).getSkeletonType()==SkeletonType.WITHER?"WITHER":event.getEntityType().name()));
  1513.             SpawnManager.kill(event.getEntity());
  1514.         }
  1515.     }
  1516.    
  1517.     @SuppressWarnings("deprecation")
  1518.     @EventHandler
  1519.     public void onDeath(org.bukkit.event.entity.PlayerDeathEvent event){
  1520.        
  1521.         onTimeDoWitherkill();
  1522.        
  1523.         if(event.getEntity().getKiller()!=null){
  1524.             long tenPercent = Bank.getBilance(event.getEntity())/10;
  1525.             if(tenPercent > 0 && Bank.substract(event.getEntity().getName().toLowerCase(), tenPercent)){
  1526.                 Bank.add(event.getEntity().getKiller().getName().toLowerCase(), tenPercent);
  1527.                 event.getEntity().getKiller().sendMessage("You got "+tenPercent+"g by killing "+event.getEntity().getDisplayName());
  1528.                 if(random()<0.1){
  1529.                     event.getEntity().getKiller().getInventory().addItem(playerHead(event.getEntity().getName()));
  1530.                 }
  1531.             }
  1532.         }
  1533.        
  1534.         final Player p = event.getEntity();
  1535.         boolean deathChest = false;
  1536.         if(p.getWorld()==Plugin.world){
  1537.             boolean b;
  1538.             event.getEntity().sendMessage((b=event.getEntity().getStatistic(Statistic.PLAYER_KILLS)/max(1, event.getEntity().getStatistic(Statistic.DEATHS))>3)?"§4[Mephisto->"+Rank.getNickName(p.getName())+"] Your travelling has an end. Enjoy your time! /wakeup":"§2[God->"+Rank.getNickName(p.getName())+"] You seem a bit sleepy. Have nice dreams :) /wakeup");
  1539.            
  1540.             String pos;
  1541.             if(!SpawnBuilder.deathMapDream.containsKey(p.getName()) || (pos=SpawnBuilder.deathMapDream.get(p.getName())).equals("null")){
  1542.                 SpawnBuilder.onDeath(event.getEntity(), b);
  1543.             } else {
  1544.                
  1545.                 final Location loc = new Location(Bukkit.getWorlds().get(0), MathHelper.isNumber(pos.split("\\.")[0]), MathHelper.isNumber(pos.split("\\.")[1], 70), MathHelper.isNumber(pos.split("\\.")[2]));
  1546.                
  1547.                 Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin.instance, new Runnable(){
  1548.  
  1549.                     @Override public void run() {
  1550.                         p.teleport(loc);
  1551.                     }
  1552.                    
  1553.                 }, 10);
  1554.             }
  1555.            
  1556.             deathChest = true;
  1557.            
  1558.         } else if(event.getEntity().getWorld().getName().endsWith("spawn_the_end")){
  1559.             event.setDeathMessage(p.getName()+" died at ISS");
  1560.             Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin.instance, new Runnable(){
  1561.  
  1562.                 @Override public void run() {
  1563.                     Location l = new Location(p.getWorld(), 0.5, 68, 1.5);
  1564.                     l.setDirection(new Vector(0, 0, -1));
  1565.                     p.teleport(l);
  1566.                 }
  1567.                
  1568.             }, 10);
  1569.            
  1570.         } else {
  1571.            
  1572.             // wenn er im Traum stirbt kommt er in die Stadt zurück
  1573.             String pos;
  1574.             if(!SpawnBuilder.deathMapNormal.containsKey(p.getName()) || (pos=SpawnBuilder.deathMapNormal.get(p.getName())).equals("null")){
  1575.                 SpawnBuilder.onJoin(event.getEntity(), true, false);
  1576.             } else {
  1577.                 final String po = pos;
  1578.                 Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin.instance, new Runnable(){
  1579.  
  1580.                     @Override public void run() {
  1581.                         Plugin.instance.onCommand(p, null, "xtp", po.split("\\."));
  1582.                     }
  1583.                    
  1584.                 }, 100);
  1585.             }
  1586.            
  1587.             deathChest = true;
  1588.         }
  1589.        
  1590.         if(deathChest){
  1591.            
  1592.             int x=p.getLocation().getBlockX(), y=(int) min(254, max(0, p.getLocation().getY()+0.999)), z=p.getLocation().getBlockZ();
  1593.             World w = p.getWorld();
  1594.             Block b = w.getBlockAt(x, y, z);
  1595.             if(b.getRelative(BlockFace.DOWN).getType()==Material.AIR){
  1596.                 y--;
  1597.                 b=w.getBlockAt(x, y, z);
  1598.             }
  1599.             Location trueLoc = w==Plugin.world?trueLocation(b.getLocation()).add(0,-4800,0):b.getLocation();
  1600.            
  1601.             // speichere...
  1602.             int i=0;
  1603.             ArrayList<ItemStack> toSave = new ArrayList<>();
  1604.             for(ItemStack s:p.getInventory().getArmorContents()){
  1605.                 if(s!=null){
  1606.                     toSave.add(s);
  1607.                     i++;
  1608.                 }
  1609.             }
  1610.             for(ItemStack s:p.getInventory().getContents()){
  1611.                 if(s!=null){
  1612.                     toSave.add(s);
  1613.                     i++;
  1614.                 }
  1615.             }
  1616.             event.getDrops().clear();
  1617.             if(i>0){
  1618.                 b.setTypeIdAndData(5, (byte) 13, false);
  1619.                 if(b.hasMetadata(MetaString.deathProtected)){
  1620.                     b.removeMetadata(MetaString.deathProtected, Plugin.instance);
  1621.                 }
  1622.                 b.setMetadata(MetaString.deathProtected, new FixedMetadataValue(Plugin.instance, p.getName()+" "+(System.currentTimeMillis()/1000+604800)));
  1623.                 b.setMetadata(MetaString.inventory, new FixedMetadataValue(Plugin.instance, toSave));
  1624.                 p.sendMessage("[§2Server§f] Your §4Inventory Contents§f("+i+" Stacks) were saved §6at "+trueLoc.getBlockX()+" "+trueLoc.getBlockY()+" "+trueLoc.getBlockZ()+"§f. They are save for the next 7 reallife days.");
  1625.             } else {
  1626.                 p.sendMessage("[§2Server§f] You had nothing in inventory, so nothing was saved!");
  1627.             }
  1628.         }
  1629.     }
  1630.    
  1631.     @EventHandler
  1632.     public void onBedEnter(org.bukkit.event.player.PlayerBedEnterEvent event){
  1633.         Player p = event.getPlayer();
  1634.         if(p.getWorld()==Plugin.world){
  1635.             Location trueloc = BlockListener.trueLocation(p.getLocation()).add(0,-4800,0);
  1636.             String pos=trueloc.getBlockX()+"."+trueloc.getBlockY()+"."+trueloc.getBlockZ();
  1637.             p.sendMessage(Plugin.serfix+"Set spawnlocation to "+pos);
  1638.             SpawnBuilder.deathMapNormal.put(p.getName(), pos);
  1639.         } else if(p.getWorld()==Bukkit.getWorlds().get(0)){
  1640.             Location trueloc = p.getLocation();
  1641.             String pos=trueloc.getBlockX()+"."+trueloc.getBlockY()+"."+trueloc.getBlockZ();
  1642.             p.sendMessage(Plugin.serfix+"Set spawnlocation to "+pos);
  1643.             SpawnBuilder.deathMapDream.put(p.getName(), pos);
  1644.         }
  1645.     }
  1646.    
  1647.     /*@EventHandler BlockFadeEvent
  1648.     public void onX(org.bukkit.event.block.BlockFadeEvent event){// Lava bewegt sich..
  1649.        
  1650.         //onTimeDoWitherkill();
  1651.         //System.out.println("Fade");
  1652.         // Feldblock geht kaputt
  1653.         //Bukkit.broadcastMessage(event.getNewState().getTypeId()+"");
  1654.     }*/
  1655.    
  1656.     /*@EventHandler BlockPhysicsEvent
  1657.     public void onX(org.bukkit.event.block.BlockPhysicsEvent event){
  1658.         // Sand/Kies, Kiste öffnen und so...
  1659.         // falscher Schnee verschwindet... -> solange es den gibt, wird das Event gecancelled! -> gibts nicht mehr, also egal :)
  1660.         if(event.getBlock().getType()==Material.SNOW){
  1661.            
  1662.             System.out.println(event.getChangedType().name()+" blockphysics cancelled in blocklistener by snow decaying: "+event.getBlock().getWorld().getBlockAt(event.getBlock().getLocation().add(0, -1, 0)).getType().name());
  1663.             event.setCancelled(true);
  1664.         }
  1665.     }*/
  1666.    
  1667.     /*@EventHandler BlockFromToEvent
  1668.     public void onX(org.bukkit.event.block.BlockFromToEvent event){
  1669.        
  1670.         onTimeDoWitherkill();
  1671.         System.out.println("FormTo");
  1672.         // Lava
  1673.         Bukkit.broadcastMessage(event.getBlock().getState().getTypeId()+"");
  1674.     }*/
  1675.  
  1676.     @EventHandler
  1677.     public void onPlayermove(PlayerMoveEvent event){//Hält den Spieler in der richtigen Welt
  1678.        
  1679.         onTimeDoWitherkill();
  1680.        
  1681.         Plugin.removeAfk(event.getPlayer().getName());
  1682.        
  1683.         if(event.getPlayer().getLocation().getWorld().getName().equalsIgnoreCase(Plugin.myWorldName)){
  1684.             Player p = event.getPlayer();
  1685.             checkPos(event, (Entity)p);
  1686.             updateScoreboard(p, false);
  1687.         } else if(event.getPlayer().getLocation().getWorld().getName().endsWith("_the_end")){
  1688.             updateScoreboard(event.getPlayer(), true);
  1689.         }
  1690.     }
  1691.    
  1692.     @EventHandler
  1693.     public void onVehicleMinecartUpdate(org.bukkit.event.vehicle.VehicleUpdateEvent event){
  1694.        
  1695.         onTimeDoWitherkill();
  1696.        
  1697.         if(event.getVehicle().getLocation().getWorld().getName().equalsIgnoreCase(Plugin.myWorldName)){
  1698.             checkPos(event, event.getVehicle());
  1699.         }
  1700.     }
  1701.    
  1702.     @SuppressWarnings("deprecation")
  1703.     public static ItemStack playerHead(String name){
  1704.         boolean animal=false, ani=false;
  1705.         switch(name){
  1706.         case "CREEPER":
  1707.         case "WITHER":
  1708.         case "ZOMBIE":
  1709.         case "SKELETON":
  1710.             animal = true;
  1711.         }
  1712.         if(!animal){
  1713.             if(EntityType.fromName(name)!=null)name = "MHF_"+name;
  1714.             ani = true;
  1715.         }
  1716.         ItemStack ret = new ItemStack(Material.SKULL_ITEM, 1, (short) SkullType.valueOf(animal?name:"PLAYER").ordinal());
  1717.         SkullMeta meta = (SkullMeta) ret.getItemMeta();
  1718.         meta.setOwner(name);
  1719.         if(ani)
  1720.             meta.setDisplayName("§f"+betterEntityName(name)+" Skull");
  1721.         else if(!animal)
  1722.             meta.setDisplayName(Rank.getNickName(name)+"'s Head");
  1723.         ret.setItemMeta(meta);
  1724.         return ret;
  1725.     }
  1726.    
  1727.     static String betterEntityName(String s){
  1728.         return s.charAt(4)+s.substring(5).toLowerCase();
  1729.     }
  1730. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement