diff --git a/arclight-forge/src/main/java/io/izzel/arclight/impl/mixin/optimization/general/realtime/ItemEntityMixin_Realtime.java b/arclight-forge/src/main/java/io/izzel/arclight/impl/mixin/optimization/general/realtime/ItemEntityMixin_Realtime.java new file mode 100644 index 00000000..3af8067f --- /dev/null +++ b/arclight-forge/src/main/java/io/izzel/arclight/impl/mixin/optimization/general/realtime/ItemEntityMixin_Realtime.java @@ -0,0 +1,29 @@ +package io.izzel.arclight.impl.mixin.optimization.general.realtime; + +import io.izzel.arclight.common.mod.ArclightConstants; +import net.minecraft.entity.item.ItemEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ItemEntity.class) +public class ItemEntityMixin_Realtime { + + @Shadow public int pickupDelay; + @Shadow public int age; + + private int lastTick = ArclightConstants.currentTick - 1; + + @Inject(method = "tick", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/entity/Entity;tick()V")) + private void arclight$useWallTime(CallbackInfo ci) { + int elapsedTicks = ArclightConstants.currentTick - this.lastTick - 1; + if (elapsedTicks < 0) { + elapsedTicks = 0; + } + if (this.pickupDelay > 0 && this.pickupDelay != 32767 && elapsedTicks > 0) this.pickupDelay -= elapsedTicks; + if (this.age != -32768) this.age += elapsedTicks; + this.lastTick = ArclightConstants.currentTick; + } +} diff --git a/arclight-forge/src/main/java/io/izzel/arclight/impl/mixin/optimization/general/realtime/PlayerInteractionManagerMixin_Realtime.java b/arclight-forge/src/main/java/io/izzel/arclight/impl/mixin/optimization/general/realtime/PlayerInteractionManagerMixin_Realtime.java new file mode 100644 index 00000000..f15860d2 --- /dev/null +++ b/arclight-forge/src/main/java/io/izzel/arclight/impl/mixin/optimization/general/realtime/PlayerInteractionManagerMixin_Realtime.java @@ -0,0 +1,27 @@ +package io.izzel.arclight.impl.mixin.optimization.general.realtime; + +import io.izzel.arclight.common.mod.ArclightConstants; +import net.minecraft.server.management.PlayerInteractionManager; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(PlayerInteractionManager.class) +public class PlayerInteractionManagerMixin_Realtime { + + @Shadow private int ticks; + + private int lastTick = ArclightConstants.currentTick - 1; + + @Redirect(method = "tick", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/server/management/PlayerInteractionManager;ticks:I")) + private void arclight$useWallTime(PlayerInteractionManager playerInteractionManager, int value) { + int elapsedTicks = ArclightConstants.currentTick - this.lastTick; + if (elapsedTicks < 1) { + elapsedTicks = 1; + } + this.ticks += elapsedTicks; + this.lastTick = ArclightConstants.currentTick; + } +} diff --git a/arclight-forge/src/main/resources/mixins.arclight.impl.forge.optimization.json b/arclight-forge/src/main/resources/mixins.arclight.impl.forge.optimization.json index 2b23479d..3817c0e1 100644 --- a/arclight-forge/src/main/resources/mixins.arclight.impl.forge.optimization.json +++ b/arclight-forge/src/main/resources/mixins.arclight.impl.forge.optimization.json @@ -17,6 +17,8 @@ "activationrange.entity.ItemEntityMixin_ActivationRange", "activationrange.entity.LivingEntityMixin_ActivationRange", "activationrange.entity.VillagerEntityMixin_ActivationRange", + "realtime.ItemEntityMixin_Realtime", + "realtime.PlayerInteractionManagerMixin_Realtime", "trackingrange.ChunkManagerMixin_TrackingRange" ] } \ No newline at end of file