/
TerrainScan.java
108 lines (89 loc) · 3.23 KB
/
TerrainScan.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.clowcadia.test.utils;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import java.util.List;
public class TerrainScan {
private World world;
public TerrainScan(World world, BlockPos pos, List<BlockPos> list){
this.world = world;
BlockPos posChanged = pos;
record(pos,list);
for (int n = 0; n < 7; n++){
posChanged = posChanged.north(n);
record(posChanged,list);
for (int w = 0; w < 7; w++){
posChanged = posChanged.west(w);
record(posChanged,list);
}
posChanged = pos.north(n);
for (int e = 0; e < 7; e++){
posChanged = posChanged.east(e);
record(posChanged,list);
}
}
for (int s = 0; s < 7; s++){
posChanged = posChanged.south(s);
record(posChanged,list);
for (int w = 0; w < 7; w++){
posChanged = posChanged.west(w);
record(posChanged,list);
}
posChanged = pos.south(s);
for (int e = 0; e < 7; e++){
posChanged = posChanged.east(e);
record(posChanged,list);
}
}
}
private BlockPos getFloor(BlockPos pos){
BlockPos floor = pos;
int up = 0;
int down = 0;
if(isGround(pos)){
while (isGround(pos.up(up))) {
up++;
}
floor = pos.up(up-1);
}else if(isAir(pos)){
while(isAir(pos.down(down))){
down++;
}
floor = pos.down(down);
}
return floor;
}
private List<BlockPos> record(BlockPos pos, List<BlockPos> list){
if(isRecordable(getFloor(pos),list))list.add(getFloor(pos));
return list;
}
private boolean isRecordable( BlockPos pos, List<BlockPos> list){
boolean isRecordable = false;
if(!list.contains(pos)) {
isRecordable = true;
}
return isRecordable;
}
private IBlockState getIBS(BlockPos pos){ return this.world.getBlockState(pos); }
private Block getBlock(BlockPos pos){ return getIBS(pos).getBlock(); }
private boolean isGround(BlockPos pos){
return getBlock(pos) == Blocks.DIRT ||
getBlock(pos) == Blocks.GRASS ||
getBlock(pos) == Blocks.STONE ||
getBlock(pos) == Blocks.COBBLESTONE;
}
private boolean isAir(BlockPos pos){
return getBlock(pos).isAir(getIBS(pos),this.world,pos) ||
getBlock(pos) == Blocks.LOG ||
getBlock(pos) == Blocks.LOG2 ||
getBlock(pos) == Blocks.LEAVES ||
getBlock(pos) == Blocks.LEAVES2 ||
getBlock(pos) == Blocks.TALLGRASS ||
getBlock(pos) == Blocks.RED_FLOWER ||
getBlock(pos) == Blocks.YELLOW_FLOWER ||
getBlock(pos) == Blocks.DOUBLE_PLANT ||
getBlock(pos) == Blocks.SAPLING;
}
}