Compare commits

..

26 Commits

Author SHA1 Message Date
s809 44cf6f6955 [skip ci] Incomplete instance based config 2024-09-20 19:49:26 +05:00
s809 00b69dcc68 Fix mixin crashes on 1.16.5 2024-09-18 01:06:06 +05:00
s809 cd74e33c54 Bump protocol version because of removed InvalidSectionPosException 2024-09-17 12:41:52 +05:00
s809 3f14e5dfa5 Fix naming of some things and comments 2024-09-17 09:48:15 +05:00
James Seibel 8c9e6ea79a Fix very high file handler jobs and pool some render data sources 2024-09-16 20:36:10 -05:00
James Seibel c71de31f57 Fix a few pre-processors blocked renamings 2024-09-16 19:37:34 -05:00
James Seibel ac869bf06e Up API version 3.0.1 -> 4.0.0 2024-09-15 21:16:24 -05:00
James Seibel 3175bc0439 Up version 2.2.2 -> 2.3.0 2024-09-15 21:16:13 -05:00
James Seibel 23ac6ec957 merge server side and minor refactoring 2024-09-15 21:15:40 -05:00
James Seibel f080a59b41 Add netty leak detection and server/client folder separation 2024-09-11 17:38:02 -05:00
James Seibel 603200ed8b only log git info on startup in dev builds 2024-09-11 17:19:33 -05:00
James Seibel b0774052a0 add default intellij gradle run scripts 2024-09-11 17:12:34 -05:00
James Seibel 7e163ce626 Add ILevelWrapper.getDimensionName() 2024-09-11 07:18:57 -05:00
James Seibel d19654cf15 Remove unneeded ChunkWrapper lighting checks 2024-09-10 07:35:02 -05:00
James Seibel 838d8be08b minor refactoring and style cleanup 2024-09-10 07:29:42 -05:00
James Seibel 2de82b1223 Add Netty to the build script 2024-09-10 06:55:40 -05:00
James Seibel 650012fb08 allow CI/CD to auto retry if there was a system failure 2024-09-10 06:53:06 -05:00
James Seibel a1ef3466ad Add test scripts folder 2024-09-10 06:52:21 -05:00
James Seibel 97421feb33 Add Oculus 1.7 to the list of incompatible fabric mods 2024-09-09 07:43:24 -05:00
James Seibel 0c90af6515 Fix low quality LODs not loading when flying in a new straight line 2024-09-09 07:41:20 -05:00
James Seibel 9cebd0298c add brown mushrooms to the list of ignored blocks to fix swamp issues 2024-09-07 14:22:45 -05:00
James Seibel 9afcddca4f Add faster sky light engine from Builderb0y
Closes !67
2024-09-07 12:07:59 -05:00
James Seibel 02fb7eedba Add missing LightingTestChunkWrapper methods 2024-09-06 21:55:55 -05:00
James Seibel 4aa9bec15c Fix unit test compiling 2024-09-06 19:36:41 -05:00
James Seibel a6eeaa5b3e Closes #805 (Hide "Distant Horizons overloaded")
Also update chunks closest to the player first
2024-09-06 18:23:04 -05:00
James Seibel c462325ce6 Add BuilderB0y's getBlockState optimization 2024-09-05 07:50:25 -05:00
70 changed files with 485 additions and 628 deletions
+2 -2
View File
@@ -538,7 +538,7 @@ ij_groovy_wrap_chain_calls_after_dot = false
ij_groovy_wrap_long_lines = false
[{*.har,*.json,*.png.mcmeta,mcmod.info,pack.mcmeta}]
indent_size = 2
indent_size = 4
ij_json_array_wrapping = split_into_lines
ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false
@@ -688,7 +688,7 @@ ij_markdown_wrap_text_inside_blockquotes = true
ij_toml_keep_indents_on_empty_lines = false
[{*.yaml,*.yml}]
indent_size = 2
indent_size = 4
ij_yaml_align_values_properties = do_not_align
ij_yaml_autoinsert_sequence_marker = true
ij_yaml_block_mapping_on_new_line = false
+3 -3
View File
@@ -18,7 +18,7 @@ variables:
.build_java:
#image: eclipse-temurin:17
cache:
key: "gradleCache_$CI_JOB_NAME_SLUG"
key: "gradleCache"
policy: pull-push
paths:
- .gradle
@@ -68,7 +68,7 @@ build:
extends: .build_java
.api:
api:
stage: api
needs: []
script:
@@ -92,7 +92,7 @@ build:
# generate and publish API javadocs
.pages:
pages:
stage: pages
needs: []
script:
+1 -1
View File
@@ -329,7 +329,7 @@ subprojects { p ->
"META-INF/neoforge.mods.toml",
// The mixins for each of the loaders
"DistantHorizons." + p.name + ".fabricLike.mixins.json"
"DistantHorizons."+ p.name +".fabricLike.mixins.json"
]
def intoTargets = ["$buildDir/resources/main/"] // Location of the built resources folder
+4 -3
View File
@@ -5,6 +5,7 @@
echo ==================== Note: All build jars will be in the folder called 'buildAllJars' ====================
mkdir buildAllJars
del buildAllJars/*
@rem Loop trough everything in the version properties folder
for %%f in (versionProperties\*) do (
@@ -13,11 +14,11 @@ for %%f in (versionProperties\*) do (
@rem Clean out the folders, build it, and merge it
echo ==================== Cleaning workspace to build !version! ====================
call .\gradlew.bat clean -PmcVer="!version!" --no-daemon
call .\gradlew.bat clean -PmcVer="!version!"
echo ==================== Building !version! ====================
call .\gradlew.bat build -PmcVer="!version!" --no-daemon
call .\gradlew.bat build -PmcVer="!version!"
echo ==================== Merging !version! ====================
call .\gradlew.bat mergeJars -PmcVer="!version!" --no-daemon
call .\gradlew.bat mergeJars -PmcVer="!version!"
echo ==================== Moving jar ====================
move Merged\*.jar buildAllJars\
)
+9 -7
View File
@@ -1,10 +1,11 @@
buildscript {
configurations.configureEach {
resolutionStrategy {
force 'org.spongepowered:vanillagradle:0.2.1-20240507.024226-82'
}
}
}
// TODO can this be removed?
//buildscript {
// configurations.configureEach {
// resolutionStrategy {
// force 'org.spongepowered:vanillagradle:0.2.1-20240507.024226-82'
// }
// }
//}
// temporary fix for broken spongepowered version
buildscript {
@@ -43,3 +44,4 @@ publishing {
// Add repositories to publish to here.
}
}
@@ -8,7 +8,7 @@ import com.mojang.brigadier.context.CommandContext;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeDhInitEvent;
import com.seibel.distanthorizons.common.wrappers.DependencySetup;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftServerWrapper;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.core.api.internal.SharedApi;
import com.seibel.distanthorizons.core.config.Config;
@@ -20,11 +20,9 @@ import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.jar.ModJarInfo;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.network.messages.MessageRegistry;
import com.seibel.distanthorizons.core.network.messages.base.CodecCrashMessage;
import com.seibel.distanthorizons.core.util.objects.Pair;
import com.seibel.distanthorizons.core.world.DhServerWorld;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModAccessor;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector;
@@ -44,7 +42,7 @@ import java.util.function.Supplier;
import static com.mojang.brigadier.arguments.DoubleArgumentType.doubleArg;
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
import static com.seibel.distanthorizons.core.network.messages.MessageRegistry.DEBUG_ENABLE_CODEC_CRASH_MESSAGE;
import static com.seibel.distanthorizons.core.network.messages.MessageRegistry.DEBUG_CODEC_CRASH_MESSAGE;
import static net.minecraft.commands.Commands.argument;
import static net.minecraft.commands.Commands.literal;
@@ -95,7 +93,7 @@ public abstract class AbstractModInitializer
ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null);
this.startup();
this.printModInfo();
this.logBuildInfo();
this.createClientProxy().registerEvents();
this.createServerProxy(false).registerEvents();
@@ -119,7 +117,7 @@ public abstract class AbstractModInitializer
ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null);
this.startup();
this.printModInfo();
this.logBuildInfo();
// This prevents returning uninitialized Config values,
// resulting from a circular reference mid-initialization in a static class
@@ -137,7 +135,7 @@ public abstract class AbstractModInitializer
this.subscribeServerStartingEvent(server ->
{
MinecraftDedicatedServerWrapper.INSTANCE.dedicatedServer = (DedicatedServer)server;
MinecraftServerWrapper.INSTANCE.dedicatedServer = (DedicatedServer)server;
this.initConfig();
this.postInit();
@@ -160,14 +158,17 @@ public abstract class AbstractModInitializer
this.createInitialBindings();
}
private void printModInfo()
private void logBuildInfo()
{
LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION);
// Useful for dev builds
LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch);
LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit);
LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source);
// if the build is stable the branch/commit/etc shouldn't be needed
if (ModInfo.IS_DEV_BUILD)
{
LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch);
LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit);
LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source);
}
}
protected <T extends IModAccessor> void tryCreateModCompatAccessor(String modId, Class<? super T> accessorClass, Supplier<T> accessorConstructor)
@@ -215,10 +216,10 @@ public abstract class AbstractModInitializer
Function<
Function<CommandContext<CommandSourceStack>, Object>,
Command<CommandSourceStack>
> makeConfigUpdater = getter -> c -> {
Object value = getter.apply(c);
> makeConfigUpdater = (getter) -> (commandContext) -> {
Object value = getter.apply(commandContext);
c.getSource().sendSuccess(
commandContext.getSource().sendSuccess(
#if MC_VER >= MC_1_20_1
() -> Component.literal("Changed the value of "+configEntry.getServersideShortName()+" to "+value),
#elif MC_VER >= MC_1_19_2
@@ -232,13 +233,13 @@ public abstract class AbstractModInitializer
};
LiteralArgumentBuilder<CommandSourceStack> subcommand = literal(configEntry.getServersideShortName())
.executes(c -> {
.executes((commandContext) -> {
#if MC_VER >= MC_1_20_1
c.getSource().sendSuccess(() -> Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
commandContext.getSource().sendSuccess(() -> Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
#elif MC_VER >= MC_1_19_2
c.getSource().sendSuccess(Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
commandContext.getSource().sendSuccess(Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
#else // < 1.19.2
c.getSource().sendSuccess(new TranslatableComponent("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
commandContext.getSource().sendSuccess(new TranslatableComponent("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true);
#endif
return 1;
});
@@ -292,7 +293,7 @@ public abstract class AbstractModInitializer
this.commandDispatcher.register(builder);
if (DEBUG_ENABLE_CODEC_CRASH_MESSAGE)
if (DEBUG_CODEC_CRASH_MESSAGE)
{
LiteralArgumentBuilder<CommandSourceStack> dhcrash = literal("dhcrash")
.requires(source -> source.hasPermission(4))
@@ -305,7 +306,7 @@ public abstract class AbstractModInitializer
#else
.getConnectedPlayer(ServerPlayerWrapper.getWrapper(Objects.requireNonNull(c.getSource().getPlayerOrException())))
#endif
.session.sendMessage(new CodecCrashMessage(CodecCrashMessage.ECrashPhase.ENCODE));
.networkSession.sendMessage(new CodecCrashMessage(CodecCrashMessage.ECrashPhase.ENCODE));
return 1;
}))
.then(literal("decode")
@@ -317,7 +318,7 @@ public abstract class AbstractModInitializer
#else
.getConnectedPlayer(ServerPlayerWrapper.getWrapper(Objects.requireNonNull(c.getSource().getPlayerOrException())))
#endif
.session.sendMessage(new CodecCrashMessage(CodecCrashMessage.ECrashPhase.DECODE));
.networkSession.sendMessage(new CodecCrashMessage(CodecCrashMessage.ECrashPhase.DECODE));
return 1;
}));
this.commandDispatcher.register(dhcrash);
@@ -2,10 +2,10 @@ package com.seibel.distanthorizons.common;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.logging.ConfigBasedLogger;
import com.seibel.distanthorizons.core.network.event.internal.IncompatibleMessageEvent;
import com.seibel.distanthorizons.core.network.event.internal.ProtocolErrorEvent;
import com.seibel.distanthorizons.core.network.event.internal.IncompatibleMessageInternalEvent;
import com.seibel.distanthorizons.core.network.event.internal.ProtocolErrorInternalEvent;
import com.seibel.distanthorizons.core.network.messages.MessageRegistry;
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import com.seibel.distanthorizons.core.network.messages.base.CloseReasonMessage;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
@@ -33,19 +33,18 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender
@Override
public final void sendPluginPacketServer(IServerPlayerWrapper serverPlayer, NetworkMessage message)
public final void sendToClient(IServerPlayerWrapper serverPlayer, AbstractNetworkMessage message)
{
this.sendPluginPacketServer((ServerPlayer) serverPlayer.getWrappedMcObject(), message);
this.sendToClient((ServerPlayer) serverPlayer.getWrappedMcObject(), message);
}
public abstract void sendToClient(ServerPlayer serverPlayer, AbstractNetworkMessage message);
@Override
public abstract void sendPluginPacketClient(NetworkMessage message);
public abstract void sendPluginPacketServer(ServerPlayer serverPlayer, NetworkMessage message);
public abstract void sendToServer(AbstractNetworkMessage message);
@Nullable
public static NetworkMessage decodeMessage(FriendlyByteBuf in)
public static AbstractNetworkMessage decodeMessage(FriendlyByteBuf in)
{
NetworkMessage message = null;
AbstractNetworkMessage message = null;
try
{
@@ -54,7 +53,7 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender
int protocolVersion = in.readShort();
if (protocolVersion != ModInfo.PROTOCOL_VERSION)
{
return new IncompatibleMessageEvent(protocolVersion);
return new IncompatibleMessageInternalEvent(protocolVersion);
}
message = MessageRegistry.INSTANCE.createMessage(in.readUnsignedShort());
@@ -72,10 +71,10 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender
in.resetReaderIndex();
LOGGER.error("Failed to decode message", e);
LOGGER.error("Buffer: {}", in);
LOGGER.error("Buffer contents: [{}]", ByteBufUtil.hexDump(in));
LOGGER.error("Buffer: ["+in+"]");
LOGGER.error("Buffer contents: ["+ByteBufUtil.hexDump(in)+"]");
return new ProtocolErrorEvent(e, message, true);
return new ProtocolErrorInternalEvent(e, message, true);
}
finally
{
@@ -84,7 +83,7 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender
}
}
public static void encodeMessage(FriendlyByteBuf out, NetworkMessage message)
public static void encodeMessage(FriendlyByteBuf out, AbstractNetworkMessage message)
{
// This is intentionally unhandled, because errors related to this are unlikely to appear in wild
Objects.requireNonNull(message);
@@ -99,9 +98,9 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender
catch (Exception e)
{
LOGGER.error("Failed to encode message", e);
LOGGER.error("Message: {}", message);
LOGGER.error("Message: ["+message+"]");
message.getSession().tryHandleMessage(new ProtocolErrorEvent(e, message, false));
message.getSession().tryHandleMessage(new ProtocolErrorInternalEvent(e, message, false));
// Encode close reason message instead
out.resetWriterIndex();
@@ -2,25 +2,20 @@ package com.seibel.distanthorizons.common;
#if MC_VER >= MC_1_20_6
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public record CommonPacketPayload(
@Nullable NetworkMessage message
) implements CustomPacketPayload
public record CommonPacketPayload(@Nullable AbstractNetworkMessage message) implements CustomPacketPayload
{
public static final Type<CommonPacketPayload> TYPE = new Type<>(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE);
@NotNull
@Override
public Type<? extends CustomPacketPayload> type()
{
return TYPE;
}
public Type<? extends CustomPacketPayload> type() { return TYPE; }
public static class Codec implements StreamCodec<FriendlyByteBuf, CommonPacketPayload>
@@ -28,15 +23,11 @@ public record CommonPacketPayload(
@NotNull
@Override
public CommonPacketPayload decode(@NotNull FriendlyByteBuf in)
{
return new CommonPacketPayload(AbstractPluginPacketSender.decodeMessage(in));
}
{ return new CommonPacketPayload(AbstractPluginPacketSender.decodeMessage(in)); }
@Override
public void encode(@NotNull FriendlyByteBuf out, CommonPacketPayload payload)
{
AbstractPluginPacketSender.encodeMessage(out, payload.message());
}
{ AbstractPluginPacketSender.encodeMessage(out, payload.message()); }
}
@@ -22,7 +22,7 @@ package com.seibel.distanthorizons.common.wrappers;
import com.seibel.distanthorizons.common.wrappers.gui.ClassicConfigGUI;
import com.seibel.distanthorizons.common.wrappers.gui.LangWrapper;
import com.seibel.distanthorizons.common.wrappers.level.KeyedClientLevelManager;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftServerWrapper;
import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager;
import com.seibel.distanthorizons.core.wrapperInterfaces.config.IConfigGui;
import com.seibel.distanthorizons.core.wrapperInterfaces.config.ILangWrapper;
@@ -60,7 +60,7 @@ public class DependencySetup
//@Environment(EnvType.SERVER)
public static void createServerBindings()
{
SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftDedicatedServerWrapper.INSTANCE);
SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftServerWrapper.INSTANCE);
}
//@Environment(EnvType.CLIENT)
@@ -133,6 +133,26 @@ public class BlockStateWrapper implements IBlockStateWrapper
}
}
/**
* Can be faster than {@link BlockStateWrapper#fromBlockState(BlockState, ILevelWrapper)}
* in cases where the same block state is expected to be referenced multiple times.
*/
public static BlockStateWrapper fromBlockState(BlockState blockState, ILevelWrapper levelWrapper, IBlockStateWrapper guess)
{
BlockState guessBlockState = (guess == null || guess.isAir()) ? null : (BlockState) guess.getWrappedMcObject();
BlockState inputBlockState = (blockState == null || blockState.isAir()) ? null : blockState;
if (guess instanceof BlockStateWrapper guessWrapper
&& guessBlockState == inputBlockState)
{
return guessWrapper;
}
else
{
return fromBlockState(blockState, levelWrapper);
}
}
private BlockStateWrapper(BlockState blockState, ILevelWrapper levelWrapper)
{
this.blockState = blockState;
@@ -541,7 +561,8 @@ public class BlockStateWrapper implements IBlockStateWrapper
{
#if MC_VER > MC_1_17_1
Level level = (Level)Objects.requireNonNull(levelWrapper.getWrappedMcObject());
LodUtil.assertTrue(levelWrapper != null && levelWrapper.getWrappedMcObject() != null);
Level level = (Level)levelWrapper.getWrappedMcObject();
#endif
Block block;
@@ -21,6 +21,7 @@ package com.seibel.distanthorizons.common.wrappers.chunk;
import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper;
import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper;
import com.seibel.distanthorizons.common.wrappers.misc.MutableBlockPosWrapper;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject.DhLitWorldGenRegion;
import com.seibel.distanthorizons.core.api.internal.SharedApi;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
@@ -31,6 +32,7 @@ import com.seibel.distanthorizons.core.world.EWorldEnvironment;
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IMutableBlockPosWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
@@ -87,6 +89,7 @@ public class ChunkWrapper implements IChunkWrapper
/** can be used for interactions with the underlying chunk where creating new BlockPos objects could cause issues for the garbage collector. */
private static final ThreadLocal<BlockPos.MutableBlockPos> MUTABLE_BLOCK_POS_REF = ThreadLocal.withInitial(() -> new BlockPos.MutableBlockPos());
private static final ThreadLocal<MutableBlockPosWrapper> MUTABLE_BLOCK_POS_WRAPPER_REF = ThreadLocal.withInitial(() -> new MutableBlockPosWrapper());
private final ChunkAccess chunk;
@@ -94,7 +97,8 @@ public class ChunkWrapper implements IChunkWrapper
private final LevelReader lightSource;
private final ILevelWrapper wrappedLevel;
private boolean isDhLightCorrect = false;
private boolean isDhBlockLightCorrect = false;
private boolean isDhSkyLightCorrect = false;
/** only used when connected to a dedicated server */
private boolean isMcClientLightingCorrect = false;
@@ -103,26 +107,9 @@ public class ChunkWrapper implements IChunkWrapper
private ArrayList<DhBlockPos> blockLightPosList = null;
private boolean useDhLighting;
private int minNonEmptyHeight = Integer.MIN_VALUE;
private int maxNonEmptyHeight = Integer.MAX_VALUE;
private int blockBiomeHashCode = 0;
/**
* Due to vanilla `isClientLightReady()` not being designed for use by a non-render thread, it may return 'true'
* before the light engine has ticked, (right after all light changes is marked by the engine to be processed).
* To fix this, on client-only mode, we mixin-redirect the `isClientLightReady()` so that after the call, it will
* trigger a synchronous update of this flag here on all chunks that are wrapped. <br><br>
*
* Note: Using a static weak hash map to store the chunks that need to be updated, as instance of chunk wrapper
* can be duplicated, with same chunk instance. And the data stored here are all temporary, and thus will not be
* visible when a chunk is re-wrapped later. <br>
* (Also, thread safety done via a reader writer lock)
*/
private static final ConcurrentLinkedQueue<ChunkWrapper> chunksNeedingClientLightUpdating = new ConcurrentLinkedQueue<>();
//=============//
@@ -136,15 +123,6 @@ public class ChunkWrapper implements IChunkWrapper
this.wrappedLevel = wrappedLevel;
this.chunkPos = new DhChunkPos(chunk.getPos().x, chunk.getPos().z);
// TODO is this the best way to differentiate between when we are generating chunks and when MC gave us a chunk?
boolean isDhGeneratedChunk = (this.lightSource.getClass() == DhLitWorldGenRegion.class);
// MC loaded chunks should get their lighting from MC, DH generated chunks should get their lighting from DH
this.useDhLighting = isDhGeneratedChunk;
// FIXME +1 is to handle the fact that LodDataBuilder adds +1 to all block lighting calculations, also done in the relative position validator
if (SharedApi.getEnvironment() != EWorldEnvironment.Server_Only)
chunksNeedingClientLightUpdating.add(this);
}
@@ -301,6 +279,22 @@ public class ChunkWrapper implements IChunkWrapper
return BlockStateWrapper.fromBlockState(this.chunk.getBlockState(blockPos), this.wrappedLevel);
}
@Override
public IBlockStateWrapper getBlockState(int relX, int relY, int relZ, IMutableBlockPosWrapper mcBlockPos, IBlockStateWrapper guess)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, relY, relZ);
BlockPos.MutableBlockPos pos = (BlockPos.MutableBlockPos)mcBlockPos.getWrappedMcObject();
pos.setX(relX);
pos.setY(relY);
pos.setZ(relZ);
return BlockStateWrapper.fromBlockState(this.chunk.getBlockState(pos), this.wrappedLevel, guess);
}
@Override
public IMutableBlockPosWrapper getMutableBlockPosWrapper() { return MUTABLE_BLOCK_POS_WRAPPER_REF.get(); }
@Override
public DhChunkPos getChunkPos() { return this.chunkPos; }
@@ -332,44 +326,14 @@ public class ChunkWrapper implements IChunkWrapper
//==========//
@Override
public void setIsDhLightCorrect(boolean isDhLightCorrect) { this.isDhLightCorrect = isDhLightCorrect; }
public void setIsDhSkyLightCorrect(boolean isDhLightCorrect) { this.isDhSkyLightCorrect = isDhLightCorrect; }
@Override
public void setIsDhBlockLightCorrect(boolean isDhLightCorrect) { this.isDhBlockLightCorrect = isDhLightCorrect; }
@Override
public void setUseDhLighting(boolean useDhLighting) { this.useDhLighting = useDhLighting; }
public boolean isDhBlockLightingCorrect() { return this.isDhBlockLightCorrect; }
@Override
public boolean isLightCorrect()
{
if (this.useDhLighting)
{
return this.isDhLightCorrect;
}
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
return false; // MC's lighting engine doesn't work consistently enough to trust for 1.16 or 1.17
#else
if (this.chunk instanceof LevelChunk)
{
LevelChunk levelChunk = (LevelChunk) this.chunk;
if (levelChunk.getLevel().isClientSide())
{
// connected to a server
return this.isMcClientLightingCorrect;
}
else
{
// in a single player world
return this.chunk.isLightCorrect() && levelChunk.loaded;
}
}
else
{
// called when in a single player world and the chunk is a proto chunk (in world gen, and not active)
return this.chunk.isLightCorrect();
}
#endif
}
public boolean isDhSkyLightCorrect() { return this.isDhSkyLightCorrect; }
@Override
@@ -424,44 +388,6 @@ public class ChunkWrapper implements IChunkWrapper
public void setSkyLightStorage(ChunkLightStorage lightStorage) { this.skyLightStorage = lightStorage; }
@Override
public int getBlockLight(int relX, int y, int relZ)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
// use the full lighting engine when the chunks are within render distance or the config requests it
if (this.useDhLighting)
{
// DH lighting method
return this.getBlockLightStorage().get(relX, y, relZ);
}
else
{
// note: this returns 0 if the chunk is unload
// MC lighting method
return this.lightSource.getBrightness(LightLayer.BLOCK, new BlockPos(relX + this.getMinBlockX(), y, relZ + this.getMinBlockZ()));
}
}
@Override
public int getSkyLight(int relX, int y, int relZ)
{
this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, y, relZ);
// use the full lighting engine when the chunks are within render distance or the config requests it
if (this.useDhLighting)
{
// DH lighting method
return this.getSkyLightStorage().get(relX, y, relZ);
}
else
{
// MC lighting method
return this.lightSource.getBrightness(LightLayer.SKY, new BlockPos(relX + this.getMinBlockX(), y, relZ + this.getMinBlockZ()));
}
}
/**
* FIXME synchronized is necessary for a rare issue where this method is called from two separate threads at the same time
* before the list has finished populating.
@@ -497,63 +423,6 @@ public class ChunkWrapper implements IChunkWrapper
return this.blockLightPosList;
}
public static void syncedUpdateClientLightStatus()
{
#if MC_VER < MC_1_18_2
// TODO: Check what to do in 1.18.1 and older
// since we don't currently handle this list,
// clear it to prevent memory leaks
chunksNeedingClientLightUpdating.clear();
#else
// update the chunks client lighting
ChunkWrapper chunkWrapper = chunksNeedingClientLightUpdating.poll();
while (chunkWrapper != null)
{
chunkWrapper.updateIsClientLightingCorrect();
chunkWrapper = chunksNeedingClientLightUpdating.poll();
}
#endif
}
/** Should be called after client light updates are triggered. */
private void updateIsClientLightingCorrect()
{
if (this.chunk instanceof LevelChunk && ((LevelChunk) this.chunk).getLevel() instanceof ClientLevel)
{
LevelChunk levelChunk = (LevelChunk) this.chunk;
ClientChunkCache clientChunkCache = ((ClientLevel) levelChunk.getLevel()).getChunkSource();
this.isMcClientLightingCorrect = clientChunkCache.getChunkForLighting(this.chunk.getPos().x, this.chunk.getPos().z) != null &&
#if MC_VER <= MC_1_17_1
levelChunk.isLightCorrect();
#elif MC_VER < MC_1_20_1
levelChunk.isClientLightReady();
#else
checkLightSectionsOnChunk(levelChunk, levelChunk.getLevel().getLightEngine());
#endif
}
}
#if MC_VER >= MC_1_20_1
private static boolean checkLightSectionsOnChunk(LevelChunk chunk, LevelLightEngine engine)
{
LevelChunkSection[] sections = chunk.getSections();
int minY = chunk.getMinSection();
int maxY = chunk.getMaxSection();
for (int y = minY; y < maxY; ++y)
{
LevelChunkSection section = sections[chunk.getSectionIndexFromSectionY(y)];
if (section.hasOnlyAir()) continue;
if (!engine.lightOnInSection(SectionPos.of(chunk.getPos(), y)))
{
return false;
}
}
return true;
}
#endif
//===============//
@@ -13,7 +13,6 @@ public class KeyedClientLevelManager implements IKeyedClientLevelManager
/** This is set and managed by the ClientApi for servers with support for DH. */
@Nullable
private IServerKeyedClientLevel serverKeyedLevel = null;
private boolean enabled = false;
@@ -29,39 +28,21 @@ public class KeyedClientLevelManager implements IKeyedClientLevelManager
// level override logic //
//======================//
@Override
@Nullable
public IServerKeyedClientLevel getServerKeyedLevel()
{
return this.serverKeyedLevel;
}
public IServerKeyedClientLevel getServerKeyedLevel() { return this.serverKeyedLevel; }
@Override
public IServerKeyedClientLevel setServerKeyedLevel(IClientLevelWrapper clientLevel, String levelKey)
{
IServerKeyedClientLevel keyedLevel = new ServerKeyedClientLevel((ClientLevel) clientLevel.getWrappedMcObject(), levelKey);
this.serverKeyedLevel = keyedLevel;
this.enabled = true;
return keyedLevel;
}
@Override
public void clearServerKeyedLevel()
{
this.serverKeyedLevel = null;
}
public void clearKeyedLevel() { this.serverKeyedLevel = null; }
@Override
public boolean isEnabled()
{
return this.enabled;
}
@Override
public void disable()
{
this.enabled = false;
}
public boolean hasLevelSet() { return this.serverKeyedLevel != null; }
}
@@ -18,11 +18,7 @@ public class ServerKeyedClientLevel extends ClientLevelWrapper implements IServe
@Override
public String getServerLevelKey() { return this.serverLevelKey; }
@Override
public String getDimensionName()
{
return this.getServerLevelKey();
}
public String getDimensionName() { return this.getServerLevelKey(); }
}
@@ -54,7 +54,6 @@ import net.minecraft.network.chat.TextComponent;
#endif
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.ChunkPos;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;
@@ -222,14 +221,11 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Nullable
@Override
public IClientLevelWrapper getWrappedClientLevel()
{
return this.getWrappedClientLevel(false);
}
public IClientLevelWrapper getWrappedClientLevel() { return this.getWrappedClientLevel(false); }
@Override
@Nullable
public IClientLevelWrapper getWrappedClientLevel(boolean bypassMultiverse)
public IClientLevelWrapper getWrappedClientLevel(boolean bypassLevelKeyManager)
{
ClientLevel level = MINECRAFT.level;
if (level == null)
@@ -237,7 +233,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
return null;
}
return ClientLevelWrapper.getWrapper(level, bypassMultiverse);
return ClientLevelWrapper.getWrapper(level, bypassLevelKeyManager);
}
@Override
@@ -320,9 +316,6 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
public void executeOnRenderThread(Runnable runnable) { MINECRAFT.execute(runnable); }
@Override
public boolean isWorldInitialized()
{
throw new NotImplementedException("TODO");
}
public boolean isWorldNew() { throw new UnsupportedOperationException("Not Implemented"); }
}
@@ -6,19 +6,34 @@ import net.minecraft.server.dedicated.DedicatedServer;
import java.io.File;
//@Environment(EnvType.SERVER)
public class MinecraftDedicatedServerWrapper implements IMinecraftSharedWrapper
public class MinecraftServerWrapper implements IMinecraftSharedWrapper
{
public static final MinecraftDedicatedServerWrapper INSTANCE = new MinecraftDedicatedServerWrapper();
private MinecraftDedicatedServerWrapper() { }
public static final MinecraftServerWrapper INSTANCE = new MinecraftServerWrapper();
public DedicatedServer dedicatedServer = null;
//=============//
// constructor //
//=============//
private MinecraftServerWrapper() { }
//=========//
// methods //
//=========//
@Override
public boolean isDedicatedServer() { return true; }
@Override
public File getInstallationDirectory()
{
if (this.dedicatedServer == null)
{
throw new IllegalStateException("Trying to get Installation Direction before Dedicated server complete initialization!");
throw new IllegalStateException("Trying to get Installation Direction before Dedicated server completed initialization!");
}
#if MC_VER < MC_1_21_1
@@ -29,9 +44,7 @@ public class MinecraftDedicatedServerWrapper implements IMinecraftSharedWrapper
}
@Override
public boolean isWorldInitialized()
{
return this.dedicatedServer.getWorldData().overworldData().isInitialized();
}
public boolean isWorldNew()
{ return this.dedicatedServer.getWorldData().overworldData().isInitialized(); }
}
@@ -8,4 +8,8 @@ public interface IMixinServerPlayer
@Nullable
ServerLevel distantHorizons$getDimensionChangeDestination();
#if MC_VER == MC_1_16_5
void distantHorizons$setDimensionChangeDestination(ServerLevel dimensionChangeDestination);
#endif
}
@@ -0,0 +1,30 @@
package com.seibel.distanthorizons.common.wrappers.misc;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IMutableBlockPosWrapper;
import net.minecraft.core.BlockPos;
public class MutableBlockPosWrapper implements IMutableBlockPosWrapper
{
public final BlockPos.MutableBlockPos pos;
//=============//
// constructor //
//=============//
public MutableBlockPosWrapper()
{
this.pos = new BlockPos.MutableBlockPos();
}
//===========//
// overrides //
//===========//
@Override
public Object getWrappedMcObject() { return this.pos; }
}
@@ -15,7 +15,7 @@ import java.net.SocketAddress;
import java.util.concurrent.ConcurrentMap;
/**
* This wrapper transparently ensures that underlying {@link ServerPlayer} is always valid,
* This wrapper transparently ensures that the underlying {@link ServerPlayer} is always valid,
* unless the player has disconnected.
*/
public class ServerPlayerWrapper implements IServerPlayerWrapper
@@ -23,38 +23,39 @@ public class ServerPlayerWrapper implements IServerPlayerWrapper
private static final ConcurrentMap<ServerGamePacketListenerImpl, ServerPlayerWrapper> serverPlayerWrapperMap = new MapMaker().weakKeys().weakValues().makeMap();
private final ServerGamePacketListenerImpl connection;
private ServerPlayer serverPlayer()
{
return this.connection.player;
}
//=============//
// constructor //
//=============//
public static ServerPlayerWrapper getWrapper(ServerPlayer serverPlayer)
{
return serverPlayerWrapperMap.computeIfAbsent(serverPlayer.connection, ignored -> new ServerPlayerWrapper(serverPlayer.connection));
}
{ return serverPlayerWrapperMap.computeIfAbsent(serverPlayer.connection, ignored -> new ServerPlayerWrapper(serverPlayer.connection)); }
private ServerPlayerWrapper(ServerGamePacketListenerImpl connection)
{
this.connection = connection;
}
private ServerPlayerWrapper(ServerGamePacketListenerImpl connection) { this.connection = connection; }
//=========//
// getters //
//=========//
private ServerPlayer getServerPlayer() { return this.connection.player; }
@Override
public String getName()
{
return this.serverPlayer().getName().getString();
}
public String getName() { return this.getServerPlayer().getName().getString(); }
@Override
public IServerLevelWrapper getLevel()
{
ServerLevel level = ((IMixinServerPlayer) this.serverPlayer()).distantHorizons$getDimensionChangeDestination();
ServerLevel level = ((IMixinServerPlayer) this.getServerPlayer()).distantHorizons$getDimensionChangeDestination();
if (level == null)
{
#if MC_VER < MC_1_20_1
level = this.serverPlayer().getLevel();
level = this.getServerPlayer().getLevel();
#else
level = this.serverPlayer().serverLevel();
level = this.getServerPlayer().serverLevel();
#endif
}
@@ -64,57 +65,51 @@ public class ServerPlayerWrapper implements IServerPlayerWrapper
@Override
public Vec3d getPosition()
{
Vec3 position = this.serverPlayer().position();
Vec3 position = this.getServerPlayer().position();
return new Vec3d(position.x, position.y, position.z);
}
@Override
public int getViewDistance()
{
return this.serverPlayer().server.getPlayerList().getViewDistance();
}
public int getViewDistance() { return this.getServerPlayer().server.getPlayerList().getViewDistance(); }
@Override
public SocketAddress getRemoteAddress()
{
#if MC_VER >= MC_1_19_4
return this.serverPlayer().connection.getRemoteAddress();
return this.getServerPlayer().connection.getRemoteAddress();
#else // < 1.19.4
return this.serverPlayer().connection.connection.getRemoteAddress();
return this.getServerPlayer().connection.connection.getRemoteAddress();
#endif
}
@Override
public Object getWrappedMcObject()
{
return this.serverPlayer();
}
//================//
// base overrides //
//================//
@Override
public String toString()
{
return "Wrapped{" + this.serverPlayer() + "}";
}
public Object getWrappedMcObject() { return this.getServerPlayer(); }
@Override
public boolean equals(Object o)
public String toString() { return "Wrapped{" + this.getServerPlayer() + "}"; }
@Override
public boolean equals(Object obj)
{
if (this == o)
if (this == obj)
{
return true;
}
if (!(o instanceof ServerPlayerWrapper))
if (!(obj instanceof ServerPlayerWrapper))
{
return false;
}
ServerPlayerWrapper that = (ServerPlayerWrapper) o;
ServerPlayerWrapper that = (ServerPlayerWrapper) obj;
return Objects.equal(this.connection, that.connection);
}
@Override
public int hashCode()
{
return Objects.hashCode(this.connection);
}
public int hashCode() { return Objects.hashCode(this.connection); }
}
@@ -70,10 +70,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper
// wrapper logic //
//===============//
public static IClientLevelWrapper getWrapper(@NotNull ClientLevel level)
{
return getWrapper(level, false);
}
public static IClientLevelWrapper getWrapper(@NotNull ClientLevel level) { return getWrapper(level, false); }
@Nullable
public static IClientLevelWrapper getWrapper(@Nullable ClientLevel level, boolean bypassLevelKeyManager)
@@ -189,10 +186,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper
@Override
public String getDimensionName()
{
return this.level.dimension().location().toString();
}
public String getDimensionName() { return this.level.dimension().location().toString(); }
@Override
public EDhApiLevelType getLevelType() { return EDhApiLevelType.CLIENT_LEVEL; }
@@ -65,11 +65,11 @@ public class DimensionTypeWrapper implements IDimensionTypeWrapper
private String getDimensionName()
{
#if MC_VER >= MC_1_17_1
return this.dimensionType.effectsLocation().getPath();
#else // < 1.17.1
#if MC_VER <= MC_1_16_5
// effectsLocation() is marked as client only, so using the backing field directly
return dimensionType.effectsLocation.getPath();
#else
return this.dimensionType.effectsLocation().getPath();
#endif
}
@@ -91,12 +91,6 @@ public class DimensionTypeWrapper implements IDimensionTypeWrapper
return this.dimensionType;
}
@Override
public double getTeleportationScale(IDimensionTypeWrapper to)
{
return DimensionType.getTeleportationScale(this.dimensionType, (DimensionType) to.getWrappedMcObject());
}
// there's definitely a better way of doing this, but it should work well enough for now
@Override
public boolean isTheEnd() { return this.getDimensionName().equalsIgnoreCase("the_end"); }
@@ -81,48 +81,27 @@ public class ServerLevelWrapper implements IServerLevelWrapper
//=========//
@Override
public File getSaveFolder()
{
return this.level.getChunkSource().getDataStorage().dataFolder;
}
public File getSaveFolder() { return this.level.getChunkSource().getDataStorage().dataFolder; }
@Override
public DimensionTypeWrapper getDimensionType()
{
return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType());
}
public DimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }
@Override
public String getDimensionName()
{
return this.level.dimension().location().toString();
}
public String getDimensionName() { return this.level.dimension().location().toString(); }
@Override
public EDhApiLevelType getLevelType() { return EDhApiLevelType.SERVER_LEVEL; }
public ServerLevel getLevel()
{
return this.level;
}
public ServerLevel getLevel() { return this.level; }
@Override
public boolean hasCeiling()
{
return this.level.dimensionType().hasCeiling();
}
public boolean hasCeiling() { return this.level.dimensionType().hasCeiling(); }
@Override
public boolean hasSkyLight()
{
return this.level.dimensionType().hasSkyLight();
}
public boolean hasSkyLight() { return this.level.dimensionType().hasSkyLight(); }
@Override
public int getMaxHeight()
{
return this.level.getHeight();
}
public int getMaxHeight() { return this.level.getHeight(); }
@Override
public int getMinHeight()
@@ -141,11 +120,13 @@ public class ServerLevelWrapper implements IServerLevelWrapper
{
return null;
}
ChunkAccess chunk = this.level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.FULL, false);
if (chunk == null)
{
return null;
}
return new ChunkWrapper(chunk, this.level, this);
}
@@ -134,7 +134,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
{
for (int i = 0; i < 11; i++)
{
times.add(new Rolling(SIZE));
this.times.add(new Rolling(SIZE));
}
}
@@ -144,19 +144,25 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
{
String name = e.name;
int index = Arrays.asList(TIME_NAMES).indexOf(name);
if (index == -1) continue;
times.get(index).add(e.timeNs);
if (index == -1)
{
continue;
}
this.times.get(index).add(e.timeNs);
}
times.get(0).add(event.getTotalTimeNs());
this.times.get(0).add(event.getTotalTimeNs());
}
public String toString()
@Override public String toString()
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < times.size(); i++)
for (int i = 0; i < this.times.size(); i++)
{
if (times.get(i).getAverage() == 0) continue;
sb.append(TIME_NAMES[i]).append(": ").append(times.get(i).getAverage()).append("\n");
if (this.times.get(i).getAverage() == 0)
{
continue;
}
sb.append(TIME_NAMES[i]).append(": ").append(this.times.get(i).getAverage()).append("\n");
}
return sb.toString();
}
@@ -186,13 +192,13 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
public RegionFileStorageExternalCache getOrCreateRegionFileCache(RegionFileStorage storage)
{
RegionFileStorageExternalCache cache = regionFileStorageCacheRef.get();
RegionFileStorageExternalCache cache = this.regionFileStorageCacheRef.get();
if (cache == null)
{
cache = new RegionFileStorageExternalCache(storage);
if (!regionFileStorageCacheRef.compareAndSet(null, cache))
if (!this.regionFileStorageCacheRef.compareAndSet(null, cache))
{
cache = regionFileStorageCacheRef.get();
cache = this.regionFileStorageCacheRef.get();
}
}
return cache;
@@ -304,17 +310,17 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
public <T> T joinSync(CompletableFuture<T> future)
{
if (!unsafeThreadingRecorded && !future.isDone())
if (!this.unsafeThreadingRecorded && !future.isDone())
{
EVENT_LOGGER.error("Unsafe MultiThreading in Chunk Generator: ", new RuntimeException("Concurrent future"));
EVENT_LOGGER.error("To increase stability, it is recommended to set world generation threads count to 1.");
unsafeThreadingRecorded = true;
this.unsafeThreadingRecorded = true;
}
return future.join();
}
public void updateAllFutures()
@Override public void updateAllFutures()
{
if (this.unknownExceptionCount > 0)
{
@@ -488,8 +494,8 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
{
chunkWrapper.setBlockLightStorage(chunkBlockLightingByDhPos.get(chunkWrapper.getChunkPos()));
chunkWrapper.setSkyLightStorage(chunkSkyLightingByDhPos.get(chunkWrapper.getChunkPos()));
chunkWrapper.setUseDhLighting(true);
chunkWrapper.setIsDhLightCorrect(true);
chunkWrapper.setIsDhBlockLightCorrect(true);
chunkWrapper.setIsDhSkyLightCorrect(true);
}
chunkWrappersByDhPos.put(chunkPos, chunkWrapper);
@@ -531,11 +537,6 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
#endif
}
if (!wrappedChunk.isLightCorrect())
{
throw new RuntimeException("The generated chunk somehow has isLightCorrect() returning false");
}
boolean isFull = ChunkWrapper.getStatus(target) == ChunkStatus.FULL || target instanceof LevelChunk;
#if MC_VER >= MC_1_18_2
boolean isPartial = target.isOldNoiseGeneration();
@@ -823,9 +824,9 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
Heightmap.primeHeightmaps(((ChunkWrapper)centerChunk).getChunk(), ChunkStatus.FEATURES.heightmapsAfter());
// pre-generated chunks should have lighting but new ones won't
if (!centerChunk.isLightCorrect())
if (!centerChunk.isDhBlockLightingCorrect())
{
DhLightingEngine.INSTANCE.lightChunk(centerChunk, iChunkWrapperList, maxSkyLight);
DhLightingEngine.INSTANCE.bakeChunkBlockLighting(centerChunk, iChunkWrapperList, maxSkyLight);
}
}
+2 -5
View File
@@ -5,17 +5,14 @@ plugins {
loom {
accessWidenerPath = project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")
// Custom logging
log4jConfigs.from(file("log4j-dev.xml"))
// "runs" isn't required, but when we do need it then it can be useful
runs {
client {
client()
setConfigName("Fabric Client")
ideConfigGenerated(true)
ideConfigGenerated(true) // When true a run configuration file will be generated for IDE's. By default only set to true for the root project.
runDir("../run/client")
vmArgs("-Dio.netty.leakDetection.level=advanced")
vmArgs("-Dio.netty.leakDetection.level=advanced") // https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels
programArgs("--username", "Dev")
}
server {
-11
View File
@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="Dev" monitorInterval="10">
<Loggers>
<Logger name="com.seibel.distanthorizons.core.network" level="trace" additivity="false">
<AppenderRef ref="DebugFile" level="${sys:fabric.log.debug.level:-debug}" />
<AppenderRef ref="SysOut" />
<AppenderRef ref="LatestFile" level="${sys:fabric.log.level:-info}" />
<AppenderRef ref="ServerGuiConsole" />
</Logger>
</Loggers>
</Configuration>
@@ -52,7 +52,7 @@ import net.minecraft.client.gui.screens.TitleScreen;
import com.seibel.distanthorizons.common.CommonPacketPayload;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
#else
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
#endif
#if MC_VER < MC_1_19_4
@@ -268,7 +268,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
{
// Forge packet ID
buffer.readByte();
NetworkMessage message = AbstractPluginPacketSender.decodeMessage(buffer);
AbstractNetworkMessage message = AbstractPluginPacketSender.decodeMessage(buffer);
if (message != null)
{
ClientApi.INSTANCE.pluginMessageReceived(message);
@@ -119,9 +119,12 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti
@Override
protected void subscribeRegisterCommandsEvent(Consumer<CommandDispatcher<CommandSourceStack>> eventHandler)
{
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess #if MC_VER >= MC_1_19_2 , environment #endif ) -> {
eventHandler.accept(dispatcher);
});
CommandRegistrationCallback.EVENT.register(
(dispatcher, registryAccess #if MC_VER >= MC_1_19_2 , environment #endif ) ->
{
eventHandler.accept(dispatcher);
}
);
}
@Override
@@ -1,7 +1,7 @@
package com.seibel.distanthorizons.fabric;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.server.level.ServerPlayer;
@@ -16,7 +16,7 @@ import net.minecraft.network.FriendlyByteBuf;
public class FabricPluginPacketSender extends AbstractPluginPacketSender
{
@Override
public void sendPluginPacketClient(NetworkMessage message)
public void sendToServer(AbstractNetworkMessage message)
{
#if MC_VER >= MC_1_20_6
ClientPlayNetworking.send(new CommonPacketPayload(message));
@@ -30,7 +30,7 @@ public class FabricPluginPacketSender extends AbstractPluginPacketSender
}
@Override
public void sendPluginPacketServer(ServerPlayer serverPlayer, NetworkMessage message)
public void sendToClient(ServerPlayer serverPlayer, AbstractNetworkMessage message)
{
#if MC_VER >= MC_1_20_6
ServerPlayNetworking.send(serverPlayer, new CommonPacketPayload(message));
@@ -31,7 +31,7 @@ import org.apache.logging.log4j.Logger;
import com.seibel.distanthorizons.common.CommonPacketPayload;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
#else
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
#endif
@@ -50,21 +50,26 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
private static final ServerApi SERVER_API = ServerApi.INSTANCE;
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private final boolean isDedicated;
private final boolean isDedicatedServer;
public static Supplier<Boolean> isGenerationThreadChecker = null;
public FabricServerProxy(boolean isDedicated)
//=============//
// constructor //
//=============//
public FabricServerProxy(boolean isDedicatedServer)
{
this.isDedicated = isDedicated;
this.isDedicatedServer = isDedicatedServer;
}
// TODO rename
private boolean isValidTime()
{
if (this.isDedicated)
if (this.isDedicatedServer)
{
return true;
}
@@ -103,7 +108,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
{
if (this.isValidTime())
{
ServerApi.INSTANCE.serverLoadEvent(this.isDedicated);
ServerApi.INSTANCE.serverLoadEvent(this.isDedicatedServer);
}
});
// ServerWorldUnloadEvent
@@ -159,19 +164,19 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
ServerApi.INSTANCE.serverPlayerDisconnectEvent(this.getServerPlayerWrapper(handler.player));
}
});
ServerEntityWorldChangeEvents.AFTER_PLAYER_CHANGE_WORLD.register((player, origin, dest) ->
ServerEntityWorldChangeEvents.AFTER_PLAYER_CHANGE_WORLD.register((player, originLevel, destinationLevel) ->
{
if (this.isValidTime())
{
ServerApi.INSTANCE.serverPlayerLevelChangeEvent(
this.getServerPlayerWrapper(player),
this.getServerLevelWrapper(origin),
this.getServerLevelWrapper(dest)
this.getServerLevelWrapper(originLevel),
this.getServerLevelWrapper(destinationLevel)
);
}
});
if (this.isDedicated)
if (this.isDedicatedServer)
{
#if MC_VER >= MC_1_20_6
PayloadTypeRegistry.playC2S().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec());
@@ -189,7 +194,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy
{
// Forge packet ID
buffer.readByte();
NetworkMessage message = AbstractPluginPacketSender.decodeMessage(buffer);
AbstractNetworkMessage message = AbstractPluginPacketSender.decodeMessage(buffer);
if (message != null)
{
ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(serverPlayer), message);
@@ -131,22 +131,4 @@ public class MixinLevelRenderer
}
}
#if MC_VER < MC_1_19_4
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#elif MC_VER < MC_1_20_1
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#elif MC_VER < MC_1_20_6
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
private void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#else
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
private void callAfterRunUpdates(CallbackInfo ci)
#endif
{
ChunkWrapper.syncedUpdateClientLightStatus();
}
}
@@ -130,10 +130,12 @@ public abstract class MixinMinecraft
{
ClientApi.INSTANCE.clientLevelUnloadEvent(ClientLevelWrapper.getWrapper(this.lastLevel));
}
if (level != null)
{
ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(level, true));
}
this.lastLevel = level;
}
@@ -0,0 +1,38 @@
#if MC_VER == MC_1_16_5
package com.seibel.distanthorizons.fabric.mixins.server;
import com.seibel.distanthorizons.common.wrappers.misc.IMixinServerPlayer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Entity.class)
public class MixinEntity
{
@Inject(at = @At("TAIL"), method = "setLevel")
public void setLevel(Level level, CallbackInfo ci)
{
if (this instanceof IMixinServerPlayer)
{
((IMixinServerPlayer) this).distantHorizons$setDimensionChangeDestination((ServerLevel) level);
}
}
}
#else
package com.seibel.distanthorizons.fabric.mixins.server;
import net.minecraft.world.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(Entity.class)
public class MixinEntity
{
}
#endif
@@ -46,32 +46,31 @@ public class MixinServerPlayer implements IMixinServerPlayer
@Override
@Nullable
public ServerLevel distantHorizons$getDimensionChangeDestination()
{
return this.dimensionChangeDestination;
}
{ return this.dimensionChangeDestination; }
#if MC_VER == MC_1_16_5
@Override
public void distantHorizons$setDimensionChangeDestination(ServerLevel dimensionChangeDestination)
{ this.dimensionChangeDestination = dimensionChangeDestination; }
#endif
@Inject(at = @At("HEAD"), method = "changeDimension")
#if MC_VER >= MC_1_21_1
public void changeDimension(DimensionTransition dimensionTransition, CallbackInfoReturnable<Entity> cir)
{
this.dimensionChangeDestination = dimensionTransition.newLevel();
}
{ this.dimensionChangeDestination = dimensionTransition.newLevel(); }
#else
public void changeDimension(ServerLevel destination, CallbackInfoReturnable<Entity> cir)
{
this.dimensionChangeDestination = destination;
}
{ this.dimensionChangeDestination = destination; }
#endif
#if MC_VER >= MC_1_20_1
@Inject(at = @At("RETURN"), method = "setServerLevel")
public void setServerLevel(ServerLevel level, CallbackInfo ci)
#else
{ this.dimensionChangeDestination = null; }
#elif MC_VER >= MC_1_17_1
@Inject(at = @At("RETURN"), method = "setLevel")
public void setLevel(ServerLevel level, CallbackInfo ci)
{ this.dimensionChangeDestination = null; }
#endif
{
this.dimensionChangeDestination = null;
}
}
@@ -6,7 +6,8 @@
"server.MixinChunkGenerator",
"server.MixinChunkMap",
"server.MixinUtilBackgroundThread",
"server.MixinServerPlayer"
"server.MixinServerPlayer",
"server.MixinEntity"
],
"client": [
"client.MixinClientLevel",
+2 -2
View File
@@ -37,9 +37,9 @@ loom {
client {
client()
setConfigName("Forge Client")
ideConfigGenerated(false)
ideConfigGenerated(false) // When true a run configuration file will be generated for IDE's. By default only set to true for the root project.
runDir("../run/client")
vmArgs("-Dio.netty.leakDetection.level=advanced")
vmArgs("-Dio.netty.leakDetection.level=advanced") // https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels
programArgs("--username", "Dev")
}
server {
@@ -297,4 +297,5 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
}
}
}
@@ -2,7 +2,7 @@ package com.seibel.distanthorizons.forge;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import net.minecraft.server.level.ServerPlayer;
@@ -45,11 +45,11 @@ public class ForgePluginPacketSender extends AbstractPluginPacketSender
);
#endif
public static void setPacketHandler(Consumer<NetworkMessage> consumer)
public static void setPacketHandler(Consumer<AbstractNetworkMessage> consumer)
{
setPacketHandler((player, message) -> consumer.accept(message));
}
public static void setPacketHandler(BiConsumer<IServerPlayerWrapper, NetworkMessage> consumer)
public static void setPacketHandler(BiConsumer<IServerPlayerWrapper, AbstractNetworkMessage> consumer)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.messageBuilder(MessageWrapper.class, 0)
@@ -95,7 +95,7 @@ public class ForgePluginPacketSender extends AbstractPluginPacketSender
}
@Override
public void sendPluginPacketClient(NetworkMessage message)
public void sendToServer(AbstractNetworkMessage message)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.send(new MessageWrapper(message), PacketDistributor.SERVER.noArg());
@@ -105,7 +105,7 @@ public class ForgePluginPacketSender extends AbstractPluginPacketSender
}
@Override
public void sendPluginPacketServer(ServerPlayer serverPlayer, NetworkMessage message)
public void sendToClient(ServerPlayer serverPlayer, AbstractNetworkMessage message)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.send(new MessageWrapper(message), PacketDistributor.PLAYER.with(serverPlayer));
@@ -118,12 +118,9 @@ public class ForgePluginPacketSender extends AbstractPluginPacketSender
@SuppressWarnings({"ClassCanBeRecord", "RedundantSuppression"})
public static class MessageWrapper
{
public final NetworkMessage message;
public final AbstractNetworkMessage message;
public MessageWrapper(NetworkMessage message)
{
this.message = message;
}
public MessageWrapper(AbstractNetworkMessage message) { this.message = message; }
}
@@ -154,14 +154,10 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
@SubscribeEvent
public void playerLoggedInEvent(PlayerEvent.PlayerLoggedInEvent event)
{
this.serverApi.serverPlayerJoinEvent(getServerPlayerWrapper(event));
}
{ this.serverApi.serverPlayerJoinEvent(getServerPlayerWrapper(event)); }
@SubscribeEvent
public void playerLoggedOutEvent(PlayerEvent.PlayerLoggedOutEvent event)
{
this.serverApi.serverPlayerDisconnectEvent(getServerPlayerWrapper(event));
}
{ this.serverApi.serverPlayerDisconnectEvent(getServerPlayerWrapper(event)); }
@SubscribeEvent
public void playerChangedDimensionEvent(PlayerEvent.PlayerChangedDimensionEvent event)
{
@@ -158,18 +158,4 @@ public class MixinLevelRenderer
}
}
#if MC_VER < MC_1_19_4
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#elif MC_VER < MC_1_20_1
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#else
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
private void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#endif
{
ChunkWrapper.syncedUpdateClientLightStatus();
}
}
@@ -2,8 +2,6 @@ package com.seibel.distanthorizons.forge.mixins.client;
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
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.jar.installer.GitlabGetter;
@@ -13,9 +11,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.multiplayer.ClientLevel;
import org.spongepowered.asm.mixin.Mixin;
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.Redirect;
@@ -0,0 +1,39 @@
#if MC_VER == MC_1_16_5
package com.seibel.distanthorizons.forge.mixins.server;
import com.seibel.distanthorizons.common.wrappers.misc.IMixinServerPlayer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Entity.class)
public class MixinEntity
{
@Inject(at = @At("TAIL"), method = "setLevel")
public void setLevel(Level level, CallbackInfo ci)
{
if (this instanceof IMixinServerPlayer)
{
((IMixinServerPlayer) this).distantHorizons$setDimensionChangeDestination((ServerLevel) level);
}
}
}
#else
package com.seibel.distanthorizons.forge.mixins.server;
import net.minecraft.world.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(Entity.class)
public class MixinEntity
{
}
#endif
@@ -43,25 +43,26 @@ public class MixinServerPlayer implements IMixinServerPlayer
@Override
@Nullable
public ServerLevel distantHorizons$getDimensionChangeDestination()
{
return this.distantHorizons$dimensionChangeDestination;
}
{ return this.distantHorizons$dimensionChangeDestination; }
#if MC_VER == MC_1_16_5
@Override
public void distantHorizons$setDimensionChangeDestination(ServerLevel dimensionChangeDestination)
{ this.distantHorizons$dimensionChangeDestination = dimensionChangeDestination; }
#endif
@Inject(at = @At("HEAD"), method = "changeDimension", remap = false)
public void changeDimension(ServerLevel destination, ITeleporter teleporter, CallbackInfoReturnable<Entity> cir)
{
this.distantHorizons$dimensionChangeDestination = destination;
}
{ this.distantHorizons$dimensionChangeDestination = destination; }
#if MC_VER >= MC_1_20_1
@Inject(at = @At("RETURN"), method = "setServerLevel")
public void setServerLevel(ServerLevel level, CallbackInfo ci)
#else
{ this.distantHorizons$dimensionChangeDestination = null; }
#elif MC_VER >= MC_1_17_1
@Inject(at = @At("RETURN"), method = "setLevel")
public void setLevel(ServerLevel level, CallbackInfo ci)
{ this.distantHorizons$dimensionChangeDestination = null; }
#endif
{
this.distantHorizons$dimensionChangeDestination = null;
}
}
@@ -7,7 +7,8 @@
"server.MixinChunkGenerator",
"server.MixinTFChunkGenerator",
"server.MixinChunkMap",
"server.MixinServerPlayer"
"server.MixinServerPlayer",
"server.MixinEntity"
],
"client": [
"client.MixinClientPacketListener",
+2 -2
View File
@@ -5,8 +5,8 @@ org.gradle.caching=true
# Mod Info
mod_name=DistantHorizons
mod_version=2.2.2-a-dev
api_version=3.0.0
mod_version=2.3.0-a-dev
api_version=4.0.0
maven_group=com.seibel.distanthorizons
mod_readable_name=Distant Horizons
mod_description=This mod generates and renders simplified terrain beyond the normal view distance at a low performance cost. Allowing you to see much farther without turning your game into a slideshow.
+2 -2
View File
@@ -29,9 +29,9 @@ loom {
client {
client()
setConfigName("NeoForge Client")
ideConfigGenerated(false)
ideConfigGenerated(false) // When true a run configuration file will be generated for IDE's. By default only set to true for the root project.
runDir("../run/client")
vmArgs("-Dio.netty.leakDetection.level=advanced")
vmArgs("-Dio.netty.leakDetection.level=advanced") // https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels
programArgs("--username", "Dev")
}
server {
@@ -87,10 +87,7 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
@Override
public void registerEvents()
{
NeoForge.EVENT_BUS.register(this);
}
public void registerEvents() { NeoForge.EVENT_BUS.register(this); }
@@ -80,13 +80,9 @@ public class NeoforgeMain extends AbstractModInitializer
// networking //
//============//
public void registerNetworkingClient(RegisterPayloadHandlersEvent event)
{
NeoforgePluginPacketSender.setPacketHandler(event, ClientApi.INSTANCE::pluginMessageReceived);
}
{ NeoforgePluginPacketSender.setPacketHandler(event, ClientApi.INSTANCE::pluginMessageReceived); }
public void registerNetworkingServer(RegisterPayloadHandlersEvent event)
{
NeoforgePluginPacketSender.setPacketHandler(event, ServerApi.INSTANCE::pluginMessageReceived);
}
{ NeoforgePluginPacketSender.setPacketHandler(event, ServerApi.INSTANCE::pluginMessageReceived); }
@@ -3,7 +3,7 @@ package com.seibel.distanthorizons.neoforge;
import com.seibel.distanthorizons.common.CommonPacketPayload;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.common.AbstractPluginPacketSender;
import com.seibel.distanthorizons.core.network.messages.NetworkMessage;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.neoforge.network.PacketDistributor;
@@ -16,13 +16,11 @@ import java.util.function.Consumer;
public class NeoforgePluginPacketSender extends AbstractPluginPacketSender
{
private static BiConsumer<IServerPlayerWrapper, NetworkMessage> packetConsumer;
private static BiConsumer<IServerPlayerWrapper, AbstractNetworkMessage> packetConsumer;
public static void setPacketHandler(RegisterPayloadHandlersEvent event, Consumer<NetworkMessage> consumer)
{
setPacketHandler(event, (player, buffer) -> consumer.accept(buffer));
}
public static void setPacketHandler(RegisterPayloadHandlersEvent event, BiConsumer<IServerPlayerWrapper, NetworkMessage> consumer)
public static void setPacketHandler(RegisterPayloadHandlersEvent event, Consumer<AbstractNetworkMessage> consumer)
{ setPacketHandler(event, (player, buffer) -> consumer.accept(buffer)); }
public static void setPacketHandler(RegisterPayloadHandlersEvent event, BiConsumer<IServerPlayerWrapper, AbstractNetworkMessage> consumer)
{
packetConsumer = consumer;
@@ -42,15 +40,11 @@ public class NeoforgePluginPacketSender extends AbstractPluginPacketSender
}
@Override
public void sendPluginPacketClient(NetworkMessage message)
{
PacketDistributor.sendToServer(new CommonPacketPayload(message));
}
public void sendToServer(AbstractNetworkMessage message)
{ PacketDistributor.sendToServer(new CommonPacketPayload(message)); }
@Override
public void sendPluginPacketServer(ServerPlayer serverPlayer, NetworkMessage message)
{
PacketDistributor.sendToPlayer(serverPlayer, new CommonPacketPayload(message));
}
public void sendToClient(ServerPlayer serverPlayer, AbstractNetworkMessage message)
{ PacketDistributor.sendToPlayer(serverPlayer, new CommonPacketPayload(message)); }
}
@@ -129,15 +129,10 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
}
@SubscribeEvent
public void playerLoggedInEvent(PlayerEvent.PlayerLoggedInEvent event)
{
this.serverApi.serverPlayerJoinEvent(getServerPlayerWrapper(event));
}
public void playerLoggedInEvent(PlayerEvent.PlayerLoggedInEvent event) { this.serverApi.serverPlayerJoinEvent(getServerPlayerWrapper(event)); }
@SubscribeEvent
public void playerLoggedOutEvent(PlayerEvent.PlayerLoggedOutEvent event)
{
this.serverApi.serverPlayerDisconnectEvent(getServerPlayerWrapper(event));
}
{ this.serverApi.serverPlayerDisconnectEvent(getServerPlayerWrapper(event)); }
@SubscribeEvent
public void playerChangedDimensionEvent(PlayerEvent.PlayerChangedDimensionEvent event)
{
@@ -161,9 +156,6 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy
return getServerLevelWrapper(event.getEntity().getServer().getLevel(resourceKey));
}
private static ServerPlayerWrapper getServerPlayerWrapper(PlayerEvent event)
{
return ServerPlayerWrapper.getWrapper((ServerPlayer) event.getEntity());
}
private static ServerPlayerWrapper getServerPlayerWrapper(PlayerEvent event) { return ServerPlayerWrapper.getWrapper((ServerPlayer) event.getEntity()); }
}
@@ -142,22 +142,5 @@ public class MixinLevelRenderer
}
}
#if MC_VER < MC_1_19_4
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#elif MC_VER < MC_1_20_1
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runUpdates(IZZ)I"), method = "renderLevel")
public void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#elif MC_VER < MC_1_20_6
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
private void callAfterRunUpdates(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci)
#else
@Inject(at = @At(value = "TAIL", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I"), method = "renderLevel")
private void callAfterRunUpdates(CallbackInfo ci)
#endif
{
ChunkWrapper.syncedUpdateClientLightStatus();
}
}
@@ -43,24 +43,20 @@ public class MixinServerPlayer implements IMixinServerPlayer
@Nullable
private ServerLevel distantHorizons$dimensionChangeDestination;
@Unique
@Override
@Nullable
public ServerLevel distantHorizons$getDimensionChangeDestination()
{
return this.distantHorizons$dimensionChangeDestination;
}
{ return this.distantHorizons$dimensionChangeDestination; }
@Inject(at = @At("HEAD"), method = "changeDimension")
#if MC_VER >= MC_1_21_1
public void changeDimension(DimensionTransition dimensionTransition, CallbackInfoReturnable<Entity> cir)
{
this.distantHorizons$dimensionChangeDestination = dimensionTransition.newLevel();
}
{ this.distantHorizons$dimensionChangeDestination = dimensionTransition.newLevel(); }
#else
public void changeDimension(ServerLevel destination, CallbackInfoReturnable<Entity> cir)
{
this.distantHorizons$dimensionChangeDestination = destination;
}
{ this.distantHorizons$dimensionChangeDestination = destination; }
#endif
#if MC_VER >= MC_1_20_1
View File
View File
+1 -1
View File
@@ -24,7 +24,7 @@ fabric_api_version=0.42.0+1.16
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ "iris": "*" }
fabric_incompatibility_list={ "iris": "*", "oculus": "*" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -24,7 +24,7 @@ fabric_api_version=0.46.1+1.17
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ "iris": "*" }
fabric_incompatibility_list={ "iris": "*", "oculus": "*" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -25,7 +25,7 @@ fabric_api_version=0.76.0+1.18.2
immersive_portals_version=v1.4.11-1.18
canvas_version=mc118:1.0.2616
fabric_incompatibility_list={ "iris": "*" }
fabric_incompatibility_list={ "iris": "*", "oculus": "*" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -24,7 +24,7 @@ fabric_api_version=0.76.1+1.19.2
immersive_portals_version=
canvas_version=mc119-1.0.2480
fabric_incompatibility_list={ "iris": "*" }
fabric_incompatibility_list={ "iris": "*", "oculus": "*" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -23,7 +23,7 @@ fabric_api_version=0.87.1+1.19.4
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ "iris": "*" }
fabric_incompatibility_list={ "iris": "*", "oculus": "*" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -23,7 +23,7 @@ fabric_api_version=0.90.4+1.20.1
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_incompatibility_list={ "iris": "<=1.7.4", "oculus": "<=1.7.0" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -23,7 +23,7 @@ fabric_api_version=0.90.4+1.20.2
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_incompatibility_list={ "iris": "<=1.7.4", "oculus": "<=1.7.0" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -24,7 +24,7 @@ fabric_api_version=0.91.2+1.20.4
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_incompatibility_list={ "iris": "<=1.7.4", "oculus": "<=1.7.0" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -24,7 +24,7 @@ fabric_api_version=0.97.8+1.20.6
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_incompatibility_list={ "iris": "<=1.7.4", "oculus": "<=1.7.0" }
fabric_recommend_list={}
# Fabric mod run
+1 -1
View File
@@ -24,7 +24,7 @@ fabric_api_version=0.100.1+1.21
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_incompatibility_list={ "iris": "<=1.7.4", "oculus": "<=1.7.0" }
fabric_recommend_list={}
# Fabric mod run