Advertisement
Corosus

Pathfinder.java

Aug 19th, 2011
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.68 KB | None | 0 0
  1. package net.minecraft.src;
  2.  
  3. import net.minecraft.src.Block;
  4. import net.minecraft.src.BlockDoor;
  5. import net.minecraft.src.Entity;
  6. import net.minecraft.src.IBlockAccess;
  7. import net.minecraft.src.MCHash;
  8. import net.minecraft.src.Material;
  9. import net.minecraft.src.MathHelper;
  10. import net.minecraft.src.Path;
  11. import net.minecraft.src.PathEntity;
  12. import net.minecraft.src.PathPoint;
  13.  
  14. public class Pathfinder {
  15.  
  16.    private IBlockAccess worldMap;
  17.    private Path path = new Path();
  18.    private MCHash pointMap = new MCHash();
  19.    private PathPoint[] pathOptions = new PathPoint[32];
  20.  
  21.  
  22.    public Pathfinder(IBlockAccess var1) {
  23.       this.worldMap = var1;
  24.    }
  25.  
  26.    public PathEntity createEntityPathTo(Entity var1, Entity var2, float var3) {
  27.       return this.createEntityPathTo(var1, var2.posX, var2.boundingBox.minY, var2.posZ, var3);
  28.    }
  29.  
  30.    public PathEntity createEntityPathTo(Entity var1, int var2, int var3, int var4, float var5) {
  31.       return this.createEntityPathTo(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), var5);
  32.    }
  33.  
  34.    private PathEntity createEntityPathTo(Entity var1, double var2, double var4, double var6, float var8) {
  35.       this.path.clearPath();
  36.       this.pointMap.clearMap();
  37.       PathPoint var9 = this.openPoint(MathHelper.floor_double(var1.boundingBox.minX), MathHelper.floor_double(var1.boundingBox.minY), MathHelper.floor_double(var1.boundingBox.minZ));
  38.       PathPoint var10 = this.openPoint(MathHelper.floor_double(var2 - (double)(var1.width / 2.0F)), MathHelper.floor_double(var4), MathHelper.floor_double(var6 - (double)(var1.width / 2.0F)));
  39.       PathPoint var11 = new PathPoint(MathHelper.floor_float(var1.width + 1.0F), MathHelper.floor_float(var1.height + 1.0F), MathHelper.floor_float(var1.width + 1.0F));
  40.       PathEntity var12 = this.addToPath(var1, var9, var10, var11, var8);
  41.       return var12;
  42.    }
  43.  
  44.    private PathEntity addToPath(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) {
  45.       var2.totalPathDistance = 0.0F;
  46.       var2.distanceToNext = var2.distanceTo(var3);
  47.       var2.distanceToTarget = var2.distanceToNext;
  48.       this.path.clearPath();
  49.       this.path.addPoint(var2);
  50.       PathPoint var6 = var2;
  51.  
  52.       while(!this.path.isPathEmpty()) {
  53.          PathPoint var7 = this.path.dequeue();
  54.          if(var7.equals(var3)) {
  55.             return this.createEntityPath(var2, var3);
  56.          }
  57.  
  58.          if(var7.distanceTo(var3) < var6.distanceTo(var3)) {
  59.             var6 = var7;
  60.          }
  61.  
  62.          var7.isFirst = true;
  63.          int var8 = this.findPathOptions(var1, var7, var4, var3, var5);
  64.  
  65.          for(int var9 = 0; var9 < var8; ++var9) {
  66.             PathPoint var10 = this.pathOptions[var9];
  67.             float var11 = var7.totalPathDistance + var7.distanceTo(var10);
  68.             if(!var10.isAssigned() || var11 < var10.totalPathDistance) {
  69.                var10.previous = var7;
  70.                var10.totalPathDistance = var11;
  71.                var10.distanceToNext = var10.distanceTo(var3);
  72.                if(var10.isAssigned()) {
  73.                   this.path.changeDistance(var10, var10.totalPathDistance + var10.distanceToNext);
  74.                } else {
  75.                   var10.distanceToTarget = var10.totalPathDistance + var10.distanceToNext;
  76.                   this.path.addPoint(var10);
  77.                }
  78.             }
  79.          }
  80.       }
  81.  
  82.       if(var6 == var2) {
  83.          return null;
  84.       } else {
  85.          return this.createEntityPath(var2, var6);
  86.       }
  87.    }
  88.  
  89.    private int findPathOptions(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) {
  90.       int var6 = 0;
  91.       byte var7 = 0;
  92.       if(this.getVerticalOffset(var1, var2.xCoord, var2.yCoord + 1, var2.zCoord, var3) == 1) {
  93.          var7 = 1;
  94.       }
  95.  
  96.       PathPoint var8 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord + 1, var3, var7);
  97.       PathPoint var9 = this.getSafePoint(var1, var2.xCoord - 1, var2.yCoord, var2.zCoord, var3, var7);
  98.       PathPoint var10 = this.getSafePoint(var1, var2.xCoord + 1, var2.yCoord, var2.zCoord, var3, var7);
  99.       PathPoint var11 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord - 1, var3, var7);
  100.       if(var8 != null && !var8.isFirst && var8.distanceTo(var4) < var5) {
  101.          this.pathOptions[var6++] = var8;
  102.       }
  103.  
  104.       if(var9 != null && !var9.isFirst && var9.distanceTo(var4) < var5) {
  105.          this.pathOptions[var6++] = var9;
  106.       }
  107.  
  108.       if(var10 != null && !var10.isFirst && var10.distanceTo(var4) < var5) {
  109.          this.pathOptions[var6++] = var10;
  110.       }
  111.  
  112.       if(var11 != null && !var11.isFirst && var11.distanceTo(var4) < var5) {
  113.          this.pathOptions[var6++] = var11;
  114.       }
  115.  
  116.       return var6;
  117.    }
  118.  
  119.    private PathPoint getSafePoint(Entity var1, int var2, int var3, int var4, PathPoint var5, int var6) {
  120.       PathPoint var7 = null;
  121.       if(this.getVerticalOffset(var1, var2, var3, var4, var5) == 1) {
  122.          var7 = this.openPoint(var2, var3, var4);
  123.       }
  124.  
  125.       if(var7 == null && var6 > 0 && this.getVerticalOffset(var1, var2, var3 + var6, var4, var5) == 1) {
  126.          var7 = this.openPoint(var2, var3 + var6, var4);
  127.          var3 += var6;
  128.       }
  129.  
  130.       if(var7 != null) {
  131.          int var8 = 0;
  132.          int var9 = 0;
  133.  
  134.          while(var3 > 0 && (var9 = this.getVerticalOffset(var1, var2, var3 - 1, var4, var5)) == 1) {
  135.             ++var8;
  136.             if(var8 >= 4) {
  137.                return null;
  138.             }
  139.  
  140.             --var3;
  141.             if(var3 > 0) {
  142.                var7 = this.openPoint(var2, var3, var4);
  143.             }
  144.          }
  145.  
  146.          if(var9 == -2) {
  147.             return null;
  148.          }
  149.       }
  150.  
  151.       return var7;
  152.    }
  153.  
  154.    private final PathPoint openPoint(int var1, int var2, int var3) {
  155.       int var4 = PathPoint.func_22329_a(var1, var2, var3);
  156.       PathPoint var5 = (PathPoint)this.pointMap.lookup(var4);
  157.       if(var5 == null) {
  158.          var5 = new PathPoint(var1, var2, var3);
  159.          this.pointMap.addKey(var4, var5);
  160.       }
  161.  
  162.       return var5;
  163.    }
  164.  
  165.    private int getVerticalOffset(Entity var1, int var2, int var3, int var4, PathPoint var5) {
  166.       for(int var6 = var2; var6 < var2 + var5.xCoord; ++var6) {
  167.          for(int var7 = var3; var7 < var3 + var5.yCoord; ++var7) {
  168.             for(int var8 = var4; var8 < var4 + var5.zCoord; ++var8) {
  169.                int var9 = this.worldMap.getBlockId(var6, var7, var8);
  170.                if(var9 > 0) {
  171.                   if(var9 != Block.doorSteel.blockID && var9 != Block.doorWood.blockID) {
  172.                      Material var11 = Block.blocksList[var9].blockMaterial;
  173.                      if(var11.getIsSolid()) {
  174.                         return 0;
  175.                      }
  176.  
  177.                      if(var11 == Material.water) {
  178.                         return -1;
  179.                      }
  180.  
  181.                      if(var11 == Material.lava) {
  182.                         return -2;
  183.                      }
  184.                   } else {
  185.                      int var10 = this.worldMap.getBlockMetadata(var6, var7, var8);
  186.                      if(!BlockDoor.isOpen(var10)) {
  187.                         return 0;
  188.                      }
  189.                   }
  190.                }
  191.             }
  192.          }
  193.       }
  194.  
  195.       return 1;
  196.    }
  197.  
  198.    private PathEntity createEntityPath(PathPoint var1, PathPoint var2) {
  199.       int var3 = 1;
  200.  
  201.       PathPoint var4;
  202.       for(var4 = var2; var4.previous != null; var4 = var4.previous) {
  203.          ++var3;
  204.       }
  205.  
  206.       PathPoint[] var5 = new PathPoint[var3];
  207.       var4 = var2;
  208.       --var3;
  209.  
  210.       for(var5[var3] = var2; var4.previous != null; var5[var3] = var4) {
  211.          var4 = var4.previous;
  212.          --var3;
  213.       }
  214.  
  215.       return new PathEntity(var5);
  216.    }
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement