Mattie

Mattie

Jan 25th, 2011
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.01 KB | None | 0 0
  1. package com.bukkit.Matthijs.RedstoneSponge;
  2.  
  3. import java.util.logging.Level;
  4. import java.util.logging.Logger;
  5.  
  6. import org.bukkit.Material;
  7. import org.bukkit.Server;
  8. import org.bukkit.World;
  9. import org.bukkit.block.*;
  10. import org.bukkit.block.Sign;
  11. import org.bukkit.event.block.*;
  12. import org.bukkit.material.*;
  13.  
  14. public class RedstoneSpongeBlockListener extends BlockListener
  15. {
  16.     private final RedstoneSponge    plugin;
  17.     private final Server            server;
  18.     final Logger                    logger  = Logger.getLogger("Minecraft");
  19.     private final int               SPONGE  = 19;
  20.     private static World            world;
  21.     private int                     radius;
  22.  
  23.     public RedstoneSpongeBlockListener(RedstoneSponge instance)
  24.     {
  25.         this.plugin = instance;
  26.         this.server = plugin.getServer();
  27.         radius = plugin.getRadius();
  28.     }
  29.  
  30.     public void onBlockPlace(BlockPlaceEvent event)
  31.     {
  32.         Block blockPlaced = event.getBlock();
  33.         World world = blockPlaced.getWorld();
  34.         if (blockPlaced.getTypeId() == SPONGE)
  35.         {
  36.             int blockX = blockPlaced.getX();
  37.             int blockY = blockPlaced.getY();
  38.             int blockZ = blockPlaced.getZ();
  39. //          int radius = plugin.getRadius();
  40.             radius = plugin.getRadius();
  41.             boolean waterSponge = plugin.isWaterSpongeEnabled();
  42.             boolean lavaSponge = plugin.isLavaSpongeEnabled();
  43.  
  44.             for (int radX = 0 - radius; radX <= radius; radX++)
  45.             {
  46.                 for (int radY = 0 - radius; radY <= radius; radY++)
  47.                 {
  48.                     for (int radZ = 0 - radius; radZ <= radius; radZ++)
  49.                     {
  50.                         int id = world.getBlockTypeIdAt(blockX + radX, blockY + radY, blockZ + radZ);
  51.                         if (lavaSponge && (id == 10 || id == 11))
  52.                         {
  53.                             world.getBlockAt(blockX + radX, blockY + radY, blockZ + radZ).setTypeId(0);
  54.                         }
  55.                         else if (waterSponge && (id == 8 || id == 9))
  56.                         {
  57.                             world.getBlockAt(blockX + radX, blockY + radY, blockZ + radZ).setTypeId(0);
  58.                         }
  59.                     }
  60.  
  61.                 }
  62.  
  63.             }
  64.  
  65.         }
  66.     }
  67.  
  68.     public void placeSponge(Block b)
  69.     {
  70.  
  71.         int blockX = b.getX();
  72.         int blockY = b.getY();
  73.         int blockZ = b.getZ();
  74. //          int radius = plugin.getRadius();
  75.         radius = plugin.getRadius();
  76.         boolean waterSponge = plugin.isWaterSpongeEnabled();
  77.         boolean lavaSponge = plugin.isLavaSpongeEnabled();
  78.  
  79.         for (int radX = 0 - radius; radX <= radius; radX++)
  80.         {
  81.             for (int radY = 0 - radius; radY <= radius; radY++)
  82.             {
  83.                 for (int radZ = 0 - radius; radZ <= radius; radZ++)
  84.                 {
  85.                     int id = world.getBlockTypeIdAt(blockX + radX, blockY + radY, blockZ + radZ);
  86.                     if (lavaSponge && (id == 10 || id == 11))
  87.                     {
  88.                         world.getBlockAt(blockX + radX, blockY + radY, blockZ + radZ).setTypeId(0);
  89.                     }
  90.                     else if (waterSponge && (id == 8 || id == 9))
  91.                     {
  92.                         world.getBlockAt(blockX + radX, blockY + radY, blockZ + radZ).setTypeId(0);
  93.                     }
  94.                 }
  95.  
  96.             }
  97.  
  98.         }
  99.     }
  100.  
  101.     public void onBlockRedstoneChange(BlockFromToEvent event)
  102.     {
  103.  
  104. //      System.out.println("redstonechange");
  105. //      logger.log(Level.INFO, "onredstonechange");
  106.         world = event.getBlock().getWorld();
  107.         Block blockFrom = event.getBlock();
  108. //      Block blockTo = event.getToBlock();
  109.         Material north = event.getBlock().getFace(BlockFace.NORTH).getType();
  110.         Material east = event.getBlock().getFace(BlockFace.EAST).getType();
  111.         Material south = event.getBlock().getFace(BlockFace.SOUTH).getType();
  112.         Material west = event.getBlock().getFace(BlockFace.WEST).getType();
  113.         Material spons = Material.SPONGE;
  114.         Material wool = Material.WOOL;
  115.         BlockRedstoneEvent r = (BlockRedstoneEvent) event;
  116.         int newCurrent = r.getNewCurrent();
  117.         int oldCurrent = r.getOldCurrent();
  118. //      System.out.println("new: " + newCurrent + "    old: " + oldCurrent);
  119.  
  120.         if (north == spons || east == spons || south == spons || west == spons)
  121.         {
  122. //          if (isBlockIndirectlyPowered(blockFrom) || isBlockPowered2(blockFrom))
  123.             if (oldCurrent == 0 && newCurrent >= 1)
  124.             {
  125. //              System.out.println("SPONS isindirect: " + isBlockIndirectlyPowered(blockFrom) + "  is direct " + isBlockPowered2(blockFrom));
  126.                 spongeToWool(event);
  127.  
  128.             }
  129.  
  130.         }
  131.  
  132.         if ((north == wool || east == wool || south == wool || west == wool))
  133.         {
  134. //          System.out.println("wool if dinges");
  135. //          System.out.println("123WOOL isindirect: " + !isBlockIndirectlyPowered(blockFrom) + "  is direct " + !isBlockPowered2(blockFrom));
  136.  
  137.             boolean test = !isBlockIndirectlyPowered(blockFrom) && !isBlockPowered2(blockFrom);
  138.  
  139. //          if (test == false)
  140.             if (oldCurrent >= 1 && newCurrent == 0)
  141.             {
  142. //              System.out.println("WOOL isindirect: " + !isBlockIndirectlyPowered(blockFrom) + "  is direct " + !isBlockPowered2(blockFrom));
  143.                 woolToSponge(event);
  144.  
  145.             }
  146.  
  147.         }
  148.  
  149. //      System.out.println("blockfrom: " + blockFrom.getType());
  150. //      System.out.println("blockTo: " + blockTo.getType());
  151.     }
  152.  
  153.     public void spongeToWool(BlockFromToEvent event)
  154.     {
  155. //      logger.log(Level.INFO, "IF SPONS");
  156.         if (event.getBlock().getFace(BlockFace.NORTH).getType() == Material.SPONGE)
  157.         {
  158.             Block despons = event.getBlock().getRelative(BlockFace.NORTH);
  159.             despons.setTypeId(35);
  160.             despons.setData((byte) 4);//set yellow
  161.  
  162.         }
  163.         if (event.getBlock().getFace(BlockFace.EAST).getType() == Material.SPONGE)
  164.         {
  165.             Block despons = event.getBlock().getRelative(BlockFace.EAST);
  166.             despons.setTypeId(35);
  167.             despons.setData((byte) 4);//set yellow
  168.  
  169.         }
  170.         if (event.getBlock().getFace(BlockFace.SOUTH).getType() == Material.SPONGE)
  171.         {
  172.             Block despons = event.getBlock().getRelative(BlockFace.SOUTH);
  173.             despons.setTypeId(35);
  174.             despons.setData((byte) 4);//set yellow
  175.  
  176.         }
  177.         if (event.getBlock().getFace(BlockFace.WEST).getType() == Material.SPONGE)
  178.         {
  179.             Block despons = event.getBlock().getRelative(BlockFace.WEST);
  180.             despons.setTypeId(35);
  181.             despons.setData((byte) 4);//set yellow
  182.  
  183.         }
  184.     }
  185.  
  186.     public void woolToSponge(BlockFromToEvent event)
  187.     {
  188. //      logger.log(Level.INFO, "ELSE IF WOOL");
  189.         if (event.getBlock().getFace(BlockFace.NORTH).getType() == Material.WOOL)
  190.         {
  191.             Block despons = event.getBlock().getRelative(BlockFace.NORTH);
  192.             despons.setTypeId(0);
  193.             despons.setTypeId(SPONGE);
  194.             placeSponge(despons);
  195.         }
  196.         if (event.getBlock().getFace(BlockFace.EAST).getType() == Material.WOOL)
  197.         {
  198.             Block despons = event.getBlock().getRelative(BlockFace.EAST);
  199.             despons.setTypeId(0);
  200.             despons.setTypeId(SPONGE);
  201.             placeSponge(despons);
  202.         }
  203.         if (event.getBlock().getFace(BlockFace.SOUTH).getType() == Material.WOOL)
  204.         {
  205.             Block despons = event.getBlock().getRelative(BlockFace.SOUTH);
  206.             despons.setTypeId(0);
  207.             despons.setTypeId(SPONGE);
  208.             placeSponge(despons);
  209.         }
  210.         if (event.getBlock().getFace(BlockFace.WEST).getType() == Material.WOOL)
  211.         {
  212.             Block despons = event.getBlock().getRelative(BlockFace.WEST);
  213.             despons.setTypeId(0);
  214.             despons.setTypeId(SPONGE);
  215.             placeSponge(despons);
  216.         }
  217.  
  218.     }
  219.  
  220.     public static World getWorld()
  221.     {
  222.         return world;
  223.     }
  224.  
  225.     /**
  226.      ** Returns true if the block at the given x, y, z coordinates is indirectly
  227.      * powered
  228.      **
  229.      * @param x
  230.      *            coordinate
  231.      ** @param y
  232.      *            coordinate
  233.      ** @param z
  234.      *            coordinate
  235.      **/
  236.     public static boolean isBlockIndirectlyPowered(Block b)
  237.     {
  238.         int x = b.getX();
  239.         int y = b.getY();
  240.         int z = b.getZ();
  241.  
  242.         return isBlockPowered(x + 1, y, z) || isBlockPowered(x - 1, y, z) || isBlockPowered(x, y, z + 1) || isBlockPowered(x, y, z - 1) || isBlockPowered(x, y - 1, z);
  243.     }
  244.  
  245.     /**
  246.      ** Returns true if the block at the given x, y, z coordinates is directly
  247.      * powered
  248.      **
  249.      * @param x
  250.      *            coordinate
  251.      ** @param y
  252.      *            coordinate
  253.      ** @param z
  254.      *            coordinate
  255.      **/
  256.     public static boolean isBlockPowered(int x, int y, int z)
  257.     {
  258.         MaterialData md = getWorld().getBlockAt(x, y, z).getState().getData();
  259.         if (md instanceof Redstone)
  260.         {
  261.             return ((Redstone) md).isPowered();
  262.         }
  263.         return false;
  264.     }
  265.  
  266.     public static boolean isBlockPowered2(Block b)
  267.     {
  268.  
  269.         int x = b.getX();
  270.         int y = b.getY();
  271.         int z = b.getZ();
  272.  
  273.         MaterialData md = getWorld().getBlockAt(x, y, z).getState().getData();
  274.         if (md instanceof Redstone)
  275.         {
  276.             return ((Redstone) md).isPowered();
  277.         }
  278.         return false;
  279.     }
  280.  
  281.     public void onBlockFlow(BlockFromToEvent event)
  282.     {
  283.         World world = event.getBlock().getWorld();
  284.         Block blockFrom = event.getBlock();
  285.         Block blockTo = event.getToBlock();
  286.         boolean isLava = blockFrom.getTypeId() == 10 || blockFrom.getTypeId() == 11;
  287.         boolean isWater = blockFrom.getTypeId() == 8 || blockFrom.getTypeId() == 9;
  288.         boolean waterSponge = plugin.isWaterSpongeEnabled();
  289.         boolean lavaSponge = plugin.isLavaSpongeEnabled();
  290. //      int radius = plugin.getRadius();
  291.         if (lavaSponge && isLava || waterSponge && isWater)
  292.         {
  293.             int blockX = blockTo.getX();
  294.             int blockY = blockTo.getY();
  295.             int blockZ = blockTo.getZ();
  296.  
  297.             for (int radX = 0 - radius; radX <= radius; radX++)
  298.             {
  299.                 for (int radY = 0 - radius; radY <= radius; radY++)
  300.                 {
  301.                     for (int radZ = 0 - radius; radZ <= radius; radZ++)
  302.                     {
  303.                         int id = world.getBlockTypeIdAt(blockX + radX, blockY + radY, blockZ + radZ);
  304.                         if (id == SPONGE)
  305.                         {
  306.  
  307.                             event.setCancelled(true);
  308.                             return;
  309.                         }
  310.                     }
  311.  
  312.                 }
  313.  
  314.             }
  315.  
  316.         }
  317.     }
  318. }
Add Comment
Please, Sign In to add comment