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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
package galacticgreg;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import galacticgreg.api.Enums;
import galacticgreg.api.ModDimensionDef;
import gregtech.api.GregTechAPI;
import gregtech.api.util.GTLog;
import gregtech.common.blocks.BlockOresAbstract;
import gregtech.common.blocks.TileEntityOres;
public class TileEntitySpaceOres {
// Renamed function to prevent function shadowing with base GT-code
public static boolean setOuterSpaceOreBlock(ModDimensionDef pDimensionDef, World pWorld, int pX, int pY, int pZ,
int pMetaData) {
return setOuterSpaceOreBlock(pDimensionDef, pWorld, pX, pY, pZ, pMetaData, false, -1);
}
public static boolean setOuterSpaceOreBlock(ModDimensionDef pDimensionDef, World pWorld, int pX, int pY, int pZ,
int pMetaData, boolean pAir) {
return setOuterSpaceOreBlock(pDimensionDef, pWorld, pX, pY, pZ, pMetaData, pAir, -1);
}
/**
* Check if the block at given position may be replaced by an ore
*
* @param pWorld the world in question
* @param pX X-Cord
* @param pY Y-Cord
* @param pZ Z-Cord
* @return
*/
private static Enums.ReplaceState CheckForReplaceableBlock(World pWorld, int pX, int pY, int pZ,
ModDimensionDef pDimDef) {
try {
Enums.ReplaceState tFlag = Enums.ReplaceState.Unknown;
Block targetBlock = pWorld.getBlock(pX, pY, pZ);
int targetBlockMeta = pWorld.getBlockMetadata(pX, pY, pZ);
if (targetBlock == Blocks.air) tFlag = Enums.ReplaceState.Airblock;
else tFlag = pDimDef.getReplaceStateForBlock(targetBlock, targetBlockMeta);
return tFlag;
} catch (Exception e) {
e.printStackTrace(GTLog.err);
GalacticGreg.Logger.error("Error while processing CheckForReplaceableBlock(), defaulting to UNKNOWN");
return Enums.ReplaceState.Unknown;
}
}
/**
* Actually set the OreBlock
*
* @param pWorld the world in question
* @param pX
* @param pY
* @param pZ
* @param pMetaData GT-Ore metadata
* @param pAir
* @return
*/
public static boolean setOuterSpaceOreBlock(ModDimensionDef pDimensionDef, World pWorld, int pX, int pY, int pZ,
int pMetaData, boolean pAir, int pCustomGTOreOffset) {
if (!pAir) pY = Math.min(pWorld.getActualHeight(), Math.max(pY, 1));
if (pDimensionDef == null) {
GalacticGreg.Logger
.warn("Unknown DimensionID: %d. Will not set anything here", pWorld.provider.dimensionId);
return false;
}
try {
Block tBlock = pWorld.getBlock(pX, pY, pZ);
// If the meta is non-zero, and the target block is either non-air or the air-override is active
if ((pMetaData > 0) && ((tBlock != Blocks.air) || pAir)) {
// make sure we're either going with normal ore-metas, or small ores.
// Probably should do another check for <= 1700
if (pMetaData < 1000 || pMetaData >= 16000) {
Enums.ReplaceState tRS = CheckForReplaceableBlock(pWorld, pX, pY, pZ, pDimensionDef);
// Unable to lookup replacement state. Means: The block is unknown, and shall not be replaced
if (tRS == Enums.ReplaceState.Unknown) {
GalacticGreg.Logger.trace("Not placing ore Meta %d, as target block is unknown", pMetaData);
return false;
} else if (tRS == Enums.ReplaceState.Airblock && !pAir) {
GalacticGreg.Logger.trace("Not placing ore Meta %d in midair, as AIR is FALSE", pMetaData);
return false;
}
if (tRS == Enums.ReplaceState.CannotReplace) {
// wrong metaData ID for target block
GalacticGreg.Logger.trace("Not placing ore Meta %d, as the state is CANNOTREPLACE", pMetaData);
return false;
}
if (pCustomGTOreOffset == -1) pMetaData += pDimensionDef.getStoneType()
.getOffset();
else pMetaData += pCustomGTOreOffset;
// This fix seems like cargo cult coding...The Abstract class just returns 0 for the harvest level.
// But it aligns with the GT5U method, so yay?
pWorld.setBlock(
pX,
pY,
pZ,
GregTechAPI.sBlockOres1,
TileEntityOres.getHarvestData(
(short) pMetaData,
((BlockOresAbstract) GregTechAPI.sBlockOres1)
.getBaseBlockHarvestLevel(pMetaData % 16000 / 1000)),
0);
TileEntity tTileEntity = pWorld.getTileEntity(pX, pY, pZ);
if ((tTileEntity instanceof TileEntityOres)) {
((TileEntityOres) tTileEntity).mMetaData = ((short) pMetaData);
((TileEntityOres) tTileEntity).mNatural = true;
} else {
// This is somehow triggered randomly, and most times the target block is air, which should
// never happen as we check for air...
// That's why I put this behind a debug config option. If you ever find the reason for it,
// please tell me what caused this
if (GalacticGreg.GalacticConfig.ReportOreGenFailures) GalacticGreg.Logger.warn(
"Something went wrong while placing GT OreTileEntity. Meta: %d X [%d] Y [%d] Z [%d]",
pMetaData,
pX,
pY,
pZ);
}
return true;
} else GalacticGreg.Logger.warn(
"Not replacing block at pos %d %d %d due unexpected metaData for OreBlock: %d",
pX,
pY,
pZ,
pMetaData);
}
} catch (Exception e) {
if (GalacticGreg.GalacticConfig.ReportOreGenFailures) e.printStackTrace();
}
return false;
}
}
|