diff --git a/.github/workflows/build_1.21.5.yml b/.github/workflows/build_1.21.5.yml index 999a469..a3d5450 100644 --- a/.github/workflows/build_1.21.5.yml +++ b/.github/workflows/build_1.21.5.yml @@ -56,7 +56,7 @@ jobs: run: sh scripts/SetENV.sh - name: Create Release - if: github.event_name != 'pull_request' && false # early access, we won't provide any releases + if: github.event_name != 'pull_request' uses: ncipollo/release-action@v1 with: tag: ${{ env.tag }} diff --git a/README.md b/README.md index 1ff2c7d..b38eedd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -Logo +[//]: # (Logo) -# LightingLuminol +# Lophine

Lophine 是一个基于Luminol的分支,具有许多有用的优化和可配置的原版特性,目标是在Folia上实现更多生电的目标

diff --git a/README_EN.md b/README_EN.md index 0637ce0..03382fe 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1,9 +1,6 @@ - -Logo +[//]: # (Logo) -# LightingLuminol +# Lophine

LightingLuminol is a Luminol fork with many useful optimizations and configurable vanilla features, aims to provide more function for survival-usable circuit on folia

diff --git a/gradle.properties b/gradle.properties index accd6d5..5d20908 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=me.earthme.lophine version=1.21.5-R0.1-SNAPSHOT mcVersion=1.21.5 -luminolRef=785d82c4339056eccb40ada00a341f7d0e933db6 +luminolRef=9e3360efa0de1f3a6b34812aed6c16f497516513 org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/lophine-server/minecraft-patches/features/0002-Add-config-for-command-block-command-execution.patch b/lophine-server/minecraft-patches/features/0002-Add-config-for-command-block-command-execution.patch new file mode 100644 index 0000000..5a2642f --- /dev/null +++ b/lophine-server/minecraft-patches/features/0002-Add-config-for-command-block-command-execution.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Sun, 12 Jan 2025 10:36:31 +0800 +Subject: [PATCH] Add config for command block command execution + + +diff --git a/net/minecraft/world/level/BaseCommandBlock.java b/net/minecraft/world/level/BaseCommandBlock.java +index 91e30f9c83259abc0589f4ee69c429cd4305d6ea..8155da15908fd944d452fd6aaff69cfdfcc7b36b 100644 +--- a/net/minecraft/world/level/BaseCommandBlock.java ++++ b/net/minecraft/world/level/BaseCommandBlock.java +@@ -102,7 +102,7 @@ public abstract class BaseCommandBlock implements CommandSource { + } + + public boolean performCommand(Level level) { +- if (true) return false; // Folia - region threading ++ if (!me.earthme.lophine.config.modules.experiment.CommandConfig.block) return false; // Folia - region threading // Luminol + if (level.isClientSide || level.getGameTime() == this.lastExecution) { + return false; + } else if ("Searge".equalsIgnoreCase(this.command)) { diff --git a/lophine-server/minecraft-patches/features/0003-Add-config-to-disable-end-crystal-check.patch b/lophine-server/minecraft-patches/features/0003-Add-config-to-disable-end-crystal-check.patch new file mode 100644 index 0000000..9b4dd34 --- /dev/null +++ b/lophine-server/minecraft-patches/features/0003-Add-config-to-disable-end-crystal-check.patch @@ -0,0 +1,27 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Wed, 21 May 2025 13:04:00 +0800 +Subject: [PATCH] Add config to disable end crystal check + + +diff --git a/net/minecraft/world/level/dimension/end/EndDragonFight.java b/net/minecraft/world/level/dimension/end/EndDragonFight.java +index 4fa8371c212dcc02b8cf5fd267b736e1cf3f50c1..d62a9e93dae7b4a7a079e73e80e68e6a81b4c437 100644 +--- a/net/minecraft/world/level/dimension/end/EndDragonFight.java ++++ b/net/minecraft/world/level/dimension/end/EndDragonFight.java +@@ -547,6 +547,8 @@ public class EndDragonFight { + + blockPos = this.portalLocation; + } ++ // Luminol start - Disable end crystal check ++ if (!me.earthme.lophine.config.modules.misc.DisableEndCrystalCheckConfig.disableCheck) { + // Paper start - Perf: Do crystal-portal proximity check before entity lookup + if (placedEndCrystalPos != null) { + // The end crystal must be 0 or 1 higher than the portal origin +@@ -562,6 +564,7 @@ public class EndDragonFight { + } + } + // Paper end - Perf: Do crystal-portal proximity check before entity lookup ++ } // Luminol end - Disable end crystal check + + + List list = Lists.newArrayList(); diff --git a/lophine-server/minecraft-patches/features/0004-Add-config-to-enable-tick-command.patch b/lophine-server/minecraft-patches/features/0004-Add-config-to-enable-tick-command.patch new file mode 100644 index 0000000..92d300c --- /dev/null +++ b/lophine-server/minecraft-patches/features/0004-Add-config-to-enable-tick-command.patch @@ -0,0 +1,167 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Thu, 1 May 2025 22:43:08 +0800 +Subject: [PATCH] Add config to enable tick command + + +diff --git a/io/papermc/paper/threadedregions/RegionizedServer.java b/io/papermc/paper/threadedregions/RegionizedServer.java +index 8e91ec81128bdbd5f78e1f04fe17bcbd6e5dc280..6b4a33189b4dcd4979fb421248f72530c547ac19 100644 +--- a/io/papermc/paper/threadedregions/RegionizedServer.java ++++ b/io/papermc/paper/threadedregions/RegionizedServer.java +@@ -299,6 +299,11 @@ public final class RegionizedServer { + this.randomWalk(); + */ + ++this.tickCount; ++ // Luminol start - Add a config to enable tick command ++ if (me.earthme.lophine.config.modules.experiment.CommandConfig.tick) { ++ MinecraftServer.tickRateManager.tick(); ++ } ++ // Luminol end - Add a config to enable tick command + // expire invalid click command callbacks + io.papermc.paper.adventure.providers.ClickCallbackProviderImpl.CALLBACK_MANAGER.handleQueue((int)this.tickCount); + +@@ -321,6 +326,13 @@ public final class RegionizedServer { + this.globalTick(world, tickCount); + } + ++ // Luminol start - Add a config to enable tick command ++ if (me.earthme.lophine.config.modules.experiment.CommandConfig.tick) { ++ MinecraftServer.tickRateManager.reduceSprintTicks(); ++ MinecraftServer.tickRateManager.endTickWork(); ++ } ++ // Luminol end - Add a config to enable tick command ++ + // tick connections + this.tickConnections(); + +@@ -454,7 +466,7 @@ public final class RegionizedServer { + } + + private void tickTime(final ServerLevel world, final int tickCount) { +- if (world.tickTime) { ++ if ((!me.earthme.lophine.config.modules.experiment.CommandConfig.tick || world.tickRateManager().runsNormally()) && world.tickTime) { // Luminol - Add a config to enable tick command + if (world.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { + world.setDayTime(world.levelData.getDayTime() + (long)tickCount); + } +diff --git a/io/papermc/paper/threadedregions/TickRegionScheduler.java b/io/papermc/paper/threadedregions/TickRegionScheduler.java +index fa6b8d756195c1b430cc11214a901bd42eebc98d..1d79465c9b04c5cdfd299278786916cb10e49522 100644 +--- a/io/papermc/paper/threadedregions/TickRegionScheduler.java ++++ b/io/papermc/paper/threadedregions/TickRegionScheduler.java +@@ -31,8 +31,8 @@ public final class TickRegionScheduler { + } + } + +- public static final int TICK_RATE = 20; +- public static final long TIME_BETWEEN_TICKS = 1_000_000_000L / TICK_RATE; // ns ++ public static float TICK_RATE = 20; // Luminol - Add tick command support ++ public static long TIME_BETWEEN_TICKS = (long) (1_000_000_000L / TICK_RATE); // ns // Luminol - Add tick command support + + // Folia start - watchdog + public static final FoliaWatchdogThread WATCHDOG_THREAD = new FoliaWatchdogThread(); +@@ -375,8 +375,23 @@ public final class TickRegionScheduler { + final long cpuStart = MEASURE_CPU_TIME ? THREAD_MX_BEAN.getCurrentThreadCpuTime() : 0L; + final long tickStart = System.nanoTime(); + +- // use max(), don't assume that tickStart >= scheduledStart +- final int tickCount = Math.max(1, this.tickSchedule.getPeriodsAhead(TIME_BETWEEN_TICKS, tickStart)); ++ // Luminol start - Add a config to enable tick command ++ final int tickCount; ++ if (me.earthme.lophine.config.modules.experiment.CommandConfig.tick) { ++ if (MinecraftServer.tickRateManager.isSprinting() && MinecraftServer.tickRateManager.checkShouldSprintThisTick()) { ++ TICK_RATE = net.minecraft.server.commands.TickCommand.MAX_TICKRATE; ++ TIME_BETWEEN_TICKS = (long) (1_000_000_000L / TICK_RATE); ++ tickCount = 1; ++ } else { ++ TICK_RATE = MinecraftServer.tickRateManager.tickrate(); ++ TIME_BETWEEN_TICKS = (long) (1_000_000_000L / TICK_RATE); ++ tickCount = Math.max(1, this.tickSchedule.getPeriodsAhead(TIME_BETWEEN_TICKS, tickStart)); ++ } ++ } else { ++ // use max(), don't assume that tickStart >= scheduledStart ++ tickCount = Math.max(1, this.tickSchedule.getPeriodsAhead(TIME_BETWEEN_TICKS, tickStart)); ++ } ++ // Luminol end - Add tick command support + + if (!this.tryMarkTicking()) { + if (!this.cancelled.get()) { +@@ -416,6 +431,11 @@ public final class TickRegionScheduler { + try { + // next start isn't updated until the end of this tick + this.tickRegion(tickCount, tickStart, scheduledEnd); ++ // Luminol start - Add a config to enable tick command ++ if (me.earthme.lophine.config.modules.experiment.CommandConfig.tick) { ++ MinecraftServer.tickRateManager.endTickWork(); ++ } ++ // Luminol end - Add a config to enable tick command + } catch (final Throwable thr) { + this.scheduler.regionFailed(this, false, thr); + // regionFailed will schedule a shutdown, so we should avoid letting this region tick further +diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java +index ea50e3c0c4044f03dc8257680814f808fbf3a177..bd5d8bbb667585c1bf976e2eaa38f2b72eabe9e2 100644 +--- a/net/minecraft/commands/Commands.java ++++ b/net/minecraft/commands/Commands.java +@@ -214,7 +214,11 @@ public class Commands { + TeleportCommand.register(this.dispatcher); + TellRawCommand.register(this.dispatcher, context); + //TestCommand.register(this.dispatcher, context); // Folia - region threading +- //TickCommand.register(this.dispatcher); // Folia - region threading - TODO later ++ // Luminol start - Add a config to enable tick command ++ if (me.earthme.lophine.config.modules.experiment.CommandConfig.tick) { ++ TickCommand.register(this.dispatcher); // Folia - region threading - TODO later ++ } ++ // Luminol end - Add a config to enable tick command + TimeCommand.register(this.dispatcher); + TitleCommand.register(this.dispatcher, context); + //TriggerCommand.register(this.dispatcher); // Folia - region threading - TODO later +diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java +index 33d596c0f07d076886c0dd8eb93e901cdb56e438..87625b365e04ce05fa2b6cdf2003c839255c4393 100644 +--- a/net/minecraft/server/MinecraftServer.java ++++ b/net/minecraft/server/MinecraftServer.java +@@ -266,7 +266,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0L) { + this.sprintTickStartTime = System.nanoTime(); +- this.remainingSprintTicks--; ++ // this.remainingSprintTicks--; // Luminol - Add tick command support + return true; + } else { + this.finishTickSprint(); +@@ -113,6 +113,12 @@ public class ServerTickRateManager extends TickRateManager { + } + } + ++ // Luminol start - Add tick command support ++ public void reduceSprintTicks() { ++ this.remainingSprintTicks--; ++ } ++ // Luminol end - Add tick command support ++ + public void endTickWork() { + this.sprintTimeSpend = this.sprintTimeSpend + (System.nanoTime() - this.sprintTickStartTime); + } +diff --git a/net/minecraft/server/commands/TickCommand.java b/net/minecraft/server/commands/TickCommand.java +index 6b6c8ce49eda6806c8288d70848dd143ba2c4703..5d09d2c8bb45cc10b2a13100793249adc7b5a7e9 100644 +--- a/net/minecraft/server/commands/TickCommand.java ++++ b/net/minecraft/server/commands/TickCommand.java +@@ -14,7 +14,7 @@ import net.minecraft.server.ServerTickRateManager; + import net.minecraft.util.TimeUtil; + + public class TickCommand { +- private static final float MAX_TICKRATE = 10000.0F; ++ public static final float MAX_TICKRATE = 10000.0F; // Luminol - Add tick command support + private static final String DEFAULT_TICKRATE = String.valueOf(20); + + public static void register(CommandDispatcher dispatcher) { diff --git a/lophine-server/minecraft-patches/features/0005-Add-config-to-revert-raid-changes.patch b/lophine-server/minecraft-patches/features/0005-Add-config-to-revert-raid-changes.patch new file mode 100644 index 0000000..a9ae0b3 --- /dev/null +++ b/lophine-server/minecraft-patches/features/0005-Add-config-to-revert-raid-changes.patch @@ -0,0 +1,204 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Fri, 11 Apr 2025 16:53:57 +0800 +Subject: [PATCH] Add config to revert raid changes + + +diff --git a/net/minecraft/world/effect/BadOmenMobEffect.java b/net/minecraft/world/effect/BadOmenMobEffect.java +index 80f17f33f670018240c854df589cf90cdeab6e70..faf31ef66ab7fcdb4135e4c225312dc353bdb99b 100644 +--- a/net/minecraft/world/effect/BadOmenMobEffect.java ++++ b/net/minecraft/world/effect/BadOmenMobEffect.java +@@ -22,6 +22,11 @@ class BadOmenMobEffect extends MobEffect { + && !serverPlayer.isSpectator() + && level.getDifficulty() != Difficulty.PEACEFUL + && level.isVillage(serverPlayer.blockPosition())) { ++ // Leaves start - Revert raid changes ++ if (me.earthme.lophine.config.modules.misc.RaidChangesConfig.trigger) { ++ return level.getRaids().createOrExtendRaid(serverPlayer, serverPlayer.blockPosition()) == null; ++ } ++ // Leaves end - Revert raid changes + Raid raidAt = level.getRaidAt(serverPlayer.blockPosition()); + if (raidAt == null || raidAt.getRaidOmenLevel() < raidAt.getMaxRaidOmenLevel()) { + serverPlayer.addEffect(new MobEffectInstance(MobEffects.RAID_OMEN, 600, amplifier)); +diff --git a/net/minecraft/world/entity/raid/Raid.java b/net/minecraft/world/entity/raid/Raid.java +index dbb207c638a64b733dc21704033ff55ca1f44f1d..94fdf1b5ce2622e4e654d09562f8a3e032e6add8 100644 +--- a/net/minecraft/world/entity/raid/Raid.java ++++ b/net/minecraft/world/entity/raid/Raid.java +@@ -340,7 +340,20 @@ public class Raid { + } + + if (flag1) { +- this.waveSpawnPos = this.getValidSpawnPos(level); ++ // Luminol Start - Raid revert ++ if (!me.earthme.lophine.config.modules.misc.RaidChangesConfig.posRevert) { ++ this.waveSpawnPos = this.getValidSpawnPos(level); ++ } else { ++ int n4 = 0; ++ if (this.raidCooldownTicks < 100) { ++ n4 = 1; ++ } ++ if (this.raidCooldownTicks < 40) { ++ n4 = 2; ++ } ++ this.waveSpawnPos = this.getValidSpawnPos(level, n4); ++ } ++ // Luminol End - Raid revert + } + + if (this.raidCooldownTicks == 300 || this.raidCooldownTicks % 20 == 0) { +@@ -375,7 +388,14 @@ public class Raid { + int i = 0; + + while (this.shouldSpawnGroup()) { +- BlockPos blockPos = this.waveSpawnPos.orElseGet(() -> this.findRandomSpawnPos(level, 20)); ++ // Luminol Start - Raid revert ++ BlockPos blockPos; ++ if (!me.earthme.lophine.config.modules.misc.RaidChangesConfig.posRevert) { ++ blockPos = this.waveSpawnPos.orElseGet(() -> this.findRandomSpawnPos(level, 20)); ++ } else { ++ blockPos = this.waveSpawnPos.isPresent() ? this.waveSpawnPos.get() : this.findRandomSpawnPos(level, i, 20); ++ } ++ // Luminol End - Raid revert + if (blockPos != null) { + this.started = true; + this.spawnGroup(level, blockPos); +@@ -387,7 +407,7 @@ public class Raid { + i++; + } + +- if (i > 5) { ++ if (i > (me.earthme.lophine.config.modules.misc.RaidChangesConfig.posRevert ? 3 : 5)) { // Luminol - Raid revert + org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(level, this, org.bukkit.event.raid.RaidStopEvent.Reason.UNSPAWNABLE); // CraftBukkit + this.stop(); + break; +@@ -458,6 +478,17 @@ public class Raid { + return blockPos != null ? Optional.of(blockPos) : Optional.empty(); + } + ++ // Luminol Start - Raid revert ++ private Optional getValidSpawnPos(ServerLevel level, int n) { ++ for (int i = 0; i < 3; ++i) { ++ BlockPos blockPos = this.findRandomSpawnPos(level, n, 1); ++ if (blockPos == null) continue; ++ return Optional.of(blockPos); ++ } ++ return Optional.empty(); ++ } ++ // Luminol End - Raid revert ++ + private boolean hasMoreWaves() { + return this.hasBonusWave() ? !this.hasSpawnedBonusWave() : !this.isFinalWave(); + } +@@ -683,7 +714,7 @@ public class Raid { + int i2 = this.center.getX() + Mth.floor(Mth.cos(f2) * 32.0F * f) + level.random.nextInt(3) * Mth.floor(f); + int i3 = this.center.getZ() + Mth.floor(Mth.sin(f2) * 32.0F * f) + level.random.nextInt(3) * Mth.floor(f); + int height = level.getHeight(Heightmap.Types.WORLD_SURFACE, i2, i3); +- if (Mth.abs(height - this.center.getY()) <= 96) { ++ if (me.earthme.lophine.config.modules.misc.RaidChangesConfig.heightCheck || Mth.abs(height - this.center.getY()) <= 96) { // Leaves - Disable height check + mutableBlockPos.set(i2, height, i3); + if (!level.isVillage(mutableBlockPos) || i <= 7) { + int i4 = 10; +@@ -702,6 +733,26 @@ public class Raid { + return null; + } + ++ // Luminol Start - Raid revert ++ @Nullable ++ private BlockPos findRandomSpawnPos(ServerLevel level, int n, int n2) { ++ int n3 = 2 - n; ++ BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(); ++ SpawnPlacementType spawnPlacementType = SpawnPlacements.getPlacementType(EntityType.RAVAGER); ++ for (int i = 0; i < n2; ++i) { ++ float f = level.random.nextFloat() * ((float)Math.PI * 2); ++ int n4 = this.center.getX() + Mth.floor(Mth.cos(f) * 32.0f * (float)n3) + level.random.nextInt(5); ++ int n5 = this.center.getZ() + Mth.floor(Mth.sin(f) * 32.0f * (float)n3) + level.random.nextInt(5); ++ int n6 = level.getHeight(Heightmap.Types.WORLD_SURFACE, n4, n5); ++ mutableBlockPos.set(n4, n6, n5); ++ if (level.isVillage(mutableBlockPos) && n < 2) continue; ++ if (!level.hasChunksAt(mutableBlockPos.getX() - 10, mutableBlockPos.getZ() - 10, mutableBlockPos.getX() + 10, mutableBlockPos.getZ() + 10) || !level.isPositionEntityTicking(mutableBlockPos) || !spawnPlacementType.isSpawnPositionOk(level, mutableBlockPos, EntityType.RAVAGER) && (!level.getBlockState(mutableBlockPos.below()).is(Blocks.SNOW) || !level.getBlockState(mutableBlockPos).isAir())) continue; ++ return mutableBlockPos; ++ } ++ return null; ++ } ++ // Luminol End - Raid revert ++ + private boolean addWaveMob(ServerLevel level, int wave, Raider raider) { + // Folia start - make raids thread-safe + if (!this.ownsRaid(level)) { +diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java +index f6f36c15120da6c57c0cbea3743a0819252cb6cc..b2bb9b0ff94a7e463ebc4e59fe4378e022e52843 100644 +--- a/net/minecraft/world/entity/raid/Raider.java ++++ b/net/minecraft/world/entity/raid/Raider.java +@@ -127,6 +127,41 @@ public abstract class Raider extends PatrollingMonster { + + currentRaid.removeFromRaid(serverLevel, this, false); + } ++ ++ // Leaves start - Revert raid changes ++ if (me.earthme.lophine.config.modules.misc.RaidChangesConfig.effect && !this.hasRaid()) { ++ ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); ++ net.minecraft.world.entity.player.Player entityhuman = null; ++ if (entity instanceof net.minecraft.world.entity.player.Player player) { ++ entityhuman = player; ++ } else if (entity instanceof net.minecraft.world.entity.animal.wolf.Wolf wolf) { ++ LivingEntity entityliving = wolf.getOwner(); ++ if (wolf.isTame() && entityliving instanceof net.minecraft.world.entity.player.Player player) { ++ entityhuman = player; ++ } ++ } ++ ++ if (entityhuman != null && !itemstack.isEmpty() && this.isCaptain()) { ++ net.minecraft.world.effect.MobEffectInstance mobeffect = entityhuman.getEffect(net.minecraft.world.effect.MobEffects.BAD_OMEN); ++ int i = 1; ++ ++ if (mobeffect != null) { ++ i += mobeffect.getAmplifier(); ++ entityhuman.removeEffectNoUpdate(net.minecraft.world.effect.MobEffects.BAD_OMEN); ++ } else { ++ --i; ++ } ++ ++ i = net.minecraft.util.Mth.clamp(i, 0, 4); ++ net.minecraft.world.effect.MobEffectInstance mobeffect1 = new net.minecraft.world.effect.MobEffectInstance(net.minecraft.world.effect.MobEffects.BAD_OMEN, me.earthme.lophine.config.modules.misc.RaidChangesConfig.infinite ? net.minecraft.world.effect.MobEffectInstance.INFINITE_DURATION : 120000, i, false, false, true); ++ ++ if (!serverLevel.getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_DISABLE_RAIDS)) { ++ entityhuman.addEffect(mobeffect1, entityhuman, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN, true); // CraftBukkit ++ } ++ this.setPatrolLeader(false); ++ } ++ } ++ // Leaves end - Revert raid changes + } + + super.die(cause); +@@ -155,7 +190,7 @@ public abstract class Raider extends PatrollingMonster { + } + + public boolean hasRaid() { +- return this.level() instanceof ServerLevel serverLevel && (this.getCurrentRaid() != null || serverLevel.getRaidAt(this.blockPosition()) != null); ++ return !me.earthme.lophine.config.modules.misc.RaidChangesConfig.selfCheck && (this.level() instanceof ServerLevel serverLevel && (this.getCurrentRaid() != null || serverLevel.getRaidAt(this.blockPosition()) != null)); // Leaves - Disable raid self check + } + + public boolean hasActiveRaid() { +diff --git a/net/minecraft/world/item/component/OminousBottleAmplifier.java b/net/minecraft/world/item/component/OminousBottleAmplifier.java +index 33907bb190ffa22ccf9ea424b1e536297878711a..4b48aa0db9c1ab3e6227d1e1a42ce73db6943b04 100644 +--- a/net/minecraft/world/item/component/OminousBottleAmplifier.java ++++ b/net/minecraft/world/item/component/OminousBottleAmplifier.java +@@ -29,7 +29,7 @@ public record OminousBottleAmplifier(int value) implements ConsumableListener, T + + @Override + public void onConsume(Level level, LivingEntity entity, ItemStack stack, Consumable consumable) { +- entity.addEffect(new MobEffectInstance(MobEffects.BAD_OMEN, 120000, this.value, false, false, true)); // Paper - properly resend entities - diff on change for below ++ entity.addEffect(new MobEffectInstance(MobEffects.BAD_OMEN, me.earthme.lophine.config.modules.misc.RaidChangesConfig.infinite ? net.minecraft.world.effect.MobEffectInstance.INFINITE_DURATION : 120000, this.value, false, false, true)); // Paper - properly resend entities - diff on change for below // Luminol - Raid effect infinite + } + + // Paper start - properly resend entities - collect packets for bundle +@@ -41,7 +41,7 @@ public record OminousBottleAmplifier(int value) implements ConsumableListener, T + + @Override + public void addToTooltip(Item.TooltipContext context, Consumer tooltipAdder, TooltipFlag flag, DataComponentGetter componentGetter) { +- List list = List.of(new MobEffectInstance(MobEffects.BAD_OMEN, 120000, this.value, false, false, true)); ++ List list = List.of(new MobEffectInstance(MobEffects.BAD_OMEN, me.earthme.lophine.config.modules.misc.RaidChangesConfig.infinite ? net.minecraft.world.effect.MobEffectInstance.INFINITE_DURATION : 120000, this.value, false, false, true)); // Luminol - Raid effect infinite + PotionContents.addPotionTooltip(list, tooltipAdder, 1.0F, context.tickRate()); + } + } diff --git a/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-Cross-Region-Damage-trace.patch b/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-Cross-Region-Damage-trace.patch new file mode 100644 index 0000000..9782609 --- /dev/null +++ b/lophine-server/minecraft-patches/features/0006-Add-config-to-enable-Cross-Region-Damage-trace.patch @@ -0,0 +1,154 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Tue, 29 Apr 2025 23:03:56 +0800 +Subject: [PATCH] Add config to enable Cross Region Damage trace + + +diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java +index c3201cb0ba6f928f658d4c74a1ef2b7e8900b1f6..1764875b9024569671bf2be537afb8b492f79102 100644 +--- a/net/minecraft/server/level/ServerPlayer.java ++++ b/net/minecraft/server/level/ServerPlayer.java +@@ -1330,6 +1330,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + this.awardStat(Stats.ENTITY_KILLED_BY.get(killCredit.getType())); + killCredit.awardKillScore(this, cause); + this.createWitherRose(killCredit); ++ // Luminol Start - Cross Region Damage trace ++ } else if (me.earthme.lophine.config.modules.experiment.EntityDamageSourceTraceConfig.enabled) { ++ final LivingEntity entitylivingnew = this.getKillCreditOrigin(); ++ if (entitylivingnew != null) { ++ this.damageTransferToAsync(entitylivingnew, cause); ++ } ++ // Luminol End - Cross Region Damage trace + } + + this.level().broadcastEntityEvent(this, (byte)3); +@@ -1353,6 +1360,24 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + } + // Leaves end - exp fix + ++ // Luminol Start - Cross Region Damage trace ++ private void damageTransferToAsync(LivingEntity entity, DamageSource cause) { ++ // Operations running on current entity ++ this.awardStat(Stats.ENTITY_KILLED_BY.get(entity.getType())); ++ this.createWitherRose(entity); ++ ++ // the entity might be in another tickregion sometimes, so we need to schedule the task onto the entity ++ // to ensure thread safe ++ entity.getBukkitEntity().taskScheduler.schedule((LivingEntity nmsEntity) -> { ++ try { ++ nmsEntity.awardKillScore(this, cause); ++ } catch (Throwable ex) { ++ LOGGER.error(ex.getMessage(), ex); ++ } ++ }, null, 1L ); ++ } ++ // Luminol End - Cross Region Damage trace ++ + private void tellNeutralMobsThatIDied() { + AABB aabb = new AABB(this.blockPosition()).inflate(32.0, 10.0, 32.0); + this.level() +diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java +index 5b5e63c4dc10076ba33a8ddf0ebae96643b1161f..063d682ae6cde044717a32402785b7a20ea8a351 100644 +--- a/net/minecraft/world/entity/LivingEntity.java ++++ b/net/minecraft/world/entity/LivingEntity.java +@@ -1191,6 +1191,29 @@ public abstract class LivingEntity extends Entity implements Attackable { + } + } + ++ // Luminol Start - raid revert adapt Cross Region Damage trace ++ public boolean addEffect(MobEffectInstance effectInstance, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause, boolean fireEvent, boolean async) { ++ if (ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(entity)) { ++ return addEffect(effectInstance, entity, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN, true); ++ } else if (me.earthme.lophine.config.modules.experiment.EntityDamageSourceTraceConfig.enabled) { ++ postToEntityThreadAddEffect(effectInstance, entity, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN, true); ++ return true; ++ } ++ return false; ++ } ++ ++ private void postToEntityThreadAddEffect(MobEffectInstance effectInstance, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause, boolean fireEvent) { ++ if (entity != null) ++ entity.getBukkitEntity().taskScheduler.schedule((Entity nmsEntity) -> { ++ try { ++ addEffect(effectInstance, nmsEntity, cause, fireEvent); ++ } catch (Throwable ex) { ++ LOGGER.error(ex.getMessage(), ex); ++ } ++ }, null, 1L ); ++ } ++ // Luminol End - raid revert adapt Cross Region Damage trace ++ + public boolean canBeAffected(MobEffectInstance effectInstance) { + if (this.getType().is(EntityTypeTags.IMMUNE_TO_INFESTED)) { + return !effectInstance.is(MobEffects.INFESTED); +@@ -1916,6 +1939,13 @@ public abstract class LivingEntity extends Entity implements Attackable { + final LivingEntity killer = this.getKillCredit(); + if (killer != null) { + killer.awardKillScore(this, damageSource); ++ // Luminol Start - Cross Region Damage trace ++ } else if (me.earthme.lophine.config.modules.experiment.EntityDamageSourceTraceConfig.enabled) { ++ final LivingEntity killernew = this.getKillCreditOrigin(); ++ if (killernew != null) { ++ this.damageTransferToAsync(killernew, damageSource); ++ } ++ // Luminol End - Cross Region Damage trace + } + }); // Paper end + this.postDeathDropItems(deathEvent); // Paper +@@ -1926,6 +1956,18 @@ public abstract class LivingEntity extends Entity implements Attackable { + return deathEvent; // Paper + } + ++ // Luminol Start - Cross Region Damage trace ++ private void damageTransferToAsync(LivingEntity entity, DamageSource damageSource) { ++ entity.getBukkitEntity().taskScheduler.schedule((LivingEntity nmsEntity) -> { ++ try { ++ nmsEntity.awardKillScore(this, damageSource); ++ } catch (Throwable ex) { ++ LOGGER.error(ex.getMessage(), ex); ++ } ++ }, null, 1L ); ++ } ++ // Luminol End - Cross Region Damage trace ++ + protected void dropEquipment(ServerLevel level) { + } + protected void postDeathDropItems(org.bukkit.event.entity.EntityDeathEvent event) {} // Paper - method for post death logic that cannot be ran before the event is potentially cancelled +@@ -2524,6 +2566,18 @@ public abstract class LivingEntity extends Entity implements Attackable { + } + } + ++ // Luminol Start - Cross Region Damage trace ++ @Nullable ++ public LivingEntity getKillCreditOrigin() { ++ if (this.lastHurtByPlayer != null) { ++ return this.lastHurtByPlayer.getEntity(this.level(), Player.class); ++ } else if (this.lastHurtByMob != null) { ++ return this.lastHurtByMob.getEntity(this.level(), LivingEntity.class); ++ } ++ return null; ++ } ++ // Luminol End - Cross Region Damage trace ++ + public final float getMaxHealth() { + return (float)this.getAttributeValue(Attributes.MAX_HEALTH); + } +diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java +index b2bb9b0ff94a7e463ebc4e59fe4378e022e52843..4b72db3350f2990b00076fffb9df811560db8207 100644 +--- a/net/minecraft/world/entity/raid/Raider.java ++++ b/net/minecraft/world/entity/raid/Raider.java +@@ -156,7 +156,13 @@ public abstract class Raider extends PatrollingMonster { + net.minecraft.world.effect.MobEffectInstance mobeffect1 = new net.minecraft.world.effect.MobEffectInstance(net.minecraft.world.effect.MobEffects.BAD_OMEN, me.earthme.lophine.config.modules.misc.RaidChangesConfig.infinite ? net.minecraft.world.effect.MobEffectInstance.INFINITE_DURATION : 120000, i, false, false, true); + + if (!serverLevel.getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_DISABLE_RAIDS)) { +- entityhuman.addEffect(mobeffect1, entityhuman, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN, true); // CraftBukkit ++ if (me.earthme.lophine.config.modules.experiment.EntityDamageSourceTraceConfig.enabled) { ++ // Luminol start - Raid changes adapt DamageSource trace ++ entityhuman.addEffect(mobeffect1, entityhuman, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN, true, true); ++ } else { ++ entityhuman.addEffect(mobeffect1, entityhuman, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN, true); // CraftBukkit ++ } ++ // Luminol end - Raid changes adapt DamageSource trace + } + this.setPatrolLeader(false); + } diff --git a/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-Raytracing-tracker.patch b/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-Raytracing-tracker.patch new file mode 100644 index 0000000..06fc2a6 --- /dev/null +++ b/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-Raytracing-tracker.patch @@ -0,0 +1,158 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Wed, 5 Feb 2025 15:22:19 +0800 +Subject: [PATCH] Add config to enable Raytracing tracker + + +diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java +index ee53f78396f4377d3e5c2998826f231208066ef6..607091ecbd4a7261f2c0d839ee4dd1d27fa2190a 100644 +--- a/net/minecraft/server/level/ChunkMap.java ++++ b/net/minecraft/server/level/ChunkMap.java +@@ -1278,7 +1278,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + double d1 = vec3_dx * vec3_dx + vec3_dz * vec3_dz; // Paper + double d2 = d * d; + // Paper start - Configurable entity tracking range by Y +- boolean flag = d1 <= d2; ++ boolean flag = d1 <= d2 && !entity.isCulled(); // Luminol - Ray tracing entity tracker + if (flag && level.paperConfig().entities.trackingRangeY.enabled) { + double rangeY = level.paperConfig().entities.trackingRangeY.get(this.entity, -1); + if (rangeY != -1) { +diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java +index 14e58b4093b4eafb989f9b1d498579bd25ab6c1e..2e906ba62380ed3999ed5747a88073b313b60bae 100644 +--- a/net/minecraft/world/entity/Entity.java ++++ b/net/minecraft/world/entity/Entity.java +@@ -140,7 +140,7 @@ import net.minecraft.world.scores.ScoreHolder; + import net.minecraft.world.scores.Team; + import org.jetbrains.annotations.Contract; + +-public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, DataComponentGetter, ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity, ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity { // Paper - rewrite chunk system // Paper - optimise entity tracker ++public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, DataComponentGetter, ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity, ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity, dev.tr7zw.entityculling.versionless.access.Cullable { // Paper - rewrite chunk system // Paper - optimise entity tracker // Luminol - Ray tracing entity tracker + // CraftBukkit start + private static final org.slf4j.Logger LOGGER = com.mojang.logging.LogUtils.getLogger(); + private static final int CURRENT_LEVEL = 2; +@@ -6102,4 +6102,46 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess + // Paper end - Expose entity id counter + + public boolean shouldTickHot() { return this.tickCount > 20 * 10 && this.isAlive(); } // KioCG ++ ++ private long lasttime = 0; ++ private boolean culled = false; ++ private boolean outOfCamera = false; ++ ++ @Override ++ public void setTimeout() { ++ this.lasttime = System.currentTimeMillis() + 1000; ++ } ++ ++ @Override ++ public boolean isForcedVisible() { ++ return this.lasttime > System.currentTimeMillis(); ++ } ++ ++ @Override ++ public void setCulled(boolean value) { ++ this.culled = value; ++ if (!value) { ++ setTimeout(); ++ } ++ } ++ ++ @Override ++ public boolean isCulled() { ++ if (!me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.enabled) ++ return false; ++ return this.culled; ++ } ++ ++ @Override ++ public void setOutOfCamera(boolean value) { ++ this.outOfCamera = value; ++ } ++ ++ @Override ++ public boolean isOutOfCamera() { ++ if (!me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.enabled) ++ return false; ++ return this.outOfCamera; ++ } ++ + } +diff --git a/net/minecraft/world/entity/EntityType.java b/net/minecraft/world/entity/EntityType.java +index 6b72ab233508e6df1eca34360ce76d102ee25a41..f39ee4605cc15102d6560afd1dad5f56dd53cf4e 100644 +--- a/net/minecraft/world/entity/EntityType.java ++++ b/net/minecraft/world/entity/EntityType.java +@@ -1109,6 +1109,9 @@ public class EntityType implements FeatureElement, EntityTypeT + public final int passengerTickTimerId; + public final int passengerInactiveTickTimerId; + // Folia end - profiler ++ // Luminol - Raytracing entity tracker ++ public boolean skipRaytracningCheck = false; ++ // Luminol end + + public EntityType( + EntityType.EntityFactory factory, +diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java +index 543750bee43bfaaaf33f2cec53eb0de05e7a1dd2..34c4c195519de03ec11897160b98c80353eb3d6c 100644 +--- a/net/minecraft/world/entity/player/Player.java ++++ b/net/minecraft/world/entity/player/Player.java +@@ -220,6 +220,25 @@ public abstract class Player extends LivingEntity { + return (org.bukkit.craftbukkit.entity.CraftHumanEntity) super.getBukkitEntity(); + } + // CraftBukkit end ++ // Luminol start - Raytracing entity tracker ++ public dev.tr7zw.entityculling.CullTask cullTask; ++ { ++ if (!me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.enabled) { ++ this.cullTask = null; ++ }else { ++ final com.logisticscraft.occlusionculling.OcclusionCullingInstance culling = new com.logisticscraft.occlusionculling.OcclusionCullingInstance( ++ me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.tracingDistance, ++ new dev.tr7zw.entityculling.DefaultChunkDataProvider(this.level()) ++ ); ++ ++ this.cullTask = new dev.tr7zw.entityculling.CullTask( ++ culling, this, ++ me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.hitboxLimit, ++ me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.checkIntervalMs ++ ); ++ } ++ } ++ // Luminol end + + public Player(Level level, BlockPos pos, float yRot, GameProfile gameProfile) { + super(EntityType.PLAYER, level); +@@ -277,6 +296,26 @@ public abstract class Player extends LivingEntity { + + @Override + public void tick() { ++ // Luminol start - Ray tracing entity tracker ++ if (!me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.enabled) { ++ if (this.cullTask != null) this.cullTask.signalStop(); ++ this.cullTask = null; ++ }else { ++ final com.logisticscraft.occlusionculling.OcclusionCullingInstance culling = new com.logisticscraft.occlusionculling.OcclusionCullingInstance( ++ me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.tracingDistance, ++ new dev.tr7zw.entityculling.DefaultChunkDataProvider(this.level()) ++ ); ++ ++ this.cullTask = new dev.tr7zw.entityculling.CullTask( ++ culling, this, ++ me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.hitboxLimit, ++ me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig.checkIntervalMs ++ ); ++ } ++ if (this.cullTask != null) this.cullTask.setup(); ++ if (this.cullTask != null) this.cullTask.requestCullSignal(); // Luminol - Ray tracing entity tracker ++ // Luminol end ++ + this.noPhysics = this.isSpectator(); + if (this.isSpectator() || this.isPassenger()) { + this.setOnGround(false); +@@ -1415,6 +1454,7 @@ public abstract class Player extends LivingEntity { + if (this.containerMenu != null && this.hasContainerOpen()) { + this.doCloseContainer(); + } ++ if (this.cullTask != null) this.cullTask.signalStop(); // Luminol - Ray tracing entity tracker + } + + @Override diff --git a/lophine-server/minecraft-patches/features/0008-Purpur-Barrels-and-enderchests-6-rows.patch b/lophine-server/minecraft-patches/features/0008-Purpur-Barrels-and-enderchests-6-rows.patch new file mode 100644 index 0000000..9113184 --- /dev/null +++ b/lophine-server/minecraft-patches/features/0008-Purpur-Barrels-and-enderchests-6-rows.patch @@ -0,0 +1,175 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Thu, 20 Feb 2025 01:00:28 +0800 +Subject: [PATCH] Purpur: Barrels and enderchests 6 rows + +Co-authored by: William Blake Galbreath +As part of: Purpur (https://github.com/PurpurMC/Purpur/blob/09f547de09fc5d886f18f6d99ff389289766ec9d/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch) +Licensed under: MIT (https://github.com/PurpurMC/Purpur/blob/09f547de09fc5d886f18f6d99ff389289766ec9d/LICENSE) + +diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java +index 001483b7098523f3645a95c81fcf0e38b551705e..3a83ba2fab530e9e64d53167d296c1f2ca1b9e4b 100644 +--- a/net/minecraft/server/players/PlayerList.java ++++ b/net/minecraft/server/players/PlayerList.java +@@ -1116,6 +1116,10 @@ public abstract class PlayerList { + player.getBukkitEntity().recalculatePermissions(); // CraftBukkit + this.server.getCommands().sendCommands(player); + } // Paper - Add sendOpLevel API ++ ++ // Purpur start - Barrels and enderchests 6 rows ++ player.enderChestSlotCount = me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.enderchestRows < 7 && me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.enderchestRows > 0 ? 9 * me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.enderchestRows : 27; ++ // Purpur end - Barrels and enderchests 6 rows + } + + public boolean isWhiteListed(GameProfile profile) { +diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java +index 34c4c195519de03ec11897160b98c80353eb3d6c..27e335e01d8f09f05a4fea5f15407dbe3a4555cb 100644 +--- a/net/minecraft/world/entity/player/Player.java ++++ b/net/minecraft/world/entity/player/Player.java +@@ -210,6 +210,7 @@ public abstract class Player extends LivingEntity { + private int currentImpulseContextResetGraceTime = 0; + public boolean affectsSpawning = true; // Paper - Affects Spawning API + public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage ++ public int enderChestSlotCount = -1; // Purpur - Barrels and enderchests 6 rows + + // CraftBukkit start + public boolean fauxSleeping; +diff --git a/net/minecraft/world/inventory/ChestMenu.java b/net/minecraft/world/inventory/ChestMenu.java +index 0fffa384f928ab84451331380968fb4650eafe26..d84a10396395939149da88bcb01be59e220c340e 100644 +--- a/net/minecraft/world/inventory/ChestMenu.java ++++ b/net/minecraft/world/inventory/ChestMenu.java +@@ -66,10 +66,30 @@ public class ChestMenu extends AbstractContainerMenu { + return new ChestMenu(MenuType.GENERIC_9x6, containerId, playerInventory, 6); + } + ++ // Purpur start - Barrels and enderchests 6 rows ++ public static ChestMenu oneRow(int syncId, Inventory playerInventory, Container inventory) { ++ return new ChestMenu(MenuType.GENERIC_9x1, syncId, playerInventory, inventory, 1); ++ } ++ ++ public static ChestMenu twoRows(int syncId, Inventory playerInventory, Container inventory) { ++ return new ChestMenu(MenuType.GENERIC_9x2, syncId, playerInventory, inventory, 2); ++ } ++ // Purpur end - Barrels and enderchests 6 rows ++ + public static ChestMenu threeRows(int containerId, Inventory playerInventory, Container container) { + return new ChestMenu(MenuType.GENERIC_9x3, containerId, playerInventory, container, 3); + } + ++ // Purpur start - Barrels and enderchests 6 rows ++ public static ChestMenu fourRows(int syncId, Inventory playerInventory, Container inventory) { ++ return new ChestMenu(MenuType.GENERIC_9x4, syncId, playerInventory, inventory, 4); ++ } ++ ++ public static ChestMenu fiveRows(int syncId, Inventory playerInventory, Container inventory) { ++ return new ChestMenu(MenuType.GENERIC_9x5, syncId, playerInventory, inventory, 5); ++ } ++ // Purpur end - Barrels and enderchests 6 rows ++ + public static ChestMenu sixRows(int containerId, Inventory playerInventory, Container container) { + return new ChestMenu(MenuType.GENERIC_9x6, containerId, playerInventory, container, 6); + } +diff --git a/net/minecraft/world/inventory/PlayerEnderChestContainer.java b/net/minecraft/world/inventory/PlayerEnderChestContainer.java +index bc2b95973192069fc64581b59583b19df876f55d..d80a3760c0a84df19d0b2063c648f08ecef44f02 100644 +--- a/net/minecraft/world/inventory/PlayerEnderChestContainer.java ++++ b/net/minecraft/world/inventory/PlayerEnderChestContainer.java +@@ -25,11 +25,18 @@ public class PlayerEnderChestContainer extends SimpleContainer { + } + + public PlayerEnderChestContainer(Player owner) { +- super(27); ++ super(me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.enderchestRows < 7 && me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.enderchestRows > 0 ? 9 * me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.enderchestRows : 27); + this.owner = owner; + // CraftBukkit end + } + ++ // Purpur start - Barrels and enderchests 6 rows ++ @Override ++ public int getContainerSize() { ++ return owner.enderChestSlotCount < 0 ? super.getContainerSize() : owner.enderChestSlotCount; ++ } ++ // Purpur end - Barrels and enderchests 6 rows ++ + public void setActiveChest(EnderChestBlockEntity enderChestBlockEntity) { + this.activeChest = enderChestBlockEntity; + } +diff --git a/net/minecraft/world/level/block/EnderChestBlock.java b/net/minecraft/world/level/block/EnderChestBlock.java +index 5077a9ff7b78801bdc53536a37aee07b8d86ee4d..c7866aa9a3647d3285eb0996fbc55e1b15a4c40c 100644 +--- a/net/minecraft/world/level/block/EnderChestBlock.java ++++ b/net/minecraft/world/level/block/EnderChestBlock.java +@@ -85,8 +85,14 @@ public class EnderChestBlock extends AbstractChestBlock i + enderChestInventory.setActiveChest(enderChestBlockEntity); // Needs to happen before ChestMenu.threeRows as it is required for opening animations + if (level instanceof ServerLevel serverLevel && player.openMenu( + new SimpleMenuProvider( +- (containerId, playerInventory, player1) -> ChestMenu.threeRows(containerId, playerInventory, enderChestInventory), CONTAINER_TITLE +- ) ++ (containerId, playerInventory, player1) -> switch (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.enderchestRows) { ++ case 6 -> ChestMenu.sixRows(containerId, playerInventory, enderChestInventory); ++ case 5 -> ChestMenu.fiveRows(containerId, playerInventory, enderChestInventory); ++ case 4 -> ChestMenu.fourRows(containerId, playerInventory, enderChestInventory); ++ case 2 -> ChestMenu.twoRows(containerId, playerInventory, enderChestInventory); ++ case 1 -> ChestMenu.oneRow(containerId, playerInventory, enderChestInventory); ++ default -> ChestMenu.threeRows(containerId, playerInventory, enderChestInventory); ++ }, CONTAINER_TITLE) // Purpur - Barrels and enderchests 6 rows + ).isPresent()) { + // Paper end - Fix InventoryOpenEvent cancellation - moved up; + player.awardStat(Stats.OPEN_ENDERCHEST); +diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +index 027502d0af5512c31878978c4d05c52fa3029cca..4716015da322ed1f41c9f81d5ff0695914e7b6e3 100644 +--- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +@@ -56,7 +56,17 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { + } + // CraftBukkit end + +- private NonNullList items = NonNullList.withSize(27, ItemStack.EMPTY); ++ // Purpur start - Barrels and enderchests 6 rows ++ private NonNullList items = NonNullList.withSize(switch (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.barrelRows) { ++ case 6 -> 54; ++ case 5 -> 45; ++ case 4 -> 36; ++ case 2 -> 18; ++ case 1 -> 9; ++ default -> 27; ++ }, ItemStack.EMPTY); ++ // Purpur end - Barrels and enderchests 6 rows ++ + public final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { + @Override + protected void onOpen(Level level, BlockPos pos, BlockState state) { +@@ -108,7 +118,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { + + @Override + public int getContainerSize() { +- return 27; ++ // Purpur start - Barrels and enderchests 6 rows ++ return switch (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.barrelRows) { ++ case 6 -> 54; ++ case 5 -> 45; ++ case 4 -> 36; ++ case 2 -> 18; ++ case 1 -> 9; ++ default -> 27; ++ }; ++ // Purpur end - Barrels and enderchests 6 rows + } + + @Override +@@ -128,7 +147,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { + + @Override + protected AbstractContainerMenu createMenu(int id, Inventory player) { +- return ChestMenu.threeRows(id, player, this); ++ // Purpur start - Barrels and enderchests 6 rows ++ return switch (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.barrelRows) { ++ case 6 -> ChestMenu.sixRows(id, player, this); ++ case 5 -> ChestMenu.fiveRows(id, player, this); ++ case 4 -> ChestMenu.fourRows(id, player, this); ++ case 2 -> ChestMenu.twoRows(id, player, this); ++ case 1 -> ChestMenu.oneRow(id, player, this); ++ default -> ChestMenu.threeRows(id, player, this); ++ }; ++ // Purpur end - Barrels and enderchests 6 rows + } + + @Override diff --git a/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch b/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch index 05569c9..cae8bec 100644 --- a/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch +++ b/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch @@ -165,7 +165,7 @@ index fb63e2a3205ea9f7aaee0ff0f4dc0cc1a5268507..645f2f41de74f4461685c753dcd6cfc5 ); } diff --git a/src/main/java/me/earthme/luminol/config/LuminolConfig.java b/src/main/java/me/earthme/luminol/config/LuminolConfig.java -index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb195a74daa0 100644 +index da945b930ed8ef24a907e9c397efa115d128a3d2..f9994cb3134accd2d43ae5de950fdb9700e7b466 100644 --- a/src/main/java/me/earthme/luminol/config/LuminolConfig.java +++ b/src/main/java/me/earthme/luminol/config/LuminolConfig.java @@ -29,22 +29,33 @@ import java.util.jar.JarEntry; @@ -273,7 +273,7 @@ index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb19 final EnumConfigCategory category = singleConfigModule.getCategory(); Field[] fields = singleConfigModule.getClass().getDeclaredFields(); -@@ -199,7 +210,7 @@ public class LuminolConfig { +@@ -200,7 +211,7 @@ public class LuminolConfig { } } @@ -282,7 +282,7 @@ index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb19 configFileInstance.remove(name); Object configAtPath = configFileInstance.get(String.join(".", keys)); if (configAtPath instanceof UnmodifiableConfig && ((UnmodifiableConfig) configAtPath).isEmpty()) { -@@ -207,7 +218,7 @@ public class LuminolConfig { +@@ -208,7 +219,7 @@ public class LuminolConfig { } } @@ -291,7 +291,7 @@ index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb19 configFileInstance.remove(String.join(".", keys)); Object configAtPath = configFileInstance.get(String.join(".", Arrays.copyOfRange(keys, 1, keys.length))); if (configAtPath instanceof UnmodifiableConfig && ((UnmodifiableConfig) configAtPath).isEmpty()) { -@@ -215,11 +226,11 @@ public class LuminolConfig { +@@ -216,11 +227,11 @@ public class LuminolConfig { } } @@ -305,7 +305,7 @@ index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb19 if (configFileInstance.contains(key) && configFileInstance.get(key) != null) { stagedConfigMap.put(key, value); return true; -@@ -227,7 +238,7 @@ public class LuminolConfig { +@@ -228,7 +239,7 @@ public class LuminolConfig { return false; } @@ -314,7 +314,7 @@ index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb19 if (!targetType.isAssignableFrom(value.getClass())) { try { if (targetType == Integer.class) { -@@ -251,27 +262,27 @@ public class LuminolConfig { +@@ -252,27 +263,27 @@ public class LuminolConfig { return value; } @@ -348,7 +348,7 @@ index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb19 List allPaths = getAllConfigPaths(partialPath); List result = new ArrayList<>(); -@@ -291,13 +302,13 @@ public class LuminolConfig { +@@ -292,13 +303,13 @@ public class LuminolConfig { return result; } @@ -364,7 +364,7 @@ index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb19 Set> classes = new LinkedHashSet<>(); String packageDirName = pack.replace('.', '/'); Enumeration dirs; -@@ -328,7 +339,7 @@ public class LuminolConfig { +@@ -329,7 +340,7 @@ public class LuminolConfig { return classes; } @@ -373,7 +373,7 @@ index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb19 File dir = new File(packagePath); if (!dir.exists() || !dir.isDirectory()) { -@@ -352,7 +363,7 @@ public class LuminolConfig { +@@ -353,7 +364,7 @@ public class LuminolConfig { } } diff --git a/lophine-server/paper-patches/features/0002-Purpur-Barrels-and-enderchests-6-rows.patch b/lophine-server/paper-patches/features/0002-Purpur-Barrels-and-enderchests-6-rows.patch new file mode 100644 index 0000000..0bb6b79 --- /dev/null +++ b/lophine-server/paper-patches/features/0002-Purpur-Barrels-and-enderchests-6-rows.patch @@ -0,0 +1,52 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Suisuroru +Date: Thu, 20 Feb 2025 01:00:29 +0800 +Subject: [PATCH] Purpur-Barrels-and-enderchests-6-rows + + +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +index c00ddfe41439954fa0fd87c0933f274c8a752eb6..ac0218fcdf9e9c77a30b7f09b2a5e557ef0f7591 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +@@ -150,9 +150,26 @@ public class CraftContainer extends AbstractContainerMenu { + case PLAYER: + case CHEST: + case ENDER_CHEST: +- case BARREL: +- this.delegate = new ChestMenu(net.minecraft.world.inventory.MenuType.GENERIC_9x3, windowId, bottom, top, top.getContainerSize() / 9); ++ // Purpur start - Barrels and enderchests 6 rows ++ this.delegate = new ChestMenu(switch (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.enderchestRows) { ++ case 6 -> net.minecraft.world.inventory.MenuType.GENERIC_9x6; ++ case 5 -> net.minecraft.world.inventory.MenuType.GENERIC_9x5; ++ case 4 -> net.minecraft.world.inventory.MenuType.GENERIC_9x4; ++ case 2 -> net.minecraft.world.inventory.MenuType.GENERIC_9x2; ++ case 1 -> net.minecraft.world.inventory.MenuType.GENERIC_9x1; ++ default -> net.minecraft.world.inventory.MenuType.GENERIC_9x3; ++ }, windowId, bottom, top, top.getContainerSize() / 9); + break; ++ case BARREL: ++ this.delegate = new ChestMenu(switch (me.earthme.lophine.config.modules.misc.ContainerExpansionConfig.barrelRows) { ++ case 6 -> net.minecraft.world.inventory.MenuType.GENERIC_9x6; ++ case 5 -> net.minecraft.world.inventory.MenuType.GENERIC_9x5; ++ case 4 -> net.minecraft.world.inventory.MenuType.GENERIC_9x4; ++ case 2 -> net.minecraft.world.inventory.MenuType.GENERIC_9x2; ++ case 1 -> net.minecraft.world.inventory.MenuType.GENERIC_9x1; ++ default -> net.minecraft.world.inventory.MenuType.GENERIC_9x3; ++ }, windowId, bottom, top, top.getContainerSize() / 9); ++ // Purpur end - Barrels and enderchests 6 rows + case DISPENSER: + case DROPPER: + this.delegate = new DispenserMenu(windowId, bottom, top); +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +index f850e6cea92edc87ed54cf54488b5ebb606913ed..f4db38de4348fb03db0b769bd5b5993184dd4abb 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +@@ -84,7 +84,7 @@ public class CraftInventory implements Inventory { + + @Override + public void setContents(ItemStack[] items) { +- Preconditions.checkArgument(items.length <= this.getSize(), "Invalid inventory size (%s); expected %s or less", items.length, this.getSize()); ++ // Preconditions.checkArgument(items.length <= this.getSize(), "Invalid inventory size (%s); expected %s or less", items.length, this.getSize()); // Purpur - Barrels and enderchests 6 rows + + for (int i = 0; i < this.getSize(); i++) { + if (i >= items.length) { diff --git a/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/CullTask.java.patch b/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/CullTask.java.patch new file mode 100644 index 0000000..8737ec9 --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/CullTask.java.patch @@ -0,0 +1,154 @@ +--- /dev/null ++++ b/src/main/java/dev/tr7zw/entityculling/CullTask.java +@@ -1,0 +_,151 @@ ++package dev.tr7zw.entityculling; ++ ++import ca.spottedleaf.moonrise.common.util.TickThread; ++import com.logisticscraft.occlusionculling.OcclusionCullingInstance; ++import com.logisticscraft.occlusionculling.util.Vec3d; ++import dev.tr7zw.entityculling.versionless.access.Cullable; ++import me.earthme.lophine.config.modules.experiment.RayTrackingEntityTrackerConfig; ++import net.minecraft.world.entity.Entity; ++import net.minecraft.world.entity.decoration.ArmorStand; ++import net.minecraft.world.entity.player.Player; ++import net.minecraft.world.phys.AABB; ++import net.minecraft.world.phys.Vec3; ++ ++import java.util.concurrent.CompletableFuture; ++import java.util.concurrent.Executor; ++import java.util.concurrent.Executors; ++import java.util.concurrent.TimeUnit; ++ ++public class CullTask implements Runnable { ++ ++ private volatile boolean requestCull = false; ++ private volatile boolean scheduleNext = true; ++ private volatile boolean inited = false; ++ ++ private final OcclusionCullingInstance culling; ++ private final Player checkTarget; ++ ++ private final int hitboxLimit; ++ ++ public long lastCheckedTime = 0; ++ ++ // reused preallocated vars ++ private final Vec3d lastPos = new Vec3d(0, 0, 0); ++ private final Vec3d aabbMin = new Vec3d(0, 0, 0); ++ private final Vec3d aabbMax = new Vec3d(0, 0, 0); ++ ++ private static final Executor backgroundWorker = Executors.newCachedThreadPool(task -> { ++ final TickThread worker = new TickThread("EntityCulling") { ++ @Override ++ public void run() { ++ task.run(); ++ } ++ }; ++ ++ worker.setDaemon(true); ++ ++ return worker; ++ }); ++ ++ private final Executor worker; ++ ++ public CullTask( ++ OcclusionCullingInstance culling, ++ Player checkTarget, ++ int hitboxLimit, ++ long checkIntervalMs ++ ) { ++ this.culling = culling; ++ this.checkTarget = checkTarget; ++ this.hitboxLimit = hitboxLimit; ++ this.worker = CompletableFuture.delayedExecutor(checkIntervalMs, TimeUnit.MILLISECONDS, backgroundWorker); ++ } ++ ++ public void requestCullSignal() { ++ this.requestCull = true; ++ } ++ ++ public void signalStop() { ++ this.scheduleNext = false; ++ } ++ ++ public void setup() { ++ if (!this.inited) ++ this.inited = true; ++ else ++ return; ++ this.worker.execute(this); ++ } ++ ++ @Override ++ public void run() { ++ try { ++ if (this.checkTarget.tickCount > 10) { ++ // getEyePosition can use a fixed delta as its debug only anyway ++ Vec3 cameraMC = this.checkTarget.getEyePosition(0); ++ if (requestCull || !(cameraMC.x == lastPos.x && cameraMC.y == lastPos.y && cameraMC.z == lastPos.z)) { ++ long start = System.currentTimeMillis(); ++ ++ requestCull = false; ++ ++ lastPos.set(cameraMC.x, cameraMC.y, cameraMC.z); ++ culling.resetCache(); ++ ++ cullEntities(cameraMC, lastPos); ++ ++ lastCheckedTime = (System.currentTimeMillis() - start); ++ } ++ } ++ }finally { ++ if (this.scheduleNext) { ++ this.worker.execute(this); ++ } ++ } ++ } ++ ++ private void cullEntities(Vec3 cameraMC, Vec3d camera) { ++ for (Entity entity : this.checkTarget.level().getEntities().getAll()) { ++ if (!(entity instanceof Cullable cullable)) { ++ continue; // Not sure how this could happen outside from mixin screwing up the inject into ++ // Entity ++ } ++ ++ if (entity.getType().skipRaytracningCheck) { ++ continue; ++ } ++ ++ if (!cullable.isForcedVisible()) { ++ if (entity.isCurrentlyGlowing() || isSkippableArmorstand(entity)) { ++ cullable.setCulled(false); ++ continue; ++ } ++ ++ if (!entity.position().closerThan(cameraMC, RayTrackingEntityTrackerConfig.tracingDistance)) { ++ cullable.setCulled(false); // If your entity view distance is larger than tracingDistance just ++ // render it ++ continue; ++ } ++ ++ AABB boundingBox = entity.getBoundingBox(); ++ if (boundingBox.getXsize() > hitboxLimit || boundingBox.getYsize() > hitboxLimit ++ || boundingBox.getZsize() > hitboxLimit) { ++ cullable.setCulled(false); // Too big to bother to cull ++ continue; ++ } ++ ++ aabbMin.set(boundingBox.minX, boundingBox.minY, boundingBox.minZ); ++ aabbMax.set(boundingBox.maxX, boundingBox.maxY, boundingBox.maxZ); ++ ++ boolean visible = culling.isAABBVisible(aabbMin, aabbMax, camera); ++ ++ cullable.setCulled(!visible); ++ } ++ } ++ } ++ ++ private boolean isSkippableArmorstand(Entity entity) { ++ if (!RayTrackingEntityTrackerConfig.skipMarkerArmorStands) ++ return false; ++ return entity instanceof ArmorStand && entity.isInvisible(); ++ } ++} diff --git a/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/DefaultChunkDataProvider.java.patch b/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/DefaultChunkDataProvider.java.patch new file mode 100644 index 0000000..3bc01a0 --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/DefaultChunkDataProvider.java.patch @@ -0,0 +1,45 @@ +--- /dev/null ++++ b/src/main/java/dev/tr7zw/entityculling/DefaultChunkDataProvider.java +@@ -1,0 +_,42 @@ ++package dev.tr7zw.entityculling; ++ ++import com.logisticscraft.occlusionculling.DataProvider; ++import net.minecraft.core.BlockPos; ++import net.minecraft.world.level.Level; ++import net.minecraft.world.level.block.Blocks; ++import net.minecraft.world.level.chunk.ChunkAccess; ++ ++public class DefaultChunkDataProvider implements DataProvider { ++ private final Level level; ++ ++ public DefaultChunkDataProvider(Level level) { ++ this.level = level; ++ } ++ ++ @Override ++ public boolean prepareChunk(int chunkX, int chunkZ) { ++ return this.level.getChunkIfLoaded(chunkX, chunkZ) != null; ++ } ++ ++ @Override ++ public boolean isOpaqueFullCube(int x, int y, int z) { ++ BlockPos pos = new BlockPos(x, y, z); ++ ++ final ChunkAccess access = this.level.getChunkIfLoaded(pos); ++ if (access == null) { ++ return false; ++ } ++ ++ if (this.level.isOutsideBuildHeight(pos)) { ++ return Blocks.VOID_AIR.defaultBlockState().isSolidRender(); ++ } else { ++ return access.getBlockState(pos).isSolidRender();// 好孩子不要学坏叔叔这样绕过异步拦截() ++ } ++ } ++ ++ @Override ++ public void cleanup() { ++ DataProvider.super.cleanup(); ++ } ++ ++} diff --git a/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/versionless/access/Cullable.java.patch b/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/versionless/access/Cullable.java.patch new file mode 100644 index 0000000..8ffd32f --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/dev/tr7zw/entityculling/versionless/access/Cullable.java.patch @@ -0,0 +1,20 @@ +--- /dev/null ++++ b/src/main/java/dev/tr7zw/entityculling/versionless/access/Cullable.java +@@ -1,0 +_,17 @@ ++package dev.tr7zw.entityculling.versionless.access; ++ ++public interface Cullable { ++ ++ public void setTimeout(); ++ ++ public boolean isForcedVisible(); ++ ++ public void setCulled(boolean value); ++ ++ public boolean isCulled(); ++ ++ public void setOutOfCamera(boolean value); ++ ++ public boolean isOutOfCamera(); ++ ++} diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/CommandConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/CommandConfig.java.patch new file mode 100644 index 0000000..a444920 --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/CommandConfig.java.patch @@ -0,0 +1,30 @@ +--- /dev/null ++++ b/src/main/java/me/earthme/lophine/config/modules/experiment/CommandConfig.java +@@ -1,0 +_,27 @@ ++package me.earthme.lophine.config.modules.experiment; ++ ++import me.earthme.luminol.config.EnumConfigCategory; ++import me.earthme.luminol.config.IConfigModule; ++import me.earthme.luminol.config.flags.ConfigInfo; ++ ++public class CommandConfig implements IConfigModule { ++ @ConfigInfo(baseName = "command_block_enabled", comments = ++ """ ++ Allow to use command block""") ++ public static boolean block = false; ++ ++ @ConfigInfo(baseName = "tick_command_enabled", comments = ++ """ ++ Allow to use tick command""") ++ public static boolean tick = false; ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.EXPERIMENT; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "command"; ++ } ++} diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/EntityDamageSourceTraceConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/EntityDamageSourceTraceConfig.java.patch new file mode 100644 index 0000000..281e7db --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/EntityDamageSourceTraceConfig.java.patch @@ -0,0 +1,25 @@ +--- /dev/null ++++ b/src/main/java/me/earthme/lophine/config/modules/experiment/EntityDamageSourceTraceConfig.java +@@ -1,0 +_,22 @@ ++package me.earthme.lophine.config.modules.experiment; ++ ++import me.earthme.luminol.config.EnumConfigCategory; ++import me.earthme.luminol.config.IConfigModule; ++import me.earthme.luminol.config.flags.ConfigInfo; ++ ++public class EntityDamageSourceTraceConfig implements IConfigModule { ++ @ConfigInfo(baseName = "enabled", comments = ++ """ ++ Allow trace damage source cross different Region Scheduler.""") ++ public static boolean enabled = false; ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.EXPERIMENT; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "entity_damage_source_trace"; ++ } ++} diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/RayTrackingEntityTrackerConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/RayTrackingEntityTrackerConfig.java.patch new file mode 100644 index 0000000..fd49f47 --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/experiment/RayTrackingEntityTrackerConfig.java.patch @@ -0,0 +1,31 @@ +--- /dev/null ++++ b/src/main/java/me/earthme/lophine/config/modules/experiment/RayTrackingEntityTrackerConfig.java +@@ -1,0 +_,28 @@ ++package me.earthme.lophine.config.modules.experiment; ++ ++import me.earthme.luminol.config.EnumConfigCategory; ++import me.earthme.luminol.config.IConfigModule; ++import me.earthme.luminol.config.flags.ConfigInfo; ++ ++public class RayTrackingEntityTrackerConfig implements IConfigModule { ++ @ConfigInfo(baseName = "enabled") ++ public static boolean enabled = false; ++ @ConfigInfo(baseName = "skip_marker_armor_stands") ++ public static boolean skipMarkerArmorStands = true; ++ @ConfigInfo(baseName = "check_interval_ms") ++ public static int checkIntervalMs = 10; ++ @ConfigInfo(baseName = "tracing_distance") ++ public static int tracingDistance = 48; ++ @ConfigInfo(baseName = "hitbox_limit") ++ public static int hitboxLimit = 50; ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.EXPERIMENT; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "ray_tracking_entity_tracker"; ++ } ++} diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/ContainerExpansionConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/ContainerExpansionConfig.java.patch new file mode 100644 index 0000000..ab4866c --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/ContainerExpansionConfig.java.patch @@ -0,0 +1,30 @@ +--- /dev/null ++++ b/src/main/java/me/earthme/lophine/config/modules/misc/ContainerExpansionConfig.java +@@ -1,0 +_,27 @@ ++package me.earthme.lophine.config.modules.misc; ++ ++import me.earthme.luminol.config.EnumConfigCategory; ++import me.earthme.luminol.config.IConfigModule; ++import me.earthme.luminol.config.flags.ConfigInfo; ++ ++public class ContainerExpansionConfig implements IConfigModule { ++ @ConfigInfo(baseName = "barrel_rows", comments = ++ """ ++ range: 1~6\s""") ++ public static int barrelRows = 3; ++ ++ @ConfigInfo(baseName = "enderchest_rows", comments = ++ """ ++ range: 1~6\s""") ++ public static int enderchestRows = 3; ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.MISC; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "container_expansion"; ++ } ++} diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/DisableEndCrystalCheckConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/DisableEndCrystalCheckConfig.java.patch new file mode 100644 index 0000000..1da3665 --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/DisableEndCrystalCheckConfig.java.patch @@ -0,0 +1,26 @@ +--- /dev/null ++++ b/src/main/java/me/earthme/lophine/config/modules/misc/DisableEndCrystalCheckConfig.java +@@ -1,0 +_,23 @@ ++package me.earthme.lophine.config.modules.misc; ++ ++import me.earthme.luminol.config.EnumConfigCategory; ++import me.earthme.luminol.config.IConfigModule; ++import me.earthme.luminol.config.flags.ConfigInfo; ++ ++public class DisableEndCrystalCheckConfig implements IConfigModule { ++ @ConfigInfo(baseName = "disable_end_crystal_check", comments = ++ """ ++ Disable paper's End Crystal position check. ++ It reverts to vanilla respawn dragon logic.""") ++ public static boolean disableCheck = false; ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.MISC; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "end_crystal"; ++ } ++} diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/RaidChangesConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/RaidChangesConfig.java.patch new file mode 100644 index 0000000..adf7b02 --- /dev/null +++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/misc/RaidChangesConfig.java.patch @@ -0,0 +1,57 @@ +--- /dev/null ++++ b/src/main/java/me/earthme/lophine/config/modules/misc/RaidChangesConfig.java +@@ -1,0 +_,54 @@ ++package me.earthme.lophine.config.modules.misc; ++ ++import me.earthme.luminol.config.EnumConfigCategory; ++import me.earthme.luminol.config.IConfigModule; ++import me.earthme.luminol.config.flags.ConfigInfo; ++ ++public class RaidChangesConfig implements IConfigModule { ++ @ConfigInfo(baseName = "allow_skip_cooldown", comments = ++ """ ++ Allow players with bad omen to skip a ++ 30-second cooldown and trigger attacks directly""") ++ public static boolean trigger = false; ++ ++ @ConfigInfo(baseName = "give_bad_omen_when_kill_raid_captain", comments = ++ """ ++ Enable players to obtain a bad omen ++ effect when killing the raid captain""") ++ public static boolean effect = false; ++ ++ @ConfigInfo(baseName = "bad_omen_infinite", comments = ++ """ ++ Enable bad omen effect infinite time ++ --- this config is not old version's function""") ++ public static boolean infinite = false; ++ ++ @ConfigInfo(baseName = "skip_height_check", comments = ++ """ ++ Disable y <= 96 check. ++ If you enabled use_old_position_find, this config ++ will useless and always behavior of enabled""") ++ public static boolean heightCheck = false; ++ ++ @ConfigInfo(baseName = "skip_self_raid_check", comments = ++ """ ++ Disable raid self check ++ --- this config is not old version's function""") ++ public static boolean selfCheck = false; ++ ++ @ConfigInfo(baseName = "use_old_position_find", comments = ++ """ ++ Revert Old raid's find spawn position logic ++ --- This revert MC-274911""") ++ public static boolean posRevert = false; ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.MISC; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "revert_raid_changes"; ++ } ++} diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java.patch index 3015ad1..fd25d0d 100644 --- a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java.patch +++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java.patch @@ -1,6 +1,6 @@ --- /dev/null +++ b/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java -@@ -1,0 +_,26 @@ +@@ -1,0 +_,25 @@ +package me.earthme.lophine.config.modules.removed; + +import me.earthme.luminol.config.EnumConfigCategory; @@ -11,7 +11,6 @@ + +public class RemovedConfig implements IConfigModule { + @TransformedConfig(name = "example", category = {"removed", "example"}, transform = false) -+ @DoNotLoad + @ConfigInfo(baseName = "removed", comments = + """ + RemovedConfig redirect to here, no any function.""")