Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9e41d543f5 | |||
| 0f469e9df6 | |||
| 12ca8d109a | |||
| b756d68be1 | |||
| 60b07e5ca5 | |||
| 957bc4c5cc | |||
| e90dd2f9c6 | |||
| 9719c7ffc3 | |||
| 319d92a371 | |||
| 3a0552c56e | |||
| 8a0dd192e5 | |||
| a97b35f3d0 | |||
| 1394ab0863 | |||
| 159f4c7f14 | |||
| ee7fe9f40d | |||
| 9c9a49f9e7 | |||
| b7949e4134 | |||
| ea95913ec8 | |||
| 33d7f02323 | |||
| b8d4f0cffa | |||
| 7e1bfdb5ac | |||
| 1f9707e256 | |||
| 954ce1442e | |||
| ee67c5ea50 | |||
| 73735c5cd5 | |||
| c1713f1682 | |||
| f455fd1994 | |||
| 1657c88681 | |||
| fd67e0e5c6 |
@@ -72,12 +72,20 @@ The API for Applied Energistics 2. It is open source to discuss changes, improve
|
||||
|
||||
### Maven
|
||||
|
||||
We use Github Packages as maven repository now. You can use the following snippet as example on how to add a repository to your gradle build file.
|
||||
Our authoritative Maven repository is Github Packages, which you can also use in your builds. Use of Github Packages
|
||||
[requires special setup](https://docs.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-gradle-for-use-with-github-packages#authenticating-to-github-packages)
|
||||
to authenticate with your personal access token.
|
||||
|
||||
AE2 is also available without authentication from Modmaven. You can use the following snippet as example on how to add a repository to your gradle build file.
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
name "AE2"
|
||||
url "https://maven.pkg.github.com/AppliedEnergistics/Applied-Energistics-2"
|
||||
name "Modmaven"
|
||||
url "https://modmaven.k-4u.nl/"
|
||||
// For Gradle 5.1 and above, limit it to just AE2
|
||||
content {
|
||||
includeGroup 'appeng'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+7
-6
@@ -9,23 +9,24 @@ artifact_basename=appliedenergistics2
|
||||
# Minecraft Versions #
|
||||
#########################################################
|
||||
minecraft_release=1.16
|
||||
minecraft_version=1.16.1
|
||||
minecraft_version=1.16.2
|
||||
mcp_mappings=20200723-1.16.1
|
||||
forge_version=32.0.108
|
||||
forge_version=33.0.42
|
||||
|
||||
#########################################################
|
||||
# Provided APIs #
|
||||
#########################################################
|
||||
jei_version=7.0.0.6
|
||||
top_version=3.0.1-beta-4
|
||||
jei_minecraft_version=1.16.2
|
||||
jei_version=7.1.1.15
|
||||
top_version=3.0.3-beta-6
|
||||
hwyla_version=1.10.8-B72_1.15.2
|
||||
ctm_version=MC1.15.2-1.1.0.9
|
||||
|
||||
#########################################################
|
||||
# Deployment #
|
||||
#########################################################
|
||||
website_version=1.16.1
|
||||
curse_versions=1.16.1
|
||||
website_version=1.16.2
|
||||
curse_versions=1.16.2
|
||||
curseforge_project=223794
|
||||
|
||||
#########################################################
|
||||
|
||||
@@ -29,11 +29,11 @@ dependencies {
|
||||
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
|
||||
|
||||
// compile against provided APIs
|
||||
compileOnly "mezz.jei:jei-${minecraft_version}:${jei_version}:api"
|
||||
compileOnly "mezz.jei:jei-${jei_minecraft_version}:${jei_version}:api"
|
||||
compileOnly "mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}:api"
|
||||
|
||||
// Runtime, Mods
|
||||
runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}")
|
||||
runtimeOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}")
|
||||
runtimeOnly fg.deobf("mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}")
|
||||
//runtimeOnly fg.deobf("team.chisel.ctm:CTM:${ctm_version}")
|
||||
|
||||
|
||||
@@ -27,13 +27,14 @@ import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.DimensionType;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
* Represents a location in the Minecraft Universe
|
||||
*/
|
||||
public class DimensionalCoord extends WorldCoord {
|
||||
|
||||
private final IWorld world;
|
||||
private final World world;
|
||||
private final DimensionType dimension;
|
||||
|
||||
public DimensionalCoord(final DimensionalCoord coordinate) {
|
||||
@@ -48,13 +49,13 @@ public class DimensionalCoord extends WorldCoord {
|
||||
this.dimension = this.world.func_230315_m_();
|
||||
}
|
||||
|
||||
public DimensionalCoord(final IWorld world, final int x, final int y, final int z) {
|
||||
public DimensionalCoord(final World world, final int x, final int y, final int z) {
|
||||
super(x, y, z);
|
||||
this.world = world;
|
||||
this.dimension = world.func_230315_m_();
|
||||
}
|
||||
|
||||
public DimensionalCoord(final IWorld world, final BlockPos pos) {
|
||||
public DimensionalCoord(final World world, final BlockPos pos) {
|
||||
super(pos);
|
||||
this.world = world;
|
||||
this.dimension = world.func_230315_m_();
|
||||
@@ -84,7 +85,7 @@ public class DimensionalCoord extends WorldCoord {
|
||||
return this.world == world;
|
||||
}
|
||||
|
||||
public IWorld getWorld() {
|
||||
public World getWorld() {
|
||||
return this.world;
|
||||
}
|
||||
|
||||
|
||||
@@ -111,11 +111,6 @@ public abstract class AEBaseTileBlock<T extends AEBaseTileEntity> extends AEBase
|
||||
return this.tileEntityFactory.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dropXpOnBlockBreak(World worldIn, BlockPos pos, int amount) {
|
||||
super.dropXpOnBlockBreak(worldIn, pos, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReplaced(BlockState state, World w, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
if (newState.getBlock() == state.getBlock()) {
|
||||
|
||||
@@ -79,10 +79,10 @@ class PaintSplotchesBakedModel implements IDynamicBakedModel {
|
||||
|
||||
if (s.isLumen()) {
|
||||
builder.setColorRGB(s.getColor().whiteVariant);
|
||||
builder.setRenderFullBright(true);
|
||||
builder.setEmissiveMaterial(true);
|
||||
} else {
|
||||
builder.setColorRGB(s.getColor().mediumVariant);
|
||||
builder.setRenderFullBright(false);
|
||||
builder.setEmissiveMaterial(false);
|
||||
}
|
||||
|
||||
float offset = offsetConstant;
|
||||
|
||||
@@ -117,7 +117,7 @@ class QnbFormedBakedModel implements IDynamicBakedModel {
|
||||
|
||||
if (formedState.isPowered()) {
|
||||
builder.setTexture(this.lightCornerTexture);
|
||||
builder.setRenderFullBright(true);
|
||||
builder.setEmissiveMaterial(true);
|
||||
for (Direction facing : Direction.values()) {
|
||||
// Offset the face by a slight amount so that it is drawn over the already drawn
|
||||
// ring texture
|
||||
@@ -131,6 +131,7 @@ class QnbFormedBakedModel implements IDynamicBakedModel {
|
||||
DEFAULT_RENDER_MIN - zOffset, DEFAULT_RENDER_MAX + xOffset,
|
||||
DEFAULT_RENDER_MAX + yOffset, DEFAULT_RENDER_MAX + zOffset);
|
||||
}
|
||||
builder.setEmissiveMaterial(false);
|
||||
}
|
||||
} else {
|
||||
builder.setTexture(this.ringTexture);
|
||||
@@ -143,7 +144,7 @@ class QnbFormedBakedModel implements IDynamicBakedModel {
|
||||
|
||||
if (formedState.isPowered()) {
|
||||
builder.setTexture(this.lightTexture);
|
||||
builder.setRenderFullBright(true);
|
||||
builder.setEmissiveMaterial(true);
|
||||
for (Direction facing : Direction.values()) {
|
||||
// Offset the face by a slight amount so that it is drawn over the already drawn
|
||||
// ring texture
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.text.NumberFormat;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
@@ -72,14 +73,16 @@ public abstract class AEBaseMEScreen<T extends AEBaseContainer> extends AEBaseSc
|
||||
currentToolTip.add(ButtonToolTips.ItemsRequestable.text(formattedAmount));
|
||||
}
|
||||
|
||||
this.renderToolTip(matrixStack, currentToolTip, x, y, this.font);
|
||||
this.renderToolTip(matrixStack, Lists.transform(currentToolTip, ITextComponent::func_241878_f), x, y,
|
||||
this.font);
|
||||
|
||||
return;
|
||||
} else if (stack.getCount() > bigNumber) {
|
||||
final String formattedAmount = NumberFormat.getNumberInstance(Locale.US).format(stack.getCount());
|
||||
currentToolTip.add(ButtonToolTips.ItemsStored.text(formattedAmount).mergeStyle(TextFormatting.GRAY));
|
||||
|
||||
this.renderToolTip(matrixStack, currentToolTip, x, y, this.font);
|
||||
this.renderToolTip(matrixStack, Lists.transform(currentToolTip, ITextComponent::func_241878_f), x, y,
|
||||
this.font);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -218,7 +218,7 @@ public abstract class AEBaseScreen<T extends AEBaseContainer> extends ContainerS
|
||||
styledLines.add(lines.get(i).deepCopy().modifyStyle(s -> style));
|
||||
}
|
||||
|
||||
this.renderTooltip(matrices, styledLines, x, y);
|
||||
this.func_243308_b(matrices, styledLines, x, y);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -342,7 +342,7 @@ class CableBuilder {
|
||||
this.addBigCoveredCableSizedCube(facing, cubeBuilder);
|
||||
|
||||
// Render the channel indicators brightly lit at night
|
||||
cubeBuilder.setRenderFullBright(true);
|
||||
cubeBuilder.setEmissiveMaterial(true);
|
||||
|
||||
cubeBuilder.setTexture(oddChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.blackVariant);
|
||||
@@ -353,14 +353,14 @@ class CableBuilder {
|
||||
this.addBigCoveredCableSizedCube(facing, cubeBuilder);
|
||||
|
||||
// Reset back to normal rendering for the rest
|
||||
cubeBuilder.setRenderFullBright(false);
|
||||
cubeBuilder.setEmissiveMaterial(false);
|
||||
cubeBuilder.setTexture(texture);
|
||||
}
|
||||
|
||||
addCoveredCableSizedCube(facing, cubeBuilder);
|
||||
|
||||
// Render the channel indicators brightly lit at night
|
||||
cubeBuilder.setRenderFullBright(true);
|
||||
cubeBuilder.setEmissiveMaterial(true);
|
||||
|
||||
cubeBuilder.setTexture(oddChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.blackVariant);
|
||||
@@ -369,6 +369,9 @@ class CableBuilder {
|
||||
cubeBuilder.setTexture(evenChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.whiteVariant);
|
||||
addCoveredCableSizedCube(facing, cubeBuilder);
|
||||
|
||||
// Reset back to default
|
||||
cubeBuilder.setEmissiveMaterial(false);
|
||||
}
|
||||
|
||||
public void addStraightSmartConnection(Direction facing, AEColor cableColor, int channels,
|
||||
@@ -386,7 +389,7 @@ class CableBuilder {
|
||||
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
|
||||
|
||||
// Render the channel indicators brightly lit at night
|
||||
cubeBuilder.setRenderFullBright(true);
|
||||
cubeBuilder.setEmissiveMaterial(true);
|
||||
|
||||
cubeBuilder.setTexture(oddChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.blackVariant);
|
||||
@@ -395,6 +398,9 @@ class CableBuilder {
|
||||
cubeBuilder.setTexture(evenChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.whiteVariant);
|
||||
addStraightCoveredCableSizedCube(facing, cubeBuilder);
|
||||
|
||||
// Reset back to default
|
||||
cubeBuilder.setEmissiveMaterial(false);
|
||||
}
|
||||
|
||||
public void addConstrainedSmartConnection(Direction facing, AEColor cableColor, int distanceFromEdge, int channels,
|
||||
@@ -417,7 +423,7 @@ class CableBuilder {
|
||||
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
|
||||
|
||||
// Render the channel indicators brightly lit at night
|
||||
cubeBuilder.setRenderFullBright(true);
|
||||
cubeBuilder.setEmissiveMaterial(true);
|
||||
|
||||
cubeBuilder.setTexture(oddChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.blackVariant);
|
||||
@@ -426,6 +432,9 @@ class CableBuilder {
|
||||
cubeBuilder.setTexture(evenChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.whiteVariant);
|
||||
addCoveredCableSizedCube(facing, distanceFromEdge, cubeBuilder);
|
||||
|
||||
// Reset back to default
|
||||
cubeBuilder.setEmissiveMaterial(false);
|
||||
}
|
||||
|
||||
public void addDenseCoveredConnection(Direction facing, AEColor cableColor, AECableType connectionType,
|
||||
@@ -449,7 +458,7 @@ class CableBuilder {
|
||||
addDenseCableSizedCube(facing, cubeBuilder);
|
||||
|
||||
// Reset back to normal rendering for the rest
|
||||
cubeBuilder.setRenderFullBright(false);
|
||||
cubeBuilder.setEmissiveMaterial(false);
|
||||
cubeBuilder.setTexture(texture);
|
||||
}
|
||||
|
||||
@@ -485,7 +494,7 @@ class CableBuilder {
|
||||
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
|
||||
|
||||
// Render the channel indicators brightly lit at night
|
||||
cubeBuilder.setRenderFullBright(true);
|
||||
cubeBuilder.setEmissiveMaterial(true);
|
||||
|
||||
cubeBuilder.setTexture(oddChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.blackVariant);
|
||||
@@ -496,7 +505,7 @@ class CableBuilder {
|
||||
addDenseCableSizedCube(facing, cubeBuilder);
|
||||
|
||||
// Reset back to normal rendering for the rest
|
||||
cubeBuilder.setRenderFullBright(false);
|
||||
cubeBuilder.setEmissiveMaterial(false);
|
||||
cubeBuilder.setTexture(texture);
|
||||
}
|
||||
|
||||
@@ -529,7 +538,7 @@ class CableBuilder {
|
||||
TextureAtlasSprite evenChannel = this.smartCableTextures.getEvenTextureForChannels(channels);
|
||||
|
||||
// Render the channel indicators brightly lit at night
|
||||
cubeBuilder.setRenderFullBright(true);
|
||||
cubeBuilder.setEmissiveMaterial(true);
|
||||
|
||||
cubeBuilder.setTexture(oddChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.blackVariant);
|
||||
@@ -538,6 +547,9 @@ class CableBuilder {
|
||||
cubeBuilder.setTexture(evenChannel);
|
||||
cubeBuilder.setColorRGB(cableColor.whiteVariant);
|
||||
addStraightDenseCableSizedCube(facing, cubeBuilder);
|
||||
|
||||
// Reset back to default
|
||||
cubeBuilder.setEmissiveMaterial(false);
|
||||
}
|
||||
|
||||
private static void addDenseCableSizedCube(Direction facing, CubeBuilder cubeBuilder) {
|
||||
|
||||
@@ -52,7 +52,7 @@ public class CubeBuilder {
|
||||
|
||||
private boolean useStandardUV = false;
|
||||
|
||||
private boolean renderFullBright;
|
||||
private boolean emissiveMaterial;
|
||||
|
||||
public CubeBuilder(List<BakedQuad> output) {
|
||||
this.output = output;
|
||||
@@ -379,7 +379,7 @@ public class CubeBuilder {
|
||||
if (e.getIndex() == 0) {
|
||||
builder.put(i, u, v);
|
||||
break;
|
||||
} else if (e.getIndex() == 2 && renderFullBright) {
|
||||
} else if (e.getIndex() == 2 && emissiveMaterial) {
|
||||
// Force Brightness to 15, this is for full bright mode
|
||||
// this vertex element will only be present in that case
|
||||
final float lightMapU = (float) (15 * 0x20) / 0xFFFF;
|
||||
@@ -434,8 +434,8 @@ public class CubeBuilder {
|
||||
this.setColorRGB((int) (r * 255) << 16 | (int) (g * 255) << 8 | (int) (b * 255));
|
||||
}
|
||||
|
||||
public void setRenderFullBright(boolean renderFullBright) {
|
||||
this.renderFullBright = renderFullBright;
|
||||
public void setEmissiveMaterial(boolean renderFullBright) {
|
||||
this.emissiveMaterial = renderFullBright;
|
||||
}
|
||||
|
||||
public void setCustomUv(Direction facing, float u1, float v1, float u2, float v2) {
|
||||
|
||||
@@ -49,7 +49,7 @@ public class P2PTunnelFrequencyBakedModel implements IDynamicBakedModel {
|
||||
|
||||
cb.setTexture(this.texture);
|
||||
cb.useStandardUV();
|
||||
cb.setRenderFullBright(active);
|
||||
cb.setEmissiveMaterial(active);
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
final int[] offs = QUAD_OFFSETS[i];
|
||||
@@ -70,6 +70,10 @@ public class P2PTunnelFrequencyBakedModel implements IDynamicBakedModel {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Reset back to default
|
||||
cb.setEmissiveMaterial(false);
|
||||
|
||||
return cb.getOutput();
|
||||
}
|
||||
|
||||
|
||||
@@ -51,8 +51,10 @@ class LightBakedModel extends CraftingCubeBakedModel {
|
||||
builder.addCube(x1, y1, z1, x2, y2, z2);
|
||||
|
||||
boolean powered = state.get(AbstractCraftingUnitBlock.POWERED);
|
||||
builder.setRenderFullBright(powered);
|
||||
builder.setEmissiveMaterial(powered);
|
||||
builder.setTexture(this.lightTexture);
|
||||
builder.addCube(x1, y1, z1, x2, y2, z2);
|
||||
// Reset back to default
|
||||
builder.setEmissiveMaterial(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ public class MonitorBakedModel extends CraftingCubeBakedModel {
|
||||
AEColor color = getColor(modelData);
|
||||
boolean powered = state.get(CraftingMonitorBlock.POWERED);
|
||||
|
||||
builder.setRenderFullBright(powered);
|
||||
builder.setEmissiveMaterial(powered);
|
||||
|
||||
builder.setColorRGB(color.whiteVariant);
|
||||
builder.setTexture(this.lightBrightTexture);
|
||||
@@ -92,6 +92,8 @@ public class MonitorBakedModel extends CraftingCubeBakedModel {
|
||||
builder.setTexture(this.lightDarkTexture);
|
||||
builder.addCube(x1, y1, z1, x2, y2, z2);
|
||||
|
||||
// Reset back to default
|
||||
builder.setEmissiveMaterial(false);
|
||||
}
|
||||
|
||||
private static AEColor getColor(IModelData modelData) {
|
||||
|
||||
@@ -117,7 +117,7 @@ class SpatialPylonBakedModel implements IDynamicBakedModel {
|
||||
|
||||
if ((flags
|
||||
& SpatialPylonTileEntity.DISPLAY_POWERED_ENABLED) == SpatialPylonTileEntity.DISPLAY_POWERED_ENABLED) {
|
||||
builder.setRenderFullBright(true);
|
||||
builder.setEmissiveMaterial(true);
|
||||
}
|
||||
|
||||
builder.setTextures(this.textures.get(getTextureTypeFromSideInside(flags, ori, Direction.UP)),
|
||||
@@ -135,6 +135,9 @@ class SpatialPylonBakedModel implements IDynamicBakedModel {
|
||||
builder.addCube(0, 0, 0, 16, 16, 16);
|
||||
}
|
||||
|
||||
// Reset back to default
|
||||
builder.setEmissiveMaterial(false);
|
||||
|
||||
return builder.getOutput();
|
||||
}
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ public final class ContainerLocator {
|
||||
public static ContainerLocator forPart(AEBasePart part) {
|
||||
IPartHost host = part.getHost();
|
||||
DimensionalCoord pos = host.getLocation();
|
||||
return new ContainerLocator(Type.PART, -1, pos.getWorld().getWorld(), pos.getBlockPos(), part.getSide());
|
||||
return new ContainerLocator(Type.PART, -1, pos.getWorld(), pos.getBlockPos(), part.getSide());
|
||||
}
|
||||
|
||||
public boolean hasItemIndex() {
|
||||
|
||||
@@ -34,13 +34,12 @@ import net.minecraft.item.crafting.IRecipeSerializer;
|
||||
import net.minecraft.particles.ParticleType;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.gen.feature.Feature;
|
||||
import net.minecraft.world.gen.feature.structure.Structure;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.fml.DeferredWorkQueue;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
import net.minecraftforge.fml.ModLoadingContext;
|
||||
import net.minecraftforge.fml.client.registry.RenderingRegistry;
|
||||
@@ -101,6 +100,7 @@ public final class AppEng {
|
||||
|
||||
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
|
||||
registration = new Registration();
|
||||
modEventBus.addListener(this::bootstrap);
|
||||
modEventBus.addGenericListener(Block.class, registration::registerBlocks);
|
||||
modEventBus.addGenericListener(Item.class, registration::registerItems);
|
||||
modEventBus.addGenericListener(EntityType.class, registration::registerEntities);
|
||||
@@ -108,9 +108,6 @@ public final class AppEng {
|
||||
modEventBus.addGenericListener(TileEntityType.class, registration::registerTileEntities);
|
||||
modEventBus.addGenericListener(ContainerType.class, registration::registerContainerTypes);
|
||||
modEventBus.addGenericListener(IRecipeSerializer.class, registration::registerRecipeSerializers);
|
||||
modEventBus.addGenericListener(Feature.class, registration::registerFeatures);
|
||||
modEventBus.addGenericListener(Structure.class, registration::registerStructures);
|
||||
modEventBus.addGenericListener(Biome.class, registration::registerBiomes);
|
||||
|
||||
modEventBus.addListener(Integrations::enqueueIMC);
|
||||
modEventBus.addListener(this::commonSetup);
|
||||
@@ -129,7 +126,15 @@ public final class AppEng {
|
||||
MinecraftForge.EVENT_BUS.register(new PartPlacement());
|
||||
}
|
||||
|
||||
private void bootstrap(RegistryEvent.NewRegistry e) {
|
||||
// This has to be here so it's not run in parallel with other registrations
|
||||
AppEngBootstrap.initialize();
|
||||
}
|
||||
|
||||
private void commonSetup(FMLCommonSetupEvent event) {
|
||||
// This must run here because the config is not available earlier
|
||||
DeferredWorkQueue.runLater(AppEngBootstrap::enhanceBiomes);
|
||||
|
||||
ApiDefinitions definitions = Api.INSTANCE.definitions();
|
||||
definitions.getRegistry().getBootstrapComponents(IInitComponent.class)
|
||||
.forEachRemaining(IInitComponent::initialize);
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
package appeng.core;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import net.minecraft.util.registry.WorldGenRegistries;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.gen.GenerationStage;
|
||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||
import net.minecraft.world.gen.feature.Feature;
|
||||
import net.minecraft.world.gen.feature.OreFeatureConfig;
|
||||
import net.minecraft.world.gen.placement.NoPlacementConfig;
|
||||
import net.minecraft.world.gen.placement.Placement;
|
||||
import net.minecraft.world.gen.placement.TopSolidRangeConfig;
|
||||
|
||||
import appeng.api.features.AEFeature;
|
||||
import appeng.mixins.feature.ConfiguredFeaturesAccessor;
|
||||
import appeng.mixins.structure.ConfiguredStructureFeaturesAccessor;
|
||||
import appeng.mixins.structure.StructureFeatureAccessor;
|
||||
import appeng.spatial.SpatialStorageChunkGenerator;
|
||||
import appeng.spatial.SpatialStorageDimensionIds;
|
||||
import appeng.worldgen.BiomeModifier;
|
||||
import appeng.worldgen.ChargedQuartzOreConfig;
|
||||
import appeng.worldgen.ChargedQuartzOreFeature;
|
||||
import appeng.worldgen.meteorite.MeteoriteStructure;
|
||||
import appeng.worldgen.meteorite.MeteoriteStructurePiece;
|
||||
|
||||
/**
|
||||
* Hooks into the very early bootstrapping phase to register things before the
|
||||
* first dynamic registry manager is created.
|
||||
*/
|
||||
public final class AppEngBootstrap {
|
||||
|
||||
private static boolean initialized;
|
||||
private static ConfiguredFeature<?, ?> quartzOreFeature;
|
||||
private static ConfiguredFeature<?, ?> chargedQuartzOreFeature;
|
||||
|
||||
private AppEngBootstrap() {
|
||||
}
|
||||
|
||||
public synchronized static void initialize() {
|
||||
if (initialized) {
|
||||
return;
|
||||
}
|
||||
initialized = true;
|
||||
|
||||
registerStructures();
|
||||
|
||||
quartzOreFeature = registerQuartzOreFeature();
|
||||
chargedQuartzOreFeature = registerChargedQuartzOreFeature();
|
||||
|
||||
registerDimension();
|
||||
}
|
||||
|
||||
public synchronized static void enhanceBiomes() {
|
||||
// add to all standard biomes
|
||||
// TODO: This means we'll not add these things to newly created biomes
|
||||
WorldGenRegistries.field_243657_i.forEach(b -> {
|
||||
addMeteoriteWorldGen(b);
|
||||
addQuartzWorldGen(b, quartzOreFeature, chargedQuartzOreFeature);
|
||||
});
|
||||
}
|
||||
|
||||
private static void registerStructures() {
|
||||
|
||||
MeteoriteStructurePiece.register();
|
||||
|
||||
// Registering into the registry alone is INSUFFICIENT!
|
||||
// There's a bidirectional map in the Structure class itself primarily for the
|
||||
// purposes of NBT serialization
|
||||
StructureFeatureAccessor.register(MeteoriteStructure.ID.toString(), MeteoriteStructure.INSTANCE,
|
||||
GenerationStage.Decoration.TOP_LAYER_MODIFICATION);
|
||||
|
||||
ConfiguredStructureFeaturesAccessor.register(MeteoriteStructure.ID.toString(),
|
||||
MeteoriteStructure.CONFIGURED_INSTANCE);
|
||||
}
|
||||
|
||||
private static void addMeteoriteWorldGen(Biome b) {
|
||||
if (!AEConfig.instance().isFeatureEnabled(AEFeature.METEORITE_WORLD_GEN)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (b.getCategory() == Biome.Category.THEEND || b.getCategory() == Biome.Category.NETHER) {
|
||||
return;
|
||||
}
|
||||
|
||||
BiomeModifier modifier = new BiomeModifier(b);
|
||||
modifier.addStructureFeature(MeteoriteStructure.CONFIGURED_INSTANCE);
|
||||
}
|
||||
|
||||
private static void addQuartzWorldGen(Biome b, ConfiguredFeature<?, ?> quartzOre,
|
||||
ConfiguredFeature<?, ?> chargedQuartz) {
|
||||
if (!AEConfig.instance().isFeatureEnabled(AEFeature.CERTUS_QUARTZ_WORLD_GEN)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BiomeModifier modifier = new BiomeModifier(b);
|
||||
|
||||
modifier.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, quartzOre);
|
||||
|
||||
if (AEConfig.instance().isFeatureEnabled(AEFeature.CHARGED_CERTUS_ORE)) {
|
||||
modifier.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, chargedQuartz);
|
||||
}
|
||||
}
|
||||
|
||||
private static ConfiguredFeature<?, ?> registerQuartzOreFeature() {
|
||||
// Tell Minecraft about our configured quartz ore feature
|
||||
BlockState quartzOreState = Api.instance().definitions().blocks().quartzOre().block().getDefaultState();
|
||||
return ConfiguredFeaturesAccessor.register(AppEng.makeId("quartz_ore").toString(), Feature.ORE
|
||||
.withConfiguration(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.field_241882_a, quartzOreState,
|
||||
AEConfig.instance().getQuartzOresPerCluster()))
|
||||
.withPlacement(Placement.field_242907_l/* RANGE */.configure(new TopSolidRangeConfig(12, 12, 72)))
|
||||
.func_242728_a/* spreadHorizontally */()
|
||||
.func_242731_b/* repeat */(AEConfig.instance().getQuartzOresClusterAmount()));
|
||||
}
|
||||
|
||||
private static ConfiguredFeature<?, ?> registerChargedQuartzOreFeature() {
|
||||
// Tell Minecraft about our configured charged quartz ore feature
|
||||
Registry.register(Registry.FEATURE, AppEng.makeId("charged_quartz_ore"), ChargedQuartzOreFeature.INSTANCE);
|
||||
|
||||
BlockState quartzOreState = Api.instance().definitions().blocks().quartzOre().block().getDefaultState();
|
||||
BlockState chargedQuartzOreState = Api.instance().definitions().blocks().quartzOreCharged().block()
|
||||
.getDefaultState();
|
||||
return ConfiguredFeaturesAccessor.register(AppEng.makeId("charged_quartz_ore").toString(),
|
||||
ChargedQuartzOreFeature.INSTANCE
|
||||
.withConfiguration(new ChargedQuartzOreConfig(quartzOreState, chargedQuartzOreState,
|
||||
AEConfig.instance().getSpawnChargedChance()))
|
||||
.withPlacement(Placement.NOPE.configure(NoPlacementConfig.field_236556_b_)));
|
||||
}
|
||||
|
||||
private static void registerDimension() {
|
||||
Registry.register(Registry.CHUNK_GENERATOR_CODEC, SpatialStorageDimensionIds.CHUNK_GENERATOR_ID,
|
||||
SpatialStorageChunkGenerator.CODEC);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -34,6 +34,7 @@ import net.minecraft.particles.ParticleType;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import net.minecraft.util.registry.WorldGenRegistries;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.gen.GenerationStage;
|
||||
@@ -41,7 +42,6 @@ import net.minecraft.world.gen.feature.Feature;
|
||||
import net.minecraft.world.gen.feature.IFeatureConfig;
|
||||
import net.minecraft.world.gen.feature.OreFeatureConfig;
|
||||
import net.minecraft.world.gen.feature.structure.Structure;
|
||||
import net.minecraft.world.gen.placement.CountRangeConfig;
|
||||
import net.minecraft.world.gen.placement.IPlacementConfig;
|
||||
import net.minecraft.world.gen.placement.Placement;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
@@ -213,7 +213,6 @@ import appeng.me.cache.PathGridCache;
|
||||
import appeng.me.cache.SecurityCache;
|
||||
import appeng.me.cache.SpatialPylonCache;
|
||||
import appeng.me.cache.TickManagerCache;
|
||||
import appeng.mixins.StructureAccessor;
|
||||
import appeng.parts.automation.PlaneModelLoader;
|
||||
import appeng.recipes.game.DisassembleRecipe;
|
||||
import appeng.recipes.game.FacadeRecipe;
|
||||
@@ -682,73 +681,6 @@ final class Registration {
|
||||
new ResourceLocation(dimension));
|
||||
}
|
||||
|
||||
MeteoriteStructurePiece.register();
|
||||
|
||||
ForgeRegistries.BIOMES.forEach(b -> {
|
||||
addMeteoriteWorldGen(b);
|
||||
addQuartzWorldGen(b);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private static void addMeteoriteWorldGen(Biome b) {
|
||||
if (!AEConfig.instance().isFeatureEnabled(AEFeature.METEORITE_WORLD_GEN)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (b.getCategory() == Biome.Category.THEEND || b.getCategory() == Biome.Category.NETHER) {
|
||||
return;
|
||||
}
|
||||
|
||||
b.func_235063_a_(MeteoriteStructure.INSTANCE.func_236391_a_(IFeatureConfig.NO_FEATURE_CONFIG));
|
||||
}
|
||||
|
||||
private static void addQuartzWorldGen(Biome b) {
|
||||
if (!AEConfig.instance().isFeatureEnabled(AEFeature.CERTUS_QUARTZ_WORLD_GEN)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockState quartzOre = Api.instance().definitions().blocks().quartzOre().block().getDefaultState();
|
||||
b.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES,
|
||||
Feature.ORE
|
||||
.withConfiguration(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE,
|
||||
quartzOre, AEConfig.instance().getQuartzOresPerCluster()))
|
||||
.withPlacement(Placement.COUNT_RANGE.configure(
|
||||
new CountRangeConfig(AEConfig.instance().getQuartzOresClusterAmount(), 12, 12, 72))));
|
||||
|
||||
if (AEConfig.instance().isFeatureEnabled(AEFeature.CHARGED_CERTUS_ORE)) {
|
||||
|
||||
BlockState chargedQuartzOre = Api.instance().definitions().blocks().quartzOreCharged().block()
|
||||
.getDefaultState();
|
||||
b.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION,
|
||||
ChargedQuartzOreFeature.INSTANCE
|
||||
.withConfiguration(new ChargedQuartzOreConfig(quartzOre, chargedQuartzOre,
|
||||
AEConfig.instance().getSpawnChargedChance()))
|
||||
.withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void registerFeatures(RegistryEvent.Register<Feature<?>> evt) {
|
||||
IForgeRegistry<Feature<?>> r = evt.getRegistry();
|
||||
|
||||
r.register(ChargedQuartzOreFeature.INSTANCE.setRegistryName(AppEng.makeId("charged_quartz_ore")));
|
||||
}
|
||||
|
||||
public void registerStructures(RegistryEvent.Register<Structure<?>> evt) {
|
||||
// Registering into the Forge registry is INSUFFICIENT!
|
||||
// There's a bidirectional map in the Structure class itself primarily for the
|
||||
// purposes of NBT serialization
|
||||
StructureAccessor.register(MeteoriteStructure.ID.toString(),
|
||||
MeteoriteStructure.INSTANCE.setRegistryName(MeteoriteStructure.ID),
|
||||
GenerationStage.Decoration.TOP_LAYER_MODIFICATION);
|
||||
|
||||
Registry.register(Registry.CHUNK_GENERATOR_CODEC, SpatialStorageDimensionIds.CHUNK_GENERATOR_ID,
|
||||
SpatialStorageChunkGenerator.CODEC);
|
||||
}
|
||||
|
||||
public void registerBiomes(RegistryEvent.Register<Biome> evt) {
|
||||
evt.getRegistry().register(SpatialStorageBiome.INSTANCE.setRegistryName(SpatialStorageDimensionIds.BIOME_ID));
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
|
||||
@@ -51,12 +51,12 @@ public class MovableTileRegistry implements IMovableRegistry {
|
||||
private final List<IMovableHandler> handlers = new ArrayList<>();
|
||||
private final DefaultSpatialHandler dsh = new DefaultSpatialHandler();
|
||||
private final IMovableHandler nullHandler = new DefaultSpatialHandler();
|
||||
private final ITag<Block> blockTagWhiteList;
|
||||
private final ITag<Block> blockTagBlackList;
|
||||
private final ITag.INamedTag<Block> blockTagWhiteList;
|
||||
private final ITag.INamedTag<Block> blockTagBlackList;
|
||||
|
||||
public MovableTileRegistry() {
|
||||
this.blockTagWhiteList = BlockTags.getCollection().getOrCreate(TAG_WHITELIST);
|
||||
this.blockTagBlackList = BlockTags.getCollection().getOrCreate(TAG_BLACKLIST);
|
||||
this.blockTagWhiteList = BlockTags.makeWrapperTag(TAG_WHITELIST.toString());
|
||||
this.blockTagBlackList = BlockTags.makeWrapperTag(TAG_BLACKLIST.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -71,7 +71,7 @@ public class BlockTransitionEffectPacket extends BasePacket {
|
||||
|
||||
data.writeInt(this.getPacketID());
|
||||
data.writeBlockPos(pos);
|
||||
int blockStateId = GameData.getBlockStateIDMap().get(blockState);
|
||||
int blockStateId = GameData.getBlockStateIDMap().getId(blockState);
|
||||
if (blockStateId == -1) {
|
||||
AELog.warn("Failed to find numeric id for block state %s", blockState);
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import net.minecraft.loot.RandomValueRange;
|
||||
import net.minecraft.loot.conditions.SurvivesExplosion;
|
||||
import net.minecraft.loot.functions.ApplyBonus;
|
||||
import net.minecraft.loot.functions.SetCount;
|
||||
import net.minecraft.util.RegistryKey;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.fml.event.lifecycle.GatherDataEvent;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
@@ -62,12 +63,13 @@ public class BlockDropProvider extends BlockLootTables implements IAE2DataProvid
|
||||
|
||||
@Override
|
||||
public void act(@Nonnull DirectoryCache cache) throws IOException {
|
||||
for (Map.Entry<ResourceLocation, Block> entry : ForgeRegistries.BLOCKS.getEntries()) {
|
||||
for (Map.Entry<RegistryKey<Block>, Block> entry : ForgeRegistries.BLOCKS.getEntries()) {
|
||||
LootTable.Builder builder;
|
||||
if (entry.getKey().getNamespace().equals(AppEng.MOD_ID)) {
|
||||
if (entry.getKey().func_240901_a_().getNamespace().equals(AppEng.MOD_ID)) {
|
||||
builder = overrides.getOrDefault(entry.getValue(), this::defaultBuilder).apply(entry.getValue());
|
||||
|
||||
IDataProvider.save(GSON, cache, toJson(builder), getPath(outputFolder, entry.getKey()));
|
||||
IDataProvider.save(GSON, cache, toJson(builder),
|
||||
getPath(outputFolder, entry.getKey().func_240901_a_()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,7 +129,7 @@ public class MeteoritePlacerItem extends AEBaseItem {
|
||||
// is a debug tool, we'll not care about being terribly efficient here
|
||||
ChunkPos.getAllInBox(new ChunkPos(spawned.getPos()), 1).forEach(cp -> {
|
||||
Chunk c = world.getChunk(cp.x, cp.z);
|
||||
player.connection.sendPacket(new SChunkDataPacket(c, 65535, false)); // 65535 == full chunk
|
||||
player.connection.sendPacket(new SChunkDataPacket(c, 65535)); // 65535 == full chunk
|
||||
});
|
||||
|
||||
return ActionResultType.SUCCESS;
|
||||
|
||||
@@ -176,7 +176,7 @@ public class FluidTerminalScreen extends AEBaseMEScreen<FluidTerminalContainer>
|
||||
list.add(new StringTextComponent(formattedAmount));
|
||||
list.add(new StringTextComponent(modName));
|
||||
|
||||
this.renderTooltip(matrixStack, list, mouseX, mouseY);
|
||||
this.func_243308_b(matrixStack, list, mouseX, mouseY);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package appeng.fluids.client.gui.widgets;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
@@ -73,7 +74,7 @@ public class FluidSlotWidget extends CustomSlotWidget {
|
||||
if (clickStack.isEmpty() || mouseButton == 1) {
|
||||
this.setFluidStack(null);
|
||||
} else if (mouseButton == 0) {
|
||||
final LazyOptional<FluidStack> fluidOpt = FluidUtil.getFluidContained(clickStack);
|
||||
final Optional<FluidStack> fluidOpt = FluidUtil.getFluidContained(clickStack);
|
||||
fluidOpt.ifPresent(fluid -> {
|
||||
this.setFluidStack(AEFluidStack.fromFluidStack(fluid));
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@ package appeng.fluids.container;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
import net.minecraft.inventory.container.ContainerType;
|
||||
@@ -39,7 +40,7 @@ public abstract class FluidConfigurableContainer extends UpgradeableContainer im
|
||||
|
||||
@Override
|
||||
protected ItemStack transferStackToContainer(ItemStack input) {
|
||||
LazyOptional<FluidStack> fsOpt = FluidUtil.getFluidContained(input);
|
||||
Optional<FluidStack> fsOpt = FluidUtil.getFluidContained(input);
|
||||
if (fsOpt.isPresent()) {
|
||||
final IAEFluidTank t = this.getFluidConfigInventory();
|
||||
final IAEFluidStack stack = AEFluidStack.fromFluidStack(fsOpt.orElse(null));
|
||||
|
||||
@@ -18,10 +18,11 @@
|
||||
|
||||
package appeng.fluids.helper;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.fluids.FluidAttributes;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
@@ -46,7 +47,7 @@ public class FluidCellConfig extends CellConfig {
|
||||
if (stack.isEmpty() || stack.getItem() instanceof FluidDummyItem) {
|
||||
super.insertItem(slot, stack, simulate);
|
||||
}
|
||||
LazyOptional<FluidStack> fluidOpt = FluidUtil.getFluidContained(stack);
|
||||
Optional<FluidStack> fluidOpt = FluidUtil.getFluidContained(stack);
|
||||
if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) {
|
||||
return stack;
|
||||
}
|
||||
@@ -64,7 +65,7 @@ public class FluidCellConfig extends CellConfig {
|
||||
if (stack.isEmpty() || stack.getItem() instanceof FluidDummyItem) {
|
||||
super.setStackInSlot(slot, stack);
|
||||
}
|
||||
LazyOptional<FluidStack> fluidOpt = FluidUtil.getFluidContained(stack);
|
||||
Optional<FluidStack> fluidOpt = FluidUtil.getFluidContained(stack);
|
||||
if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) {
|
||||
return;
|
||||
}
|
||||
@@ -82,7 +83,7 @@ public class FluidCellConfig extends CellConfig {
|
||||
if (stack.isEmpty() || stack.getItem() instanceof FluidDummyItem) {
|
||||
super.isItemValid(slot, stack);
|
||||
}
|
||||
LazyOptional<FluidStack> fluidOpt = FluidUtil.getFluidContained(stack);
|
||||
Optional<FluidStack> fluidOpt = FluidUtil.getFluidContained(stack);
|
||||
if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tags.FluidTags;
|
||||
import net.minecraft.tags.ITag;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
@@ -57,8 +56,8 @@ import appeng.util.Platform;
|
||||
|
||||
public class FluidAnnihilationPlanePart extends BasicStatePart implements IGridTickable {
|
||||
|
||||
public static final ResourceLocation TAG_BLACKLIST = new ResourceLocation(AppEng.MOD_ID,
|
||||
"blacklisted/fluid_annihilation_plane");
|
||||
public static final ITag.INamedTag<Fluid> TAG_BLACKLIST = FluidTags
|
||||
.makeWrapperTag(AppEng.makeId("blacklisted/fluid_annihilation_plane").toString());
|
||||
|
||||
private static final PlaneModels MODELS = new PlaneModels("part/fluid_annihilation_plane",
|
||||
"part/fluid_annihilation_plane_on");
|
||||
@@ -214,8 +213,7 @@ public class FluidAnnihilationPlanePart extends BasicStatePart implements IGridT
|
||||
}
|
||||
|
||||
private boolean isFluidBlacklisted(Fluid fluid) {
|
||||
ITag<Fluid> tag = FluidTags.getCollection().getOrCreate(TAG_BLACKLIST);
|
||||
return fluid.isIn(tag);
|
||||
return TAG_BLACKLIST.contains(fluid);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -58,7 +58,8 @@ public class FacadeItem extends AEBaseItem implements IFacadeItem, IAlphaPassIte
|
||||
/**
|
||||
* Block tag used to explicitly whitelist blocks for use in facades.
|
||||
*/
|
||||
private static final ResourceLocation TAG_WHITELISTED = new ResourceLocation(AppEng.MOD_ID, "whitelisted/facades");
|
||||
private static final ITag.INamedTag<Block> BLOCK_WHITELIST = BlockTags
|
||||
.makeWrapperTag(AppEng.makeId("whitelisted/facades").toString());
|
||||
|
||||
private static final String NBT_ITEM_ID = "item";
|
||||
|
||||
@@ -105,8 +106,7 @@ public class FacadeItem extends AEBaseItem implements IFacadeItem, IAlphaPassIte
|
||||
BlockState blockState = block.getDefaultState();
|
||||
|
||||
final boolean areTileEntitiesEnabled = AEConfig.instance().isFeatureEnabled(AEFeature.TILE_ENTITY_FACADES);
|
||||
ITag<Block> whitelistTag = BlockTags.getCollection().getOrCreate(TAG_WHITELISTED);
|
||||
final boolean isWhiteListed = block.isIn(whitelistTag);
|
||||
final boolean isWhiteListed = BLOCK_WHITELIST.contains(block);
|
||||
final boolean isModel = blockState.getRenderType() == BlockRenderType.MODEL;
|
||||
|
||||
final BlockState defaultState = block.getDefaultState();
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
package appeng.mixins;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import net.minecraft.world.chunk.listener.IChunkStatusListener;
|
||||
import net.minecraft.world.server.ChunkManager;
|
||||
|
||||
@Mixin(ChunkManager.class)
|
||||
public interface ThreadedAnvilChunkStorageAccessor {
|
||||
|
||||
@Accessor("field_219266_t")
|
||||
IChunkStatusListener getWorldGenerationProgressListener();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package appeng.mixins.feature;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
|
||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||
import net.minecraft.world.gen.feature.Features;
|
||||
import net.minecraft.world.gen.feature.IFeatureConfig;
|
||||
|
||||
@Mixin(Features.class)
|
||||
public interface ConfiguredFeaturesAccessor {
|
||||
|
||||
@Invoker("func_243968_a")
|
||||
static <FC extends IFeatureConfig> ConfiguredFeature<FC, ?> register(String id,
|
||||
ConfiguredFeature<FC, ?> configuredFeature) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package appeng.mixins.spatial;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.util.registry.WorldGenRegistries;
|
||||
import net.minecraft.world.biome.BiomeRegistry;
|
||||
|
||||
import appeng.spatial.SpatialStorageBiome;
|
||||
import appeng.spatial.SpatialStorageDimensionIds;
|
||||
|
||||
/**
|
||||
* This only needs to be here because the server-side will create a dynamic
|
||||
* registry manager long before our mod is initialized.
|
||||
*/
|
||||
@Mixin(BiomeRegistry.class)
|
||||
public class BiomesMixin {
|
||||
|
||||
@Inject(method = "<clinit>", at = @At("TAIL"))
|
||||
private static void registerBiomes(CallbackInfo ci) {
|
||||
WorldGenRegistries.func_243664_a(WorldGenRegistries.field_243657_i,
|
||||
SpatialStorageDimensionIds.BIOME_KEY.func_240901_a_(), SpatialStorageBiome.INSTANCE);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -35,4 +35,4 @@ public class DimensionOptionMixin {
|
||||
return dimensions;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,15 +2,25 @@ package appeng.mixins.spatial;
|
||||
|
||||
import java.util.OptionalLong;
|
||||
|
||||
import com.mojang.serialization.Lifecycle;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import net.minecraft.server.IDynamicRegistries;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.registry.DynamicRegistries;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import net.minecraft.util.registry.SimpleRegistry;
|
||||
import net.minecraft.world.Dimension;
|
||||
import net.minecraft.world.DimensionType;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.gen.DimensionSettings;
|
||||
|
||||
import appeng.spatial.SpatialStorageChunkGenerator;
|
||||
import appeng.spatial.SpatialStorageDimensionIds;
|
||||
|
||||
/**
|
||||
@@ -21,12 +31,37 @@ import appeng.spatial.SpatialStorageDimensionIds;
|
||||
@Mixin(value = DimensionType.class)
|
||||
public class DimensionTypeMixin {
|
||||
|
||||
@Inject(method = "func_236027_a_", at = @At("TAIL"))
|
||||
private static void addRegistryDefaults(IDynamicRegistries.Impl registryTracker, CallbackInfoReturnable<?> cir) {
|
||||
@Invoker("<init>")
|
||||
static DimensionType create(OptionalLong fixedTime, boolean hasSkylight, boolean hasCeiling, boolean ultrawarm,
|
||||
boolean natural, double coordinateScale, boolean piglinSafe, boolean bedWorks, boolean respawnAnchorWorks,
|
||||
boolean hasRaids, int logicalHeight, ResourceLocation infiniburn, ResourceLocation skyProperties,
|
||||
float ambientLight) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
registryTracker.func_239774_a_(SpatialStorageDimensionIds.DIMENSION_TYPE_ID,
|
||||
new DimensionType(OptionalLong.of(12000), false, false, false, false, false, false, true, false, false,
|
||||
256, BlockTags.INFINIBURN_OVERWORLD.getName(), 1.0f));
|
||||
@Inject(method = "func_236027_a_", at = @At("TAIL"))
|
||||
private static void addRegistryDefaults(DynamicRegistries.Impl registryTracker, CallbackInfoReturnable<?> cir) {
|
||||
DimensionType dimensionType = create(OptionalLong.of(12000), false, false, false, false, 1.0, false, false,
|
||||
false, false, 256, BlockTags.INFINIBURN_OVERWORLD.getName(),
|
||||
SpatialStorageDimensionIds.SKY_PROPERTIES_ID, 1.0f);
|
||||
|
||||
Registry.register(registryTracker.func_230520_a_(),
|
||||
SpatialStorageDimensionIds.DIMENSION_TYPE_ID.func_240901_a_(), dimensionType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert our custom dimension into the initial registry. <em>This is what will
|
||||
* ultimately lead to the creation of a new World.</em>
|
||||
*/
|
||||
@Inject(method = "func_242718_a", at = @At("RETURN"))
|
||||
private static void buildDimensionRegistry(Registry<DimensionType> dimensionTypes, Registry<Biome> biomes,
|
||||
Registry<DimensionSettings> dimensionSettings, long seed,
|
||||
CallbackInfoReturnable<SimpleRegistry<Dimension>> cir) {
|
||||
SimpleRegistry<Dimension> simpleregistry = cir.getReturnValue();
|
||||
|
||||
simpleregistry.register(SpatialStorageDimensionIds.DIMENSION_ID, new Dimension(() -> {
|
||||
return dimensionTypes.func_243576_d(SpatialStorageDimensionIds.DIMENSION_TYPE_ID);
|
||||
}, new SpatialStorageChunkGenerator(biomes)), Lifecycle.stable());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package appeng.mixins.spatial;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import net.minecraft.block.PortalInfo;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
|
||||
import appeng.spatial.SpatialStorageDimensionIds;
|
||||
import appeng.spatial.SpatialStorageHelper;
|
||||
|
||||
/**
|
||||
* This mixin sets the teleport destination, because otherwise Vanilla will not
|
||||
* move the player.
|
||||
*/
|
||||
@Mixin(Entity.class)
|
||||
public class EntityMixin {
|
||||
|
||||
@Inject(method = "func_241829_a", at = @At("HEAD"), cancellable = true, allow = 1)
|
||||
public void getTeleportTarget(ServerWorld destination, CallbackInfoReturnable<PortalInfo> cri) {
|
||||
// Check if a destination has been set for the entity currently being teleported
|
||||
if (destination.func_234923_W_() == SpatialStorageDimensionIds.WORLD_ID) {
|
||||
PortalInfo target = SpatialStorageHelper.getInstance().getTeleportTarget();
|
||||
if (target != null) {
|
||||
cri.setReturnValue(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
package appeng.mixins.spatial;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.client.world.DimensionRenderInfo;
|
||||
import net.minecraft.util.RegistryKey;
|
||||
import net.minecraft.world.DimensionType;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||
|
||||
import appeng.spatial.SpatialStorageDimensionIds;
|
||||
import appeng.spatial.SpatialStorageSkyProperties;
|
||||
@@ -17,12 +17,12 @@ import appeng.spatial.SpatialStorageSkyProperties;
|
||||
@Mixin(DimensionRenderInfo.class)
|
||||
public class SkyPropertiesMixin {
|
||||
|
||||
@Inject(method = "func_239215_a_", at = @At("HEAD"), cancellable = true)
|
||||
private static void byDimensionType(Optional<RegistryKey<DimensionType>> optional,
|
||||
CallbackInfoReturnable<DimensionRenderInfo> ci) {
|
||||
if (optional.orElse(null) == SpatialStorageDimensionIds.DIMENSION_TYPE_ID) {
|
||||
ci.setReturnValue(SpatialStorageSkyProperties.INSTANCE);
|
||||
}
|
||||
@Shadow
|
||||
private static Object2ObjectMap<ResourceLocation, DimensionRenderInfo> field_239208_a_/* BY_IDENTIFIER */;
|
||||
|
||||
@Inject(method = "<clinit>", at = @At("TAIL"))
|
||||
private static void init(CallbackInfo ci) {
|
||||
field_239208_a_.put(SpatialStorageDimensionIds.SKY_PROPERTIES_ID, SpatialStorageSkyProperties.INSTANCE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ public class SkyRenderMixin {
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
@Inject(method = "renderSky(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V", at = @At("HEAD"), cancellable = true)
|
||||
public void renderSky(MatrixStack matrices, float tickDelta, CallbackInfo ci) {
|
||||
if (mc.world.func_234922_V_() == SpatialStorageDimensionIds.DIMENSION_TYPE_ID) {
|
||||
if (mc.world.func_234923_W_() == SpatialStorageDimensionIds.WORLD_ID) {
|
||||
SpatialSkyRender.getInstance().render(matrices);
|
||||
ci.cancel();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package appeng.mixins.structure;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.gen.feature.StructureFeature;
|
||||
import net.minecraft.world.gen.feature.structure.Structure;
|
||||
|
||||
/**
|
||||
* Allows access to the copy of _all_ structures that is maintained within each
|
||||
* instance of {@link Biome}, in order to add our new structure to it. Note that
|
||||
* this does not mean the structure will start _generating_ in this biome, it
|
||||
* will only continue to generate if an adjacent biome has started the structure
|
||||
* and it extends into this one.
|
||||
*/
|
||||
@Mixin(Biome.class)
|
||||
public interface BiomeAccessor {
|
||||
|
||||
@Accessor
|
||||
Map<Integer, List<Structure<?>>> getField_242421_g();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package appeng.mixins.structure;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
|
||||
import net.minecraft.world.gen.feature.IFeatureConfig;
|
||||
import net.minecraft.world.gen.feature.StructureFeature;
|
||||
import net.minecraft.world.gen.feature.structure.Structure;
|
||||
import net.minecraft.world.gen.feature.structure.StructureFeatures;
|
||||
|
||||
@Mixin(StructureFeatures.class)
|
||||
public interface ConfiguredStructureFeaturesAccessor {
|
||||
|
||||
@Invoker("func_244162_a")
|
||||
static <FC extends IFeatureConfig, F extends Structure<FC>> StructureFeature<FC, F> register(String id,
|
||||
StructureFeature<FC, F> configuredStructureFeature) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package appeng.mixins;
|
||||
package appeng.mixins.structure;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package appeng.mixins.structure;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import net.minecraft.world.biome.BiomeGenerationSettings;
|
||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||
import net.minecraft.world.gen.feature.StructureFeature;
|
||||
|
||||
/**
|
||||
* Allows the settings in a Biome's generation settings to be modified.
|
||||
*/
|
||||
@Mixin(BiomeGenerationSettings.class)
|
||||
public interface GenerationSettingsAccessor {
|
||||
|
||||
@Accessor("field_242484_f")
|
||||
List<List<Supplier<ConfiguredFeature<?, ?>>>> getFeatures();
|
||||
|
||||
@Accessor("field_242484_f")
|
||||
void setFeatures(List<List<Supplier<ConfiguredFeature<?, ?>>>> features);
|
||||
|
||||
@Accessor("field_242485_g")
|
||||
List<Supplier<StructureFeature<?, ?>>> getStructureFeatures();
|
||||
|
||||
@Accessor("field_242485_g")
|
||||
void setStructureFeatures(List<Supplier<StructureFeature<?, ?>>> structureFeatures);
|
||||
|
||||
}
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
package appeng.mixins;
|
||||
package appeng.mixins.structure;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
@@ -7,10 +7,10 @@ import net.minecraft.world.gen.GenerationStage;
|
||||
import net.minecraft.world.gen.feature.structure.Structure;
|
||||
|
||||
@Mixin(Structure.class)
|
||||
public interface StructureAccessor {
|
||||
public interface StructureFeatureAccessor {
|
||||
|
||||
@Invoker("func_236394_a_")
|
||||
static <F extends Structure<?>> F register(String id, F feature, GenerationStage.Decoration defaultStage) {
|
||||
static <F extends Structure<?>> F register(String id, F structureFeature, GenerationStage.Decoration step) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import net.minecraft.item.Items;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.tags.ITag;
|
||||
import net.minecraft.tags.ItemTags;
|
||||
import net.minecraft.tags.Tag;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
@@ -82,6 +83,10 @@ public class AnnihilationPlanePart extends BasicStatePart implements IGridTickab
|
||||
public static final ResourceLocation TAG_BLACKLIST = new ResourceLocation(AppEng.MOD_ID,
|
||||
"blacklisted/annihilation_plane");
|
||||
|
||||
private static final ITag.INamedTag<Block> BLOCK_BLACKLIST = BlockTags.makeWrapperTag(TAG_BLACKLIST.toString());
|
||||
|
||||
private static final ITag.INamedTag<Item> ITEM_BLACKLIST = ItemTags.makeWrapperTag(TAG_BLACKLIST.toString());
|
||||
|
||||
private static final PlaneModels MODELS = new PlaneModels("part/annihilation_plane", "part/annihilation_plane_on");
|
||||
|
||||
@PartModels
|
||||
@@ -527,13 +532,11 @@ public class AnnihilationPlanePart extends BasicStatePart implements IGridTickab
|
||||
}
|
||||
|
||||
public static boolean isBlockBlacklisted(Block b) {
|
||||
ITag<Block> tag = BlockTags.getCollection().getOrCreate(TAG_BLACKLIST);
|
||||
return b.isIn(tag);
|
||||
return BLOCK_BLACKLIST.contains(b);
|
||||
}
|
||||
|
||||
public static boolean isItemBlacklisted(Item i) {
|
||||
ITag<Item> tag = ItemTags.getCollection().getOrCreate(TAG_BLACKLIST);
|
||||
return i.isIn(tag);
|
||||
return ITEM_BLACKLIST.contains(i);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -379,12 +379,12 @@ public class FormationPlanePart extends AbstractFormationPlanePart<IAEItemStack>
|
||||
|
||||
@Override
|
||||
public BlockPos getPos() {
|
||||
return this.rayTraceResult.getPos();
|
||||
return this.func_242401_i().getPos();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlace() {
|
||||
return this.world.getBlockState(this.rayTraceResult.getPos()).isReplaceable(this);
|
||||
return getWorld().getBlockState(this.getPos()).isReplaceable(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -110,7 +110,7 @@ public class SpatialStorageCommand implements ISubCommand {
|
||||
}
|
||||
}
|
||||
|
||||
throw new CommandException(ITextComponent.func_241827_a_("Couldn't find a plot for the current position."));
|
||||
throw new CommandException(new StringTextComponent("Couldn't find a plot for the current position."));
|
||||
|
||||
}
|
||||
|
||||
@@ -120,8 +120,7 @@ public class SpatialStorageCommand implements ISubCommand {
|
||||
private void teleportBack(CommandSource source, SpatialStoragePlot plot) {
|
||||
TransitionInfo lastTransition = plot.getLastTransition();
|
||||
if (lastTransition == null) {
|
||||
throw new CommandException(
|
||||
ITextComponent.func_241827_a_("This plot doesn't have a last known transition."));
|
||||
throw new CommandException(new StringTextComponent("This plot doesn't have a last known transition."));
|
||||
}
|
||||
|
||||
String command = getTeleportCommand(lastTransition.getWorldId(), lastTransition.getMin().add(0, 1, 0));
|
||||
@@ -212,7 +211,7 @@ public class SpatialStorageCommand implements ISubCommand {
|
||||
|
||||
if (!(cell.getItem() instanceof SpatialStorageCellItem)) {
|
||||
throw new CommandException(
|
||||
ITextComponent.func_241827_a_("Storage cell items don't implement the storage cell interface!"));
|
||||
new StringTextComponent("Storage cell items don't implement the storage cell interface!"));
|
||||
}
|
||||
|
||||
SpatialStorageCellItem spatialCellItem = (SpatialStorageCellItem) cell.getItem();
|
||||
@@ -321,7 +320,7 @@ public class SpatialStorageCommand implements ISubCommand {
|
||||
}
|
||||
}
|
||||
|
||||
throw new CommandException(ITextComponent.func_241827_a_("Couldn't find a plot for the current position."));
|
||||
throw new CommandException(new StringTextComponent("Couldn't find a plot for the current position."));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -172,8 +172,9 @@ public class TestMeteoritesCommand implements ISubCommand {
|
||||
msg.append(getClickablePosition(world, settings, pos)).append(restOfLine);
|
||||
|
||||
// Add a tooltip
|
||||
String biomeId = world.func_242406_i(pos).map(bk -> bk.func_240901_a_().toString()).orElse("unknown");
|
||||
ITextComponent tooltip = new StringTextComponent(settings.toString() + "\nBiome: ").deepCopy()
|
||||
.append(world.getBiome(pos).getDisplayName());
|
||||
.appendString(biomeId);
|
||||
msg.modifyStyle(style -> style.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)));
|
||||
|
||||
sender.sendFeedback(msg, true);
|
||||
|
||||
@@ -31,8 +31,7 @@ import net.minecraft.block.Block;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.ChunkPos;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.IServerWorld;
|
||||
import net.minecraft.world.chunk.IChunk;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.event.world.WorldEvent;
|
||||
@@ -92,18 +91,14 @@ public final class CompassService {
|
||||
}
|
||||
}
|
||||
|
||||
public void tryUpdateArea(final IWorld w, ChunkPos chunkPos) {
|
||||
public void tryUpdateArea(final IServerWorld w, ChunkPos chunkPos) {
|
||||
// If this seems weird: during worldgen, WorldAccess is a specific region, but
|
||||
// getWorld is
|
||||
// still the server world. We do need to use the world access to get the chunk
|
||||
// in question
|
||||
// though, since during worldgen, it's not comitted to the actual world yet.
|
||||
World world = w.getWorld();
|
||||
if (!(world instanceof ServerWorld)) {
|
||||
return;
|
||||
}
|
||||
IChunk chunk = w.getChunk(chunkPos.x, chunkPos.z);
|
||||
updateArea((ServerWorld) world, chunk);
|
||||
updateArea(w.getWorld(), chunk);
|
||||
}
|
||||
|
||||
public void updateArea(final ServerWorld w, IChunk chunk) {
|
||||
|
||||
@@ -323,7 +323,7 @@ public class CachedPlane {
|
||||
|
||||
WorldData.instance().compassData().service().updateArea(this.getWorld(), c);
|
||||
|
||||
SChunkDataPacket cdp = new SChunkDataPacket(c, verticalBits, false);
|
||||
SChunkDataPacket cdp = new SChunkDataPacket(c, verticalBits);
|
||||
world.getChunkProvider().chunkManager.getTrackingPlayers(c.getPos(), false)
|
||||
.forEach(spe -> spe.connection.sendPacket(cdp));
|
||||
}
|
||||
|
||||
@@ -20,33 +20,25 @@ package appeng.spatial;
|
||||
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.biome.BiomeAmbience;
|
||||
import net.minecraft.world.biome.BiomeGenerationSettings;
|
||||
import net.minecraft.world.biome.MobSpawnInfo;
|
||||
import net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder;
|
||||
import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
/**
|
||||
* The single biome used within the spatial storage world.
|
||||
*/
|
||||
public class SpatialStorageBiome extends Biome {
|
||||
public class SpatialStorageBiome {
|
||||
|
||||
public static final SpatialStorageBiome INSTANCE = new SpatialStorageBiome();
|
||||
|
||||
public SpatialStorageBiome() {
|
||||
super(new Biome.Builder()
|
||||
.surfaceBuilder(
|
||||
new ConfiguredSurfaceBuilder<>(SurfaceBuilder.NOPE, SurfaceBuilder.STONE_STONE_GRAVEL_CONFIG))
|
||||
.precipitation(RainType.NONE).category(Category.NONE).depth(0).scale(1)
|
||||
// Copied from the vanilla void biome
|
||||
.temperature(0.5F).downfall(0.5F).func_235097_a_(new BiomeAmbience.Builder().setWaterColor(4159204)
|
||||
.setWaterFogColor(329011).setFogColor(0).build())
|
||||
.parent(null));
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getSkyColor() {
|
||||
return 0x111111;
|
||||
}
|
||||
public static final Biome INSTANCE = new Biome.Builder()
|
||||
.func_242457_a(new BiomeGenerationSettings.Builder().func_242517_a(
|
||||
new ConfiguredSurfaceBuilder<>(SurfaceBuilder.NOPE, SurfaceBuilder.STONE_STONE_GRAVEL_CONFIG))
|
||||
.func_242508_a())
|
||||
.precipitation(Biome.RainType.NONE).category(Biome.Category.NONE).depth(0).scale(1)
|
||||
// Copied from the vanilla void biome
|
||||
.temperature(0.5F).downfall(0.5F)
|
||||
.func_235097_a_(new BiomeAmbience.Builder().setWaterColor(4159204).setWaterFogColor(329011).setFogColor(0)
|
||||
.func_242539_d(0x111111).build())
|
||||
.func_242458_a(new MobSpawnInfo.Builder().func_242572_a(0).func_242577_b()).func_242455_a();
|
||||
|
||||
}
|
||||
|
||||
@@ -23,15 +23,16 @@ import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import net.minecraft.util.registry.RegistryLookupCodec;
|
||||
import net.minecraft.world.Blockreader;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.biome.BiomeManager;
|
||||
import net.minecraft.world.biome.provider.BiomeProvider;
|
||||
import net.minecraft.world.biome.provider.SingleBiomeProvider;
|
||||
import net.minecraft.world.chunk.IChunk;
|
||||
import net.minecraft.world.gen.ChunkGenerator;
|
||||
@@ -48,18 +49,28 @@ import appeng.core.Api;
|
||||
*/
|
||||
public class SpatialStorageChunkGenerator extends ChunkGenerator {
|
||||
|
||||
/**
|
||||
* This codec is necessary to restore the actual instance of the Biome we use,
|
||||
* since it is sources from the dynamic registries and <em>must be the same
|
||||
* object as in the registry!</em>.
|
||||
* <p>
|
||||
* If it was not the same object, then the Object->ID lookup would fail since it
|
||||
* uses an identity hashmap internally.
|
||||
*/
|
||||
public static final Codec<SpatialStorageChunkGenerator> CODEC = RegistryLookupCodec
|
||||
.func_244331_a(Registry.BIOME_KEY)
|
||||
.xmap(SpatialStorageChunkGenerator::new, SpatialStorageChunkGenerator::getBiomeRegistry).stable().codec();
|
||||
|
||||
private final Registry<Biome> biomeRegistry;
|
||||
|
||||
private final Blockreader columnSample;
|
||||
|
||||
public static final SpatialStorageChunkGenerator INSTANCE = new SpatialStorageChunkGenerator();
|
||||
|
||||
public static final Codec<SpatialStorageChunkGenerator> CODEC = RecordCodecBuilder
|
||||
.create((instance) -> instance.stable(INSTANCE));
|
||||
|
||||
private final BlockState defaultBlockState;
|
||||
|
||||
private SpatialStorageChunkGenerator() {
|
||||
super(createBiomeProvider(), createSettings());
|
||||
public SpatialStorageChunkGenerator(Registry<Biome> biomeRegistry) {
|
||||
super(createBiomeSource(biomeRegistry), createSettings());
|
||||
this.defaultBlockState = Api.instance().definitions().blocks().matrixFrame().block().getDefaultState();
|
||||
this.biomeRegistry = biomeRegistry;
|
||||
|
||||
// Vertical sample is mostly used for Feature generation, for those purposes
|
||||
// we're all filled with matrix blocks
|
||||
@@ -73,8 +84,13 @@ public class SpatialStorageChunkGenerator extends ChunkGenerator {
|
||||
return CODEC;
|
||||
}
|
||||
|
||||
private static BiomeProvider createBiomeProvider() {
|
||||
return new SingleBiomeProvider(SpatialStorageBiome.INSTANCE);
|
||||
private static SingleBiomeProvider createBiomeSource(Registry<Biome> biomeRegistry) {
|
||||
return new SingleBiomeProvider(
|
||||
biomeRegistry.func_243576_d/* getOrThrow */(SpatialStorageDimensionIds.BIOME_KEY));
|
||||
}
|
||||
|
||||
public Registry<Biome> getBiomeRegistry() {
|
||||
return biomeRegistry;
|
||||
}
|
||||
|
||||
private static DimensionStructuresSettings createSettings() {
|
||||
|
||||
@@ -6,6 +6,7 @@ import net.minecraft.util.registry.Registry;
|
||||
import net.minecraft.world.Dimension;
|
||||
import net.minecraft.world.DimensionType;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
|
||||
import appeng.core.AppEng;
|
||||
import appeng.mixins.spatial.DimensionTypeMixin;
|
||||
@@ -33,13 +34,13 @@ public final class SpatialStorageDimensionIds {
|
||||
* ID of the {@link net.minecraft.world.biome.Biome} used for the spatial
|
||||
* storage world.
|
||||
*/
|
||||
public static final ResourceLocation BIOME_ID = AppEng.makeId("spatial_storage");
|
||||
public static final RegistryKey<Biome> BIOME_KEY = RegistryKey.func_240903_a_(Registry.BIOME_KEY,
|
||||
AppEng.makeId("spatial_storage"));
|
||||
|
||||
/**
|
||||
* ID of the {@link Dimension} used for the spatial storage dimension.
|
||||
* <p>
|
||||
* This is defined in
|
||||
* <code>data/minecraft/dimension/appliedenergistics2/spatial_storage.json</code>
|
||||
* This is defined in {@link appeng.mixins.spatial.DimensionTypeMixin}.
|
||||
*/
|
||||
public static final RegistryKey<Dimension> DIMENSION_ID = RegistryKey.func_240903_a_(Registry.DIMENSION_KEY,
|
||||
AppEng.makeId("spatial_storage"));
|
||||
@@ -51,6 +52,12 @@ public final class SpatialStorageDimensionIds {
|
||||
public static final RegistryKey<World> WORLD_ID = RegistryKey.func_240903_a_(Registry.WORLD_KEY,
|
||||
AppEng.makeId("spatial_storage"));
|
||||
|
||||
/**
|
||||
* ID of the {@link net.minecraft.client.world.DimensionRenderInfo} used for the
|
||||
* spatial storage world.
|
||||
*/
|
||||
public static ResourceLocation SKY_PROPERTIES_ID = AppEng.makeId("spatial_storage");
|
||||
|
||||
private SpatialStorageDimensionIds() {
|
||||
}
|
||||
|
||||
|
||||
@@ -25,11 +25,13 @@ import java.util.function.Function;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.PortalInfo;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.chunk.ChunkStatus;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
@@ -50,6 +52,16 @@ public class SpatialStorageHelper {
|
||||
return instance;
|
||||
}
|
||||
|
||||
private final ThreadLocal<PortalInfo> teleportTarget = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* If an entity is currently being teleported, this will return the target
|
||||
* within the target dimension.
|
||||
*/
|
||||
public PortalInfo getTeleportTarget() {
|
||||
return teleportTarget.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Mostly from dimensional doors.. which mostly got it form X-Comp.
|
||||
*
|
||||
@@ -97,12 +109,25 @@ public class SpatialStorageHelper {
|
||||
newWorld.getChunkProvider().getChunk(MathHelper.floor(link.x) >> 4, MathHelper.floor(link.z) >> 4,
|
||||
ChunkStatus.FULL, true);
|
||||
|
||||
if (entity instanceof ServerPlayerEntity
|
||||
&& link.dim.func_234922_V_() == SpatialStorageDimensionIds.DIMENSION_TYPE_ID) {
|
||||
if (entity instanceof ServerPlayerEntity && link.dim.func_234923_W_() == SpatialStorageDimensionIds.WORLD_ID) {
|
||||
AppEng.instance().getAdvancementTriggers().getSpatialExplorer().trigger((ServerPlayerEntity) entity);
|
||||
}
|
||||
|
||||
entity.changeDimension(link.dim, new METeleporter(link));
|
||||
// Store in a threadlocal so that EntityMixin can return it for the Vanilla
|
||||
// logic to use
|
||||
teleportTarget.set(new PortalInfo(new Vector3d(link.x, link.y, link.z), Vector3d.ZERO, entity.rotationYaw,
|
||||
entity.rotationPitch));
|
||||
try {
|
||||
entity = entity.changeDimension(link.dim, new ITeleporter() {
|
||||
@Override
|
||||
public Entity placeEntity(Entity entity, ServerWorld currentWorld, ServerWorld destWorld, float yaw,
|
||||
Function<Boolean, Entity> repositionEntity) {
|
||||
return repositionEntity.apply(false);
|
||||
}
|
||||
});
|
||||
} finally {
|
||||
teleportTarget.remove();
|
||||
}
|
||||
|
||||
if (!passengersOnOtherSide.isEmpty()) {
|
||||
for (Entity passanger : passengersOnOtherSide) {
|
||||
@@ -238,22 +263,4 @@ public class SpatialStorageHelper {
|
||||
}
|
||||
}
|
||||
|
||||
private static class METeleporter implements ITeleporter {
|
||||
|
||||
private final TelDestination destination;
|
||||
|
||||
METeleporter(final TelDestination d) {
|
||||
this.destination = d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Entity placeEntity(Entity entity, ServerWorld currentWorld, ServerWorld destWorld, float yaw,
|
||||
Function<Boolean, Entity> repositionEntity) {
|
||||
Entity newEntity = repositionEntity.apply(false);
|
||||
newEntity.rotationYaw = yaw;
|
||||
newEntity.setPositionAndUpdate(this.destination.x, this.destination.y, this.destination.z);
|
||||
newEntity.setMotion(0, 0, 0);
|
||||
return newEntity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
package appeng.worldgen;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.gen.GenerationStage;
|
||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||
import net.minecraft.world.gen.feature.StructureFeature;
|
||||
import net.minecraft.world.gen.feature.structure.Structure;
|
||||
|
||||
import appeng.mixins.structure.BiomeAccessor;
|
||||
import appeng.mixins.structure.GenerationSettingsAccessor;
|
||||
|
||||
public final class BiomeModifier {
|
||||
|
||||
private final BiomeAccessor biomeAccessor;
|
||||
|
||||
private final GenerationSettingsAccessor generationSettingsAccessor;
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
public BiomeModifier(Biome biome) {
|
||||
this.biomeAccessor = (BiomeAccessor) (Object) biome;
|
||||
this.generationSettingsAccessor = (GenerationSettingsAccessor) biome.func_242440_e();
|
||||
}
|
||||
|
||||
public void addFeature(GenerationStage.Decoration step, ConfiguredFeature<?, ?> feature) {
|
||||
|
||||
int stepIndex = step.ordinal();
|
||||
List<List<Supplier<ConfiguredFeature<?, ?>>>> featuresByStep = new ArrayList<>(
|
||||
generationSettingsAccessor.getFeatures());
|
||||
|
||||
while (featuresByStep.size() <= stepIndex) {
|
||||
featuresByStep.add(Lists.newArrayList());
|
||||
}
|
||||
|
||||
List<Supplier<ConfiguredFeature<?, ?>>> features = new ArrayList<>(featuresByStep.get(stepIndex));
|
||||
features.add(() -> feature);
|
||||
featuresByStep.set(stepIndex, features);
|
||||
|
||||
generationSettingsAccessor.setFeatures(featuresByStep);
|
||||
|
||||
}
|
||||
|
||||
public void addStructureFeature(StructureFeature<?, ?> structure) {
|
||||
List<Supplier<StructureFeature<?, ?>>> features = new ArrayList<>(
|
||||
generationSettingsAccessor.getStructureFeatures());
|
||||
features.add(() -> structure);
|
||||
generationSettingsAccessor.setStructureFeatures(features);
|
||||
|
||||
// Add it to the structures that will generate pieces within this biome,
|
||||
// this is only half-correct since a structure can start in an adjacent biome
|
||||
// and extend into biomes that would usually not start the structure
|
||||
Map<Integer, List<Structure<?>>> structuresByStage = biomeAccessor.getField_242421_g();
|
||||
int step = structure.field_236268_b_.func_236396_f_().ordinal();
|
||||
if (!structuresByStage.containsKey(step)) {
|
||||
structuresByStage.put(step, new ArrayList<>());
|
||||
}
|
||||
structuresByStage.get(step).add(structure.field_236268_b_);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,7 +15,7 @@ public class ChargedQuartzOreConfig implements IFeatureConfig {
|
||||
public static final Codec<ChargedQuartzOreConfig> CODEC = RecordCodecBuilder.create((instance) -> instance
|
||||
.group(BlockState.BLOCKSTATE_CODEC.fieldOf("target").forGetter((config) -> config.target),
|
||||
BlockState.BLOCKSTATE_CODEC.fieldOf("state").forGetter((config) -> config.state),
|
||||
Codec.FLOAT.fieldOf("chance").withDefault(0f).forGetter((config) -> config.chance))
|
||||
Codec.FLOAT.fieldOf("chance").orElse(0f).forGetter((config) -> config.chance))
|
||||
.apply(instance, ChargedQuartzOreConfig::new));
|
||||
|
||||
public final BlockState target;
|
||||
|
||||
@@ -11,7 +11,6 @@ import net.minecraft.world.chunk.IChunk;
|
||||
import net.minecraft.world.gen.ChunkGenerator;
|
||||
import net.minecraft.world.gen.Heightmap;
|
||||
import net.minecraft.world.gen.feature.Feature;
|
||||
import net.minecraft.world.gen.feature.structure.StructureManager;
|
||||
|
||||
/**
|
||||
* Extends {@link net.minecraft.world.gen.feature.OreFeature} by also allowing
|
||||
@@ -27,8 +26,8 @@ public class ChargedQuartzOreFeature extends Feature<ChargedQuartzOreConfig> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean func_230362_a_(ISeedReader worldIn, StructureManager structureAccessor, ChunkGenerator generator,
|
||||
Random rand, BlockPos pos, ChargedQuartzOreConfig config) {
|
||||
public boolean func_241855_a(ISeedReader worldIn, ChunkGenerator generator, Random rand, BlockPos pos,
|
||||
ChargedQuartzOreConfig config) {
|
||||
ChunkPos chunkPos = new ChunkPos(pos);
|
||||
|
||||
BlockPos.Mutable bpos = new BlockPos.Mutable();
|
||||
|
||||
@@ -9,6 +9,7 @@ import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.biome.provider.BiomeProvider;
|
||||
import net.minecraft.world.gen.ChunkGenerator;
|
||||
import net.minecraft.world.gen.feature.NoFeatureConfig;
|
||||
import net.minecraft.world.gen.feature.StructureFeature;
|
||||
import net.minecraft.world.gen.feature.structure.Structure;
|
||||
|
||||
import appeng.core.AppEng;
|
||||
@@ -19,6 +20,9 @@ public class MeteoriteStructure extends Structure<NoFeatureConfig> {
|
||||
|
||||
public static final Structure<NoFeatureConfig> INSTANCE = new MeteoriteStructure(NoFeatureConfig.field_236558_a_);
|
||||
|
||||
public static final StructureFeature<NoFeatureConfig, ? extends Structure<NoFeatureConfig>> CONFIGURED_INSTANCE = INSTANCE
|
||||
.func_236391_a_(NoFeatureConfig.field_236559_b_);
|
||||
|
||||
public MeteoriteStructure(Codec<NoFeatureConfig> configCodec) {
|
||||
super(configCodec);
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ import appeng.worldgen.meteorite.fallout.FalloutMode;
|
||||
public class MeteoriteStructurePiece extends StructurePiece {
|
||||
|
||||
public static final IStructurePieceType TYPE = IStructurePieceType.register(MeteoriteStructurePiece::new,
|
||||
"AE2MTRT");
|
||||
"ae2mtrt");
|
||||
|
||||
public static void register() {
|
||||
// THIS MUST BE CALLED otherwise the static initializer above will not run,
|
||||
|
||||
@@ -12,9 +12,9 @@ import net.minecraft.tags.ITag;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MutableBoundingBox;
|
||||
import net.minecraft.util.registry.DynamicRegistries;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.biome.Biome.Category;
|
||||
import net.minecraft.world.biome.Biome.TempCategory;
|
||||
import net.minecraft.world.gen.ChunkGenerator;
|
||||
import net.minecraft.world.gen.Heightmap;
|
||||
import net.minecraft.world.gen.Heightmap.Type;
|
||||
@@ -27,17 +27,18 @@ import appeng.worldgen.meteorite.fallout.FalloutMode;
|
||||
|
||||
public class MeteoriteStructureStart extends StructureStart<NoFeatureConfig> {
|
||||
|
||||
private final ITag<Block> sandTag = BlockTags.getCollection().getOrCreate(new ResourceLocation("minecraft:sand"));
|
||||
private final ITag<Block> sandTag = BlockTags.getCollection().func_241834_b(new ResourceLocation("minecraft:sand"));
|
||||
private final ITag<Block> terracottaTag = BlockTags.getCollection()
|
||||
.getOrCreate(new ResourceLocation("forge:terracotta"));
|
||||
.func_241834_b(new ResourceLocation("forge:terracotta"));
|
||||
|
||||
public MeteoriteStructureStart(Structure<NoFeatureConfig> p_i225815_1_, int p_i225815_2_, int p_i225815_3_,
|
||||
MutableBoundingBox p_i225815_4_, int p_i225815_5_, long p_i225815_6_) {
|
||||
super(p_i225815_1_, p_i225815_2_, p_i225815_3_, p_i225815_4_, p_i225815_5_, p_i225815_6_);
|
||||
}
|
||||
|
||||
public void func_230364_a_(ChunkGenerator generator, TemplateManager templateManagerIn, int chunkX, int chunkZ,
|
||||
Biome biome, NoFeatureConfig config) {
|
||||
@Override
|
||||
public void func_230364_a_(DynamicRegistries dynamicRegistryManager, ChunkGenerator generator,
|
||||
TemplateManager templateManager, int chunkX, int chunkZ, Biome biome, NoFeatureConfig config) {
|
||||
final int centerX = chunkX * 16 + this.rand.nextInt(16);
|
||||
final int centerZ = chunkZ * 16 + this.rand.nextInt(16);
|
||||
final float meteoriteRadius = (this.rand.nextFloat() * 6.0f) + 2;
|
||||
@@ -75,7 +76,7 @@ public class MeteoriteStructureStart extends StructureStart<NoFeatureConfig> {
|
||||
boolean craterLake = this.locateWaterAroundTheCrater(generator, actualPos, meteoriteRadius);
|
||||
CraterType craterType = this.determineCraterType(spawnBiome);
|
||||
boolean pureCrater = this.rand.nextFloat() > .9f;
|
||||
FalloutMode fallout = getFalloutFromBaseBlock(spawnBiome.getSurfaceBuilderConfig().getTop());
|
||||
FalloutMode fallout = getFalloutFromBaseBlock(spawnBiome.func_242440_e().func_242502_e().getTop());
|
||||
|
||||
components.add(
|
||||
new MeteoriteStructurePiece(actualPos, meteoriteRadius, craterType, fallout, pureCrater, craterLake));
|
||||
@@ -118,7 +119,9 @@ public class MeteoriteStructureStart extends StructureStart<NoFeatureConfig> {
|
||||
}
|
||||
|
||||
private CraterType determineCraterType(Biome biome) {
|
||||
final TempCategory temp = biome.getTempCategory();
|
||||
// The temperature thresholds below are taken from older Vanilla code
|
||||
// (temperature categories)
|
||||
final float temp = biome.func_242445_k();
|
||||
final Category category = biome.getCategory();
|
||||
|
||||
// No craters in oceans
|
||||
@@ -135,7 +138,7 @@ public class MeteoriteStructureStart extends StructureStart<NoFeatureConfig> {
|
||||
}
|
||||
|
||||
// Warm biomes, higher chance for lava
|
||||
if (temp == TempCategory.WARM) {
|
||||
if (temp >= 1) {
|
||||
|
||||
// 50% chance to actually spawn as lava
|
||||
final boolean lava = rand.nextFloat() > .5f;
|
||||
@@ -158,7 +161,7 @@ public class MeteoriteStructureStart extends StructureStart<NoFeatureConfig> {
|
||||
}
|
||||
|
||||
// Temperate biomes. Water or maybe lava
|
||||
if (temp == TempCategory.MEDIUM) {
|
||||
if (temp < 1 && temp >= 0.2) {
|
||||
// 75% chance to actually spawn with a crater lake
|
||||
final boolean lake = rand.nextFloat() > .25f;
|
||||
// 20% to spawn with lava
|
||||
@@ -184,7 +187,7 @@ public class MeteoriteStructureStart extends StructureStart<NoFeatureConfig> {
|
||||
}
|
||||
|
||||
// Cold biomes, Snow or Ice, maybe water and very rarely lava.
|
||||
if (temp == TempCategory.COLD) {
|
||||
if (temp < 0.2) {
|
||||
// 75% chance to actually spawn with a crater lake
|
||||
final boolean lake = rand.nextFloat() > .25f;
|
||||
// 5% to spawn with lava
|
||||
|
||||
@@ -36,7 +36,7 @@ public class FalloutCopy extends Fallout {
|
||||
public FalloutCopy(final IWorld w, BlockPos pos, final MeteoriteBlockPutter putter, final BlockState skyStone) {
|
||||
super(putter, skyStone);
|
||||
this.putter = putter;
|
||||
this.block = w.getBiome(pos).getSurfaceBuilderConfig().getTop();
|
||||
this.block = w.getBiome(pos).func_242440_e().func_242502_e().getTop();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -6,6 +6,7 @@ displayURL="https://github.com/AppliedEnergistics/Applied-Energistics-2"
|
||||
logoFile="logo.png"
|
||||
#credits="Thanks for this example mod goes to Java"
|
||||
authors="TeamAppliedEnergistics"
|
||||
license="See GitHub repository for details"
|
||||
|
||||
[[mods]]
|
||||
modId="appliedenergistics2"
|
||||
@@ -16,13 +17,13 @@ description="A Mod about Matter, Energy and using them to conquer the world.."
|
||||
[[dependencies.appliedenergistics2]]
|
||||
modId="forge"
|
||||
mandatory=true
|
||||
versionRange="[32.0.108,33.0.0)"
|
||||
versionRange="[33.0.22,34.0.0)"
|
||||
ordering="NONE"
|
||||
side="BOTH"
|
||||
|
||||
[[dependencies.appliedenergistics2]]
|
||||
modId="minecraft"
|
||||
mandatory=true
|
||||
versionRange="[1.16.1]"
|
||||
versionRange="[1.16.2]"
|
||||
ordering="NONE"
|
||||
side="BOTH"
|
||||
|
||||
@@ -7,9 +7,14 @@
|
||||
"mixins": [
|
||||
"spatial.DimensionTypeMixin",
|
||||
"spatial.DimensionOptionMixin",
|
||||
"ThreadedAnvilChunkStorageAccessor",
|
||||
"DimensionStructuresSettingsMixin",
|
||||
"StructureAccessor"
|
||||
"spatial.EntityMixin",
|
||||
"spatial.BiomesMixin",
|
||||
"structure.DimensionStructuresSettingsMixin",
|
||||
"structure.ConfiguredStructureFeaturesAccessor",
|
||||
"structure.StructureFeatureAccessor",
|
||||
"structure.GenerationSettingsAccessor",
|
||||
"structure.BiomeAccessor",
|
||||
"feature.ConfiguredFeaturesAccessor"
|
||||
],
|
||||
"client": [
|
||||
"spatial.SkyRenderMixin",
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
"block.appliedenergistics2.chest": "ME箱子",
|
||||
"block.appliedenergistics2.chiseled_quartz_block": "錾制赛特斯石英块",
|
||||
"block.appliedenergistics2.chiseled_quartz_slab": "錾制赛特斯石英台阶",
|
||||
"block.appliedenergistics2.chiseled_quartz_stairs": "竖纹赛特斯石英楼梯",
|
||||
"block.appliedenergistics2.chiseled_quartz_stairs": "錾制赛特斯石英楼梯",
|
||||
"block.appliedenergistics2.condenser": "物质聚合器",
|
||||
"block.appliedenergistics2.controller": "ME控制器",
|
||||
"block.appliedenergistics2.crafting_accelerator": "并行处理单元",
|
||||
@@ -77,7 +77,7 @@
|
||||
"block.appliedenergistics2.fluid_interface": "ME流体接口",
|
||||
"block.appliedenergistics2.fluix_block": "福鲁伊克斯块",
|
||||
"block.appliedenergistics2.fluix_slab": "福鲁伊克斯台阶",
|
||||
"block.appliedenergistics2.fluix_stairs": "錾制赛特斯石英楼梯",
|
||||
"block.appliedenergistics2.fluix_stairs": "福鲁伊克斯楼梯",
|
||||
"block.appliedenergistics2.grindstone": "石英磨具",
|
||||
"block.appliedenergistics2.inscriber": "压印器",
|
||||
"block.appliedenergistics2.interface": "ME接口",
|
||||
@@ -92,11 +92,11 @@
|
||||
"block.appliedenergistics2.quartz_glass": "石英玻璃",
|
||||
"block.appliedenergistics2.quartz_growth_accelerator": "晶体催生器",
|
||||
"block.appliedenergistics2.quartz_ore": "赛特斯石英矿石",
|
||||
"block.appliedenergistics2.quartz_pillar": "赛特斯竖纹石英块",
|
||||
"block.appliedenergistics2.quartz_pillar": "竖纹赛特斯石英块",
|
||||
"block.appliedenergistics2.quartz_pillar_slab": "竖纹赛特斯石英台阶",
|
||||
"block.appliedenergistics2.quartz_pillar_stairs": "赛特斯石英楼梯",
|
||||
"block.appliedenergistics2.quartz_pillar_stairs": "竖纹赛特斯石英楼梯",
|
||||
"block.appliedenergistics2.quartz_slab": "赛特斯石英台阶",
|
||||
"block.appliedenergistics2.quartz_stairs": "福鲁伊克斯楼梯",
|
||||
"block.appliedenergistics2.quartz_stairs": "赛特斯石英楼梯",
|
||||
"block.appliedenergistics2.quartz_vibrant_glass": "聚能石英玻璃",
|
||||
"block.appliedenergistics2.security_station": "ME安全终端",
|
||||
"block.appliedenergistics2.sky_compass": "陨石罗盘",
|
||||
@@ -408,28 +408,28 @@
|
||||
"item.appliedenergistics2.annihilation_plane": "ME破坏面板",
|
||||
"item.appliedenergistics2.basic_card": "基础卡",
|
||||
"item.appliedenergistics2.biometric_card": "身份卡",
|
||||
"item.appliedenergistics2.black_covered_cable": "黑色 ME包层线缆",
|
||||
"item.appliedenergistics2.black_covered_dense_cable": "黑色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.black_glass_cable": "黑色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.black_lumen_paint_ball": "黑色 光通 染色球",
|
||||
"item.appliedenergistics2.black_paint_ball": "黑色 染色球",
|
||||
"item.appliedenergistics2.black_smart_cable": "黑色 ME智能线缆",
|
||||
"item.appliedenergistics2.black_smart_dense_cable": "黑色 ME致密线缆",
|
||||
"item.appliedenergistics2.black_covered_cable": "ME包层线缆(黑色)",
|
||||
"item.appliedenergistics2.black_covered_dense_cable": "ME致密包层线缆(黑色)",
|
||||
"item.appliedenergistics2.black_glass_cable": "ME玻璃线缆(黑色)",
|
||||
"item.appliedenergistics2.black_lumen_paint_ball": "光通染色球(黑色)",
|
||||
"item.appliedenergistics2.black_paint_ball": "染色球(黑色)",
|
||||
"item.appliedenergistics2.black_smart_cable": "ME智能线缆(黑色)",
|
||||
"item.appliedenergistics2.black_smart_dense_cable": "ME致密线缆(黑色)",
|
||||
"item.appliedenergistics2.blank_pattern": "空白样板",
|
||||
"item.appliedenergistics2.blue_covered_cable": "蓝色 ME包层线缆",
|
||||
"item.appliedenergistics2.blue_covered_dense_cable": "蓝色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.blue_glass_cable": "蓝色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.blue_lumen_paint_ball": "蓝色 光通 染色球",
|
||||
"item.appliedenergistics2.blue_paint_ball": "蓝色 染色球",
|
||||
"item.appliedenergistics2.blue_smart_cable": "蓝色 ME智能线缆",
|
||||
"item.appliedenergistics2.blue_smart_dense_cable": "蓝色 ME致密线缆",
|
||||
"item.appliedenergistics2.brown_covered_cable": "棕色 ME包层线缆",
|
||||
"item.appliedenergistics2.brown_covered_dense_cable": "棕色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.brown_glass_cable": "棕色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.brown_lumen_paint_ball": "棕色 光通 染色球",
|
||||
"item.appliedenergistics2.brown_paint_ball": "棕色 染色球",
|
||||
"item.appliedenergistics2.brown_smart_cable": "棕色 ME智能线缆",
|
||||
"item.appliedenergistics2.brown_smart_dense_cable": "棕色 ME致密线缆",
|
||||
"item.appliedenergistics2.blue_covered_cable": "ME包层线缆(蓝色)",
|
||||
"item.appliedenergistics2.blue_covered_dense_cable": "ME致密包层线缆(蓝色)",
|
||||
"item.appliedenergistics2.blue_glass_cable": "ME玻璃线缆(蓝色)",
|
||||
"item.appliedenergistics2.blue_lumen_paint_ball": "光通染色球(蓝色)",
|
||||
"item.appliedenergistics2.blue_paint_ball": "染色球(蓝色)",
|
||||
"item.appliedenergistics2.blue_smart_cable": "ME智能线缆(蓝色)",
|
||||
"item.appliedenergistics2.blue_smart_dense_cable": "ME致密线缆(蓝色)",
|
||||
"item.appliedenergistics2.brown_covered_cable": "ME包层线缆(棕色)",
|
||||
"item.appliedenergistics2.brown_covered_dense_cable": "棕色 ME致密包层线缆(棕色)",
|
||||
"item.appliedenergistics2.brown_glass_cable": "ME玻璃线缆(棕色)",
|
||||
"item.appliedenergistics2.brown_lumen_paint_ball": "光通染色球(棕色)",
|
||||
"item.appliedenergistics2.brown_paint_ball": "染色球(棕色)",
|
||||
"item.appliedenergistics2.brown_smart_cable": "ME智能线缆(棕色)",
|
||||
"item.appliedenergistics2.brown_smart_dense_cable": "ME致密线缆(棕色)",
|
||||
"item.appliedenergistics2.cable_anchor": "线缆锚",
|
||||
"item.appliedenergistics2.cable_fluid_interface": "ME流体接口",
|
||||
"item.appliedenergistics2.cable_interface": "ME接口",
|
||||
@@ -459,13 +459,13 @@
|
||||
"item.appliedenergistics2.crafting_monitor": "ME合成监控器",
|
||||
"item.appliedenergistics2.crafting_terminal": "ME合成终端",
|
||||
"item.appliedenergistics2.creative_storage_cell": "创造型ME存储元件",
|
||||
"item.appliedenergistics2.cyan_covered_cable": "青色 ME包层线缆",
|
||||
"item.appliedenergistics2.cyan_covered_dense_cable": "青色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.cyan_glass_cable": "青色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.cyan_lumen_paint_ball": "青色 光通 染色球",
|
||||
"item.appliedenergistics2.cyan_paint_ball": "青色 染色球",
|
||||
"item.appliedenergistics2.cyan_smart_cable": "青色 ME智能线缆",
|
||||
"item.appliedenergistics2.cyan_smart_dense_cable": "青色 ME致密线缆",
|
||||
"item.appliedenergistics2.cyan_covered_cable": "ME包层线缆(青色)",
|
||||
"item.appliedenergistics2.cyan_covered_dense_cable": "ME致密包层线缆(青色)",
|
||||
"item.appliedenergistics2.cyan_glass_cable": "ME玻璃线缆(青色)",
|
||||
"item.appliedenergistics2.cyan_lumen_paint_ball": "光通染色球(青色)",
|
||||
"item.appliedenergistics2.cyan_paint_ball": "染色球(青色)",
|
||||
"item.appliedenergistics2.cyan_smart_cable": "ME智能线缆(青色)",
|
||||
"item.appliedenergistics2.cyan_smart_dense_cable": "ME致密线缆(青色)",
|
||||
"item.appliedenergistics2.dark_monitor": "暗色照明面板",
|
||||
"item.appliedenergistics2.debug_card": "Dev.调试卡",
|
||||
"item.appliedenergistics2.debug_replicator_card": "Dev.复制卡",
|
||||
@@ -478,7 +478,7 @@
|
||||
"item.appliedenergistics2.entropy_manipulator": "熵变机械臂",
|
||||
"item.appliedenergistics2.export_bus": "ME输出总线",
|
||||
"item.appliedenergistics2.facade": "线缆伪装板",
|
||||
"item.appliedenergistics2.fe_p2p_tunnel": "FE P2P通道",
|
||||
"item.appliedenergistics2.fe_p2p_tunnel": "P2P通道-FE",
|
||||
"item.appliedenergistics2.flour": "面粉",
|
||||
"item.appliedenergistics2.fluid_annihilation_plane": "ME流体破坏面板",
|
||||
"item.appliedenergistics2.16k_fluid_cell_component": "16k-ME流体存储组件",
|
||||
@@ -489,43 +489,43 @@
|
||||
"item.appliedenergistics2.fluid_formation_plane": "ME流体成型面板",
|
||||
"item.appliedenergistics2.fluid_import_bus": "ME流体输入总线",
|
||||
"item.appliedenergistics2.fluid_level_emitter": "ME流体标准发信器",
|
||||
"item.appliedenergistics2.fluid_p2p_tunnel": "流体 P2P通道",
|
||||
"item.appliedenergistics2.fluid_storage_bus": "ME流体储存总线",
|
||||
"item.appliedenergistics2.fluid_p2p_tunnel": "P2P通道-流体",
|
||||
"item.appliedenergistics2.fluid_storage_bus": "ME流体存储总线",
|
||||
"item.appliedenergistics2.16k_fluid_storage_cell": "16k-ME流体储存元件",
|
||||
"item.appliedenergistics2.1k_fluid_storage_cell": "1k-ME流体储存元件",
|
||||
"item.appliedenergistics2.4k_fluid_storage_cell": "4k-ME流体储存元件",
|
||||
"item.appliedenergistics2.64k_fluid_storage_cell": "64k-ME流体储存元件",
|
||||
"item.appliedenergistics2.fluid_terminal": "ME流体终端",
|
||||
"item.appliedenergistics2.fluix_covered_cable": "Fluix默认色 ME包层线缆",
|
||||
"item.appliedenergistics2.fluix_covered_dense_cable": "Fluix默认色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.fluix_covered_cable": "ME包层线缆(Fluix默认色)",
|
||||
"item.appliedenergistics2.fluix_covered_dense_cable": "ME致密包层线缆(Fluix默认色)",
|
||||
"item.appliedenergistics2.fluix_crystal": "福鲁伊克斯水晶",
|
||||
"item.appliedenergistics2.fluix_crystal_seed": "福鲁伊克斯种子",
|
||||
"item.appliedenergistics2.fluix_dust": "福鲁伊克斯粉",
|
||||
"item.appliedenergistics2.fluix_glass_cable": "Fluix默认色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.fluix_lumen_paint_ball": "Fluix默认色 光通 染色球",
|
||||
"item.appliedenergistics2.fluix_paint_ball": "Fluix默认色 染色球",
|
||||
"item.appliedenergistics2.fluix_glass_cable": "ME玻璃线缆(Fluix默认色)",
|
||||
"item.appliedenergistics2.fluix_lumen_paint_ball": "光通染色球(Fluix默认色)",
|
||||
"item.appliedenergistics2.fluix_paint_ball": "色球(Fluix默认色)",
|
||||
"item.appliedenergistics2.fluix_pearl": "福鲁伊克斯珍珠",
|
||||
"item.appliedenergistics2.fluix_smart_cable": "Fluix默认色 ME智能线缆",
|
||||
"item.appliedenergistics2.fluix_smart_dense_cable": "Fluix默认色 ME致密线缆",
|
||||
"item.appliedenergistics2.fluix_smart_cable": "ME智能线缆(Fluix默认色)",
|
||||
"item.appliedenergistics2.fluix_smart_dense_cable": "ME致密线缆(Fluix默认色)",
|
||||
"item.appliedenergistics2.formation_core": "成型核心",
|
||||
"item.appliedenergistics2.formation_plane": "ME成型面板",
|
||||
"item.appliedenergistics2.fuzzy_card": "模糊卡",
|
||||
"item.appliedenergistics2.gold_dust": "金粉",
|
||||
"item.appliedenergistics2.gray_covered_cable": "灰色 ME包层线缆",
|
||||
"item.appliedenergistics2.gray_covered_dense_cable": "灰色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.gray_glass_cable": "灰色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.gray_lumen_paint_ball": "灰色 光通 染色球",
|
||||
"item.appliedenergistics2.gray_paint_ball": "灰色 染色球",
|
||||
"item.appliedenergistics2.gray_smart_cable": "灰色 ME智能线缆",
|
||||
"item.appliedenergistics2.gray_smart_dense_cable": "灰色 ME致密线缆",
|
||||
"item.appliedenergistics2.green_covered_cable": "绿色 ME包层线缆",
|
||||
"item.appliedenergistics2.green_covered_dense_cable": "绿色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.green_glass_cable": "绿色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.green_lumen_paint_ball": "绿色 光通 染色球",
|
||||
"item.appliedenergistics2.green_paint_ball": "绿色 染色球",
|
||||
"item.appliedenergistics2.green_smart_cable": "绿色 ME智能线缆",
|
||||
"item.appliedenergistics2.green_smart_dense_cable": "绿色 ME致密线缆",
|
||||
"item.appliedenergistics2.ic2_p2p_tunnel": "EU P2P通道",
|
||||
"item.appliedenergistics2.gray_covered_cable": "ME包层线缆(灰色)",
|
||||
"item.appliedenergistics2.gray_covered_dense_cable": "ME致密包层线缆(灰色)",
|
||||
"item.appliedenergistics2.gray_glass_cable": "ME玻璃线缆(灰色)",
|
||||
"item.appliedenergistics2.gray_lumen_paint_ball": "光通染色球(灰色)",
|
||||
"item.appliedenergistics2.gray_paint_ball": "染色球(灰色)",
|
||||
"item.appliedenergistics2.gray_smart_cable": "ME智能线缆(灰色)",
|
||||
"item.appliedenergistics2.gray_smart_dense_cable": "ME致密线缆(灰色)",
|
||||
"item.appliedenergistics2.green_covered_cable": "ME包层线缆(绿色)",
|
||||
"item.appliedenergistics2.green_covered_dense_cable": "ME致密包层线缆(绿色)",
|
||||
"item.appliedenergistics2.green_glass_cable": "ME玻璃线缆(绿色)",
|
||||
"item.appliedenergistics2.green_lumen_paint_ball": "光通染色球(绿色)",
|
||||
"item.appliedenergistics2.green_paint_ball": "染色球(绿色)",
|
||||
"item.appliedenergistics2.green_smart_cable": "ME智能线缆(绿色)",
|
||||
"item.appliedenergistics2.green_smart_dense_cable": "ME致密线缆(绿色)",
|
||||
"item.appliedenergistics2.ic2_p2p_tunnel": "P2P通道-EU",
|
||||
"item.appliedenergistics2.identity_annihilation_plane": "ME精准破坏面板",
|
||||
"item.appliedenergistics2.import_bus": "ME输入总线",
|
||||
"item.appliedenergistics2.interface_terminal": "ME接口终端",
|
||||
@@ -533,44 +533,44 @@
|
||||
"item.appliedenergistics2.inverted_toggle_bus": "ME反相触发总线",
|
||||
"item.appliedenergistics2.inverter_card": "反相卡",
|
||||
"item.appliedenergistics2.iron_dust": "铁粉",
|
||||
"item.appliedenergistics2.item_p2p_tunnel": "物品 P2P通道",
|
||||
"item.appliedenergistics2.item_p2p_tunnel": "P2P通道-物品",
|
||||
"item.appliedenergistics2.level_emitter": "ME标准发信器",
|
||||
"item.appliedenergistics2.light_blue_covered_cable": "浅蓝色 ME包层线缆",
|
||||
"item.appliedenergistics2.light_blue_covered_dense_cable": "浅蓝色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.light_blue_glass_cable": "浅蓝色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.light_blue_lumen_paint_ball": "浅蓝色 光通 染色球",
|
||||
"item.appliedenergistics2.light_blue_paint_ball": "浅蓝色 染色球",
|
||||
"item.appliedenergistics2.light_blue_smart_cable": "浅蓝色 ME智能线缆",
|
||||
"item.appliedenergistics2.light_blue_smart_dense_cable": "浅蓝色 ME致密线缆",
|
||||
"item.appliedenergistics2.light_gray_covered_cable": "浅灰色 ME包层线缆",
|
||||
"item.appliedenergistics2.light_gray_covered_dense_cable": "浅灰色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.light_gray_glass_cable": "浅灰色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.light_gray_lumen_paint_ball": "浅灰色 光通 染色球",
|
||||
"item.appliedenergistics2.light_gray_paint_ball": "浅灰色 染色球",
|
||||
"item.appliedenergistics2.light_gray_smart_cable": "浅灰色 ME智能线缆",
|
||||
"item.appliedenergistics2.light_gray_smart_dense_cable": "浅灰色 ME致密线缆",
|
||||
"item.appliedenergistics2.light_p2p_tunnel": "光 P2P通道",
|
||||
"item.appliedenergistics2.lime_covered_cable": "柠檬色 ME包层线缆",
|
||||
"item.appliedenergistics2.lime_covered_dense_cable": "柠檬色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.lime_glass_cable": "柠檬色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.lime_lumen_paint_ball": "柠檬色 光通 染色球",
|
||||
"item.appliedenergistics2.lime_paint_ball": "柠檬色 染色球",
|
||||
"item.appliedenergistics2.lime_smart_cable": "柠檬色 ME智能线缆",
|
||||
"item.appliedenergistics2.lime_smart_dense_cable": "柠檬色 ME致密线缆",
|
||||
"item.appliedenergistics2.light_blue_covered_cable": "ME包层线缆(浅蓝色)",
|
||||
"item.appliedenergistics2.light_blue_covered_dense_cable": "ME致密包层线缆(浅蓝色)",
|
||||
"item.appliedenergistics2.light_blue_glass_cable": "ME玻璃线缆(浅蓝色)",
|
||||
"item.appliedenergistics2.light_blue_lumen_paint_ball": "光通染色球(浅蓝色)",
|
||||
"item.appliedenergistics2.light_blue_paint_ball": "染色球(浅蓝色)",
|
||||
"item.appliedenergistics2.light_blue_smart_cable": "ME智能线缆(浅蓝色)",
|
||||
"item.appliedenergistics2.light_blue_smart_dense_cable": "ME致密线缆(浅蓝色)",
|
||||
"item.appliedenergistics2.light_gray_covered_cable": "ME包层线缆(浅灰色)",
|
||||
"item.appliedenergistics2.light_gray_covered_dense_cable": "ME致密包层线缆(浅灰色)",
|
||||
"item.appliedenergistics2.light_gray_glass_cable": "ME玻璃线缆(浅灰色)",
|
||||
"item.appliedenergistics2.light_gray_lumen_paint_ball": "光通染色球(浅灰色)",
|
||||
"item.appliedenergistics2.light_gray_paint_ball": "染色球(浅灰色)",
|
||||
"item.appliedenergistics2.light_gray_smart_cable": "ME智能线缆(浅灰色)",
|
||||
"item.appliedenergistics2.light_gray_smart_dense_cable": "ME致密线缆(浅灰色)",
|
||||
"item.appliedenergistics2.light_p2p_tunnel": "P2P通道-光",
|
||||
"item.appliedenergistics2.lime_covered_cable": "ME包层线缆(柠檬色)",
|
||||
"item.appliedenergistics2.lime_covered_dense_cable": "ME致密包层线缆(柠檬色)",
|
||||
"item.appliedenergistics2.lime_glass_cable": "ME玻璃线缆(柠檬色)",
|
||||
"item.appliedenergistics2.lime_lumen_paint_ball": "光通染色球(柠檬色)",
|
||||
"item.appliedenergistics2.lime_paint_ball": "染色球(柠檬色)",
|
||||
"item.appliedenergistics2.lime_smart_cable": "ME智能线缆(柠檬色)",
|
||||
"item.appliedenergistics2.lime_smart_dense_cable": "ME致密线缆(柠檬色)",
|
||||
"item.appliedenergistics2.logic_processor": "逻辑处理器",
|
||||
"item.appliedenergistics2.logic_processor_asm": "半成品-逻辑处理器",
|
||||
"item.appliedenergistics2.logic_processor_press": "逻辑压印模板",
|
||||
"item.appliedenergistics2.printed_logic_processor": "逻辑电路板",
|
||||
"item.appliedenergistics2.magenta_covered_cable": "品红色 ME包层线缆",
|
||||
"item.appliedenergistics2.magenta_covered_dense_cable": "品红色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.magenta_glass_cable": "品红色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.magenta_lumen_paint_ball": "品红色 光通 染色球",
|
||||
"item.appliedenergistics2.magenta_paint_ball": "品红色 染色球",
|
||||
"item.appliedenergistics2.magenta_smart_cable": "品红色 ME智能线缆",
|
||||
"item.appliedenergistics2.magenta_smart_dense_cable": "品红色 ME致密线缆",
|
||||
"item.appliedenergistics2.magenta_covered_cable": "ME包层线缆(品红色)",
|
||||
"item.appliedenergistics2.magenta_covered_dense_cable": "ME致密包层线缆(品红色)",
|
||||
"item.appliedenergistics2.magenta_glass_cable": "ME玻璃线缆(品红色)",
|
||||
"item.appliedenergistics2.magenta_lumen_paint_ball": "光通染色球(品红色)",
|
||||
"item.appliedenergistics2.magenta_paint_ball": "染色球(品红色)",
|
||||
"item.appliedenergistics2.magenta_smart_cable": "ME智能线缆(品红色)",
|
||||
"item.appliedenergistics2.magenta_smart_dense_cable": "ME致密线缆(品红色)",
|
||||
"item.appliedenergistics2.matter_ball": "物质球",
|
||||
"item.appliedenergistics2.matter_cannon": "物质炮",
|
||||
"item.appliedenergistics2.me_p2p_tunnel": "ME P2P通道",
|
||||
"item.appliedenergistics2.me_p2p_tunnel": "P2P通道-ME",
|
||||
"item.appliedenergistics2.memory_card": "内存卡",
|
||||
"item.appliedenergistics2.monitor": "亮色照明面板",
|
||||
"item.appliedenergistics2.name_press": "名称压印模板",
|
||||
@@ -584,43 +584,43 @@
|
||||
"item.appliedenergistics2.nether_quartz_sword": "下界石英剑",
|
||||
"item.appliedenergistics2.nether_quartz_wrench": "下界石英扳手",
|
||||
"item.appliedenergistics2.network_tool": "网络工具",
|
||||
"item.appliedenergistics2.orange_covered_cable": "橙色 ME包层线缆",
|
||||
"item.appliedenergistics2.orange_covered_dense_cable": "橙色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.orange_glass_cable": "橙色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.orange_lumen_paint_ball": "橙色 光通 染色球",
|
||||
"item.appliedenergistics2.orange_paint_ball": "橙色 染色球",
|
||||
"item.appliedenergistics2.orange_smart_cable": "橙色 ME智能线缆",
|
||||
"item.appliedenergistics2.orange_smart_dense_cable": "橙色 ME致密线缆",
|
||||
"item.appliedenergistics2.orange_covered_cable": "ME包层线缆(橙色)",
|
||||
"item.appliedenergistics2.orange_covered_dense_cable": "ME致密包层线缆(橙色)",
|
||||
"item.appliedenergistics2.orange_glass_cable": "ME玻璃线缆(橙色)",
|
||||
"item.appliedenergistics2.orange_lumen_paint_ball": "光通染色球(橙色)",
|
||||
"item.appliedenergistics2.orange_paint_ball": "染色球(橙色)",
|
||||
"item.appliedenergistics2.orange_smart_cable": "ME智能线缆(橙色)",
|
||||
"item.appliedenergistics2.orange_smart_dense_cable": "ME致密线缆(橙色)",
|
||||
"item.appliedenergistics2.pattern_terminal": "ME样板终端",
|
||||
"item.appliedenergistics2.pink_covered_cable": "粉色 ME包层线缆",
|
||||
"item.appliedenergistics2.pink_covered_dense_cable": "粉色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.pink_glass_cable": "粉色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.pink_lumen_paint_ball": "粉色 光通 染色球",
|
||||
"item.appliedenergistics2.pink_paint_ball": "粉色 染色球",
|
||||
"item.appliedenergistics2.pink_smart_cable": "粉色 ME智能线缆",
|
||||
"item.appliedenergistics2.pink_smart_dense_cable": "粉色 ME致密线缆",
|
||||
"item.appliedenergistics2.pink_covered_cable": "ME包层线缆(粉色)",
|
||||
"item.appliedenergistics2.pink_covered_dense_cable": "ME致密包层线缆(粉色)",
|
||||
"item.appliedenergistics2.pink_glass_cable": "ME玻璃线缆(粉色)",
|
||||
"item.appliedenergistics2.pink_lumen_paint_ball": "光通染色球(粉色)",
|
||||
"item.appliedenergistics2.pink_paint_ball": "染色球(粉色)",
|
||||
"item.appliedenergistics2.pink_smart_cable": "ME智能线缆(粉色)",
|
||||
"item.appliedenergistics2.pink_smart_dense_cable": "ME致密线缆(粉色)",
|
||||
"item.appliedenergistics2.portable_cell": "便携元件",
|
||||
"item.appliedenergistics2.purified_certus_quartz_crystal": "高纯赛特斯石英水晶",
|
||||
"item.appliedenergistics2.purified_fluix_crystal": "高纯福鲁伊克斯水晶",
|
||||
"item.appliedenergistics2.purified_nether_quartz_crystal": "高纯下界石英水晶",
|
||||
"item.appliedenergistics2.purple_covered_cable": "紫色 ME包层线缆",
|
||||
"item.appliedenergistics2.purple_covered_dense_cable": "紫色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.purple_glass_cable": "紫色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.purple_lumen_paint_ball": "紫色 光通 染色球",
|
||||
"item.appliedenergistics2.purple_paint_ball": "紫色 染色球",
|
||||
"item.appliedenergistics2.purple_smart_cable": "紫色 ME智能线缆",
|
||||
"item.appliedenergistics2.purple_smart_dense_cable": "紫色 ME致密线缆",
|
||||
"item.appliedenergistics2.purple_covered_cable": "ME包层线缆(紫色)",
|
||||
"item.appliedenergistics2.purple_covered_dense_cable": "ME致密包层线缆(紫色)",
|
||||
"item.appliedenergistics2.purple_glass_cable": "ME玻璃线缆(紫色)",
|
||||
"item.appliedenergistics2.purple_lumen_paint_ball": "光通染色球(紫色)",
|
||||
"item.appliedenergistics2.purple_paint_ball": "染色球(紫色)",
|
||||
"item.appliedenergistics2.purple_smart_cable": "ME智能线缆(紫色)",
|
||||
"item.appliedenergistics2.purple_smart_dense_cable": "ME致密线缆(紫色)",
|
||||
"item.appliedenergistics2.quantum_entangled_singularity": "量子缠绕态奇点",
|
||||
"item.appliedenergistics2.quartz_fiber": "石英纤维",
|
||||
"item.appliedenergistics2.red_covered_cable": "红色 ME包层线缆",
|
||||
"item.appliedenergistics2.red_covered_dense_cable": "红色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.red_glass_cable": "红色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.red_lumen_paint_ball": "红色 光通 染色球",
|
||||
"item.appliedenergistics2.red_paint_ball": "红色 染色球",
|
||||
"item.appliedenergistics2.red_smart_cable": "红色 ME智能线缆",
|
||||
"item.appliedenergistics2.red_smart_dense_cable": "红色 ME致密线缆",
|
||||
"item.appliedenergistics2.red_covered_cable": "ME包层线缆(红色)",
|
||||
"item.appliedenergistics2.red_covered_dense_cable": "ME致密包层线缆(红色)",
|
||||
"item.appliedenergistics2.red_glass_cable": "ME玻璃线缆(红色)",
|
||||
"item.appliedenergistics2.red_lumen_paint_ball": "光通染色球(红色)",
|
||||
"item.appliedenergistics2.red_paint_ball": "染色球(红色)",
|
||||
"item.appliedenergistics2.red_smart_cable": "ME智能线缆(红色)",
|
||||
"item.appliedenergistics2.red_smart_dense_cable": "ME致密线缆(红色)",
|
||||
"item.appliedenergistics2.redstone_card": "红石卡",
|
||||
"item.appliedenergistics2.redstone_p2p_tunnel": "红石 P2P通道",
|
||||
"item.appliedenergistics2.redstone_p2p_tunnel": "P2P通道-红石",
|
||||
"item.appliedenergistics2.semi_dark_monitor": "照明面板",
|
||||
"item.appliedenergistics2.silicon": "硅",
|
||||
"item.appliedenergistics2.silicon_press": "硅压印模板",
|
||||
@@ -643,24 +643,24 @@
|
||||
"item.appliedenergistics2.terminal": "ME终端",
|
||||
"item.appliedenergistics2.toggle_bus": "ME触发总线",
|
||||
"item.appliedenergistics2.view_cell": "显示元件",
|
||||
"item.appliedenergistics2.white_covered_cable": "白色 ME包层线缆",
|
||||
"item.appliedenergistics2.white_covered_dense_cable": "白色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.white_glass_cable": "白色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.white_lumen_paint_ball": "白色 光通 染色球",
|
||||
"item.appliedenergistics2.white_paint_ball": "白色 染色球",
|
||||
"item.appliedenergistics2.white_smart_cable": "白色 ME智能线缆",
|
||||
"item.appliedenergistics2.white_smart_dense_cable": "白色 ME致密线缆",
|
||||
"item.appliedenergistics2.white_covered_cable": "ME包层线缆(白色)",
|
||||
"item.appliedenergistics2.white_covered_dense_cable": "ME致密包层线缆(白色)",
|
||||
"item.appliedenergistics2.white_glass_cable": "ME玻璃线缆(白色)",
|
||||
"item.appliedenergistics2.white_lumen_paint_ball": "光通染色球(白色)",
|
||||
"item.appliedenergistics2.white_paint_ball": "染色球(白色)",
|
||||
"item.appliedenergistics2.white_smart_cable": "ME智能线缆(白色)",
|
||||
"item.appliedenergistics2.white_smart_dense_cable": "ME致密线缆(白色)",
|
||||
"item.appliedenergistics2.wireless_booster": "无线信号增幅器",
|
||||
"item.appliedenergistics2.wireless_receiver": "无线接收器",
|
||||
"item.appliedenergistics2.wireless_terminal": "无线终端",
|
||||
"item.appliedenergistics2.wooden_gear": "木齿轮",
|
||||
"item.appliedenergistics2.yellow_covered_cable": "黄色 ME包层线缆",
|
||||
"item.appliedenergistics2.yellow_covered_dense_cable": "黄色 ME致密包层线缆",
|
||||
"item.appliedenergistics2.yellow_glass_cable": "黄色 ME玻璃线缆",
|
||||
"item.appliedenergistics2.yellow_lumen_paint_ball": "黄色 光通 染色球",
|
||||
"item.appliedenergistics2.yellow_paint_ball": "黄色 染色球",
|
||||
"item.appliedenergistics2.yellow_smart_cable": "黄色 ME智能线缆",
|
||||
"item.appliedenergistics2.yellow_smart_dense_cable": "黄色 ME致密线缆",
|
||||
"item.appliedenergistics2.yellow_covered_cable": "ME包层线缆(黄色)",
|
||||
"item.appliedenergistics2.yellow_covered_dense_cable": "ME致密包层线缆(黄色)",
|
||||
"item.appliedenergistics2.yellow_glass_cable": "ME玻璃线缆(黄色)",
|
||||
"item.appliedenergistics2.yellow_lumen_paint_ball": "光通染色球(黄色)",
|
||||
"item.appliedenergistics2.yellow_paint_ball": "染色球(黄色)",
|
||||
"item.appliedenergistics2.yellow_smart_cable": "ME智能线缆(黄色)",
|
||||
"item.appliedenergistics2.yellow_smart_dense_cable": "ME致密线缆(黄色)",
|
||||
"itemGroup.appliedenergistics2": "应用能源2",
|
||||
"itemGroup.appliedenergistics2.facades": "应用能源2-伪装板",
|
||||
"key.appliedenergistics2.category": "Applied Energistics 2",
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"type": "appliedenergistics2:spatial_storage",
|
||||
"generator": {
|
||||
"type": "appliedenergistics2:spatial_storage"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user