Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b6b108a287 | |||
| ab4ef429db | |||
| 86473e022e | |||
| fd89f569d0 | |||
| eefc765823 | |||
| ebccb2516b | |||
| 8c62a40da9 | |||
| d56af5c38f | |||
| 39b1ec61ba | |||
| cb613cf7df | |||
| 28e33b4c36 | |||
| 855e6b8180 | |||
| d62161f529 | |||
| 71d48411f1 | |||
| 731842e09c | |||
| 61169f87c0 | |||
| 9fb3b196d2 | |||
| 867b875cf9 | |||
| 3875c8c4ce | |||
| 89b959d3f5 | |||
| d62e50d6f4 | |||
| 16836a2b49 | |||
| f5651f26a5 | |||
| 82ff59c857 | |||
| 8af61041f0 | |||
| 2a9136b56f | |||
| 64da6c811d | |||
| e6b93e0d92 | |||
| f874219a64 | |||
| b4822740f4 | |||
| af205a50b4 | |||
| 2f6eaf79bd | |||
| 625f1e700f | |||
| 897d5b0b11 | |||
| 95641e2f4e | |||
| cd856b86c7 | |||
| c00aa6d627 | |||
| 398a3fb0bc | |||
| e0fa638ad9 | |||
| 4e42cbd4ce | |||
| b6c6be77cd | |||
| 0964293a72 | |||
| c8b6141ce0 | |||
| 948540369f | |||
| 363df0ad6f | |||
| 2a37bec8ff | |||
| f0f864d824 | |||
| 5abbff42d8 | |||
| 53e2c4f806 | |||
| cb4c32e0a9 | |||
| c620086ed1 | |||
| 513cecf318 | |||
| 749921b436 | |||
| 0d565895e2 | |||
| 2c6849a0fd | |||
| 4d53ec5b64 | |||
| 4467af4798 | |||
| d3f953686a | |||
| 67901d82c5 | |||
| 013fbf638a |
+1
-1
@@ -30,7 +30,7 @@ build:
|
|||||||
stage: build
|
stage: build
|
||||||
parallel:
|
parallel:
|
||||||
matrix:
|
matrix:
|
||||||
- MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1", "1.20.2", "1.20.4", "1.20.6", "1.21"]
|
- MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1", "1.20.2", "1.20.4", "1.20.6", "1.21.1"]
|
||||||
script:
|
script:
|
||||||
# this both runs the unit tests and assembles the code
|
# this both runs the unit tests and assembles the code
|
||||||
- ./gradlew clean -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
|
- ./gradlew clean -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
|
||||||
|
|||||||
+85
@@ -0,0 +1,85 @@
|
|||||||
|
package com.seibel.distanthorizons.common.commonMixins;
|
||||||
|
|
||||||
|
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
||||||
|
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
|
||||||
|
import com.seibel.distanthorizons.core.api.internal.ServerApi;
|
||||||
|
import com.seibel.distanthorizons.core.api.internal.SharedApi;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
public class MixinChunkMapCommon
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void onChunkSave(ServerLevel level, ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
|
||||||
|
{
|
||||||
|
// is this position already being updated?
|
||||||
|
if (SharedApi.isChunkAtChunkPosAlreadyUpdating(chunk.getPos().x, chunk.getPos().z))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// is this chunk being saved to disk?
|
||||||
|
boolean savingChunkToDisk = ci.getReturnValue();
|
||||||
|
// true means a chunk was saved to disk
|
||||||
|
if (!savingChunkToDisk)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO are the following validations necessary since we are checking above if
|
||||||
|
// the callback return value should state if the chunk was actually saved or not?
|
||||||
|
// Do we trust it to always be correct?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// corrupt/incomplete chunk validation //
|
||||||
|
|
||||||
|
// MC has a tendency to try saving incomplete or corrupted chunks (which show up as empty or black chunks)
|
||||||
|
// this logic should prevent that from happening
|
||||||
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
|
if (chunk.isUnsaved() || chunk.getUpgradeData() != null || !chunk.isLightCorrect())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (chunk.isUnsaved() || chunk.isUpgrading() || !chunk.isLightCorrect())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// biome validation //
|
||||||
|
|
||||||
|
// some chunks may be missing their biomes, which cause issues when attempting to save them
|
||||||
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
|
if (chunk.getBiomes() == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// this will throw an exception if the biomes aren't set up
|
||||||
|
chunk.getNoiseBiome(0,0,0);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// submit the update event
|
||||||
|
ServerApi.INSTANCE.serverChunkSaveEvent(
|
||||||
|
new ChunkWrapper(chunk, level, ServerLevelWrapper.getWrapper(level)),
|
||||||
|
ServerLevelWrapper.getWrapper(level)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+5
-38
@@ -20,11 +20,9 @@
|
|||||||
package com.seibel.distanthorizons.common.wrappers;
|
package com.seibel.distanthorizons.common.wrappers;
|
||||||
|
|
||||||
import java.nio.FloatBuffer;
|
import java.nio.FloatBuffer;
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import com.seibel.distanthorizons.core.enums.EDhDirection;
|
import com.seibel.distanthorizons.core.enums.EDhDirection;
|
||||||
import com.seibel.distanthorizons.core.pos.DhBlockPos;
|
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
|
||||||
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
||||||
import com.seibel.distanthorizons.core.util.math.Mat4f;
|
import com.seibel.distanthorizons.core.util.math.Mat4f;
|
||||||
|
|
||||||
@@ -137,41 +135,10 @@ public class McObjectConverter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BlockPos Convert(DhBlockPos wrappedPos)
|
public static BlockPos Convert(DhBlockPos wrappedPos) { return new BlockPos(wrappedPos.getX(), wrappedPos.getY(), wrappedPos.getZ()); }
|
||||||
{
|
public static ChunkPos Convert(DhChunkPos wrappedPos) { return new ChunkPos(wrappedPos.getX(), wrappedPos.getZ()); }
|
||||||
return new BlockPos(wrappedPos.x, wrappedPos.y, wrappedPos.z);
|
|
||||||
}
|
|
||||||
public static ChunkPos Convert(DhChunkPos wrappedPos)
|
|
||||||
{
|
|
||||||
return new ChunkPos(wrappedPos.x, wrappedPos.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Direction Convert(EDhDirection lodDirection)
|
public static Direction Convert(EDhDirection lodDirection) { return directions[lodDirection.ordinal()]; }
|
||||||
{
|
public static EDhDirection Convert(Direction direction) { return lodDirections[direction.ordinal()]; }
|
||||||
return directions[lodDirection.ordinal()];
|
|
||||||
}
|
|
||||||
public static EDhDirection Convert(Direction direction)
|
|
||||||
{
|
|
||||||
return lodDirections[direction.ordinal()];
|
|
||||||
}
|
|
||||||
public static void DebugCheckAllPackers()
|
|
||||||
{
|
|
||||||
BiConsumer<Integer, Integer> func = (x, z) -> DhChunkPos._DebugCheckPacker(x, z, ChunkPos.asLong(x, z));
|
|
||||||
func.accept(0, 0);
|
|
||||||
func.accept(12345, 134);
|
|
||||||
func.accept(-12345, -134);
|
|
||||||
func.accept(-30000000 / 16, 30000000 / 16);
|
|
||||||
func.accept(30000000 / 16, -30000000 / 16);
|
|
||||||
func.accept(30000000 / 16, 30000000 / 16);
|
|
||||||
func.accept(-30000000 / 16, -30000000 / 16);
|
|
||||||
Consumer<BlockPos> func2 = (p) -> DhBlockPos._DebugCheckPacker(p.getX(), p.getY(), p.getZ(), p.asLong());
|
|
||||||
func2.accept(new BlockPos(0, 0, 0));
|
|
||||||
func2.accept(new BlockPos(12345, 134, 123));
|
|
||||||
func2.accept(new BlockPos(-12345, -134, -80));
|
|
||||||
func2.accept(new BlockPos(-30000000, 2047, 30000000));
|
|
||||||
func2.accept(new BlockPos(30000000, -2048, -30000000));
|
|
||||||
func2.accept(new BlockPos(30000000, 2047, 30000000));
|
|
||||||
func2.accept(new BlockPos(-30000000, -2048, -30000000));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-33
@@ -155,7 +155,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MC_VER <= MC_1_21
|
//#if MC_VER <= MC_1_XX_X
|
||||||
else if (objectArray.length == 2)
|
else if (objectArray.length == 2)
|
||||||
{
|
{
|
||||||
// correct number of parameters from the API
|
// correct number of parameters from the API
|
||||||
@@ -201,16 +201,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
{
|
{
|
||||||
throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
|
throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
|
||||||
}
|
}
|
||||||
#else
|
//#endif
|
||||||
// Intentional compiler error to bring attention to the missing wrapper function.
|
|
||||||
// If you need to work on an unimplemented version but don't have the ability to implement this yet
|
|
||||||
// you can comment it out, but please don't commit it. Someone will have to implement it.
|
|
||||||
|
|
||||||
// After implementing the new version please read this method's javadocs for instructions
|
|
||||||
// on what other locations also need to be updated, the DhAPI specifically needs to
|
|
||||||
// be updated to state which objects this method accepts.
|
|
||||||
not implemented for this version of Minecraft!
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Note: when this is updated for different MC versions,
|
* Note: when this is updated for different MC versions,
|
||||||
@@ -220,16 +211,13 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
{
|
{
|
||||||
String[] expectedClassNames;
|
String[] expectedClassNames;
|
||||||
|
|
||||||
#if MC_VER <= MC_1_21
|
//#if MC_VER <= MC_1_XX_X
|
||||||
expectedClassNames = new String[]
|
expectedClassNames = new String[]
|
||||||
{
|
{
|
||||||
ChunkAccess.class.getName(),
|
ChunkAccess.class.getName(),
|
||||||
ServerLevel.class.getName() + "] or [" + ClientLevel.class.getName()
|
ServerLevel.class.getName() + "] or [" + ClientLevel.class.getName()
|
||||||
};
|
};
|
||||||
#else
|
//#endif
|
||||||
// See preprocessor comment in createChunkWrapper() for full documentation
|
|
||||||
not implemented for this version of Minecraft!
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return createWrapperErrorMessage("Chunk wrapper", expectedClassNames, objectArray);
|
return createWrapperErrorMessage("Chunk wrapper", expectedClassNames, objectArray);
|
||||||
}
|
}
|
||||||
@@ -268,7 +256,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
Biome biome = (Biome) objectArray[0];
|
Biome biome = (Biome) objectArray[0];
|
||||||
return BiomeWrapper.getBiomeWrapper(biome, coreLevelWrapper);
|
return BiomeWrapper.getBiomeWrapper(biome, coreLevelWrapper);
|
||||||
#elif MC_VER <= MC_1_21
|
#else
|
||||||
if (!(objectArray[0] instanceof Holder) || !(((Holder<?>) objectArray[0]).value() instanceof Biome))
|
if (!(objectArray[0] instanceof Holder) || !(((Holder<?>) objectArray[0]).value() instanceof Biome))
|
||||||
{
|
{
|
||||||
throw new ClassCastException(createBiomeWrapperErrorMessage(objectArray));
|
throw new ClassCastException(createBiomeWrapperErrorMessage(objectArray));
|
||||||
@@ -276,9 +264,6 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
Holder<Biome> biomeHolder = (Holder<Biome>) objectArray[0];
|
Holder<Biome> biomeHolder = (Holder<Biome>) objectArray[0];
|
||||||
return BiomeWrapper.getBiomeWrapper(biomeHolder, coreLevelWrapper);
|
return BiomeWrapper.getBiomeWrapper(biomeHolder, coreLevelWrapper);
|
||||||
#else
|
|
||||||
// See preprocessor comment in createChunkWrapper() for full documentation (not a typo, check createChunkWrapper()'s else statement for full documentation)
|
|
||||||
not implemented for this version of Minecraft!
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -291,11 +276,8 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
#if MC_VER < MC_1_18_2
|
#if MC_VER < MC_1_18_2
|
||||||
expectedClassNames = new String[] { Biome.class.getName() };
|
expectedClassNames = new String[] { Biome.class.getName() };
|
||||||
#elif MC_VER <= MC_1_21
|
|
||||||
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
|
|
||||||
#else
|
#else
|
||||||
// See preprocessor comment in createChunkWrapper() for full documentation
|
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
|
||||||
not implemented for this version of Minecraft!
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return createWrapperErrorMessage("Biome wrapper", expectedClassNames, objectArray);
|
return createWrapperErrorMessage("Biome wrapper", expectedClassNames, objectArray);
|
||||||
@@ -312,7 +294,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if MC_VER <= MC_1_21
|
//#if MC_VER <= MC_1_XX_X
|
||||||
if (objectArray.length != 1)
|
if (objectArray.length != 1)
|
||||||
{
|
{
|
||||||
throw new ClassCastException(createBlockStateWrapperErrorMessage(objectArray));
|
throw new ClassCastException(createBlockStateWrapperErrorMessage(objectArray));
|
||||||
@@ -324,10 +306,7 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
BlockState blockState = (BlockState) objectArray[0];
|
BlockState blockState = (BlockState) objectArray[0];
|
||||||
return BlockStateWrapper.fromBlockState(blockState, coreLevelWrapper);
|
return BlockStateWrapper.fromBlockState(blockState, coreLevelWrapper);
|
||||||
#else
|
//#endif
|
||||||
// See preprocessor comment in createChunkWrapper() for full documentation (not a typo, check createChunkWrapper()'s else statement for full documentation)
|
|
||||||
not implemented for this version of Minecraft!
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Note: when this is updated for different MC versions,
|
* Note: when this is updated for different MC versions,
|
||||||
@@ -339,11 +318,8 @@ public class WrapperFactory implements IWrapperFactory
|
|||||||
|
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
||||||
expectedClassNames = new String[] { Biome.class.getName() };
|
expectedClassNames = new String[] { Biome.class.getName() };
|
||||||
#elif MC_VER <= MC_1_21
|
|
||||||
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
|
|
||||||
#else
|
#else
|
||||||
// See preprocessor comment in createChunkWrapper() for full documentation
|
expectedClassNames = new String[] { Holder.class.getName()+"<"+Biome.class.getName()+">" };
|
||||||
not implemented for this version of Minecraft!
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return createWrapperErrorMessage("BlockState wrapper", expectedClassNames, objectArray);
|
return createWrapperErrorMessage("BlockState wrapper", expectedClassNames, objectArray);
|
||||||
|
|||||||
+1
-1
@@ -293,7 +293,7 @@ public class BiomeWrapper implements IBiomeWrapper
|
|||||||
ResourceLocation resourceLocation;
|
ResourceLocation resourceLocation;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
|
resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
|
||||||
#else
|
#else
|
||||||
resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
|
resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
|
||||||
|
|||||||
+30
-4
@@ -30,6 +30,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrappe
|
|||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.tags.BlockTags;
|
import net.minecraft.tags.BlockTags;
|
||||||
|
import net.minecraft.world.level.block.BeaconBeamBlock;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.SoundType;
|
import net.minecraft.world.level.block.SoundType;
|
||||||
@@ -103,7 +104,8 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
|
|
||||||
private final boolean isBeaconBlock;
|
private final boolean isBeaconBlock;
|
||||||
private final boolean isBeaconBaseBlock;
|
private final boolean isBeaconBaseBlock;
|
||||||
private final boolean isGlassBlock;
|
/** null if this block can't tint beacons */
|
||||||
|
private final Color beaconTintColor;
|
||||||
private final Color mapColor;
|
private final Color mapColor;
|
||||||
|
|
||||||
|
|
||||||
@@ -139,6 +141,7 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
this.hashCode = Objects.hash(this.serialString);
|
this.hashCode = Objects.hash(this.serialString);
|
||||||
this.blockMaterialId = this.calculateEDhApiBlockMaterialId().index;
|
this.blockMaterialId = this.calculateEDhApiBlockMaterialId().index;
|
||||||
|
|
||||||
|
// beacon blocks
|
||||||
String lowercaseSerial = this.serialString.toLowerCase();
|
String lowercaseSerial = this.serialString.toLowerCase();
|
||||||
boolean isBeaconBaseBlock = false;
|
boolean isBeaconBaseBlock = false;
|
||||||
for (int i = 0; i < LodUtil.BEACON_BASE_BLOCK_NAME_LIST.size(); i++)
|
for (int i = 0; i < LodUtil.BEACON_BASE_BLOCK_NAME_LIST.size(); i++)
|
||||||
@@ -152,7 +155,28 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
}
|
}
|
||||||
this.isBeaconBaseBlock = isBeaconBaseBlock;
|
this.isBeaconBaseBlock = isBeaconBaseBlock;
|
||||||
this.isBeaconBlock = lowercaseSerial.contains("minecraft:beacon");
|
this.isBeaconBlock = lowercaseSerial.contains("minecraft:beacon");
|
||||||
this.isGlassBlock = lowercaseSerial.contains("glass");
|
|
||||||
|
// beacon tint color
|
||||||
|
Color beaconTintColor = null;
|
||||||
|
if (this.blockState != null
|
||||||
|
// beacon blocks also show up here, but since they block the beacon beam we don't want their color
|
||||||
|
&& !this.isBeaconBlock)
|
||||||
|
{
|
||||||
|
Block block = this.blockState.getBlock();
|
||||||
|
if (block instanceof BeaconBeamBlock)
|
||||||
|
{
|
||||||
|
int colorInt;
|
||||||
|
#if MC_VER <= MC_1_19_4
|
||||||
|
colorInt = ((BeaconBeamBlock) block).getColor().getMaterialColor().col;
|
||||||
|
#else
|
||||||
|
colorInt = ((BeaconBeamBlock) block).getColor().getMapColor().col;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
beaconTintColor = ColorUtil.toColorObjRGB(colorInt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.beaconTintColor = beaconTintColor;
|
||||||
|
|
||||||
|
|
||||||
int mcColor = 0;
|
int mcColor = 0;
|
||||||
if (this.blockState != null)
|
if (this.blockState != null)
|
||||||
@@ -399,10 +423,12 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
@Override
|
@Override
|
||||||
public boolean isBeaconBaseBlock() { return this.isBeaconBaseBlock; }
|
public boolean isBeaconBaseBlock() { return this.isBeaconBaseBlock; }
|
||||||
@Override
|
@Override
|
||||||
public boolean isGlassBlock() { return this.isGlassBlock; }
|
public boolean isBeaconTintBlock() { return this.beaconTintColor != null; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Color getMapColor() { return this.mapColor; }
|
public Color getMapColor() { return this.mapColor; }
|
||||||
|
@Override
|
||||||
|
public Color getBeaconTintColor() { return this.beaconTintColor; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte getMaterialId() { return this.blockMaterialId; }
|
public byte getMaterialId() { return this.blockMaterialId; }
|
||||||
@@ -498,7 +524,7 @@ public class BlockStateWrapper implements IBlockStateWrapper
|
|||||||
ResourceLocation resourceLocation;
|
ResourceLocation resourceLocation;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
resourceLocation = new ResourceLocation(resourceStateString.substring(0, separatorIndex), resourceStateString.substring(separatorIndex + 1));
|
resourceLocation = new ResourceLocation(resourceStateString.substring(0, separatorIndex), resourceStateString.substring(separatorIndex + 1));
|
||||||
#else
|
#else
|
||||||
resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceStateString.substring(0, separatorIndex), resourceStateString.substring(separatorIndex + 1));
|
resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceStateString.substring(0, separatorIndex), resourceStateString.substring(separatorIndex + 1));
|
||||||
|
|||||||
+1
-5
@@ -19,13 +19,9 @@
|
|||||||
|
|
||||||
package com.seibel.distanthorizons.common.wrappers.block;
|
package com.seibel.distanthorizons.common.wrappers.block;
|
||||||
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.block.TextureAtlasSpriteWrapper;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.block.TintWithoutLevelOverrider;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
||||||
import com.seibel.distanthorizons.common.wrappers.block.*;
|
|
||||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import com.seibel.distanthorizons.core.pos.DhBlockPos;
|
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
|
||||||
import com.seibel.distanthorizons.core.util.ColorUtil;
|
import com.seibel.distanthorizons.core.util.ColorUtil;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
|||||||
+14
-4
@@ -23,7 +23,7 @@ import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
|
|||||||
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
|
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
|
||||||
import com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject.DhLitWorldGenRegion;
|
import com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject.DhLitWorldGenRegion;
|
||||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import com.seibel.distanthorizons.core.pos.DhBlockPos;
|
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
|
||||||
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage;
|
||||||
@@ -305,7 +305,7 @@ public class ChunkWrapper implements IChunkWrapper
|
|||||||
public ChunkStatus getStatus() { return getStatus(this.getChunk()); }
|
public ChunkStatus getStatus() { return getStatus(this.getChunk()); }
|
||||||
public static ChunkStatus getStatus(ChunkAccess chunk)
|
public static ChunkStatus getStatus(ChunkAccess chunk)
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
return chunk.getStatus();
|
return chunk.getStatus();
|
||||||
#else
|
#else
|
||||||
return chunk.getPersistedStatus();
|
return chunk.getPersistedStatus();
|
||||||
@@ -390,6 +390,8 @@ public class ChunkWrapper implements IChunkWrapper
|
|||||||
return this.blockLightStorage;
|
return this.blockLightStorage;
|
||||||
}
|
}
|
||||||
public void setBlockLightStorage(ChunkLightStorage lightStorage) { this.blockLightStorage = lightStorage; }
|
public void setBlockLightStorage(ChunkLightStorage lightStorage) { this.blockLightStorage = lightStorage; }
|
||||||
|
@Override
|
||||||
|
public void clearDhBlockLighting() { this.getBlockLightStorage().clear(); }
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -404,6 +406,8 @@ public class ChunkWrapper implements IChunkWrapper
|
|||||||
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
|
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
|
||||||
this.getSkyLightStorage().set(relX, y, relZ, lightValue);
|
this.getSkyLightStorage().set(relX, y, relZ, lightValue);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public void clearDhSkyLighting() { this.getSkyLightStorage().clear(); }
|
||||||
|
|
||||||
private ChunkLightStorage getSkyLightStorage()
|
private ChunkLightStorage getSkyLightStorage()
|
||||||
{
|
{
|
||||||
@@ -459,7 +463,7 @@ public class ChunkWrapper implements IChunkWrapper
|
|||||||
* before the list has finished populating.
|
* before the list has finished populating.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public synchronized ArrayList<DhBlockPos> getBlockLightPosList()
|
public synchronized ArrayList<DhBlockPos> getWorldBlockLightPosList()
|
||||||
{
|
{
|
||||||
// only populate the list once
|
// only populate the list once
|
||||||
if (this.blockLightPosList == null)
|
if (this.blockLightPosList == null)
|
||||||
@@ -475,7 +479,13 @@ public class ChunkWrapper implements IChunkWrapper
|
|||||||
#else
|
#else
|
||||||
this.chunk.findBlockLightSources((blockPos, blockState) ->
|
this.chunk.findBlockLightSources((blockPos, blockState) ->
|
||||||
{
|
{
|
||||||
this.blockLightPosList.add(new DhBlockPos(blockPos.getX(), blockPos.getY(), blockPos.getZ()));
|
DhBlockPos pos = new DhBlockPos(blockPos.getX(), blockPos.getY(), blockPos.getZ());
|
||||||
|
|
||||||
|
// this can be uncommented if MC decides to return relative block positions in the future instead of world positions
|
||||||
|
//pos.mutateToChunkRelativePos(pos);
|
||||||
|
//pos.mutateOffset(this.chunkPos.getMinBlockX(), 0, this.chunkPos.getMinBlockZ(), pos);
|
||||||
|
|
||||||
|
this.blockLightPosList.add(pos);
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -259,7 +259,7 @@ public class ClassicConfigGUI
|
|||||||
0, 0,
|
0, 0,
|
||||||
// Some textuary stuff
|
// Some textuary stuff
|
||||||
0,
|
0,
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"),
|
new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"),
|
||||||
#else
|
#else
|
||||||
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/changelog.png"),
|
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/changelog.png"),
|
||||||
|
|||||||
+2
-2
@@ -76,7 +76,7 @@ public class UpdateModScreen extends DhScreen
|
|||||||
0, 0,
|
0, 0,
|
||||||
// Some textuary stuff
|
// Some textuary stuff
|
||||||
0,
|
0,
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
new ResourceLocation(ModInfo.ID, "logo.png"),
|
new ResourceLocation(ModInfo.ID, "logo.png"),
|
||||||
#else
|
#else
|
||||||
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "logo.png"),
|
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "logo.png"),
|
||||||
@@ -107,7 +107,7 @@ public class UpdateModScreen extends DhScreen
|
|||||||
0, 0,
|
0, 0,
|
||||||
// Some textuary stuff
|
// Some textuary stuff
|
||||||
0,
|
0,
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"),
|
new ResourceLocation(ModInfo.ID, "textures/gui/changelog.png"),
|
||||||
#else
|
#else
|
||||||
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/changelog.png"),
|
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/changelog.png"),
|
||||||
|
|||||||
+1
-2
@@ -39,14 +39,13 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftCli
|
|||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
||||||
import com.seibel.distanthorizons.core.pos.DhBlockPos;
|
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
|
||||||
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
||||||
|
|
||||||
import net.minecraft.CrashReport;
|
import net.minecraft.CrashReport;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.multiplayer.ServerData;
|
import net.minecraft.client.multiplayer.ServerData;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.client.resources.model.ModelManager;
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
#if MC_VER < MC_1_19_2
|
#if MC_VER < MC_1_19_2
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ public class MinecraftDedicatedServerWrapper implements IMinecraftSharedWrapper
|
|||||||
throw new IllegalStateException("Trying to get Installation Direction before Dedicated server complete initialization!");
|
throw new IllegalStateException("Trying to get Installation Direction before Dedicated server complete initialization!");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
return this.dedicatedServer.getServerDirectory();
|
return this.dedicatedServer.getServerDirectory();
|
||||||
#else
|
#else
|
||||||
return this.dedicatedServer.getServerDirectory().toFile();
|
return this.dedicatedServer.getServerDirectory().toFile();
|
||||||
|
|||||||
+6
-16
@@ -21,29 +21,26 @@ package com.seibel.distanthorizons.common.wrappers.minecraft;
|
|||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.lang.invoke.MethodHandles;
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import com.mojang.blaze3d.pipeline.RenderTarget;
|
import com.mojang.blaze3d.pipeline.RenderTarget;
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.WrapperFactory;
|
import com.seibel.distanthorizons.common.wrappers.WrapperFactory;
|
||||||
import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper;
|
import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper;
|
||||||
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
|
||||||
|
|
||||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper;
|
||||||
|
|
||||||
|
#if MC_VER >= MC_1_17_1
|
||||||
|
import net.minecraft.client.renderer.FogRenderer;
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if MC_VER < MC_1_19_4
|
#if MC_VER < MC_1_19_4
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
#else
|
#else
|
||||||
import org.joml.Matrix4f;
|
|
||||||
import org.joml.Vector3f;
|
|
||||||
#endif
|
#endif
|
||||||
#if MC_VER >= MC_1_20_2
|
#if MC_VER >= MC_1_20_2
|
||||||
import net.minecraft.client.renderer.chunk.SectionRenderDispatcher;
|
import net.minecraft.client.renderer.chunk.SectionRenderDispatcher;
|
||||||
@@ -53,20 +50,14 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOpt
|
|||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
||||||
import com.seibel.distanthorizons.core.util.math.Mat4f;
|
|
||||||
import com.seibel.distanthorizons.core.util.math.Vec3d;
|
import com.seibel.distanthorizons.core.util.math.Vec3d;
|
||||||
import com.seibel.distanthorizons.core.util.math.Vec3f;
|
import com.seibel.distanthorizons.core.util.math.Vec3f;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor;
|
|
||||||
import com.seibel.distanthorizons.core.pos.DhBlockPos;
|
|
||||||
|
|
||||||
import net.minecraft.client.Camera;
|
import net.minecraft.client.Camera;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.FogRenderer;
|
|
||||||
import net.minecraft.client.renderer.LevelRenderer;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.world.effect.MobEffects;
|
import net.minecraft.world.effect.MobEffects;
|
||||||
#if MC_VER < MC_1_17_1
|
#if MC_VER < MC_1_17_1
|
||||||
import net.minecraft.tags.FluidTags;
|
import net.minecraft.tags.FluidTags;
|
||||||
@@ -76,7 +67,6 @@ import org.lwjgl.opengl.GL15;
|
|||||||
#else
|
#else
|
||||||
import net.minecraft.world.level.material.FogType;
|
import net.minecraft.world.level.material.FogType;
|
||||||
#endif
|
#endif
|
||||||
import net.minecraft.world.phys.AABB;
|
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
@@ -165,7 +155,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
|
|||||||
if (MC.level.dimensionType().hasSkyLight())
|
if (MC.level.dimensionType().hasSkyLight())
|
||||||
{
|
{
|
||||||
float frameTime;
|
float frameTime;
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
frameTime = MC.getFrameTime();
|
frameTime = MC.getFrameTime();
|
||||||
#else
|
#else
|
||||||
frameTime = MC.getTimer().getRealtimeDeltaTicks();
|
frameTime = MC.getTimer().getRealtimeDeltaTicks();
|
||||||
|
|||||||
+12
-5
@@ -7,13 +7,11 @@ import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
|
|||||||
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
|
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
|
||||||
import com.seibel.distanthorizons.common.wrappers.block.ClientBlockStateColorCache;
|
import com.seibel.distanthorizons.common.wrappers.block.ClientBlockStateColorCache;
|
||||||
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
||||||
import com.seibel.distanthorizons.core.api.internal.ClientApi;
|
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
import com.seibel.distanthorizons.core.level.*;
|
import com.seibel.distanthorizons.core.level.*;
|
||||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import com.seibel.distanthorizons.core.pos.DhBlockPos;
|
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
|
||||||
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
||||||
import com.seibel.distanthorizons.core.util.ColorUtil;
|
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
|
||||||
@@ -26,10 +24,12 @@ import net.minecraft.server.level.ServerLevel;
|
|||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkSource;
|
import net.minecraft.world.level.chunk.ChunkSource;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
@@ -207,12 +207,12 @@ public class ClientLevelWrapper implements IClientLevelWrapper
|
|||||||
@Override
|
@Override
|
||||||
public IChunkWrapper tryGetChunk(DhChunkPos pos)
|
public IChunkWrapper tryGetChunk(DhChunkPos pos)
|
||||||
{
|
{
|
||||||
if (!this.level.hasChunk(pos.x, pos.z))
|
if (!this.level.hasChunk(pos.getX(), pos.getZ()))
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChunkAccess chunk = this.level.getChunk(pos.x, pos.z, ChunkStatus.EMPTY, false);
|
ChunkAccess chunk = this.level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.EMPTY, false);
|
||||||
if (chunk == null)
|
if (chunk == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
@@ -267,6 +267,13 @@ public class ClientLevelWrapper implements IClientLevelWrapper
|
|||||||
return this.parentDhLevel.getGenericRenderer();
|
return this.parentDhLevel.getGenericRenderer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Color getCloudColor(float tickDelta)
|
||||||
|
{
|
||||||
|
Vec3 colorVec3 = this.level.getCloudColor(tickDelta);
|
||||||
|
return new Color((float)colorVec3.x, (float)colorVec3.y, (float)colorVec3.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//================//
|
//================//
|
||||||
|
|||||||
+3
-4
@@ -30,7 +30,7 @@ import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
|
|||||||
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
||||||
import com.seibel.distanthorizons.core.level.IDhLevel;
|
import com.seibel.distanthorizons.core.level.IDhLevel;
|
||||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import com.seibel.distanthorizons.core.pos.DhBlockPos;
|
import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos;
|
||||||
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
import com.seibel.distanthorizons.core.pos.DhChunkPos;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
||||||
@@ -48,7 +48,6 @@ import net.minecraft.world.level.chunk.status.ChunkStatus;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @version 2022-9-16
|
* @version 2022-9-16
|
||||||
@@ -132,8 +131,8 @@ public class ServerLevelWrapper implements IServerLevelWrapper
|
|||||||
@Override
|
@Override
|
||||||
public IChunkWrapper tryGetChunk(DhChunkPos pos)
|
public IChunkWrapper tryGetChunk(DhChunkPos pos)
|
||||||
{
|
{
|
||||||
if (!level.hasChunk(pos.x, pos.z)) return null;
|
if (!level.hasChunk(pos.getX(), pos.getZ())) return null;
|
||||||
ChunkAccess chunk = level.getChunk(pos.x, pos.z, ChunkStatus.FULL, false);
|
ChunkAccess chunk = level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.FULL, false);
|
||||||
if (chunk == null) return null;
|
if (chunk == null) return null;
|
||||||
return new ChunkWrapper(chunk, level, this);
|
return new ChunkWrapper(chunk, level, this);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -398,8 +398,8 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
|
|||||||
int borderSize = MAX_WORLD_GEN_CHUNK_BORDER_NEEDED;
|
int borderSize = MAX_WORLD_GEN_CHUNK_BORDER_NEEDED;
|
||||||
// genEvent.size - 1 converts the even width size to an odd number for MC compatability
|
// genEvent.size - 1 converts the even width size to an odd number for MC compatability
|
||||||
int refSize = (genEvent.size - 1) + (borderSize * 2);
|
int refSize = (genEvent.size - 1) + (borderSize * 2);
|
||||||
int refPosX = genEvent.minPos.x - borderSize;
|
int refPosX = genEvent.minPos.getX() - borderSize;
|
||||||
int refPosZ = genEvent.minPos.z - borderSize;
|
int refPosZ = genEvent.minPos.getZ() - borderSize;
|
||||||
|
|
||||||
LightGetterAdaptor lightGetterAdaptor = new LightGetterAdaptor(this.params.level);
|
LightGetterAdaptor lightGetterAdaptor = new LightGetterAdaptor(this.params.level);
|
||||||
DummyLightEngine dummyLightEngine = new DummyLightEngine(lightGetterAdaptor);
|
DummyLightEngine dummyLightEngine = new DummyLightEngine(lightGetterAdaptor);
|
||||||
|
|||||||
+2
-2
@@ -85,7 +85,7 @@ import net.minecraft.world.level.material.Fluids;
|
|||||||
#if MC_VER == MC_1_20_6
|
#if MC_VER == MC_1_20_6
|
||||||
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
import net.minecraft.world.level.chunk.status.ChunkType;
|
import net.minecraft.world.level.chunk.status.ChunkType;
|
||||||
#elif MC_VER == MC_1_21
|
#elif MC_VER >= MC_1_21_1
|
||||||
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
import net.minecraft.world.level.chunk.status.ChunkType;
|
import net.minecraft.world.level.chunk.status.ChunkType;
|
||||||
#endif
|
#endif
|
||||||
@@ -325,7 +325,7 @@ public class ChunkLoader
|
|||||||
}
|
}
|
||||||
private static
|
private static
|
||||||
#if MC_VER < MC_1_20_6 ChunkStatus.ChunkType
|
#if MC_VER < MC_1_20_6 ChunkStatus.ChunkType
|
||||||
#elif MC_VER < MC_1_21 ChunkType
|
#elif MC_VER < MC_1_21_1 ChunkType
|
||||||
#else ChunkType #endif
|
#else ChunkType #endif
|
||||||
readChunkType(CompoundTag tagLevel)
|
readChunkType(CompoundTag tagLevel)
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject;
|
package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject;
|
||||||
|
|
||||||
#if MC_VER >= MC_1_21
|
#if MC_VER >= MC_1_21_1
|
||||||
|
|
||||||
import net.minecraft.server.level.GenerationChunkHolder;
|
import net.minecraft.server.level.GenerationChunkHolder;
|
||||||
import net.minecraft.world.level.ChunkPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
|
|||||||
+18
-3
@@ -20,7 +20,6 @@
|
|||||||
package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject;
|
package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject;
|
||||||
|
|
||||||
import java.lang.invoke.MethodHandles;
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
||||||
@@ -63,7 +62,7 @@ import net.minecraft.world.level.chunk.ChunkStatus;
|
|||||||
import net.minecraft.world.level.chunk.status.*;
|
import net.minecraft.world.level.chunk.status.*;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MC_VER == MC_1_21
|
#if MC_VER >= MC_1_21_1
|
||||||
import net.minecraft.util.StaticCache2D;
|
import net.minecraft.util.StaticCache2D;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import net.minecraft.server.level.GenerationChunkHolder;
|
import net.minecraft.server.level.GenerationChunkHolder;
|
||||||
@@ -127,7 +126,7 @@ public class DhLitWorldGenRegion extends WorldGenRegion
|
|||||||
{
|
{
|
||||||
#if MC_VER == MC_1_16_5
|
#if MC_VER == MC_1_16_5
|
||||||
super(serverLevel, chunkList);
|
super(serverLevel, chunkList);
|
||||||
#elif MC_VER < MC_1_21
|
#elif MC_VER < MC_1_21_1
|
||||||
super(serverLevel, chunkList, chunkStatus, writeRadius);
|
super(serverLevel, chunkList, chunkStatus, writeRadius);
|
||||||
#else
|
#else
|
||||||
super(serverLevel,
|
super(serverLevel,
|
||||||
@@ -235,6 +234,22 @@ public class DhLitWorldGenRegion extends WorldGenRegion
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This needs to be manually overridden to make sure Lithium 0.11.2 and lower
|
||||||
|
* don't try to get null chunks. <br><br>
|
||||||
|
*
|
||||||
|
* Problematic Lithium code was removed in 0.13.0 (MC 1.21.1) and higher: <br>
|
||||||
|
* https://github.com/CaffeineMC/lithium-fabric/commit/b7cfd53a1ed0197e1d13dea2799b898eb52ecab3
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public BlockState getBlockState(BlockPos blockPos)
|
||||||
|
{
|
||||||
|
int chunkX = SectionPos.blockToSectionCoord(blockPos.getX());
|
||||||
|
int chunkZ = SectionPos.blockToSectionCoord(blockPos.getZ());
|
||||||
|
return this.getChunk(chunkX, chunkZ).getBlockState(blockPos);
|
||||||
|
}
|
||||||
|
|
||||||
/** Skip BlockEntity stuff. They aren't needed for our use case. */
|
/** Skip BlockEntity stuff. They aren't needed for our use case. */
|
||||||
@Override
|
@Override
|
||||||
public boolean addFreshEntity(@NotNull Entity entity) { return true; }
|
public boolean addFreshEntity(@NotNull Entity entity) { return true; }
|
||||||
|
|||||||
+2
-2
@@ -68,7 +68,7 @@ public final class StepBiomes
|
|||||||
}
|
}
|
||||||
else if (chunk instanceof ProtoChunk)
|
else if (chunk instanceof ProtoChunk)
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
((ProtoChunk) chunk).setStatus(STATUS);
|
((ProtoChunk) chunk).setStatus(STATUS);
|
||||||
#else
|
#else
|
||||||
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
||||||
@@ -89,7 +89,7 @@ public final class StepBiomes
|
|||||||
#elif MC_VER < MC_1_19_4
|
#elif MC_VER < MC_1_19_4
|
||||||
chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(this.environment.params.biomes, Runnable::run, this.environment.params.randomState, Blender.of(worldGenRegion),
|
chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(this.environment.params.biomes, Runnable::run, this.environment.params.randomState, Blender.of(worldGenRegion),
|
||||||
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
|
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
|
||||||
#elif MC_VER < MC_1_21
|
#elif MC_VER < MC_1_21_1
|
||||||
chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(Runnable::run, this.environment.params.randomState, Blender.of(worldGenRegion),
|
chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(Runnable::run, this.environment.params.randomState, Blender.of(worldGenRegion),
|
||||||
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
|
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
|
||||||
#else
|
#else
|
||||||
|
|||||||
+2
-2
@@ -66,7 +66,7 @@ public final class StepFeatures
|
|||||||
}
|
}
|
||||||
else if (chunk instanceof ProtoChunk)
|
else if (chunk instanceof ProtoChunk)
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
((ProtoChunk) chunk).setStatus(STATUS);
|
((ProtoChunk) chunk).setStatus(STATUS);
|
||||||
#else
|
#else
|
||||||
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
||||||
@@ -80,7 +80,7 @@ public final class StepFeatures
|
|||||||
worldGenRegion.setOverrideCenter(chunk.getPos());
|
worldGenRegion.setOverrideCenter(chunk.getPos());
|
||||||
environment.params.generator.applyBiomeDecoration(worldGenRegion, tParams.structFeat);
|
environment.params.generator.applyBiomeDecoration(worldGenRegion, tParams.structFeat);
|
||||||
#else
|
#else
|
||||||
if (worldGenRegion.hasChunk(chunkWrapper.getChunkPos().x, chunkWrapper.getChunkPos().z))
|
if (worldGenRegion.hasChunk(chunkWrapper.getChunkPos().getX(), chunkWrapper.getChunkPos().getZ()))
|
||||||
{
|
{
|
||||||
this.environment.params.generator.applyBiomeDecoration(worldGenRegion, chunk, tParams.structFeat.forWorldGenRegion(worldGenRegion));
|
this.environment.params.generator.applyBiomeDecoration(worldGenRegion, chunk, tParams.structFeat.forWorldGenRegion(worldGenRegion));
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -68,7 +68,7 @@ public final class StepNoise
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
((ProtoChunk) chunk).setStatus(STATUS);
|
((ProtoChunk) chunk).setStatus(STATUS);
|
||||||
#else
|
#else
|
||||||
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
||||||
@@ -87,7 +87,7 @@ public final class StepNoise
|
|||||||
#elif MC_VER < MC_1_19_2
|
#elif MC_VER < MC_1_19_2
|
||||||
chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion),
|
chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion),
|
||||||
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
|
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
|
||||||
#elif MC_VER < MC_1_21
|
#elif MC_VER < MC_1_21_1
|
||||||
chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion), this.environment.params.randomState,
|
chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion), this.environment.params.randomState,
|
||||||
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
|
tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk));
|
||||||
#else
|
#else
|
||||||
|
|||||||
+1
-1
@@ -66,7 +66,7 @@ public final class StepStructureReference
|
|||||||
}
|
}
|
||||||
else if (chunk instanceof ProtoChunk)
|
else if (chunk instanceof ProtoChunk)
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
((ProtoChunk) chunk).setStatus(STATUS);
|
((ProtoChunk) chunk).setStatus(STATUS);
|
||||||
#else
|
#else
|
||||||
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
||||||
|
|||||||
+1
-1
@@ -83,7 +83,7 @@ public final class StepStructureStart
|
|||||||
}
|
}
|
||||||
else if (chunk instanceof ProtoChunk)
|
else if (chunk instanceof ProtoChunk)
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
((ProtoChunk) chunk).setStatus(STATUS);
|
((ProtoChunk) chunk).setStatus(STATUS);
|
||||||
#else
|
#else
|
||||||
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
||||||
|
|||||||
+1
-1
@@ -65,7 +65,7 @@ public final class StepSurface
|
|||||||
}
|
}
|
||||||
else if (chunk instanceof ProtoChunk)
|
else if (chunk instanceof ProtoChunk)
|
||||||
{
|
{
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
((ProtoChunk) chunk).setStatus(STATUS);
|
((ProtoChunk) chunk).setStatus(STATUS);
|
||||||
#else
|
#else
|
||||||
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
((ProtoChunk) chunk).setPersistedStatus(STATUS);
|
||||||
|
|||||||
+1
-1
Submodule coreSubProjects updated: 377d0fbe12...57c5b2d5fc
@@ -117,8 +117,11 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
// ClientChunkLoadEvent
|
// ClientChunkLoadEvent
|
||||||
ClientChunkEvents.CHUNK_LOAD.register((level, chunk) ->
|
ClientChunkEvents.CHUNK_LOAD.register((level, chunk) ->
|
||||||
{
|
{
|
||||||
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level);
|
if (MC.clientConnectedToDedicatedServer())
|
||||||
SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
|
{
|
||||||
|
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level);
|
||||||
|
SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// (kinda) block break event
|
// (kinda) block break event
|
||||||
@@ -200,14 +203,6 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// Client Chunk Save
|
|
||||||
ClientChunkEvents.CHUNK_UNLOAD.register((level, chunk) ->
|
|
||||||
{
|
|
||||||
IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level);
|
|
||||||
SharedApi.INSTANCE.chunkUnloadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//==============//
|
//==============//
|
||||||
// render event //
|
// render event //
|
||||||
@@ -227,7 +222,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()),
|
this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()),
|
||||||
modelViewMatrix,
|
modelViewMatrix,
|
||||||
projectionMatrix,
|
projectionMatrix,
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
renderContext.tickDelta()
|
renderContext.tickDelta()
|
||||||
#else
|
#else
|
||||||
renderContext.tickCounter().getGameTimeDeltaTicks()
|
renderContext.tickCounter().getGameTimeDeltaTicks()
|
||||||
|
|||||||
+1
-1
@@ -116,7 +116,7 @@ public class MixinLevelRenderer
|
|||||||
ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level),
|
ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level),
|
||||||
mcModelViewMatrix,
|
mcModelViewMatrix,
|
||||||
mcProjectionMatrix,
|
mcProjectionMatrix,
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
Minecraft.getInstance().getFrameTime()
|
Minecraft.getInstance().getFrameTime()
|
||||||
#else
|
#else
|
||||||
Minecraft.getInstance().getTimer().getRealtimeDeltaTicks()
|
Minecraft.getInstance().getTimer().getRealtimeDeltaTicks()
|
||||||
|
|||||||
+2
-2
@@ -45,7 +45,7 @@ import org.spongepowered.asm.mixin.Final;
|
|||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
import net.minecraft.client.gui.screens.OptionsScreen;
|
import net.minecraft.client.gui.screens.OptionsScreen;
|
||||||
#else
|
#else
|
||||||
import net.minecraft.client.gui.screens.options.OptionsScreen;
|
import net.minecraft.client.gui.screens.options.OptionsScreen;
|
||||||
@@ -64,7 +64,7 @@ public class MixinOptionsScreen extends Screen
|
|||||||
/** Texture used for the config opening button */
|
/** Texture used for the config opening button */
|
||||||
@Unique
|
@Unique
|
||||||
private static final ResourceLocation ICON_TEXTURE =
|
private static final ResourceLocation ICON_TEXTURE =
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
|
new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
|
||||||
#else
|
#else
|
||||||
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/button.png");
|
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/button.png");
|
||||||
|
|||||||
+2
-60
@@ -1,8 +1,6 @@
|
|||||||
package com.seibel.distanthorizons.fabric.mixins.server;
|
package com.seibel.distanthorizons.fabric.mixins.server;
|
||||||
|
|
||||||
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
import com.seibel.distanthorizons.common.commonMixins.MixinChunkMapCommon;
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
|
|
||||||
import com.seibel.distanthorizons.core.api.internal.ServerApi;
|
|
||||||
import net.minecraft.server.level.ChunkMap;
|
import net.minecraft.server.level.ChunkMap;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
@@ -32,62 +30,6 @@ public class MixinChunkMap
|
|||||||
// don't need the chunk(s) before MC has finished saving them
|
// don't need the chunk(s) before MC has finished saving them
|
||||||
@Inject(method = "save", at = @At(value = "RETURN", target = CHUNK_SERIALIZER_WRITE))
|
@Inject(method = "save", at = @At(value = "RETURN", target = CHUNK_SERIALIZER_WRITE))
|
||||||
private void onChunkSave(ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
|
private void onChunkSave(ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
|
||||||
{
|
{ MixinChunkMapCommon.onChunkSave(this.level, chunk, ci); }
|
||||||
// true means a chunk was saved to disk
|
|
||||||
if (ci.getReturnValue())
|
|
||||||
{
|
|
||||||
// TODO is this validation necessary since we are checking above if
|
|
||||||
// the callback return value should state if the chunk was actually saved or not?
|
|
||||||
// Do we trust it to always be correct?
|
|
||||||
|
|
||||||
//=====================================//
|
|
||||||
// corrupt/incomplete chunk validation //
|
|
||||||
//=====================================//
|
|
||||||
|
|
||||||
// MC has a tendency to try saving incomplete or corrupted chunks (which show up as empty or black chunks)
|
|
||||||
// this logic should prevent that from happening
|
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
|
||||||
if (chunk.isUnsaved() || chunk.getUpgradeData() != null || !chunk.isLightCorrect())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (chunk.isUnsaved() || chunk.isUpgrading() || !chunk.isLightCorrect())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//==================//
|
|
||||||
// biome validation //
|
|
||||||
//==================//
|
|
||||||
|
|
||||||
// some chunks may be missing their biomes, which cause issues when attempting to save them
|
|
||||||
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
|
|
||||||
if (chunk.getBiomes() == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// this will throw an exception if the biomes aren't set up
|
|
||||||
chunk.getNoiseBiome(0,0,0);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ServerApi.INSTANCE.serverChunkSaveEvent(
|
|
||||||
new ChunkWrapper(chunk, this.level, ServerLevelWrapper.getWrapper(this.level)),
|
|
||||||
ServerLevelWrapper.getWrapper(this.level)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -1,16 +1,16 @@
|
|||||||
package com.seibel.distanthorizons.fabric.testing;
|
package com.seibel.distanthorizons.fabric.testing;
|
||||||
|
|
||||||
import com.mojang.logging.LogUtils;
|
|
||||||
import com.seibel.distanthorizons.api.DhApi;
|
import com.seibel.distanthorizons.api.DhApi;
|
||||||
import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
|
import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
|
||||||
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelLoadEvent;
|
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelLoadEvent;
|
||||||
import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiEventParam;
|
import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiEventParam;
|
||||||
import com.seibel.distanthorizons.fabric.FabricServerProxy;
|
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
public class TestWorldGenBindingEvent extends DhApiLevelLoadEvent
|
public class TestWorldGenBindingEvent extends DhApiLevelLoadEvent
|
||||||
{
|
{
|
||||||
private static final org.slf4j.Logger LOGGER = LogUtils.getLogger();
|
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLevelLoad(DhApiEventParam<DhApiLevelLoadEvent.EventParam> event)
|
public void onLevelLoad(DhApiEventParam<DhApiLevelLoadEvent.EventParam> event)
|
||||||
|
|||||||
+35
-3
@@ -9,18 +9,27 @@ import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.Abstrac
|
|||||||
import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper;
|
import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper;
|
||||||
import com.seibel.distanthorizons.api.objects.data.DhApiChunk;
|
import com.seibel.distanthorizons.api.objects.data.DhApiChunk;
|
||||||
import com.seibel.distanthorizons.api.objects.data.DhApiTerrainDataPoint;
|
import com.seibel.distanthorizons.api.objects.data.DhApiTerrainDataPoint;
|
||||||
|
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
|
||||||
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
|
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
|
||||||
|
import com.seibel.distanthorizons.core.config.Config;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
|
public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
|
||||||
{
|
{
|
||||||
private final ServerLevel level;
|
private final ServerLevel level;
|
||||||
private final IDhApiLevelWrapper levelWrapper;
|
private final IDhApiLevelWrapper levelWrapper;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//=============//
|
||||||
|
// constructor //
|
||||||
|
//=============//
|
||||||
|
|
||||||
public TestWorldGenerator(ServerLevel level)
|
public TestWorldGenerator(ServerLevel level)
|
||||||
{
|
{
|
||||||
this.level = level;
|
this.level = level;
|
||||||
@@ -28,13 +37,23 @@ public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//============//
|
||||||
|
// properties //
|
||||||
|
//============//
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EDhApiWorldGeneratorReturnType getReturnType() { return EDhApiWorldGeneratorReturnType.API_CHUNKS; }
|
public EDhApiWorldGeneratorReturnType getReturnType() { return EDhApiWorldGeneratorReturnType.API_CHUNKS; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isBusy() { return false; }
|
public boolean runApiChunkValidation() { return true; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//==================//
|
||||||
|
// chunk generation //
|
||||||
|
//==================//
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object[] generateChunk(int chunkX, int chunkZ, EDhApiDistantGeneratorMode eDhApiDistantGeneratorMode)
|
public Object[] generateChunk(int chunkX, int chunkZ, EDhApiDistantGeneratorMode eDhApiDistantGeneratorMode)
|
||||||
{
|
{
|
||||||
@@ -45,10 +64,14 @@ public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
|
|||||||
@Override
|
@Override
|
||||||
public DhApiChunk generateApiChunk(int chunkPosX, int chunkPosZ, EDhApiDistantGeneratorMode generatorMode)
|
public DhApiChunk generateApiChunk(int chunkPosX, int chunkPosZ, EDhApiDistantGeneratorMode generatorMode)
|
||||||
{
|
{
|
||||||
|
// this test is only validated for 1.18.2 and up
|
||||||
|
// (and it is only needed when testing world gen overrides/API chunks, so it isn't normally needed)
|
||||||
|
#if MC_VER >= MC_1_18_2
|
||||||
ChunkAccess chunk = this.level.getChunk(chunkPosX, chunkPosZ);
|
ChunkAccess chunk = this.level.getChunk(chunkPosX, chunkPosZ);
|
||||||
|
|
||||||
int minBuildHeight = chunk.getMinBuildHeight();
|
|
||||||
int maxBuildHeight = chunk.getMaxBuildHeight();
|
int minBuildHeight = this.level.getMinBuildHeight();
|
||||||
|
int maxBuildHeight = this.level.getMaxBuildHeight();
|
||||||
|
|
||||||
DhApiChunk apiChunk = DhApiChunk.create(chunkPosX, chunkPosZ, minBuildHeight, maxBuildHeight);
|
DhApiChunk apiChunk = DhApiChunk.create(chunkPosX, chunkPosZ, minBuildHeight, maxBuildHeight);
|
||||||
for (int x = 0; x < 16; x++)
|
for (int x = 0; x < 16; x++)
|
||||||
@@ -71,11 +94,20 @@ public class TestWorldGenerator extends AbstractDhApiChunkWorldGenerator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return apiChunk;
|
return apiChunk;
|
||||||
|
#else
|
||||||
|
return null;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void preGeneratorTaskStart() { /* do nothing */ }
|
public void preGeneratorTaskStart() { /* do nothing */ }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//=========//
|
||||||
|
// cleanup //
|
||||||
|
//=========//
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() { /* do nothing */ }
|
public void close() { /* do nothing */ }
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IBCLibAcces
|
|||||||
#elif MC_VER == MC_1_18_2
|
#elif MC_VER == MC_1_18_2
|
||||||
import ru.bclib.config.ClientConfig;
|
import ru.bclib.config.ClientConfig;
|
||||||
import ru.bclib.config.Configs;
|
import ru.bclib.config.Configs;
|
||||||
#elif MC_VER < MC_1_21
|
#elif MC_VER < MC_1_21_1
|
||||||
import org.betterx.bclib.config.ClientConfig;
|
import org.betterx.bclib.config.ClientConfig;
|
||||||
import org.betterx.bclib.config.Configs;
|
import org.betterx.bclib.config.Configs;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -176,53 +176,59 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void rightClickBlockEvent(PlayerInteractEvent.RightClickBlock event)
|
public void rightClickBlockEvent(PlayerInteractEvent.RightClickBlock event)
|
||||||
{
|
{
|
||||||
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
|
if (MC.clientConnectedToDedicatedServer())
|
||||||
{
|
{
|
||||||
return;
|
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
|
||||||
}
|
|
||||||
|
|
||||||
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
|
|
||||||
|
|
||||||
#if MC_VER < MC_1_19_2
|
|
||||||
LevelAccessor level = event.getWorld();
|
|
||||||
#else
|
|
||||||
LevelAccessor level = event.getLevel();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
|
|
||||||
if (executor != null)
|
|
||||||
{
|
|
||||||
executor.execute(() ->
|
|
||||||
{
|
{
|
||||||
ChunkAccess chunk = level.getChunk(event.getPos());
|
return;
|
||||||
this.onBlockChangeEvent(level, chunk);
|
}
|
||||||
});
|
|
||||||
|
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_19_2
|
||||||
|
LevelAccessor level = event.getWorld();
|
||||||
|
#else
|
||||||
|
LevelAccessor level = event.getLevel();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
|
||||||
|
if (executor != null)
|
||||||
|
{
|
||||||
|
executor.execute(() ->
|
||||||
|
{
|
||||||
|
ChunkAccess chunk = level.getChunk(event.getPos());
|
||||||
|
this.onBlockChangeEvent(level, chunk);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event)
|
public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event)
|
||||||
{
|
{
|
||||||
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
|
if (MC.clientConnectedToDedicatedServer())
|
||||||
{
|
{
|
||||||
return;
|
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
|
||||||
}
|
|
||||||
|
|
||||||
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
|
|
||||||
|
|
||||||
#if MC_VER < MC_1_19_2
|
|
||||||
LevelAccessor level = event.getWorld();
|
|
||||||
#else
|
|
||||||
LevelAccessor level = event.getLevel();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
|
|
||||||
if (executor != null)
|
|
||||||
{
|
|
||||||
executor.execute(() ->
|
|
||||||
{
|
{
|
||||||
ChunkAccess chunk = level.getChunk(event.getPos());
|
return;
|
||||||
this.onBlockChangeEvent(level, chunk);
|
}
|
||||||
});
|
|
||||||
|
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
|
||||||
|
|
||||||
|
#if MC_VER < MC_1_19_2
|
||||||
|
LevelAccessor level = event.getWorld();
|
||||||
|
#else
|
||||||
|
LevelAccessor level = event.getLevel();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
|
||||||
|
if (executor != null)
|
||||||
|
{
|
||||||
|
executor.execute(() ->
|
||||||
|
{
|
||||||
|
ChunkAccess chunk = level.getChunk(event.getPos());
|
||||||
|
this.onBlockChangeEvent(level, chunk);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk)
|
private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk)
|
||||||
@@ -231,20 +237,15 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
SharedApi.INSTANCE.chunkBlockChangedEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
|
SharedApi.INSTANCE.chunkBlockChangedEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void clientChunkLoadEvent(ChunkEvent.Load event)
|
public void clientChunkLoadEvent(ChunkEvent.Load event)
|
||||||
{
|
{
|
||||||
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
|
if (MC.clientConnectedToDedicatedServer())
|
||||||
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
|
{
|
||||||
SharedApi.INSTANCE.chunkLoadEvent(chunk, wrappedLevel);
|
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
|
||||||
}
|
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
|
||||||
@SubscribeEvent
|
SharedApi.INSTANCE.chunkLoadEvent(chunk, wrappedLevel);
|
||||||
public void clientChunkUnloadEvent(ChunkEvent.Unload event)
|
}
|
||||||
{
|
|
||||||
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
|
|
||||||
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
|
|
||||||
SharedApi.INSTANCE.chunkUnloadEvent(chunk, wrappedLevel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ package com.seibel.distanthorizons.forge;
|
|||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import com.seibel.distanthorizons.common.AbstractModInitializer;
|
import com.seibel.distanthorizons.common.AbstractModInitializer;
|
||||||
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
|
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
|
||||||
|
import com.seibel.distanthorizons.core.api.internal.ClientApi;
|
||||||
|
import com.seibel.distanthorizons.core.config.Config;
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
|
||||||
import com.seibel.distanthorizons.coreapi.ModInfo;
|
import com.seibel.distanthorizons.coreapi.ModInfo;
|
||||||
@@ -104,6 +106,20 @@ public class ForgeMain extends AbstractModInitializer
|
|||||||
ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class,
|
ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class,
|
||||||
() -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> GetConfigScreen.getScreen(parent)));
|
() -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> GetConfigScreen.getScreen(parent)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (Config.Client.Advanced.Logging.showModCompatibilityWarningsOnStartup.get())
|
||||||
|
{
|
||||||
|
IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class);
|
||||||
|
if (modChecker.isModLoaded("alexscaves"))
|
||||||
|
{
|
||||||
|
String message =
|
||||||
|
// orange text
|
||||||
|
"\u00A76" + "Distant Horizons: Alex's Cave detected." + "\u00A7r\n" +
|
||||||
|
"You may have to change Alex's config for DH to render. ";
|
||||||
|
ClientApi.INSTANCE.showChatMessageNextFrame(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -137,14 +137,6 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
|
|||||||
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
|
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
|
||||||
this.serverApi.serverChunkLoadEvent(chunk, levelWrapper);
|
this.serverApi.serverChunkLoadEvent(chunk, levelWrapper);
|
||||||
}
|
}
|
||||||
@SubscribeEvent
|
|
||||||
public void serverChunkSaveEvent(ChunkEvent.Unload event)
|
|
||||||
{
|
|
||||||
ILevelWrapper levelWrapper = ProxyUtil.getLevelWrapper(GetEventLevel(event));
|
|
||||||
|
|
||||||
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
|
|
||||||
this.serverApi.serverChunkSaveEvent(chunk, levelWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.seibel.distanthorizons.forge.mixins.server;
|
||||||
|
|
||||||
|
import com.seibel.distanthorizons.common.commonMixins.MixinChunkMapCommon;
|
||||||
|
import net.minecraft.server.level.ChunkMap;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@Mixin(ChunkMap.class)
|
||||||
|
public class MixinChunkMap
|
||||||
|
{
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private static final String CHUNK_SERIALIZER_WRITE
|
||||||
|
= "Lnet/minecraft/world/level/chunk/storage/ChunkSerializer;write(" +
|
||||||
|
"Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;)" +
|
||||||
|
"Lnet/minecraft/nbt/CompoundTag;";
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
ServerLevel level;
|
||||||
|
|
||||||
|
// firing at INVOKE causes issues with C2ME and is probably unnecessary since we
|
||||||
|
// don't need the chunk(s) before MC has finished saving them
|
||||||
|
@Inject(method = "save", at = @At(value = "RETURN", target = CHUNK_SERIALIZER_WRITE))
|
||||||
|
private void onChunkSave(ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
|
||||||
|
{ MixinChunkMapCommon.onChunkSave(this.level, chunk, ci); }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,7 +5,8 @@
|
|||||||
"mixins": [
|
"mixins": [
|
||||||
"server.MixinUtilBackgroundThread",
|
"server.MixinUtilBackgroundThread",
|
||||||
"server.MixinChunkGenerator",
|
"server.MixinChunkGenerator",
|
||||||
"server.MixinTFChunkGenerator"
|
"server.MixinTFChunkGenerator",
|
||||||
|
"server.MixinChunkMap"
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
"client.MixinClientPacketListener",
|
"client.MixinClientPacketListener",
|
||||||
|
|||||||
+2
-2
@@ -5,7 +5,7 @@ org.gradle.caching=true
|
|||||||
|
|
||||||
# Mod Info
|
# Mod Info
|
||||||
mod_name=DistantHorizons
|
mod_name=DistantHorizons
|
||||||
mod_version=2.1.3-a-dev
|
mod_version=2.2.1-a
|
||||||
api_version=3.0.0
|
api_version=3.0.0
|
||||||
maven_group=com.seibel.distanthorizons
|
maven_group=com.seibel.distanthorizons
|
||||||
mod_readable_name=Distant Horizons
|
mod_readable_name=Distant Horizons
|
||||||
@@ -49,7 +49,7 @@ versionStr=
|
|||||||
|
|
||||||
# This defines what MC version Intellij will use for the preprocessor
|
# This defines what MC version Intellij will use for the preprocessor
|
||||||
# and what version is used automatically by build and run commands
|
# and what version is used automatically by build and run commands
|
||||||
mcVer=1.21
|
mcVer=1.21.1
|
||||||
|
|
||||||
# Defines the maximum amount of memory Minecraft is allowed when run in a development environment
|
# Defines the maximum amount of memory Minecraft is allowed when run in a development environment
|
||||||
#minecraftMemoryJavaArg="-Xmx4G"
|
#minecraftMemoryJavaArg="-Xmx4G"
|
||||||
|
|||||||
+40
-48
@@ -63,6 +63,8 @@ import org.lwjgl.opengl.GL32;
|
|||||||
import net.neoforged.neoforge.event.TickEvent;
|
import net.neoforged.neoforge.event.TickEvent;
|
||||||
#else
|
#else
|
||||||
import net.neoforged.neoforge.client.event.ClientTickEvent;
|
import net.neoforged.neoforge.client.event.ClientTickEvent;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -164,49 +166,55 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void rightClickBlockEvent(PlayerInteractEvent.RightClickBlock event)
|
public void rightClickBlockEvent(PlayerInteractEvent.RightClickBlock event)
|
||||||
{
|
{
|
||||||
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
|
if (MC.clientConnectedToDedicatedServer())
|
||||||
{
|
{
|
||||||
return;
|
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
|
||||||
}
|
|
||||||
|
|
||||||
// executor to prevent locking up the render/event thread
|
|
||||||
// if the getChunk() takes longer than expected
|
|
||||||
// (which can be caused by certain mods)
|
|
||||||
var executor = ThreadPoolUtil.getFileHandlerExecutor();
|
|
||||||
if (executor != null)
|
|
||||||
{
|
|
||||||
executor.execute(() ->
|
|
||||||
{
|
{
|
||||||
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LevelAccessor level = event.getLevel();
|
// executor to prevent locking up the render/event thread
|
||||||
ChunkAccess chunk = level.getChunk(event.getPos());
|
// if the getChunk() takes longer than expected
|
||||||
this.onBlockChangeEvent(level, chunk);
|
// (which can be caused by certain mods)
|
||||||
});
|
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
|
||||||
|
if (executor != null)
|
||||||
|
{
|
||||||
|
executor.execute(() ->
|
||||||
|
{
|
||||||
|
//LOGGER.trace("interact or block place event at blockPos: " + event.getPos());
|
||||||
|
|
||||||
|
LevelAccessor level = event.getLevel();
|
||||||
|
ChunkAccess chunk = level.getChunk(event.getPos());
|
||||||
|
this.onBlockChangeEvent(level, chunk);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event)
|
public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event)
|
||||||
{
|
{
|
||||||
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
|
if (MC.clientConnectedToDedicatedServer())
|
||||||
{
|
{
|
||||||
return;
|
if (SharedApi.isChunkAtBlockPosAlreadyUpdating(event.getPos().getX(), event.getPos().getZ()))
|
||||||
}
|
|
||||||
|
|
||||||
// executor to prevent locking up the render/event thread
|
|
||||||
// if the getChunk() takes longer than expected
|
|
||||||
// (which can be caused by certain mods)
|
|
||||||
var executor = ThreadPoolUtil.getFileHandlerExecutor();
|
|
||||||
if (executor != null)
|
|
||||||
{
|
|
||||||
executor.execute(() ->
|
|
||||||
{
|
{
|
||||||
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LevelAccessor level = event.getLevel();
|
// executor to prevent locking up the render/event thread
|
||||||
ChunkAccess chunk = level.getChunk(event.getPos());
|
// if the getChunk() takes longer than expected
|
||||||
this.onBlockChangeEvent(level, chunk);
|
// (which can be caused by certain mods)
|
||||||
});
|
ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor();
|
||||||
|
if (executor != null)
|
||||||
|
{
|
||||||
|
executor.execute(() ->
|
||||||
|
{
|
||||||
|
//LOGGER.trace("break or block attack at blockPos: " + event.getPos());
|
||||||
|
|
||||||
|
LevelAccessor level = event.getLevel();
|
||||||
|
ChunkAccess chunk = level.getChunk(event.getPos());
|
||||||
|
this.onBlockChangeEvent(level, chunk);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk)
|
private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk)
|
||||||
@@ -216,22 +224,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public void clientChunkLoadEvent(ChunkEvent.Load event)
|
|
||||||
{
|
|
||||||
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
|
|
||||||
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
|
|
||||||
SharedApi.INSTANCE.chunkLoadEvent(chunk, wrappedLevel);
|
|
||||||
}
|
|
||||||
@SubscribeEvent
|
|
||||||
public void clientChunkUnloadEvent(ChunkEvent.Unload event)
|
|
||||||
{
|
|
||||||
ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event));
|
|
||||||
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel);
|
|
||||||
SharedApi.INSTANCE.chunkUnloadEvent(chunk, wrappedLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//==============//
|
//==============//
|
||||||
// key bindings //
|
// key bindings //
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ package com.seibel.distanthorizons.neoforge;
|
|||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import com.seibel.distanthorizons.common.AbstractModInitializer;
|
import com.seibel.distanthorizons.common.AbstractModInitializer;
|
||||||
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
|
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
|
||||||
|
import com.seibel.distanthorizons.core.api.internal.ClientApi;
|
||||||
|
import com.seibel.distanthorizons.core.config.Config;
|
||||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
|
||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
|
||||||
@@ -83,6 +85,20 @@ public class NeoforgeMain extends AbstractModInitializer
|
|||||||
// TODO fix potential null pointer
|
// TODO fix potential null pointer
|
||||||
() -> (client, parent) -> GetConfigScreen.getScreen(parent));
|
() -> (client, parent) -> GetConfigScreen.getScreen(parent));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (Config.Client.Advanced.Logging.showModCompatibilityWarningsOnStartup.get())
|
||||||
|
{
|
||||||
|
IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class);
|
||||||
|
if (modChecker.isModLoaded("alexscaves"))
|
||||||
|
{
|
||||||
|
String message =
|
||||||
|
// orange text
|
||||||
|
"\u00A76" + "Distant Horizons: Alex's Cave detected." + "\u00A7r\n" +
|
||||||
|
"You may have to change Alex's config for DH to render. ";
|
||||||
|
ClientApi.INSTANCE.showChatMessageNextFrame(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -122,14 +122,6 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
|
|||||||
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
|
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
|
||||||
this.serverApi.serverChunkLoadEvent(chunk, levelWrapper);
|
this.serverApi.serverChunkLoadEvent(chunk, levelWrapper);
|
||||||
}
|
}
|
||||||
@SubscribeEvent
|
|
||||||
public void serverChunkSaveEvent(ChunkEvent.Unload event)
|
|
||||||
{
|
|
||||||
ILevelWrapper levelWrapper = ProxyUtil.getLevelWrapper(GetEventLevel(event));
|
|
||||||
|
|
||||||
IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper);
|
|
||||||
this.serverApi.serverChunkSaveEvent(chunk, levelWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -120,7 +120,7 @@ public class MixinLevelRenderer
|
|||||||
|
|
||||||
|
|
||||||
float frameTime;
|
float frameTime;
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
frameTime = Minecraft.getInstance().getFrameTime();
|
frameTime = Minecraft.getInstance().getFrameTime();
|
||||||
#else
|
#else
|
||||||
frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks();
|
frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks();
|
||||||
|
|||||||
+2
-2
@@ -45,7 +45,7 @@ import org.spongepowered.asm.mixin.Final;
|
|||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
import net.minecraft.client.gui.screens.OptionsScreen;
|
import net.minecraft.client.gui.screens.OptionsScreen;
|
||||||
#else
|
#else
|
||||||
import net.minecraft.client.gui.screens.options.OptionsScreen;
|
import net.minecraft.client.gui.screens.options.OptionsScreen;
|
||||||
@@ -64,7 +64,7 @@ public class MixinOptionsScreen extends Screen
|
|||||||
/** Texture used for the config opening button */
|
/** Texture used for the config opening button */
|
||||||
@Unique
|
@Unique
|
||||||
private static final ResourceLocation ICON_TEXTURE =
|
private static final ResourceLocation ICON_TEXTURE =
|
||||||
#if MC_VER < MC_1_21
|
#if MC_VER < MC_1_21_1
|
||||||
new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
|
new ResourceLocation(ModInfo.ID, "textures/gui/button.png");
|
||||||
#else
|
#else
|
||||||
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/button.png");
|
ResourceLocation.fromNamespaceAndPath(ModInfo.ID, "textures/gui/button.png");
|
||||||
|
|||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
package com.seibel.distanthorizons.neoforge.mixins.server;
|
||||||
|
|
||||||
|
import com.seibel.distanthorizons.common.commonMixins.MixinChunkMapCommon;
|
||||||
|
import net.minecraft.server.level.ChunkMap;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@Mixin(ChunkMap.class)
|
||||||
|
public class MixinChunkMap
|
||||||
|
{
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private static final String CHUNK_SERIALIZER_WRITE
|
||||||
|
= "Lnet/minecraft/world/level/chunk/storage/ChunkSerializer;write(" +
|
||||||
|
"Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;)" +
|
||||||
|
"Lnet/minecraft/nbt/CompoundTag;";
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
ServerLevel level;
|
||||||
|
|
||||||
|
// firing at INVOKE causes issues with C2ME and is probably unnecessary since we
|
||||||
|
// don't need the chunk(s) before MC has finished saving them
|
||||||
|
@Inject(method = "save", at = @At(value = "RETURN", target = CHUNK_SERIALIZER_WRITE))
|
||||||
|
private void onChunkSave(ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci)
|
||||||
|
{ MixinChunkMapCommon.onChunkSave(this.level, chunk, ci); }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,7 +5,8 @@
|
|||||||
"mixins": [
|
"mixins": [
|
||||||
"server.MixinUtilBackgroundThread",
|
"server.MixinUtilBackgroundThread",
|
||||||
"server.MixinChunkGenerator",
|
"server.MixinChunkGenerator",
|
||||||
"server.MixinTFChunkGenerator"
|
"server.MixinTFChunkGenerator",
|
||||||
|
"server.MixinChunkMap"
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
"client.MixinClientPacketListener",
|
"client.MixinClientPacketListener",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# 1.21 version
|
# 1.21.1 version
|
||||||
java_version=21
|
java_version=21
|
||||||
minecraft_version=1.21
|
minecraft_version=1.21.1
|
||||||
parchment_version=1.20.6:2024.05.01
|
parchment_version=1.20.6:2024.05.01
|
||||||
compatible_minecraft_versions=["1.21.0"]
|
compatible_minecraft_versions=["1.21", "1.21.1"]
|
||||||
accessWidenerVersion=1_20_6
|
accessWidenerVersion=1_20_6
|
||||||
builds_for=fabric,neoforge
|
builds_for=fabric,neoforge
|
||||||
# forge is broken due to gradle/build script issues
|
# forge is broken due to gradle/build script issues
|
||||||
@@ -38,8 +38,8 @@ fabric_api_version=0.100.1+1.21
|
|||||||
enable_canvas=0
|
enable_canvas=0
|
||||||
|
|
||||||
# (Neo)Forge loader
|
# (Neo)Forge loader
|
||||||
forge_version=50.0.19
|
forge_version=
|
||||||
neoforge_version=21.0.4-beta
|
neoforge_version=21.1.6
|
||||||
# (Neo)Forge mod versions
|
# (Neo)Forge mod versions
|
||||||
starlight_version_forge=
|
starlight_version_forge=
|
||||||
terraforged_version=
|
terraforged_version=
|
||||||
Reference in New Issue
Block a user