Realtime for block break

This commit is contained in:
IzzelAliz 2021-07-03 21:10:36 +08:00
parent f2b24ca9f0
commit 6a36da70a8
3 changed files with 58 additions and 0 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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"
]
}