bspkrs

ConnectedDestruction.java

Nov 8th, 2012
571
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.26 KB | None | 0 0
  1. package bspkrs.connecteddestruction;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Random;
  6.  
  7. import net.minecraft.client.Minecraft;
  8. import net.minecraft.src.BaseMod;
  9. import net.minecraft.src.Block;
  10. import net.minecraft.src.EntityItem;
  11. import net.minecraft.src.ItemStack;
  12. import net.minecraft.src.ModLoader;
  13. import net.minecraft.src.World;
  14.  
  15. public class ConnectedDestruction
  16. {
  17.  
  18.     private final int LIMIT = ConnectedDestructionMod.blockLimit;
  19.     private final int MAX_DISTANCE = ConnectedDestructionMod.maximumDistance;
  20.     private final int BLOCKS_PER_TICK = ConnectedDestructionMod.blocksPerTick;
  21.     public int blocksHarvested;
  22.     private boolean enableDrops;
  23.     private List scheduledBlocks = new ArrayList();
  24.    
  25.     private int initial_x, initial_y, initial_z;
  26.     private int[] blockData;
  27.     private World world;
  28.     private ArrayList<ItemStack> drops;
  29.    
  30.     public ConnectedDestruction(World world, int[] blockData, int x, int y, int z, boolean enableDrops)
  31.     {
  32.         this.world = world;
  33.         ModLoader.setInGameHook(this.new TickHelper(), true, true);
  34.         this.enableDrops = enableDrops;
  35.         blocksHarvested = 0;
  36.         scheduledBlocks = new ArrayList();
  37.         this.blockData = blockData;
  38.         initial_x = x;
  39.         initial_y = y;
  40.         initial_z = z;
  41.         drops = new ArrayList<ItemStack>();
  42.     }
  43.    
  44.     private String iterate(int[][] group)
  45.     {
  46.         String res = "";
  47.         for(int[] block: group)
  48.         {
  49.             res = res.concat(Integer.toString(block[0])).concat(", ").concat(Integer.toString(block[1])).concat("; ");
  50.         }
  51.         return res;
  52.     }
  53.    
  54.     public void harvestConnectedBlocks(int x, int y, int z)
  55.     {
  56.         byte d = 1;
  57.         for(int dx = -d; dx <= d; dx++)
  58.         {
  59.             for(int dy = -d; dy <= d; dy++)
  60.             {
  61.                 for(int dz = -d; dz <= d; dz++)
  62.                 {
  63.                     if(dx == 0 && dy == 0 && dz == 0) continue;
  64.                     int[] blockPos = new int[]{x + dx, y + dy, z + dz};
  65.                     int blockID = world.getBlockId(blockPos[0], blockPos[1], blockPos[2]);
  66.                     int blockMetadata = world.getBlockMetadata(blockPos[0], blockPos[1], blockPos[2]);
  67.                     if(blockID == blockData[0] && (blockData[1] == -1 || blockData[1] == blockMetadata))
  68.                     {
  69.                         if((LIMIT == -1 || blocksHarvested <= LIMIT) && (MAX_DISTANCE == -1 || getCubicDistance(blockPos[0], blockPos[1], blockPos[2]) <= MAX_DISTANCE))
  70.                         {
  71.                             Block block = Block.blocksList[blockID];
  72.                             if(block == null) continue;
  73.                             //world.setBlockWithNotify(blockPos[0], blockPos[1], blockPos[2], 0);
  74.                             world.setBlock(blockPos[0], blockPos[1], blockPos[2], 0);
  75.                             if(enableDrops) addDrop(block, blockMetadata); //block.dropBlockAsItemWithChance(world, initial_x, initial_y, initial_z, blockMetadata, 1.0F, 0);
  76.                             blocksHarvested++;
  77.                            
  78.                             if(!scheduledBlocks.contains(blockPos))
  79.                                 scheduledBlocks.add(blockPos);
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.     }
  86.    
  87.     private void addDrop(Block block, int metadata)
  88.     {
  89.         Random random = new Random();
  90.         int idDropped = block.idDropped(0, random, 0);
  91.         int damage = block.damageDropped(metadata);
  92.         int quantity = block.quantityDropped(random);
  93.         ItemStack drop = new ItemStack(idDropped, quantity, damage);
  94.        
  95.         int index = -1;
  96.         for(int i = 0; i < drops.size(); i++)
  97.         {
  98.             if(drops.get(i).isItemEqual(drop))
  99.             {
  100.                 index = i;
  101.                 break;
  102.             }
  103.         }
  104.        
  105.         if(index == -1)
  106.         {
  107.             drops.add(drop);
  108.             index = drops.indexOf(drop);
  109.         }
  110.         else
  111.         {
  112.             drop = drops.get(index);
  113.             drop.stackSize += quantity;
  114.         }
  115.        
  116.         if(drop.stackSize >= drop.getMaxStackSize())
  117.         {
  118.             int i = drop.stackSize - drop.getMaxStackSize();
  119.             drop.stackSize = drop.getMaxStackSize();
  120.             world.spawnEntityInWorld(new EntityItem(world, initial_x, initial_y, initial_z, drop));
  121.             if(i > 0)
  122.                 drop.stackSize = i;
  123.             else
  124.                 drops.remove(index);
  125.         }
  126.     }
  127.    
  128.     private int getCubicDistance(int x, int y, int z)
  129.     {
  130.         return Math.max(Math.abs(x - initial_x), Math.max(Math.abs(y - initial_y), Math.abs(z - initial_z)));
  131.     }
  132.    
  133.     private int getDistance(int x, int y, int z)
  134.     {
  135.         return Math.abs(x - initial_x) + Math.abs(y - initial_y) + Math.abs(z - initial_z);
  136.     }
  137.  
  138.     private List<Integer[]> destroyScheduledBlocks(List scheduledBlocks)
  139.     {
  140.         int removed = 0;
  141.         while(scheduledBlocks.size() > 0 && removed < BLOCKS_PER_TICK)
  142.         {
  143.             int[] blockPos = (int[])scheduledBlocks.remove(0);
  144.             removed++;
  145.             int[] block = new int[]{
  146.                     world.getBlockId(blockPos[0], blockPos[1], blockPos[2]),
  147.                     world.getBlockMetadata(blockPos[0], blockPos[1], blockPos[2])
  148.             };
  149.             harvestConnectedBlocks(blockPos[0], blockPos[1], blockPos[2]);
  150.         }
  151.        
  152.         if(scheduledBlocks.size() == 0)
  153.         {
  154.             while(drops.size() > 0)
  155.                 world.spawnEntityInWorld(new EntityItem(world, initial_x, initial_y, initial_z, drops.remove(0)));
  156.         }
  157.            
  158.         return scheduledBlocks;
  159.     }
  160.    
  161.     private class TickHelper extends BaseMod
  162.     {
  163.         @Override
  164.         public String getVersion()
  165.         {
  166.             return null;
  167.         }
  168.  
  169.         @Override
  170.         public void load()
  171.         {
  172.            
  173.         }
  174.        
  175.         @Override
  176.         public boolean onTickInGame(float f, Minecraft minecraft)
  177.         {
  178.             if(scheduledBlocks.size() > 0)
  179.             {
  180.                 destroyScheduledBlocks(scheduledBlocks);
  181.             }
  182.             return scheduledBlocks.size() > 0;
  183.         }
  184.     }
  185. }
Advertisement
Add Comment
Please, Sign In to add comment