protected void initializeArea() { if (wallMaterials.isEmpty() && floorMaterials.isEmpty()) { area.clear(fMat, baseMaterialData); } else { area.clear(fMat, baseMaterialData); for (int x = 0; x < fMaze.width; x++) { for (int y = 0; y < fMaze.height; y++) { for (int z = 0; z < fMaze.depth; z++) { int xx = getX(x); int yy = getY(y); int zz = getZ(z); for (int lx = 0; lx < corridorWidth; lx++) { for (int lz = 0; lz < corridorWidth; lz++) { BlockAreaItem lItem; Mat lMat; lItem = area.get(xx + lx, yy - 1, zz + lz); lMat = floorMaterials.getNext(y); lItem.id = lMat.material.getId(); lItem.data = lMat.data; lItem = area.get(xx + lx, yy + corridorHeight, zz + lz); lMat = ceilingMaterials.getNext(y); lItem.id = lMat.material.getId(); lItem.data = lMat.data; } } for (int ly = 0; ly < corridorHeight; ly++) { for (int lx = 0; lx < corridorWidth; lx++) { BlockAreaItem lItem; Mat lMat; lItem = area.get(xx + lx, yy + ly, zz - 1); lMat = wallMaterials.getNext(y); lItem.id = lMat.material.getId(); lItem.data = lMat.data; lItem = area.get(xx + lx, yy + ly, zz + corridorWidth); lMat = wallMaterials.getNext(y); lItem.id = lMat.material.getId(); lItem.data = lMat.data; } for (int lz = 0; lz < corridorWidth; lz++) { BlockAreaItem lItem; Mat lMat; lItem = area.get(xx - 1, yy + ly, zz + lz); lMat = wallMaterials.getNext(y); lItem.id = lMat.material.getId(); lItem.data = lMat.data; lItem = area.get(xx + corridorWidth, yy + ly, zz + lz); lMat = wallMaterials.getNext(y); lItem.id = lMat.material.getId(); lItem.data = lMat.data; } } } } } } }
@Override public void execute(SyncBlockList aSyncList) { fMaze.build(); initializeArea(); if (!ceilingInTopLevel) { for (int x = 0; x < fMaze.width; x++) { for (int z = 0; z < fMaze.depth; z++) { Maze.Cell lCell = fMaze.get(x, fMaze.height - 1, z); lCell.links[Maze.DirectionTop].broken = true; } } } for (Passage lPas : passages) { Maze.Cell lCell = null; if (lPas.mazePos.x >= 0) { lCell = fMaze.get(lPas.mazePos.x, lPas.mazePos.y, lPas.mazePos.z); } else { int x = (lPas.pos.x - (borderThickness + wallThickness)) / (corridorWidth + wallThickness); int y = (lPas.pos.y - (borderThickness + ceilingThickness)) / (corridorHeight + ceilingThickness); int z = (lPas.pos.z - (borderThickness + wallThickness)) / (corridorWidth + wallThickness); if (x < 0) x = 0; if (x > fMaze.width) x = fMaze.width - 1; if (y < 0) y = 0; if (y > fMaze.height) y = fMaze.height - 1; if (z < 0) z = 0; if (z > fMaze.depth) z = fMaze.depth - 1; lCell = fMaze.get(x, y, z); } if (lPas.up) lCell.links[Maze.DirectionTop].broken = true; if (lPas.down) lCell.links[Maze.DirectionBottom].broken = true; if (lPas.left) lCell.links[Maze.DirectionLeft].broken = true; if (lPas.right) lCell.links[Maze.DirectionRight].broken = true; if (lPas.forward) lCell.links[Maze.DirectionForward].broken = true; if (lPas.backward) lCell.links[Maze.DirectionBackward].broken = true; } for (int x = 0; x < fMaze.width; x++) { for (int y = 0; y < fMaze.height; y++) { for (int z = 0; z < fMaze.depth; z++) { Maze.Cell lCell = fMaze.get(x, y, z); setCellEmpty(x, y, z); for (int d = 0; d < 6; d++) { if (lCell.links[d].broken) { breakWall(x, y, z, d); } } } } } if (placeTorches) { Random lRnd = new Random(); for (int x = 0; x < fMaze.width; x++) { for (int y = 0; y < fMaze.height; y++) { for (int z = 0; z < fMaze.depth; z++) { Maze.Cell lCell = fMaze.get(x, y, z); if (!lCell.links[Maze.DirectionBottom].broken) { if (lRnd.nextInt(100) < chanceForTorches) { BlockAreaItem lItem = area.get(getX(x), getY(y), getZ(z)); lItem.id = Material.TORCH.getId(); lItem.data = (byte) 5; } } } } } } if (placeLadders && fMaze.height > 1) { for (int x = 0; x < fMaze.width; x++) { for (int y = 0; y < (fMaze.height - 1); y++) { for (int z = 0; z < fMaze.depth; z++) { Maze.Cell lCell = fMaze.get(x, y, z); if (lCell.links[Maze.DirectionTop].broken) { Maze.Cell lCellTop = fMaze.get(x, y + 1, z); for (int d = 2; d < 6; d++) { if (!lCell.links[d].broken && !lCellTop.links[d].broken) { int lcx = 0; int lcz = 0; if (fMaze.getDeltaX(d) > 0) { lcx = corridorWidth - 1; } if (fMaze.getDeltaZ(d) > 0) { lcz = corridorWidth - 1; } for (int ldy = 0; ldy < (corridorHeight * 2 + ceilingThickness); ldy++) { BlockAreaItem lItem = area.get(getX(x) + lcx, getY(y) + ldy, getZ(z) + lcz); lItem.id = Material.LADDER.getId(); lItem.data = (byte) fMazeToLadderDirs[d]; } break; } } } } } } } if (placeChests) { Random lRnd = new Random(); for (int x = 0; x < fMaze.width; x++) { for (int y = 0; y < fMaze.height; y++) { for (int z = 0; z < fMaze.depth; z++) { Maze.Cell lCell = fMaze.get(x, y, z); if (!lCell.links[Maze.DirectionTop].broken && !lCell.links[Maze.DirectionBottom].broken) { int lBCount = 0; int lFDir = 0; for (int d = 2; d < 6; d++) { if (lCell.links[d].broken) { lBCount++; } else { lFDir = d; } } if (lBCount < 2 && lRnd.nextInt(100) < chanceForChests) { BlockAreaItem lItem = area.get(getX(x), getY(y), getZ(z)); lItem.id = Material.CHEST.getId(); lItem.data = (byte) fMazeToLadderDirs[lFDir]; lItem.itemStacks = chestItems.getNext(y); /*lItem.itemStacks = new ItemStack[1]; lItem.itemStacks[0] = new ItemStack(Material.GOLD_BLOCK, 1, (short)0, (byte)0);*/ } } } } } } if (placeWoodenDoors) { Random lRnd = new Random(); for (int x = 0; x < fMaze.width; x++) { for (int y = 0; y < fMaze.height; y++) { for (int z = 0; z < fMaze.depth; z++) { Maze.Cell lCell = fMaze.get(x, y, z); if (!lCell.links[Maze.DirectionTop].broken && !lCell.links[Maze.DirectionBottom].broken) { for (int d = 2; d < 6; d++) { if (lCell.links[d].broken && lRnd.nextInt(100) < chanceForWoodenDoors) { int lcx = fMaze.getDeltaX(d) > 0 ? corridorWidth : 0; int lcz = fMaze.getDeltaZ(d) > 0 ? corridorWidth : 0; int xx = getX(x); int yy = getY(y); int zz = getZ(z); int lfx = fMaze.getDeltaZ(d) > 0 ? 1 : 0; int lfz = fMaze.getDeltaX(d) > 0 ? 1 : 0; for (int ld = 0; ld < corridorWidth; ld++) { for (int ly = 0; ly < corridorHeight; ly++) { if (ld > 0 || ly > 1) { BlockAreaItem lItem = area.get(xx + lcx + lfx * ld, yy + ly, zz + lcz + lfz * ld); Mat lMat = wallMaterials.getNext(y); lItem.id = lMat.material.getId(); lItem.data = lMat.data; } else { BlockAreaItem lItem = area.get(xx + lcx + lfx * ld, yy + ly, zz + lcz + lfz * ld); lItem.id = Material.WOODEN_DOOR.getId(); lItem.data = (byte) (ly > 0 ? 8 : 0); } } } break; } } } } } } } if (placeEntities) { Random lRnd = new Random(); for (int x = 0; x < fMaze.width; x++) { for (int y = 0; y < fMaze.height; y++) { for (int z = 0; z < fMaze.depth; z++) { for (EntityItem lItem : entities) { if (lRnd.nextInt(100) < lItem.chance) { BlockPosition lPos = new BlockPosition(getX(x), getY(y), getZ(z)); int lCount = lItem.amount; if (lCount < lItem.maxAmount) { lCount += lRnd.nextInt(lItem.maxAmount - lCount + 1); } for (int i = 0; i < lCount; i++) { BlockAreaEntity lEntity = area.newEntity(); lEntity.type = lItem.type; lEntity.location = lPos; } } } } } } } /* Statistics int fStats[] = new int[6]; fStats[0]=fStats[1]=fStats[2]=fStats[3]=fStats[4]=fStats[5]=0; for(int x=0; x<fMaze.width; x++) { for(int y=0; y<fMaze.height; y++) { for(int z=0; z<fMaze.depth; z++) { Maze.Cell lCell = fMaze.get(x, y, z); for(int d=0; d<6;d++) { if (lCell.links[d].broken) { fStats[d]++; } } } } } quest.log("0=" + fStats[0] + " 1=" + fStats[1] + " 2=" + fStats[2] + " 3=" + fStats[3] + " 4=" + fStats[4] + " 5=" + fStats[5]); */ area.toList(aSyncList, from, blockPlaceMode); }