-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathServerCache.java
More file actions
96 lines (81 loc) · 5.17 KB
/
ServerCache.java
File metadata and controls
96 lines (81 loc) · 5.17 KB
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
package com.sinthoras.visualprospecting.database;
import com.sinthoras.visualprospecting.VP;
import com.sinthoras.visualprospecting.Tags;
import com.sinthoras.visualprospecting.Utils;
import com.sinthoras.visualprospecting.database.veintypes.VeinType;
import com.sinthoras.visualprospecting.database.veintypes.VeinTypeCaching;
import com.sinthoras.visualprospecting.integration.gregtech.UndergroundFluidsWrapper;
import net.minecraft.world.World;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class ServerCache extends WorldCache {
public static final ServerCache instance = new ServerCache();
protected File getStorageDirectory() {
return Utils.getSubDirectory(Tags.SERVER_DIR);
}
public synchronized void notifyOreVeinGeneration(int dimensionId, int chunkX, int chunkZ, final VeinType veinType) {
if(veinType != VeinType.NO_VEIN) {
super.putOreVein(new OreVeinPosition(dimensionId, chunkX, chunkZ, veinType));
}
}
public void notifyOreVeinGeneration(int dimensionId, int chunkX, int chunkZ, final String veinName) {
notifyOreVeinGeneration(dimensionId, chunkX, chunkZ, VeinTypeCaching.getVeinType(veinName));
}
public List<OreVeinPosition> prospectOreChunks(int dimensionId, int minChunkX, int minChunkZ, int maxChunkX, int maxChunkZ) {
minChunkX = Utils.mapToCenterOreChunkCoord(minChunkX);
minChunkZ = Utils.mapToCenterOreChunkCoord(minChunkZ);
maxChunkX = Utils.mapToCenterOreChunkCoord(maxChunkX);
maxChunkZ = Utils.mapToCenterOreChunkCoord(maxChunkZ);
List<OreVeinPosition> oreVeinPositions = new ArrayList<>();
for(int chunkX = minChunkX; chunkX <= maxChunkX; chunkX = Utils.mapToCenterOreChunkCoord(chunkX + 3)) {
for (int chunkZ = minChunkZ; chunkZ <= maxChunkZ; chunkZ = Utils.mapToCenterOreChunkCoord(chunkZ + 3)) {
final OreVeinPosition oreVeinPosition = getOreVein(dimensionId, chunkX, chunkZ);
if (oreVeinPosition.veinType != VeinType.NO_VEIN) {
oreVeinPositions.add(oreVeinPosition);
}
}
}
return oreVeinPositions;
}
public List<OreVeinPosition> prospectOreBlocks(int dimensionId, int minBlockX, int minBlockZ, int maxBlockX, int maxBlockZ) {
return prospectOreChunks(dimensionId,
Utils.coordBlockToChunk(minBlockX),
Utils.coordBlockToChunk(minBlockZ),
Utils.coordBlockToChunk(maxBlockX),
Utils.coordBlockToChunk(maxBlockZ));
}
public List<OreVeinPosition> prospectOreBlockRadius(int dimensionId, int blockX, int blockZ, int blockRadius) {
return prospectOreBlocks(dimensionId, blockX - blockRadius, blockZ - blockRadius, blockX + blockRadius, blockZ + blockRadius);
}
public List<UndergroundFluidPosition> prospectUndergroundFluidBlockRadius(World world, int blockX, int blockZ, int undergroundFluidBlockRadius) {
final int minChunkX = Utils.mapToCornerUndergroundFluidChunkCoord(Utils.coordBlockToChunk(blockX - undergroundFluidBlockRadius));
final int minChunkZ = Utils.mapToCornerUndergroundFluidChunkCoord(Utils.coordBlockToChunk(blockZ - undergroundFluidBlockRadius));
// Equals to ceil(undergroundFluidBlockRadius / (VP.undergroundFluidFieldSizeChunkX * VP.chunkWidth))
final int undergroundFluidRadius = (undergroundFluidBlockRadius + VP.undergroundFluidSizeChunkX * VP.chunkWidth - 1) / (VP.undergroundFluidSizeChunkX * VP.chunkWidth);
List<UndergroundFluidPosition> foundUndergroundFluids = new ArrayList<>((2 * undergroundFluidRadius + 1) * (2 * undergroundFluidRadius + 1));
for(int undergroundFluidX = 0; undergroundFluidX < 2 * undergroundFluidRadius + 1; undergroundFluidX++) {
for (int undergroundFluidZ = 0; undergroundFluidZ < 2 * undergroundFluidRadius + 1; undergroundFluidZ++) {
final int chunkX = minChunkX + undergroundFluidX * VP.undergroundFluidSizeChunkX;
final int chunkZ = minChunkZ + undergroundFluidZ * VP.undergroundFluidSizeChunkZ;
final int[][] chunks = new int[VP.undergroundFluidSizeChunkX][VP.undergroundFluidSizeChunkZ];
Fluid fluid = null;
for (int offsetChunkX = 0; offsetChunkX < VP.undergroundFluidSizeChunkX; offsetChunkX++) {
for (int offsetChunkZ = 0; offsetChunkZ < VP.undergroundFluidSizeChunkZ; offsetChunkZ++) {
final FluidStack prospectedFluid = UndergroundFluidsWrapper.prospectFluid(world, chunkX + offsetChunkX, chunkZ + offsetChunkZ);
if (prospectedFluid != null) {
fluid = prospectedFluid.getFluid();
chunks[offsetChunkX][offsetChunkZ] = prospectedFluid.amount;
}
}
}
if (fluid != null) {
foundUndergroundFluids.add(new UndergroundFluidPosition(world.provider.dimensionId, chunkX, chunkZ, fluid, chunks));
}
}
}
return foundUndergroundFluids;
}
}