Compare commits
31 Commits
section-oc
...
v0.2.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7510eda16 | ||
|
|
d9442c1492 | ||
|
|
93eb2786f2 | ||
|
|
1bef6823c5 | ||
|
|
01152eec95 | ||
|
|
1e39f5370a | ||
|
|
ea50ba38ea | ||
|
|
c00b9fcd7b | ||
|
|
bad5cae4d8 | ||
|
|
e3b1502bb6 | ||
|
|
54fc964987 | ||
|
|
0cbc9aa1a1 | ||
|
|
19e2136ae1 | ||
|
|
126cc03747 | ||
|
|
ceb4936d9d | ||
|
|
3cb888e894 | ||
|
|
7bedc1a7de | ||
|
|
718f6e1369 | ||
|
|
da9ab708a6 | ||
|
|
f22335f0b6 | ||
|
|
a3f2328000 | ||
|
|
529b9a44bb | ||
|
|
1e9a6504a1 | ||
|
|
9c46dcbb94 | ||
|
|
9a1e04389a | ||
|
|
29084d8e3f | ||
|
|
41790ecf1a | ||
|
|
8af7bccdfd | ||
|
|
5f9b3571f8 | ||
|
|
9adfb2514d | ||
|
|
bf2cd1c571 |
@@ -12,19 +12,19 @@ Fabric/NeoForge mod for optimising performance of the integrated (singleplayer/L
|
|||||||
Moonrise aims to optimise the game *without changing Vanilla behavior*. If you find that there are changes to Vanilla behavior,
|
Moonrise aims to optimise the game *without changing Vanilla behavior*. If you find that there are changes to Vanilla behavior,
|
||||||
please open an issue.
|
please open an issue.
|
||||||
|
|
||||||
Moonrise ports several important [Paper](https://github.com/PaperMC/Paper/)
|
Moonrise is an official port of several important [Paper](https://github.com/PaperMC/Paper/)
|
||||||
patches. Listed below are notable patches:
|
patches. Listed below are notable patches:
|
||||||
|
- [Starlight](https://github.com/PaperMC/Starlight/)
|
||||||
- Chunk system rewrite
|
- Chunk system rewrite
|
||||||
- Collision optimisations
|
- Collision optimisations
|
||||||
- Entity tracker optimisations
|
- Entity tracker optimisations
|
||||||
- Random ticking optimisations
|
- Random ticking optimisations
|
||||||
- [Starlight](https://github.com/PaperMC/Starlight/)
|
|
||||||
|
|
||||||
## Known Compatibility Issues
|
## Known Compatibility Issues
|
||||||
| Mod | Status |
|
| Mod | Status |
|
||||||
|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Lithium | <details><summary>✅ compatible</summary>Lithium optimises many of the same parts of the game as Moonrise, for example the chunk system. Moonrise will automatically disable conflicting parts of Lithium. This mechanism needs to be manually validated for each Moonrise and Lithium release.</details> |
|
| Lithium | <details><summary>✅ compatible</summary>Lithium optimises many of the same parts of the game as Moonrise, for example the chunk system. Moonrise will automatically disable conflicting parts of Lithium. This mechanism needs to be manually validated for each Moonrise and Lithium release.</details> |
|
||||||
| FerriteCore | <details><summary>📝 requires config changes</summary>In `config/ferritecore-mixin.toml`:<br/>Set `replaceNeighborLookup` and `replacePropertyMap` to `false`</details> |
|
| FerriteCore | <details><summary>✅ compatible</summary>FerriteCore optimises some of the same parts of the game as Moonrise. Moonrise will automatically disable conflicting parts of FerriteCore. This mechanism needs to be manually validated for each Moonrise and FerriteCore release.</details> |
|
||||||
| C2ME | <details><summary>❌ incompatible</summary>C2ME is based around modifications to the chunk system, which Moonrise replaces wholesale. This makes them fundamentally incompatible.</details> |
|
| C2ME | <details><summary>❌ incompatible</summary>C2ME is based around modifications to the chunk system, which Moonrise replaces wholesale. This makes them fundamentally incompatible.</details> |
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ dependencies {
|
|||||||
include "me.shedaniel.cloth:cloth-config-fabric:${rootProject.cloth_version}"
|
include "me.shedaniel.cloth:cloth-config-fabric:${rootProject.cloth_version}"
|
||||||
modImplementation "com.terraformersmc:modmenu:${rootProject.modmenu_version}"
|
modImplementation "com.terraformersmc:modmenu:${rootProject.modmenu_version}"
|
||||||
|
|
||||||
modImplementation fabricApiLibs.fabric.api
|
modImplementation fabricApiLibs.command.api.v2
|
||||||
|
modImplementation fabricApiLibs.lifecycle.events.v1
|
||||||
include fabricApiLibs.command.api.v2
|
include fabricApiLibs.command.api.v2
|
||||||
include fabricApiLibs.base
|
include fabricApiLibs.base
|
||||||
}
|
}
|
||||||
@@ -59,7 +60,7 @@ publishMods {
|
|||||||
incompatible(
|
incompatible(
|
||||||
"not-enough-crashes",
|
"not-enough-crashes",
|
||||||
"starlight",
|
"starlight",
|
||||||
"c2me-fabric"
|
"c2me"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,21 +2,25 @@ package ca.spottedleaf.moonrise.fabric;
|
|||||||
|
|
||||||
import ca.spottedleaf.moonrise.common.PlatformHooks;
|
import ca.spottedleaf.moonrise.common.PlatformHooks;
|
||||||
import ca.spottedleaf.moonrise.common.util.ConfigHolder;
|
import ca.spottedleaf.moonrise.common.util.ConfigHolder;
|
||||||
import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder;
|
import com.mojang.datafixers.DSL;
|
||||||
import com.mojang.datafixers.DataFixer;
|
import com.mojang.datafixers.DataFixer;
|
||||||
|
import com.mojang.serialization.Dynamic;
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents;
|
||||||
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.NbtOps;
|
||||||
|
import net.minecraft.server.level.ChunkHolder;
|
||||||
import net.minecraft.server.level.GenerationChunkHolder;
|
import net.minecraft.server.level.GenerationChunkHolder;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.util.datafix.DataFixTypes;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.level.BlockGetter;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
import net.minecraft.world.level.ChunkPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
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.ImposterProtoChunk;
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
import net.minecraft.world.level.chunk.ProtoChunk;
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
import net.minecraft.world.level.chunk.status.ChunkStatusTasks;
|
import net.minecraft.world.level.chunk.status.ChunkStatusTasks;
|
||||||
@@ -28,6 +32,8 @@ import java.util.function.Predicate;
|
|||||||
|
|
||||||
public final class FabricHooks implements PlatformHooks {
|
public final class FabricHooks implements PlatformHooks {
|
||||||
|
|
||||||
|
private static final boolean HAS_FABRIC_LIFECYCLE_EVENTS = FabricLoader.getInstance().isModLoaded("fabric-lifecycle-events-v1");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getBrand() {
|
public String getBrand() {
|
||||||
return "Moonrise";
|
return "Moonrise";
|
||||||
@@ -62,7 +68,12 @@ public final class FabricHooks implements PlatformHooks {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void chunkFullStatusComplete(final LevelChunk newChunk, final ProtoChunk original) {
|
public void chunkFullStatusComplete(final LevelChunk newChunk, final ProtoChunk original) {
|
||||||
ServerChunkEvents.CHUNK_LOAD.invoker().onChunkLoad((ServerLevel)newChunk.getLevel(), newChunk);
|
if (HAS_FABRIC_LIFECYCLE_EVENTS) {
|
||||||
|
ServerChunkEvents.CHUNK_LOAD.invoker().onChunkLoad((ServerLevel)newChunk.getLevel(), newChunk);
|
||||||
|
if (!(original instanceof ImposterProtoChunk)) {
|
||||||
|
ServerChunkEvents.CHUNK_GENERATE.invoker().onChunkGenerate((ServerLevel)newChunk.getLevel(), newChunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -71,13 +82,15 @@ public final class FabricHooks implements PlatformHooks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChunkHolderTicketChange(final ServerLevel world, final NewChunkHolder holder, final int oldLevel, final int newLevel) {
|
public void onChunkHolderTicketChange(final ServerLevel world, final ChunkHolder holder, final int oldLevel, final int newLevel) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void chunkUnloadFromWorld(final LevelChunk chunk) {
|
public void chunkUnloadFromWorld(final LevelChunk chunk) {
|
||||||
ServerChunkEvents.CHUNK_UNLOAD.invoker().onChunkUnload((ServerLevel)chunk.getLevel(), chunk);
|
if (HAS_FABRIC_LIFECYCLE_EVENTS) {
|
||||||
|
ServerChunkEvents.CHUNK_UNLOAD.invoker().onChunkUnload((ServerLevel)chunk.getLevel(), chunk);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -153,12 +166,12 @@ public final class FabricHooks implements PlatformHooks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long configAutoSaveInterval() {
|
public long configAutoSaveInterval(final ServerLevel world) {
|
||||||
return ConfigHolder.getConfig().chunkSaving.autoSaveInterval.getTimeTicks();
|
return ConfigHolder.getConfig().chunkSaving.autoSaveInterval.getTimeTicks();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int configMaxAutoSavePerTick() {
|
public int configMaxAutoSavePerTick(final ServerLevel world) {
|
||||||
return ConfigHolder.getConfig().chunkSaving.maxAutoSaveChunksPerTick;
|
return ConfigHolder.getConfig().chunkSaving.maxAutoSaveChunksPerTick;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,9 +186,11 @@ public final class FabricHooks implements PlatformHooks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompoundTag convertNBT(final DataFixTypes type, final DataFixer dataFixer, final CompoundTag nbt,
|
public CompoundTag convertNBT(final DSL.TypeReference type, final DataFixer dataFixer, final CompoundTag nbt,
|
||||||
final int fromVersion, final int toVersion) {
|
final int fromVersion, final int toVersion) {
|
||||||
return type.update(dataFixer, nbt, fromVersion, toVersion);
|
return (CompoundTag)dataFixer.update(
|
||||||
|
type, new Dynamic<>(NbtOps.INSTANCE, nbt), fromVersion, toVersion
|
||||||
|
).getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -42,7 +42,6 @@
|
|||||||
"custom": {
|
"custom": {
|
||||||
"lithium:options": {
|
"lithium:options": {
|
||||||
"mixin.ai.poi": false,
|
"mixin.ai.poi": false,
|
||||||
"mixin.alloc.chunk_ticking": false,
|
|
||||||
"mixin.alloc.deep_passengers": false,
|
"mixin.alloc.deep_passengers": false,
|
||||||
"mixin.alloc.entity_tracker": false,
|
"mixin.alloc.entity_tracker": false,
|
||||||
"mixin.block.flatten_states": false,
|
"mixin.block.flatten_states": false,
|
||||||
@@ -66,9 +65,12 @@
|
|||||||
"mixin.world.block_entity_ticking": false,
|
"mixin.world.block_entity_ticking": false,
|
||||||
"mixin.world.chunk_access": false,
|
"mixin.world.chunk_access": false,
|
||||||
"mixin.world.explosions.block_raycast": false,
|
"mixin.world.explosions.block_raycast": false,
|
||||||
"mixin.world.explosions.cache_exposure": false,
|
|
||||||
"mixin.world.temperature_cache": false,
|
"mixin.world.temperature_cache": false,
|
||||||
"mixin.world.tick_scheduler": false
|
"mixin.world.tick_scheduler": false
|
||||||
}
|
},
|
||||||
|
"ferritecore:disabled_options": [
|
||||||
|
"replaceNeighborLookup",
|
||||||
|
"replacePropertyMap"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,16 +6,16 @@ org.gradle.daemon=false
|
|||||||
minecraft_version=1.21.3
|
minecraft_version=1.21.3
|
||||||
loader_version=0.16.7
|
loader_version=0.16.7
|
||||||
supported_minecraft_versions=1.21.3
|
supported_minecraft_versions=1.21.3
|
||||||
neoforge_version=21.3.0-beta
|
neoforge_version=21.3.31-beta
|
||||||
fabric_api_version=0.106.1+1.21.3
|
fabric_api_version=0.107.0+1.21.3
|
||||||
snakeyaml_version=2.2
|
snakeyaml_version=2.2
|
||||||
concurrentutil_version=0.0.2-SNAPSHOT
|
concurrentutil_version=0.0.2-SNAPSHOT
|
||||||
cloth_version=16.0.141
|
cloth_version=16.0.141
|
||||||
modmenu_version=12.0.0-beta.1
|
modmenu_version=12.0.0-beta.1
|
||||||
# version ids from modrinth
|
# version ids from modrinth
|
||||||
fabric_lithium_version=mc1.21.1-0.14.0-beta.1
|
fabric_lithium_version=QhCwdt4l
|
||||||
neo_lithium_version=BrMIoIMv
|
neo_lithium_version=wDD955sb
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version=0.2.0-SNAPSHOT
|
mod_version=0.2.0-beta.4
|
||||||
maven_group=ca.spottedleaf.moonrise
|
maven_group=ca.spottedleaf.moonrise
|
||||||
archives_base_name=moonrise
|
archives_base_name=moonrise
|
||||||
|
|||||||
@@ -3,14 +3,16 @@ package ca.spottedleaf.moonrise.neoforge;
|
|||||||
import ca.spottedleaf.moonrise.common.PlatformHooks;
|
import ca.spottedleaf.moonrise.common.PlatformHooks;
|
||||||
import ca.spottedleaf.moonrise.common.util.ConfigHolder;
|
import ca.spottedleaf.moonrise.common.util.ConfigHolder;
|
||||||
import ca.spottedleaf.moonrise.common.util.CoordinateUtils;
|
import ca.spottedleaf.moonrise.common.util.CoordinateUtils;
|
||||||
import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder;
|
import com.mojang.datafixers.DSL;
|
||||||
import com.mojang.datafixers.DataFixer;
|
import com.mojang.datafixers.DataFixer;
|
||||||
|
import com.mojang.serialization.Dynamic;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.NbtOps;
|
||||||
|
import net.minecraft.server.level.ChunkHolder;
|
||||||
import net.minecraft.server.level.GenerationChunkHolder;
|
import net.minecraft.server.level.GenerationChunkHolder;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.util.datafix.DataFixTypes;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.level.BlockGetter;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
import net.minecraft.world.level.ChunkPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
@@ -80,10 +82,12 @@ public final class NeoForgeHooks implements PlatformHooks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChunkHolderTicketChange(final ServerLevel world, final NewChunkHolder holder, final int oldLevel, final int newLevel) {
|
public void onChunkHolderTicketChange(final ServerLevel world, final ChunkHolder holder, final int oldLevel, final int newLevel) {
|
||||||
|
final ChunkPos pos = holder.getPos();
|
||||||
|
|
||||||
EventHooks.fireChunkTicketLevelUpdated(
|
EventHooks.fireChunkTicketLevelUpdated(
|
||||||
world, CoordinateUtils.getChunkKey(holder.chunkX, holder.chunkZ),
|
world, CoordinateUtils.getChunkKey(pos.x, pos.z),
|
||||||
oldLevel, newLevel, holder.vanillaChunkHolder
|
oldLevel, newLevel, holder
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,12 +189,12 @@ public final class NeoForgeHooks implements PlatformHooks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long configAutoSaveInterval() {
|
public long configAutoSaveInterval(final ServerLevel world) {
|
||||||
return ConfigHolder.getConfig().chunkSaving.autoSaveInterval.getTimeTicks();
|
return ConfigHolder.getConfig().chunkSaving.autoSaveInterval.getTimeTicks();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int configMaxAutoSavePerTick() {
|
public int configMaxAutoSavePerTick(final ServerLevel world) {
|
||||||
return ConfigHolder.getConfig().chunkSaving.maxAutoSaveChunksPerTick;
|
return ConfigHolder.getConfig().chunkSaving.maxAutoSaveChunksPerTick;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,9 +209,11 @@ public final class NeoForgeHooks implements PlatformHooks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompoundTag convertNBT(final DataFixTypes type, final DataFixer dataFixer, final CompoundTag nbt,
|
public CompoundTag convertNBT(final DSL.TypeReference type, final DataFixer dataFixer, final CompoundTag nbt,
|
||||||
final int fromVersion, final int toVersion) {
|
final int fromVersion, final int toVersion) {
|
||||||
return type.update(dataFixer, nbt, fromVersion, toVersion);
|
return (CompoundTag)dataFixer.update(
|
||||||
|
type, new Dynamic<>(NbtOps.INSTANCE, nbt), fromVersion, toVersion
|
||||||
|
).getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ displayURL = "https://github.com/Tuinity/Moonrise"
|
|||||||
authors = "Spottedleaf"
|
authors = "Spottedleaf"
|
||||||
description = "Optimisation mod for the dedicated and integrated server."
|
description = "Optimisation mod for the dedicated and integrated server."
|
||||||
displayTest = "IGNORE_ALL_VERSION"
|
displayTest = "IGNORE_ALL_VERSION"
|
||||||
|
"ferritecore:disabled_options" = [
|
||||||
|
"replaceNeighborLookup",
|
||||||
|
"replacePropertyMap"
|
||||||
|
]
|
||||||
|
|
||||||
[[dependencies.moonrise]]
|
[[dependencies.moonrise]]
|
||||||
modId = "neoforge"
|
modId = "neoforge"
|
||||||
@@ -51,9 +55,8 @@ config = "moonrise.mixins.json"
|
|||||||
[[mixins]]
|
[[mixins]]
|
||||||
config = "moonrise-neoforge.mixins.json"
|
config = "moonrise-neoforge.mixins.json"
|
||||||
|
|
||||||
[mods."lithium:options"]
|
["lithium:options"]
|
||||||
"mixin.ai.poi" = false
|
"mixin.ai.poi" = false
|
||||||
"mixin.alloc.chunk_ticking" = false
|
|
||||||
"mixin.alloc.deep_passengers" = false
|
"mixin.alloc.deep_passengers" = false
|
||||||
"mixin.alloc.entity_tracker" = false
|
"mixin.alloc.entity_tracker" = false
|
||||||
"mixin.block.flatten_states" = false
|
"mixin.block.flatten_states" = false
|
||||||
@@ -77,6 +80,5 @@ config = "moonrise-neoforge.mixins.json"
|
|||||||
"mixin.world.block_entity_ticking" = false
|
"mixin.world.block_entity_ticking" = false
|
||||||
"mixin.world.chunk_access" = false
|
"mixin.world.chunk_access" = false
|
||||||
"mixin.world.explosions.block_raycast" = false
|
"mixin.world.explosions.block_raycast" = false
|
||||||
"mixin.world.explosions.cache_exposure" = false
|
|
||||||
"mixin.world.temperature_cache" = false
|
"mixin.world.temperature_cache" = false
|
||||||
"mixin.world.tick_scheduler" = false
|
"mixin.world.tick_scheduler" = false
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ pluginManagement {
|
|||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
|
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
|
||||||
id("xyz.jpenilla.quiet-architectury-loom") version "1.7.297" apply false
|
id("xyz.jpenilla.quiet-architectury-loom") version "1.7.300" apply false
|
||||||
id 'com.gradleup.shadow' version '8.3.0' apply false
|
id 'com.gradleup.shadow' version '8.3.0' apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
package ca.spottedleaf.moonrise.common;
|
package ca.spottedleaf.moonrise.common;
|
||||||
|
|
||||||
import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder;
|
import com.mojang.datafixers.DSL;
|
||||||
import com.mojang.datafixers.DataFixer;
|
import com.mojang.datafixers.DataFixer;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.server.level.ChunkHolder;
|
||||||
import net.minecraft.server.level.GenerationChunkHolder;
|
import net.minecraft.server.level.GenerationChunkHolder;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
@@ -44,7 +45,7 @@ public interface PlatformHooks {
|
|||||||
|
|
||||||
public boolean allowAsyncTicketUpdates();
|
public boolean allowAsyncTicketUpdates();
|
||||||
|
|
||||||
public void onChunkHolderTicketChange(final ServerLevel world, final NewChunkHolder holder, final int oldLevel, final int newLevel);
|
public void onChunkHolderTicketChange(final ServerLevel world, final ChunkHolder holder, final int oldLevel, final int newLevel);
|
||||||
|
|
||||||
public void chunkUnloadFromWorld(final LevelChunk chunk);
|
public void chunkUnloadFromWorld(final LevelChunk chunk);
|
||||||
|
|
||||||
@@ -79,16 +80,16 @@ public interface PlatformHooks {
|
|||||||
|
|
||||||
public int configPlayerMaxConcurrentGens();
|
public int configPlayerMaxConcurrentGens();
|
||||||
|
|
||||||
public long configAutoSaveInterval();
|
public long configAutoSaveInterval(final ServerLevel world);
|
||||||
|
|
||||||
public int configMaxAutoSavePerTick();
|
public int configMaxAutoSavePerTick(final ServerLevel world);
|
||||||
|
|
||||||
public boolean configFixMC159283();
|
public boolean configFixMC159283();
|
||||||
|
|
||||||
// support for CB chunk mustNotSave
|
// support for CB chunk mustNotSave
|
||||||
public boolean forceNoSave(final ChunkAccess chunk);
|
public boolean forceNoSave(final ChunkAccess chunk);
|
||||||
|
|
||||||
public CompoundTag convertNBT(final DataFixTypes type, final DataFixer dataFixer, final CompoundTag nbt,
|
public CompoundTag convertNBT(final DSL.TypeReference type, final DataFixer dataFixer, final CompoundTag nbt,
|
||||||
final int fromVersion, final int toVersion);
|
final int fromVersion, final int toVersion);
|
||||||
|
|
||||||
public boolean hasMainChunkLoadHook();
|
public boolean hasMainChunkLoadHook();
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package ca.spottedleaf.moonrise.common.misc;
|
|||||||
|
|
||||||
import ca.spottedleaf.concurrentutil.util.IntPairUtil;
|
import ca.spottedleaf.concurrentutil.util.IntPairUtil;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
|
||||||
|
import it.unimi.dsi.fastutil.longs.LongSet;
|
||||||
import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.objects.ReferenceSet;
|
import it.unimi.dsi.fastutil.objects.ReferenceSet;
|
||||||
|
|
||||||
@@ -14,6 +15,10 @@ public final class PositionCountingAreaMap<T> {
|
|||||||
return this.counters.keySet();
|
return this.counters.keySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LongSet getPositions() {
|
||||||
|
return this.positions.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
public int getTotalPositions() {
|
public int getTotalPositions() {
|
||||||
return this.positions.size();
|
return this.positions.size();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -538,6 +538,21 @@ abstract class ChunkMapMixin extends ChunkStorage implements ChunkSystemChunkMap
|
|||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @reason Route to new chunk system
|
||||||
|
* @author Spottedleaf
|
||||||
|
*/
|
||||||
|
@Redirect(
|
||||||
|
method = "forEachSpawnCandidateChunk",
|
||||||
|
at = @At(
|
||||||
|
value = "INVOKE",
|
||||||
|
target = "Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap;get(J)Ljava/lang/Object;"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
private <V> V redirectChunkHolderGet(final Long2ObjectLinkedOpenHashMap<V> instance, final long key) {
|
||||||
|
return (V)this.getVisibleChunkIfPresent(key);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Optional<CompoundTag>> read(final ChunkPos pos) {
|
public CompletableFuture<Optional<CompoundTag>> read(final ChunkPos pos) {
|
||||||
final CompletableFuture<Optional<CompoundTag>> ret = new CompletableFuture<>();
|
final CompletableFuture<Optional<CompoundTag>> ret = new CompletableFuture<>();
|
||||||
|
|||||||
@@ -315,6 +315,15 @@ abstract class DistanceManagerMixin implements ChunkSystemDistanceManager {
|
|||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @reason Remove old chunk system hooks
|
||||||
|
* @author Spottedleaf
|
||||||
|
*/
|
||||||
|
@Overwrite
|
||||||
|
public LongSet getTickingChunks() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @reason This hack is not required anymore, see {@link MinecraftServerMixin}
|
* @reason This hack is not required anymore, see {@link MinecraftServerMixin}
|
||||||
* @author Spottedleaf
|
* @author Spottedleaf
|
||||||
|
|||||||
@@ -266,20 +266,4 @@ public abstract class PoiManagerMixin extends SectionStorage<Object, Object> imp
|
|||||||
private <T> Stream<T> skipLoadedSet(final Stream<T> instance, final Predicate<? super T> predicate) {
|
private <T> Stream<T> skipLoadedSet(final Stream<T> instance, final Predicate<? super T> predicate) {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public final void moonrise$close() throws IOException {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public final CompoundTag moonrise$read(final int chunkX, final int chunkZ) throws IOException {
|
|
||||||
return MoonriseRegionFileIO.loadData(
|
|
||||||
this.world, chunkX, chunkZ, MoonriseRegionFileIO.RegionFileType.POI_DATA,
|
|
||||||
MoonriseRegionFileIO.getIOBlockingPriorityForCurrentThread()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public final void moonrise$write(final int chunkX, final int chunkZ, final CompoundTag data) throws IOException {
|
|
||||||
MoonriseRegionFileIO.scheduleSave(this.world, chunkX, chunkZ, data, MoonriseRegionFileIO.RegionFileType.POI_DATA);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,10 +26,6 @@ abstract class SectionStorageMixin<R, P> implements ChunkSystemSectionStorage, A
|
|||||||
@Shadow
|
@Shadow
|
||||||
private SimpleRegionStorage simpleRegionStorage;
|
private SimpleRegionStorage simpleRegionStorage;
|
||||||
|
|
||||||
@Shadow
|
|
||||||
@Final
|
|
||||||
static Logger LOGGER;
|
|
||||||
|
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private RegionFileStorage storage;
|
private RegionFileStorage storage;
|
||||||
@@ -39,6 +35,9 @@ abstract class SectionStorageMixin<R, P> implements ChunkSystemSectionStorage, A
|
|||||||
return this.storage;
|
return this.storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void moonrise$close() throws IOException {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @reason Retrieve storage from IOWorker, and then nuke it
|
* @reason Retrieve storage from IOWorker, and then nuke it
|
||||||
* @author Spottedleaf
|
* @author Spottedleaf
|
||||||
@@ -59,12 +58,8 @@ abstract class SectionStorageMixin<R, P> implements ChunkSystemSectionStorage, A
|
|||||||
* @author Spottedleaf
|
* @author Spottedleaf
|
||||||
*/
|
*/
|
||||||
@Overwrite
|
@Overwrite
|
||||||
public final CompletableFuture<Optional<CompoundTag>> tryRead(final ChunkPos pos) {
|
public final CompletableFuture<Optional<SectionStorage.PackedChunk<P>>> tryRead(final ChunkPos pos) {
|
||||||
try {
|
throw new IllegalStateException("Only chunk system can write state, offending class:" + this.getClass().getName());
|
||||||
return CompletableFuture.completedFuture(Optional.ofNullable(this.moonrise$read(pos.x, pos.z)));
|
|
||||||
} catch (final Throwable thr) {
|
|
||||||
return CompletableFuture.failedFuture(thr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -77,24 +72,12 @@ abstract class SectionStorageMixin<R, P> implements ChunkSystemSectionStorage, A
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @reason Route to new chunk system hook
|
* @reason Destroy old chunk system hook
|
||||||
* @author Spottedleaf
|
* @author Spottedleaf
|
||||||
*/
|
*/
|
||||||
@Redirect(
|
@Overwrite
|
||||||
method = "writeChunk(Lnet/minecraft/world/level/ChunkPos;)V",
|
private void writeChunk(final ChunkPos chunkPos) {
|
||||||
at = @At(
|
throw new IllegalStateException("Only chunk system can write state, offending class:" + this.getClass().getName());
|
||||||
value = "INVOKE",
|
|
||||||
target = "Lnet/minecraft/world/level/chunk/storage/SimpleRegionStorage;write(Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/nbt/CompoundTag;)Ljava/util/concurrent/CompletableFuture;"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
private CompletableFuture<Void> redirectWrite(final SimpleRegionStorage instance, final ChunkPos pos,
|
|
||||||
final CompoundTag tag) {
|
|
||||||
try {
|
|
||||||
this.moonrise$write(pos.x, pos.z, tag);
|
|
||||||
} catch (final IOException ex) {
|
|
||||||
LOGGER.error("Error writing poi chunk data to disk for chunk " + pos, ex);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import net.minecraft.world.level.chunk.ChunkSource;
|
|||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
import net.minecraft.world.level.chunk.LightChunk;
|
import net.minecraft.world.level.chunk.LightChunk;
|
||||||
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
import net.minecraft.world.level.chunk.status.ChunkStatus;
|
||||||
|
import net.minecraft.world.level.storage.DimensionDataStorage;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
import org.spongepowered.asm.mixin.Overwrite;
|
||||||
@@ -51,6 +52,10 @@ abstract class ServerChunkCacheMixin extends ChunkSource implements ChunkSystemS
|
|||||||
@Final
|
@Final
|
||||||
public ServerLevel level;
|
public ServerLevel level;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
private DimensionDataStorage dataStorage;
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private final ConcurrentLong2ReferenceChainedHashTable<LevelChunk> fullChunks = new ConcurrentLong2ReferenceChainedHashTable<>();
|
private final ConcurrentLong2ReferenceChainedHashTable<LevelChunk> fullChunks = new ConcurrentLong2ReferenceChainedHashTable<>();
|
||||||
|
|
||||||
@@ -261,6 +266,7 @@ abstract class ServerChunkCacheMixin extends ChunkSource implements ChunkSystemS
|
|||||||
@Override
|
@Override
|
||||||
@Overwrite
|
@Overwrite
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
|
this.dataStorage.close();
|
||||||
((ChunkSystemServerLevel)this.level).moonrise$getChunkTaskScheduler().chunkHolderManager.close(true, true);
|
((ChunkSystemServerLevel)this.level).moonrise$getChunkTaskScheduler().chunkHolderManager.close(true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,11 +85,20 @@ abstract class ChunkMapMixin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @reason Use nearby players to avoid iterating over all online players
|
* @reason Avoid checking first if there are nearby players, as we make internal perform this implicitly.
|
||||||
* @author Spottedleaf
|
* @author Spottedleaf
|
||||||
*/
|
*/
|
||||||
@Overwrite
|
@Overwrite
|
||||||
public boolean anyPlayerCloseEnoughForSpawning(final ChunkPos pos) {
|
public boolean anyPlayerCloseEnoughForSpawning(final ChunkPos pos) {
|
||||||
|
return this.anyPlayerCloseEnoughForSpawningInternal(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @reason Use nearby players to avoid iterating over all online players
|
||||||
|
* @author Spottedleaf
|
||||||
|
*/
|
||||||
|
@Overwrite
|
||||||
|
public boolean anyPlayerCloseEnoughForSpawningInternal(final ChunkPos pos) {
|
||||||
final ReferenceList<ServerPlayer> players = ((ChunkSystemServerLevel)this.level).moonrise$getNearbyPlayers().getPlayers(
|
final ReferenceList<ServerPlayer> players = ((ChunkSystemServerLevel)this.level).moonrise$getNearbyPlayers().getPlayers(
|
||||||
pos, NearbyPlayers.NearbyMapType.SPAWN_RANGE
|
pos, NearbyPlayers.NearbyMapType.SPAWN_RANGE
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import ca.spottedleaf.moonrise.common.misc.PositionCountingAreaMap;
|
|||||||
import ca.spottedleaf.moonrise.common.util.CoordinateUtils;
|
import ca.spottedleaf.moonrise.common.util.CoordinateUtils;
|
||||||
import ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickConstants;
|
import ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickConstants;
|
||||||
import ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickDistanceManager;
|
import ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickDistanceManager;
|
||||||
|
import it.unimi.dsi.fastutil.longs.LongIterator;
|
||||||
import net.minecraft.core.SectionPos;
|
import net.minecraft.core.SectionPos;
|
||||||
import net.minecraft.server.level.DistanceManager;
|
import net.minecraft.server.level.DistanceManager;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
@@ -106,4 +107,13 @@ abstract class DistanceManagerMixin implements ChunkTickDistanceManager {
|
|||||||
public boolean hasPlayersNearby(final long pos) {
|
public boolean hasPlayersNearby(final long pos) {
|
||||||
return this.spawnChunkTracker.hasObjectsNear(CoordinateUtils.getChunkX(pos), CoordinateUtils.getChunkZ(pos));
|
return this.spawnChunkTracker.hasObjectsNear(CoordinateUtils.getChunkX(pos), CoordinateUtils.getChunkZ(pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @reason Use spawnChunkTracker instead
|
||||||
|
* @author Spottedleaf
|
||||||
|
*/
|
||||||
|
@Overwrite
|
||||||
|
public LongIterator getSpawnCandidateChunks() {
|
||||||
|
return this.spawnChunkTracker.getPositions().iterator();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import net.minecraft.world.entity.Entity;
|
|||||||
import net.minecraft.world.level.ChunkPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.world.level.Explosion;
|
import net.minecraft.world.level.Explosion;
|
||||||
import net.minecraft.world.level.ExplosionDamageCalculator;
|
import net.minecraft.world.level.ExplosionDamageCalculator;
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.ServerExplosion;
|
import net.minecraft.world.level.ServerExplosion;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
@@ -440,7 +439,10 @@ abstract class ServerExplosionMixin {
|
|||||||
* @author Spottedleaf
|
* @author Spottedleaf
|
||||||
*/
|
*/
|
||||||
@Redirect(
|
@Redirect(
|
||||||
method = "hurtEntities",
|
method = {
|
||||||
|
"hurtEntities()V",
|
||||||
|
"hurtEntities(Ljava/util/List;)V" // Neo moves logic into this new method
|
||||||
|
},
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/level/ServerExplosion;getSeenPercent(Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/entity/Entity;)F"
|
target = "Lnet/minecraft/world/level/ServerExplosion;getSeenPercent(Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/entity/Entity;)F"
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import net.minecraft.world.level.chunk.status.ChunkStatus;
|
|||||||
import net.minecraft.world.level.chunk.storage.RegionStorageInfo;
|
import net.minecraft.world.level.chunk.storage.RegionStorageInfo;
|
||||||
import net.minecraft.world.level.chunk.storage.SerializableChunkData;
|
import net.minecraft.world.level.chunk.storage.SerializableChunkData;
|
||||||
import net.minecraft.world.level.lighting.LevelLightEngine;
|
import net.minecraft.world.level.lighting.LevelLightEngine;
|
||||||
|
import org.slf4j.Logger;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@@ -46,6 +47,10 @@ abstract class SerializableChunkDataMixin {
|
|||||||
@Final
|
@Final
|
||||||
private List<SerializableChunkData.SectionData> sectionData;
|
private List<SerializableChunkData.SectionData> sectionData;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
private static Logger LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @reason Replace light correctness check with our own
|
* @reason Replace light correctness check with our own
|
||||||
* Our light check is versioned in case we change the light format OR fix a bug
|
* Our light check is versioned in case we change the light format OR fix a bug
|
||||||
@@ -116,33 +121,45 @@ abstract class SerializableChunkDataMixin {
|
|||||||
final SWMRNibbleArray[] blockNibbles = StarLightEngine.getFilledEmptyLight(world);
|
final SWMRNibbleArray[] blockNibbles = StarLightEngine.getFilledEmptyLight(world);
|
||||||
final SWMRNibbleArray[] skyNibbles = StarLightEngine.getFilledEmptyLight(world);
|
final SWMRNibbleArray[] skyNibbles = StarLightEngine.getFilledEmptyLight(world);
|
||||||
|
|
||||||
for (final SerializableChunkData.SectionData sectionData : this.sectionData) {
|
if (!this.lightCorrect) {
|
||||||
final int y = sectionData.y();
|
((StarlightChunk)ret).starlight$setBlockNibbles(blockNibbles);
|
||||||
final DataLayer blockLight = sectionData.blockLight();
|
((StarlightChunk)ret).starlight$setSkyNibbles(skyNibbles);
|
||||||
final DataLayer skyLight = sectionData.skyLight();
|
return;
|
||||||
|
|
||||||
final int blockState = ((StarlightSectionData)(Object)sectionData).starlight$getBlockLightState();
|
|
||||||
final int skyState = ((StarlightSectionData)(Object)sectionData).starlight$getSkyLightState();
|
|
||||||
|
|
||||||
if (blockState >= 0) {
|
|
||||||
if (blockLight != null) {
|
|
||||||
blockNibbles[y - minSection] = new SWMRNibbleArray(MixinWorkarounds.clone(blockLight.getData()), blockState); // clone for data safety
|
|
||||||
} else {
|
|
||||||
blockNibbles[y - minSection] = new SWMRNibbleArray(null, blockState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skyState >= 0 && hasSkyLight) {
|
|
||||||
if (skyLight != null) {
|
|
||||||
skyNibbles[y - minSection] = new SWMRNibbleArray(MixinWorkarounds.clone(skyLight.getData()), skyState); // clone for data safety
|
|
||||||
} else {
|
|
||||||
skyNibbles[y - minSection] = new SWMRNibbleArray(null, skyState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
((StarlightChunk)ret).starlight$setBlockNibbles(blockNibbles);
|
try {
|
||||||
((StarlightChunk)ret).starlight$setSkyNibbles(skyNibbles);
|
for (final SerializableChunkData.SectionData sectionData : this.sectionData) {
|
||||||
|
final int y = sectionData.y();
|
||||||
|
final DataLayer blockLight = sectionData.blockLight();
|
||||||
|
final DataLayer skyLight = sectionData.skyLight();
|
||||||
|
|
||||||
|
final int blockState = ((StarlightSectionData)(Object)sectionData).starlight$getBlockLightState();
|
||||||
|
final int skyState = ((StarlightSectionData)(Object)sectionData).starlight$getSkyLightState();
|
||||||
|
|
||||||
|
if (blockState >= 0) {
|
||||||
|
if (blockLight != null) {
|
||||||
|
blockNibbles[y - minSection] = new SWMRNibbleArray(MixinWorkarounds.clone(blockLight.getData()), blockState); // clone for data safety
|
||||||
|
} else {
|
||||||
|
blockNibbles[y - minSection] = new SWMRNibbleArray(null, blockState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skyState >= 0 && hasSkyLight) {
|
||||||
|
if (skyLight != null) {
|
||||||
|
skyNibbles[y - minSection] = new SWMRNibbleArray(MixinWorkarounds.clone(skyLight.getData()), skyState); // clone for data safety
|
||||||
|
} else {
|
||||||
|
skyNibbles[y - minSection] = new SWMRNibbleArray(null, skyState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
((StarlightChunk)ret).starlight$setBlockNibbles(blockNibbles);
|
||||||
|
((StarlightChunk)ret).starlight$setSkyNibbles(skyNibbles);
|
||||||
|
} catch (final Throwable thr) {
|
||||||
|
ret.setLightCorrect(false);
|
||||||
|
|
||||||
|
LOGGER.error("Failed to parse light data for chunk " + ret.getPos() + " in world '" + WorldUtil.getWorldName(world) + "'", thr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import it.unimi.dsi.fastutil.objects.AbstractReference2ObjectMap;
|
|||||||
import it.unimi.dsi.fastutil.objects.ObjectIterator;
|
import it.unimi.dsi.fastutil.objects.ObjectIterator;
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectSet;
|
import it.unimi.dsi.fastutil.objects.ObjectSet;
|
||||||
import it.unimi.dsi.fastutil.objects.Reference2ObjectMap;
|
import it.unimi.dsi.fastutil.objects.Reference2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
|
import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -27,7 +27,7 @@ public final class ZeroCollidingReferenceStateTable<O, S> {
|
|||||||
|
|
||||||
public ZeroCollidingReferenceStateTable(final Collection<Property<?>> properties) {
|
public ZeroCollidingReferenceStateTable(final Collection<Property<?>> properties) {
|
||||||
this.propertyToIndexer = new Int2ObjectOpenHashMap<>(properties.size());
|
this.propertyToIndexer = new Int2ObjectOpenHashMap<>(properties.size());
|
||||||
this.properties = new ReferenceOpenHashSet<>(properties);
|
this.properties = new ReferenceArrayList<>(properties);
|
||||||
|
|
||||||
final List<Property<?>> sortedProperties = new ArrayList<>(properties);
|
final List<Property<?>> sortedProperties = new ArrayList<>(properties);
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import net.minecraft.SharedConstants;
|
|||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.util.datafix.DataFixTypes;
|
import net.minecraft.util.datafix.fixes.References;
|
||||||
|
|
||||||
public final class ChunkSystemConverters {
|
public final class ChunkSystemConverters {
|
||||||
|
|
||||||
@@ -26,13 +26,13 @@ public final class ChunkSystemConverters {
|
|||||||
public static CompoundTag convertPoiCompoundTag(final CompoundTag data, final ServerLevel world) {
|
public static CompoundTag convertPoiCompoundTag(final CompoundTag data, final ServerLevel world) {
|
||||||
final int dataVersion = getDataVersion(data, DEFAULT_POI_DATA_VERSION);
|
final int dataVersion = getDataVersion(data, DEFAULT_POI_DATA_VERSION);
|
||||||
|
|
||||||
return PlatformHooks.get().convertNBT(DataFixTypes.POI_CHUNK, world.getServer().getFixerUpper(), data, dataVersion, getCurrentVersion());
|
return PlatformHooks.get().convertNBT(References.POI_CHUNK, world.getServer().getFixerUpper(), data, dataVersion, getCurrentVersion());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CompoundTag convertEntityChunkCompoundTag(final CompoundTag data, final ServerLevel world) {
|
public static CompoundTag convertEntityChunkCompoundTag(final CompoundTag data, final ServerLevel world) {
|
||||||
final int dataVersion = getDataVersion(data, DEFAULT_ENTITY_CHUNK_DATA_VERSION);
|
final int dataVersion = getDataVersion(data, DEFAULT_ENTITY_CHUNK_DATA_VERSION);
|
||||||
|
|
||||||
return PlatformHooks.get().convertNBT(DataFixTypes.ENTITY_CHUNK, world.getServer().getFixerUpper(), data, dataVersion, getCurrentVersion());
|
return PlatformHooks.get().convertNBT(References.ENTITY_CHUNK, world.getServer().getFixerUpper(), data, dataVersion, getCurrentVersion());
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChunkSystemConverters() {}
|
private ChunkSystemConverters() {}
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ public final class ChunkEntitySlices {
|
|||||||
return this.entities.size() != 0;
|
return this.entities.size() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Entity> getAllEntities() {
|
public List<Entity> getAllEntities() {
|
||||||
final int len = this.entities.size();
|
final int len = this.entities.size();
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
|
|||||||
@@ -1,15 +1,10 @@
|
|||||||
package ca.spottedleaf.moonrise.patches.chunk_system.level.storage;
|
package ca.spottedleaf.moonrise.patches.chunk_system.level.storage;
|
||||||
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
|
||||||
import net.minecraft.world.level.chunk.storage.RegionFileStorage;
|
import net.minecraft.world.level.chunk.storage.RegionFileStorage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public interface ChunkSystemSectionStorage {
|
public interface ChunkSystemSectionStorage {
|
||||||
|
|
||||||
public CompoundTag moonrise$read(final int chunkX, final int chunkZ) throws IOException;
|
|
||||||
|
|
||||||
public void moonrise$write(final int chunkX, final int chunkZ, final CompoundTag data) throws IOException;
|
|
||||||
|
|
||||||
public RegionFileStorage moonrise$getRegionStorage();
|
public RegionFileStorage moonrise$getRegionStorage();
|
||||||
|
|
||||||
public void moonrise$close() throws IOException;
|
public void moonrise$close() throws IOException;
|
||||||
|
|||||||
@@ -231,8 +231,8 @@ public final class ChunkHolderManager {
|
|||||||
public void autoSave() {
|
public void autoSave() {
|
||||||
final List<NewChunkHolder> reschedule = new ArrayList<>();
|
final List<NewChunkHolder> reschedule = new ArrayList<>();
|
||||||
final long currentTick = this.currentTick;
|
final long currentTick = this.currentTick;
|
||||||
final long maxSaveTime = currentTick - Math.max(1L, PlatformHooks.get().configAutoSaveInterval());
|
final long maxSaveTime = currentTick - Math.max(1L, PlatformHooks.get().configAutoSaveInterval(this.world));
|
||||||
final int maxToSave = PlatformHooks.get().configMaxAutoSavePerTick();
|
final int maxToSave = PlatformHooks.get().configMaxAutoSavePerTick(this.world);
|
||||||
for (int autoSaved = 0; autoSaved < maxToSave && !this.autoSaveQueue.isEmpty();) {
|
for (int autoSaved = 0; autoSaved < maxToSave && !this.autoSaveQueue.isEmpty();) {
|
||||||
final NewChunkHolder holder = this.autoSaveQueue.first();
|
final NewChunkHolder holder = this.autoSaveQueue.first();
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import ca.spottedleaf.concurrentutil.executor.thread.PrioritisedThreadPool;
|
|||||||
import ca.spottedleaf.concurrentutil.lock.ReentrantAreaLock;
|
import ca.spottedleaf.concurrentutil.lock.ReentrantAreaLock;
|
||||||
import ca.spottedleaf.concurrentutil.util.ConcurrentUtil;
|
import ca.spottedleaf.concurrentutil.util.ConcurrentUtil;
|
||||||
import ca.spottedleaf.concurrentutil.util.Priority;
|
import ca.spottedleaf.concurrentutil.util.Priority;
|
||||||
import ca.spottedleaf.moonrise.common.config.moonrise.MoonriseConfig;
|
|
||||||
import ca.spottedleaf.moonrise.common.util.CoordinateUtils;
|
import ca.spottedleaf.moonrise.common.util.CoordinateUtils;
|
||||||
import ca.spottedleaf.moonrise.common.util.JsonUtil;
|
import ca.spottedleaf.moonrise.common.util.JsonUtil;
|
||||||
import ca.spottedleaf.moonrise.common.util.MoonriseCommon;
|
import ca.spottedleaf.moonrise.common.util.MoonriseCommon;
|
||||||
|
|||||||
@@ -1078,7 +1078,7 @@ public final class NewChunkHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't really have a choice but to place this hook here
|
// Don't really have a choice but to place this hook here
|
||||||
PlatformHooks.get().onChunkHolderTicketChange(this.world, this, oldLevel, newLevel);
|
PlatformHooks.get().onChunkHolderTicketChange(this.world, this.vanillaChunkHolder, oldLevel, newLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
static final int NEIGHBOUR_RADIUS = 2;
|
static final int NEIGHBOUR_RADIUS = 2;
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ import net.minecraft.core.BlockPos;
|
|||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.util.Mth;
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.vehicle.AbstractMinecart;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
|
import net.minecraft.world.level.CollisionGetter;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
@@ -1943,6 +1945,7 @@ public final class CollisionUtil {
|
|||||||
|
|
||||||
final BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos();
|
final BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos();
|
||||||
final CollisionContext collisionShape = new LazyEntityCollisionContext(entity);
|
final CollisionContext collisionShape = new LazyEntityCollisionContext(entity);
|
||||||
|
final boolean useEntityCollisionShape = LazyEntityCollisionContext.useEntityCollisionShape(world, entity);
|
||||||
|
|
||||||
// special cases:
|
// special cases:
|
||||||
if (minBlockY > maxBlockY) {
|
if (minBlockY > maxBlockY) {
|
||||||
@@ -2028,7 +2031,10 @@ public final class CollisionUtil {
|
|||||||
VoxelShape blockCollision = ((CollisionBlockState)blockData).moonrise$getConstantContextCollisionShape();
|
VoxelShape blockCollision = ((CollisionBlockState)blockData).moonrise$getConstantContextCollisionShape();
|
||||||
|
|
||||||
if (edgeCount == 0 || ((edgeCount != 1 || blockData.hasLargeCollisionShape()) && (edgeCount != 2 || blockData.getBlock() == Blocks.MOVING_PISTON))) {
|
if (edgeCount == 0 || ((edgeCount != 1 || blockData.hasLargeCollisionShape()) && (edgeCount != 2 || blockData.getBlock() == Blocks.MOVING_PISTON))) {
|
||||||
if (blockCollision == null) {
|
if (useEntityCollisionShape) {
|
||||||
|
mutablePos.set(blockX, blockY, blockZ);
|
||||||
|
blockCollision = collisionShape.getCollisionShape(blockData, world, mutablePos);
|
||||||
|
} else if (blockCollision == null) {
|
||||||
mutablePos.set(blockX, blockY, blockZ);
|
mutablePos.set(blockX, blockY, blockZ);
|
||||||
blockCollision = blockData.getCollisionShape(world, mutablePos, collisionShape);
|
blockCollision = blockData.getCollisionShape(world, mutablePos, collisionShape);
|
||||||
}
|
}
|
||||||
@@ -2150,6 +2156,10 @@ public final class CollisionUtil {
|
|||||||
super(false, 0.0, null, null, entity);
|
super(false, 0.0, null, null, entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean useEntityCollisionShape(final Level world, final Entity entity) {
|
||||||
|
return entity instanceof AbstractMinecart && AbstractMinecart.useExperimentalMovement(world);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isDelegated() {
|
public boolean isDelegated() {
|
||||||
final boolean delegated = this.delegated;
|
final boolean delegated = this.delegated;
|
||||||
this.delegated = false;
|
this.delegated = false;
|
||||||
@@ -2181,6 +2191,11 @@ public final class CollisionUtil {
|
|||||||
public boolean canStandOnFluid(final FluidState state, final FluidState fluidState) {
|
public boolean canStandOnFluid(final FluidState state, final FluidState fluidState) {
|
||||||
return this.getDelegate().canStandOnFluid(state, fluidState);
|
return this.getDelegate().canStandOnFluid(state, fluidState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getCollisionShape(final BlockState blockState, final CollisionGetter collisionGetter, final BlockPos blockPos) {
|
||||||
|
return this.getDelegate().getCollisionShape(blockState, collisionGetter, blockPos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private CollisionUtil() {
|
private CollisionUtil() {
|
||||||
|
|||||||
Reference in New Issue
Block a user