Advertisement
Corosus

PathfinderEnh v0.2

Aug 18th, 2011
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.79 KB | None | 0 0
  1. //Usage example (from entity file scope)
  2. setPathToEntity(PathfinderEnh.getPathToEntity(this, var1, var2, canClimb()));
  3.  
  4. //example canClimb function
  5. public boolean canClimb() {
  6.         if (this instanceof EntityCreeper || this instanceof EntitySpider || true) {
  7.             return true;
  8.         }
  9.         return false;
  10.     }
  11.  
  12. //PathfinderEnh.java
  13.  
  14. package net.minecraft.src;
  15.  
  16. import net.minecraft.src.Block;
  17. import net.minecraft.src.BlockDoor;
  18. import net.minecraft.src.Entity;
  19. import net.minecraft.src.IBlockAccess;
  20. import net.minecraft.src.MCHash;
  21. import net.minecraft.src.Material;
  22. import net.minecraft.src.MathHelper;
  23. import net.minecraft.src.Path;
  24. import net.minecraft.src.PathEntity;
  25. import net.minecraft.src.PathPoint;
  26.  
  27. public class PathfinderEnh {
  28.  
  29.    private IBlockAccess worldMap;
  30.    private Path path = new Path();
  31.    private MCHash pointMap = new MCHash();
  32.    private PathPoint[] pathOptions = new PathPoint[32];
  33.    
  34.    public boolean foundEnd;
  35.    public boolean canClimb = false;
  36.  
  37.    public PathfinderEnh(IBlockAccess var1) {
  38.       this.worldMap = var1;
  39.    }
  40.    
  41.    public static PathEntity getPathToEntity(Entity var1, Entity var2, float var3) {
  42.        return getPathToEntity(var1, var2, var3, false);
  43.    }
  44.    
  45.    public static PathEntity getPathToEntity(Entity var1, Entity var2, float var3, boolean canClimb) {
  46.       int var4 = MathHelper.floor_double(var1.posX);
  47.       int var5 = MathHelper.floor_double(var1.posY);
  48.       int var6 = MathHelper.floor_double(var1.posZ);
  49.       int var7 = (int)(var3 + 16.0F);
  50.       int var8 = var4 - var7;
  51.       int var9 = var5 - var7;
  52.       int var10 = var6 - var7;
  53.       int var11 = var4 + var7;
  54.       int var12 = var5 + var7;
  55.       int var13 = var6 + var7;
  56.       ChunkCache var14 = new ChunkCache(ModLoader.getMinecraftInstance().theWorld, var8, var9, var10, var11, var12, var13);
  57.      
  58.      
  59.       PathfinderEnh pf = new PathfinderEnh(var14);
  60.       pf.canClimb = canClimb;
  61.      
  62.       return (pf).createEntityPathTo(var1, var2, var3);
  63.    }
  64.  
  65.    public PathEntity getEntityPathToXYZ(Entity var1, int var2, int var3, int var4, float var5) {
  66.       int var6 = MathHelper.floor_double(var1.posX);
  67.       int var7 = MathHelper.floor_double(var1.posY);
  68.       int var8 = MathHelper.floor_double(var1.posZ);
  69.       int var9 = (int)(var5 + 8.0F);
  70.       int var10 = var6 - var9;
  71.       int var11 = var7 - var9;
  72.       int var12 = var8 - var9;
  73.       int var13 = var6 + var9;
  74.       int var14 = var7 + var9;
  75.       int var15 = var8 + var9;
  76.       ChunkCache var16 = new ChunkCache(ModLoader.getMinecraftInstance().theWorld, var10, var11, var12, var13, var14, var15);
  77.      
  78.       PathfinderEnh pf = new PathfinderEnh(var16);
  79.       pf.canClimb = false;
  80.      
  81.       return (pf).createEntityPathTo(var1, var2, var3, var4, var5);
  82.    }
  83.  
  84.    public PathEntity createEntityPathTo(Entity var1, Entity var2, float var3) {
  85.       return this.createEntityPathTo(var1, var2.posX, var2.boundingBox.minY, var2.posZ, var3);
  86.    }
  87.  
  88.    public PathEntity createEntityPathTo(Entity var1, int var2, int var3, int var4, float var5) {
  89.       return this.createEntityPathTo(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), var5);
  90.    }
  91.  
  92.    private PathEntity createEntityPathTo(Entity var1, double var2, double var4, double var6, float var8) {
  93.       this.path.clearPath();
  94.       this.pointMap.clearMap();
  95.       foundEnd = false;
  96.       PathPoint var9 = this.openPoint(MathHelper.floor_double(var1.boundingBox.minX), MathHelper.floor_double(var1.boundingBox.minY), MathHelper.floor_double(var1.boundingBox.minZ));
  97.       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)));
  98.       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));
  99.       PathEntity var12 = this.addToPath(var1, var9, var10, var11, var8);
  100.       if (var12 != null) {
  101.           //var12.foundEnd = foundEnd;
  102.       }
  103.       return var12;
  104.    }
  105.  
  106.    private PathEntity addToPath(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) {
  107.       var2.totalPathDistance = 0.0F;
  108.       var2.distanceToNext = var2.distanceTo(var3);
  109.       var2.distanceToTarget = var2.distanceToNext;
  110.       this.path.clearPath();
  111.       this.path.addPoint(var2);
  112.       PathPoint var6 = var2;
  113.  
  114.       while(!this.path.isPathEmpty()) {
  115.          PathPoint var7 = this.path.dequeue();
  116.          if(var7.equals(var3)) {
  117.             return this.createEntityPath(var2, var3);
  118.          }
  119.  
  120.          if(var7.distanceTo(var3) < var6.distanceTo(var3)) {
  121.             var6 = var7;
  122.          }
  123.  
  124.          var7.isFirst = true;
  125.          int var8 = this.findPathOptions(var1, var7, var4, var3, var5);
  126.  
  127.          for(int var9 = 0; var9 < var8; ++var9) {
  128.             PathPoint var10 = this.pathOptions[var9];
  129.             float var11 = var7.totalPathDistance + var7.distanceTo(var10);
  130.             if(!var10.isAssigned() || var11 < var10.totalPathDistance) {
  131.                var10.previous = var7;
  132.                var10.totalPathDistance = var11;
  133.                var10.distanceToNext = var10.distanceTo(var3);
  134.                if(var10.isAssigned()) {
  135.                   this.path.changeDistance(var10, var10.totalPathDistance + var10.distanceToNext);
  136.                } else {
  137.                   var10.distanceToTarget = var10.totalPathDistance + var10.distanceToNext;
  138.                   this.path.addPoint(var10);
  139.                }
  140.             }
  141.          }
  142.          
  143.       }
  144.      
  145.       if (Math.abs(var3.xCoord - var6.xCoord) < 2 && Math.abs(var3.yCoord - var6.yCoord) < 2 && Math.abs(var3.zCoord - var6.zCoord) < 2) {
  146.           foundEnd = true;
  147.       }
  148.  
  149.       if(var6 == var2) {
  150.          return null;
  151.       } else {
  152.          return this.createEntityPath(var2, var6);
  153.       }
  154.    }
  155.  
  156.    private int findPathOptions(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) {
  157.       int var6 = 0;
  158.       byte var7 = 0;
  159.       if(this.getVerticalOffset(var1, var2.xCoord, var2.yCoord + 1, var2.zCoord, var3) == 1) {
  160.          var7 = 1;
  161.       }
  162.  
  163.       PathPoint var8 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord + 1, var3, var7);
  164.       PathPoint var9 = this.getSafePoint(var1, var2.xCoord - 1, var2.yCoord, var2.zCoord, var3, var7);
  165.       PathPoint var10 = this.getSafePoint(var1, var2.xCoord + 1, var2.yCoord, var2.zCoord, var3, var7);
  166.       PathPoint var11 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord - 1, var3, var7);
  167.      
  168.       if(var8 != null && !var8.isFirst && var8.distanceTo(var4) < var5) {
  169.           this.pathOptions[var6++] = var8;
  170.        }
  171.  
  172.        if(var9 != null && !var9.isFirst && var9.distanceTo(var4) < var5) {
  173.           this.pathOptions[var6++] = var9;
  174.        }
  175.  
  176.        if(var10 != null && !var10.isFirst && var10.distanceTo(var4) < var5) {
  177.           this.pathOptions[var6++] = var10;
  178.        }
  179.  
  180.        if(var11 != null && !var11.isFirst && var11.distanceTo(var4) < var5) {
  181.           this.pathOptions[var6++] = var11;
  182.        }
  183.        
  184.        if (canClimb) {
  185.            PathPoint vvar8 = this.getClimbPoint(var1, var2.xCoord, var2.yCoord, var2.zCoord + 1, var3, var7, var2.xCoord, var2.zCoord);
  186.            PathPoint vvar9 = this.getClimbPoint(var1, var2.xCoord - 1, var2.yCoord, var2.zCoord, var3, var7, var2.xCoord, var2.zCoord);
  187.            PathPoint vvar10 = this.getClimbPoint(var1, var2.xCoord + 1, var2.yCoord, var2.zCoord, var3, var7, var2.xCoord, var2.zCoord);
  188.            PathPoint vvar11 = this.getClimbPoint(var1, var2.xCoord, var2.yCoord, var2.zCoord - 1, var3, var7, var2.xCoord, var2.zCoord);
  189.          
  190.           if(vvar8 != null && !vvar8.isFirst && vvar8.distanceTo(var4) < var5) {
  191.              this.pathOptions[var6++] = vvar8;
  192.           }
  193.    
  194.           if(vvar9 != null && !vvar9.isFirst && vvar9.distanceTo(var4) < var5) {
  195.              this.pathOptions[var6++] = vvar9;
  196.           }
  197.    
  198.           if(vvar10 != null && !vvar10.isFirst && vvar10.distanceTo(var4) < var5) {
  199.              this.pathOptions[var6++] = vvar10;
  200.           }
  201.    
  202.           if(vvar11 != null && !vvar11.isFirst && vvar11.distanceTo(var4) < var5) {
  203.              this.pathOptions[var6++] = vvar11;
  204.           }
  205.        }
  206.  
  207.       return var6;
  208.    }
  209.    
  210.    private PathPoint getClimbPoint(Entity var1, int x, int y, int z, PathPoint var5, int var6, int origX, int origZ) {
  211.           PathPoint var7 = null;
  212.           if(this.getVerticalOffset(var1, x, y, z, var5) == 1) {
  213.              var7 = this.openPoint(x, y, z);
  214.           }
  215.  
  216.           if(var7 == null && var6 > 0 && this.getVerticalOffset(var1, x, y + var6, z, var5) == 1) {
  217.              var7 = this.openPoint(x, y + var6, z);
  218.              y += var6;
  219.           }
  220.  
  221.           if(var7 == null && canClimb) {
  222.              
  223.               int var8 = 0;
  224.               int var9 = 0;
  225.               int var10 = 0;
  226.               while(y > 0 && y < 128 && (var9 = this.getVerticalOffset(var1, x, y + 1, z, var5)) == 0 && (var10 = this.getVerticalOffset(var1, origX, y + 1, origZ, var5)) == 1) {
  227.                   ++var8;
  228.                   if(var8 >= 3) {
  229.                      return null;
  230.                   }
  231.  
  232.                   ++y;
  233.                   if(y > 0 && y < 128) {
  234.                      var7 = this.openPoint(x, y, z);
  235.                   }
  236.                }
  237.                if (var10 != 1) {
  238.                    return null;
  239.                }
  240.                if(var9 == -2) {
  241.                   return null;
  242.                }
  243.           }
  244.  
  245.           return var7;
  246.        }
  247.  
  248.    private PathPoint getSafePoint(Entity var1, int var2, int var3, int var4, PathPoint var5, int var6) {
  249.       PathPoint var7 = null;
  250.       if(this.getVerticalOffset(var1, var2, var3, var4, var5) == 1) {
  251.          var7 = this.openPoint(var2, var3, var4);
  252.       }
  253.  
  254.       if(var7 == null && var6 > 0 && this.getVerticalOffset(var1, var2, var3 + var6, var4, var5) == 1) {
  255.          var7 = this.openPoint(var2, var3 + var6, var4);
  256.          var3 += var6;
  257.       }
  258.  
  259.       if(var7 != null) {
  260.          int var8 = 0;
  261.          int var9 = 0;
  262.  
  263.          while(var3 > 0 && (var9 = this.getVerticalOffset(var1, var2, var3 - 1, var4, var5)) == 1) {
  264.             ++var8;
  265.             if(var8 >= 4) {
  266.                return null;
  267.             }
  268.  
  269.             --var3;
  270.             if(var3 > 0) {
  271.                var7 = this.openPoint(var2, var3, var4);
  272.             }
  273.          }
  274.  
  275.          if(var9 == -2) {
  276.             return null;
  277.          }
  278.       }
  279.  
  280.       return var7;
  281.    }
  282.  
  283.    private final PathPoint openPoint(int var1, int var2, int var3) {
  284.       int var4 = PathPoint.func_22329_a(var1, var2, var3);
  285.       PathPoint var5 = (PathPoint)this.pointMap.lookup(var4);
  286.       if(var5 == null) {
  287.          var5 = new PathPoint(var1, var2, var3);
  288.          this.pointMap.addKey(var4, var5);
  289.       }
  290.  
  291.       return var5;
  292.    }
  293.  
  294.    private int getVerticalOffset(Entity var1, int var2, int var3, int var4, PathPoint var5) {
  295.       for(int var6 = var2; var6 < var2 + var5.xCoord; ++var6) {
  296.          for(int var7 = var3; var7 < var3 + var5.yCoord; ++var7) {
  297.             for(int var8 = var4; var8 < var4 + var5.zCoord; ++var8) {
  298.                int var9 = this.worldMap.getBlockId(var6, var7, var8);
  299.                if(var9 > 0) {
  300.                    
  301.                    if(var9 != Block.doorSteel.blockID && var9 != Block.doorWood.blockID) {
  302.                      
  303.                       if (var9 == Block.fence.blockID) {
  304.                          return -2;
  305.                        }
  306.                      
  307.                       if (var9 == Block.pressurePlatePlanks.blockID || var9 == Block.pressurePlateStone.blockID) {
  308.                           return 1;
  309.                       }
  310.                      
  311.                      
  312.                       Material var11 = Block.blocksList[var9].blockMaterial;
  313.                       if(var11.getIsSolid()) {
  314.                          return 0;
  315.                       }
  316.  
  317.                       if(var11 == Material.water) {
  318.                          return -1;
  319.                       }
  320.  
  321.                       if(var11 == Material.lava) {
  322.                          return -2;
  323.                       }
  324.                      
  325.                      
  326.                    } else {
  327.                       int var10 = this.worldMap.getBlockMetadata(var6, var7, var8);
  328.                       if(!BlockDoor.isOpen(var10)) {
  329.                          return 0;
  330.                       }
  331.                    }
  332.                }
  333.             }
  334.          }
  335.       }
  336.  
  337.       return 1;
  338.    }
  339.  
  340.    private PathEntity createEntityPath(PathPoint var1, PathPoint var2) {
  341.       int var3 = 1;
  342.  
  343.       PathPoint var4;
  344.       for(var4 = var2; var4.previous != null; var4 = var4.previous) {
  345.          ++var3;
  346.       }
  347.  
  348.       PathPoint[] var5 = new PathPoint[var3];
  349.       var4 = var2;
  350.       --var3;
  351.  
  352.       for(var5[var3] = var2; var4.previous != null; var5[var3] = var4) {
  353.          var4 = var4.previous;
  354.          --var3;
  355.       }
  356.  
  357.       return new PathEntity(var5);
  358.    }
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement