mirror of
https://github.com/BX-Team/DivineMC.git
synced 2025-12-28 03:09:11 +00:00
336 lines
18 KiB
Diff
336 lines
18 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com>
|
|
Date: Sat, 1 Feb 2025 18:38:26 +0300
|
|
Subject: [PATCH] Lag compensation
|
|
|
|
|
|
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
|
index 7a3775185d5c80f43456a595f22a9ebf19760bd6..23144971acc04bbeacd719dafe2363d1618153b9 100644
|
|
--- a/net/minecraft/server/MinecraftServer.java
|
|
+++ b/net/minecraft/server/MinecraftServer.java
|
|
@@ -288,6 +288,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation
|
|
public boolean lagging = false; // Purpur - Lagging threshold
|
|
protected boolean upnp = false; // Purpur - UPnP Port Forwarding
|
|
+ public final org.bxteam.divinemc.util.tps.TPSCalculator tpsCalculator = new org.bxteam.divinemc.util.tps.TPSCalculator(); // DivineMC - Lag compensation
|
|
|
|
public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {
|
|
ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system
|
|
@@ -1534,6 +1535,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
}
|
|
|
|
this.server.spark.tickStart(); // Paper - spark
|
|
+ this.tpsCalculator.doTick(); // DivineMC - Lag compenstation
|
|
new com.destroystokyo.paper.event.server.ServerTickStartEvent(this.tickCount+1).callEvent(); // Paper - Server Tick Events
|
|
this.tickCount++;
|
|
this.tickRateManager.tick();
|
|
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
|
index 4a2cace22512fe06c1713bc8735e775e3012f3bc..85c4d709b6d04e8f43baf7b900ee59eae5d98fe0 100644
|
|
--- a/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/net/minecraft/server/level/ServerLevel.java
|
|
@@ -216,6 +216,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current)
|
|
public boolean hasRidableMoveEvent = false; // Purpur - Ridables
|
|
public net.minecraft.world.item.ItemStack ominousBanner; // DivineMC - Optimize Raids
|
|
+ public org.bxteam.divinemc.util.tps.TPSCalculator tpsCalculator = new org.bxteam.divinemc.util.tps.TPSCalculator(); // DivineMC - Lag Compensation
|
|
|
|
@Override
|
|
public @Nullable LevelChunk getChunkIfLoaded(int x, int z) {
|
|
@@ -763,6 +764,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
}
|
|
}
|
|
|
|
+ this.tpsCalculator.doTick(); // DivineMC - Lag compensation
|
|
+
|
|
this.updateSkyBrightness();
|
|
if (runsNormally) {
|
|
this.tickTime();
|
|
@@ -844,11 +847,18 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
this.setDayTime(this.preciseTime);
|
|
} else
|
|
// Purpur end - Configurable daylight cycle
|
|
- this.setDayTime(this.levelData.getDayTime() + 1L);
|
|
+ this.setDayTime(lagCompensation(this.levelData.getDayTime()) + 1L); // DivineMC - Lag compensation
|
|
}
|
|
}
|
|
}
|
|
|
|
+ // DivineMC start - Lag compensation
|
|
+ private long lagCompensation(long original) {
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.timeAcceleration) return original;
|
|
+ return original + this.tpsCalculator.applicableMissedTicks();
|
|
+ }
|
|
+ // DivineMC end - Lag compensation
|
|
+
|
|
public void setDayTime(long time) {
|
|
this.serverLevelData.setDayTime(time);
|
|
// Purpur start - Configurable daylight cycle
|
|
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
|
index 49cb64c6dd0941eab8f7531e0c182a79e4ec1da6..a6a7af2393c15f92683f05500bd4f45b1b1f4853 100644
|
|
--- a/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -523,6 +523,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
|
}
|
|
}
|
|
|
|
+ lagCompensation(); // DivineMC - Lag Compensation
|
|
this.tickEffects();
|
|
this.yHeadRotO = this.yHeadRot;
|
|
this.yBodyRotO = this.yBodyRot;
|
|
@@ -530,6 +531,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
|
this.xRotO = this.getXRot();
|
|
}
|
|
|
|
+ // DivineMC start - Lag Compensation
|
|
+ private void lagCompensation() {
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.potionEffectAcceleration) return;
|
|
+ if (this.level().isClientSide()) return;
|
|
+
|
|
+ for (int i = 0; i < ((ServerLevel) this.level()).tpsCalculator.applicableMissedTicks(); i++) {
|
|
+ tickEffects();
|
|
+ }
|
|
+ }
|
|
+ // DivineMC end - Lag Compensation
|
|
+
|
|
@Override
|
|
protected float getBlockSpeedFactor() {
|
|
return Mth.lerp((float)this.getAttributeValue(Attributes.MOVEMENT_EFFICIENCY), super.getBlockSpeedFactor(), 1.0F);
|
|
diff --git a/net/minecraft/world/entity/PortalProcessor.java b/net/minecraft/world/entity/PortalProcessor.java
|
|
index 88b07fbb96b20124777889830afa480673629d43..91f6d43b3785ddad7db8eb529ba3293c45f3588d 100644
|
|
--- a/net/minecraft/world/entity/PortalProcessor.java
|
|
+++ b/net/minecraft/world/entity/PortalProcessor.java
|
|
@@ -24,10 +24,20 @@ public class PortalProcessor {
|
|
return false;
|
|
} else {
|
|
this.insidePortalThisTick = false;
|
|
- return canChangeDimensions && this.portalTime++ >= this.portal.getPortalTransitionTime(level, entity);
|
|
+ return canChangeDimensions && lagCompensation(this.portalTime++, level) >= this.portal.getPortalTransitionTime(level, entity); // DivineMC - Lag compensation
|
|
}
|
|
}
|
|
|
|
+ // DivineMC start - Lag compensation
|
|
+ private int lagCompensation(int original, ServerLevel world) {
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.portalAcceleration) return original;
|
|
+ if (world.isClientSide()) return original;
|
|
+
|
|
+ portalTime = portalTime + world.tpsCalculator.applicableMissedTicks();
|
|
+ return portalTime;
|
|
+ }
|
|
+ // DivineMC end - Lag compensation
|
|
+
|
|
@Nullable
|
|
public TeleportTransition getPortalDestination(ServerLevel level, Entity entity) {
|
|
return this.portal.getPortalDestination(level, entity, this.entryPosition);
|
|
diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java
|
|
index d650d4f34fde0682ab76360408f7ff6a7d4b4c3a..f738db4aa54a5961e1484737b99de133f7e92b68 100644
|
|
--- a/net/minecraft/world/entity/item/ItemEntity.java
|
|
+++ b/net/minecraft/world/entity/item/ItemEntity.java
|
|
@@ -158,8 +158,25 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
}
|
|
// Paper end - EAR 2
|
|
|
|
+ // DivineMC start - Lag compensation
|
|
+ private void lagCompensation() {
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.pickupAcceleration) return;
|
|
+ if ((this).level().isClientSide()) return;
|
|
+
|
|
+ if (pickupDelay == 0) return;
|
|
+
|
|
+ if (pickupDelay - ((ServerLevel) this.level()).tpsCalculator.applicableMissedTicks() <= 0) {
|
|
+ pickupDelay = 0;
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ pickupDelay = pickupDelay - ((ServerLevel) this.level()).tpsCalculator.applicableMissedTicks();
|
|
+ }
|
|
+ // DivineMC end - Lag compensation
|
|
+
|
|
@Override
|
|
public void tick() {
|
|
+ lagCompensation(); // DivineMC - Lag compensation
|
|
if (this.getItem().isEmpty()) {
|
|
this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
|
|
} else {
|
|
diff --git a/net/minecraft/world/item/Item.java b/net/minecraft/world/item/Item.java
|
|
index 40cb5e6bbcf9dbdb400f1503e86c0804b60e07be..d5352cbb4a64631a0a831de880efa21e1b3f6092 100644
|
|
--- a/net/minecraft/world/item/Item.java
|
|
+++ b/net/minecraft/world/item/Item.java
|
|
@@ -286,10 +286,25 @@ public class Item implements FeatureElement, ItemLike {
|
|
}
|
|
}
|
|
|
|
+ // DivineMC start - Lag compensation
|
|
+ private int lagCompensation(int original, net.minecraft.server.level.ServerLevel level) {
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.eatingAcceleration || original == 0) return original;
|
|
+ return org.bxteam.divinemc.util.tps.TPSUtil.tt20(original, true, level);
|
|
+ }
|
|
+ // DivineMC end - Lag compensation
|
|
+
|
|
public int getUseDuration(ItemStack stack, LivingEntity entity) {
|
|
Consumable consumable = stack.get(DataComponents.CONSUMABLE);
|
|
if (consumable != null) {
|
|
- return consumable.consumeTicks();
|
|
+ // DivineMC start - Lag compensation
|
|
+ int original = consumable.consumeTicks();
|
|
+
|
|
+ if (entity.level() instanceof net.minecraft.server.level.ServerLevel serverLevel) {
|
|
+ return lagCompensation(original, serverLevel);
|
|
+ }
|
|
+
|
|
+ return original;
|
|
+ // DivineMC end - Lag compensation
|
|
} else {
|
|
BlocksAttacks blocksAttacks = stack.get(DataComponents.BLOCKS_ATTACKS);
|
|
return blocksAttacks != null ? 72000 : 0;
|
|
diff --git a/net/minecraft/world/level/GameRules.java b/net/minecraft/world/level/GameRules.java
|
|
index d510503a8ad272255aeba20a916642828023fd19..2def087994cb6676b6346e7062fd050e7e346c05 100644
|
|
--- a/net/minecraft/world/level/GameRules.java
|
|
+++ b/net/minecraft/world/level/GameRules.java
|
|
@@ -366,8 +366,31 @@ public class GameRules {
|
|
}
|
|
|
|
public int getInt(GameRules.Key<GameRules.IntegerValue> key) {
|
|
- return this.getRule(key).get();
|
|
+ return lagCompensation(this.getRule(key).get(), key); // DivineMC - Lag compensation
|
|
+ }
|
|
+
|
|
+ // DivineMC start - Lag compensation
|
|
+ private final java.util.concurrent.atomic.AtomicReference<net.minecraft.server.level.ServerLevel> level = new java.util.concurrent.atomic.AtomicReference<>();
|
|
+
|
|
+ private int lagCompensation(int original, GameRules.Key<GameRules.IntegerValue> rule) {
|
|
+ ServerLevel level = getOrCacheLevel();
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.randomTickSpeedAcceleration) return original;
|
|
+ if (!(rule == GameRules.RULE_RANDOMTICKING)) return original;
|
|
+ return (int) (original * org.bxteam.divinemc.util.tps.TPSCalculator.MAX_TPS / (float) level.tpsCalculator.getMostAccurateTPS());
|
|
+ }
|
|
+
|
|
+ private ServerLevel getOrCacheLevel() {
|
|
+ if (level.get() == null) {
|
|
+ for (final ServerLevel level : MinecraftServer.getServer().getAllLevels()) {
|
|
+ if (level.getGameRules() == this) {
|
|
+ this.level.set(level);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return level.get();
|
|
}
|
|
+ // DivineMC end - Lag compensation
|
|
|
|
public static class BooleanValue extends GameRules.Value<GameRules.BooleanValue> {
|
|
private boolean value;
|
|
diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java
|
|
index 8db95b74f88f8096de93115ae8d3fb2e6184ad3b..e044830439fe9821ab3f62695d318a6321b8a266 100644
|
|
--- a/net/minecraft/world/level/block/state/BlockBehaviour.java
|
|
+++ b/net/minecraft/world/level/block/state/BlockBehaviour.java
|
|
@@ -347,13 +347,21 @@ public abstract class BlockBehaviour implements FeatureElement {
|
|
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
|
|
}
|
|
|
|
+ // DivineMC start - Lag compensation
|
|
+ private float lagCompensation(float original, Player player) {
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.blockBreakingAcceleration) return original;
|
|
+ if (player.level().isClientSide) return original;
|
|
+ return original * org.bxteam.divinemc.util.tps.TPSCalculator.MAX_TPS / (float) ((ServerLevel) player.level()).tpsCalculator.getMostAccurateTPS();
|
|
+ }
|
|
+ // DivineMC end - Lag compensation
|
|
+
|
|
protected float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) {
|
|
float destroySpeed = state.getDestroySpeed(level, pos);
|
|
if (destroySpeed == -1.0F) {
|
|
- return 0.0F;
|
|
+ return lagCompensation(0.0F, player); // DivineMC - Lag compensation
|
|
} else {
|
|
int i = player.hasCorrectToolForDrops(state) ? 30 : 100;
|
|
- return player.getDestroySpeed(state) / destroySpeed / i;
|
|
+ return lagCompensation(player.getDestroySpeed(state) / destroySpeed / i, player); // DivineMC - Lag compensation
|
|
}
|
|
}
|
|
|
|
diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java
|
|
index a2b21970841a0f7f2b4b469c7b8737440041ebaa..cf2ff202103fde0607e4dacef1a976c36b7840ef 100644
|
|
--- a/net/minecraft/world/level/chunk/LevelChunk.java
|
|
+++ b/net/minecraft/world/level/chunk/LevelChunk.java
|
|
@@ -917,6 +917,19 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
|
|
this.ticker = ticker;
|
|
}
|
|
|
|
+ // DivineMC start - Lag compensation
|
|
+ private <T extends BlockEntity> void lagCompensation(Runnable original) {
|
|
+ original.run();
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled) return;
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.blockEntityAcceleration) return;
|
|
+ if (LevelChunk.this.level.isClientSide()) return;
|
|
+
|
|
+ for (int i = 0; i < ((ServerLevel) this.blockEntity.getLevel()).tpsCalculator.applicableMissedTicks(); i++) {
|
|
+ original.run();
|
|
+ }
|
|
+ }
|
|
+ // DivineMC end - Lag compensation
|
|
+
|
|
@Override
|
|
public void tick() {
|
|
if (!this.blockEntity.isRemoved() && this.blockEntity.hasLevel()) {
|
|
@@ -925,7 +938,11 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
|
|
try {
|
|
BlockState blockState = LevelChunk.this.getBlockState(blockPos);
|
|
if (this.blockEntity.getType().isValid(blockState)) {
|
|
- this.ticker.tick(LevelChunk.this.level, this.blockEntity.getBlockPos(), blockState, this.blockEntity);
|
|
+ // DivineMC start - Lag compensation
|
|
+ lagCompensation(() -> {
|
|
+ this.ticker.tick(LevelChunk.this.level, this.blockEntity.getBlockPos(), blockState, this.blockEntity);
|
|
+ });
|
|
+ // DivineMC end - Lag compensation
|
|
this.loggedInvalidBlockState = false;
|
|
// Paper start - Remove the Block Entity if it's invalid
|
|
} else {
|
|
diff --git a/net/minecraft/world/level/material/LavaFluid.java b/net/minecraft/world/level/material/LavaFluid.java
|
|
index e7ae29a4da3bf36b99fdab39af78f03c06696dbc..6ae99a4dc04f48342b948fcfeaffc68babe60f96 100644
|
|
--- a/net/minecraft/world/level/material/LavaFluid.java
|
|
+++ b/net/minecraft/world/level/material/LavaFluid.java
|
|
@@ -187,9 +187,22 @@ public abstract class LavaFluid extends FlowingFluid {
|
|
return fluidState.getHeight(blockReader, pos) >= 0.44444445F && fluid.is(FluidTags.WATER);
|
|
}
|
|
|
|
+ // DivineMC start - Lag compensation
|
|
+ private int lagCompensation(int original, ServerLevel level) {
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.fluidAcceleration) return original;
|
|
+ return org.bxteam.divinemc.util.tps.TPSUtil.tt20(original, true, level);
|
|
+ }
|
|
+ // DivineMC end - Lag compensation
|
|
+
|
|
@Override
|
|
public int getTickDelay(LevelReader level) {
|
|
- return level.dimensionType().ultraWarm() ? level.getWorldBorder().world.purpurConfig.lavaSpeedNether : level.getWorldBorder().world.purpurConfig.lavaSpeedNotNether; // Purpur - Make lava flow speed configurable
|
|
+ // DivineMC start - Lag compensation
|
|
+ int original = level.dimensionType().ultraWarm() ? level.getWorldBorder().world.purpurConfig.lavaSpeedNether : level.getWorldBorder().world.purpurConfig.lavaSpeedNotNether; // Purpur - Make lava flow speed configurable
|
|
+ if (level instanceof ServerLevel serverLevel) {
|
|
+ return lagCompensation(original, serverLevel);
|
|
+ }
|
|
+ return original;
|
|
+ // DivineMC end - Lag compensation
|
|
}
|
|
|
|
@Override
|
|
diff --git a/net/minecraft/world/level/material/WaterFluid.java b/net/minecraft/world/level/material/WaterFluid.java
|
|
index b248fe1d66940c05d56fc322df61c52ece72e77f..2a35dcf66dc01e787f9767a90c08a6cb283576e4 100644
|
|
--- a/net/minecraft/world/level/material/WaterFluid.java
|
|
+++ b/net/minecraft/world/level/material/WaterFluid.java
|
|
@@ -124,8 +124,16 @@ public abstract class WaterFluid extends FlowingFluid {
|
|
return 1;
|
|
}
|
|
|
|
+ // DivineMC start - Lag compensation
|
|
+ private int lagCompensation(ServerLevel level) {
|
|
+ if (!org.bxteam.divinemc.config.DivineConfig.MiscCategory.lagCompensationEnabled || !org.bxteam.divinemc.config.DivineConfig.MiscCategory.fluidAcceleration) return 5;
|
|
+ return org.bxteam.divinemc.util.tps.TPSUtil.tt20(5, true, level);
|
|
+ }
|
|
+ // DivineMC end - Lag compensation
|
|
+
|
|
@Override
|
|
public int getTickDelay(LevelReader level) {
|
|
+ if (level instanceof ServerLevel serverLevel) return lagCompensation(serverLevel); // DivineMC - Lag compensation
|
|
return 5;
|
|
}
|
|
|