Lag compensate entity move
This commit is contained in:
parent
74e69e5e3d
commit
7c709e554d
|
@ -4,6 +4,7 @@ import com.google.common.collect.Lists;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge;
|
import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge;
|
||||||
import io.izzel.arclight.common.bridge.core.world.ServerEntityBridge;
|
import io.izzel.arclight.common.bridge.core.world.ServerEntityBridge;
|
||||||
|
import io.izzel.arclight.common.mod.ArclightConstants;
|
||||||
import net.minecraft.network.protocol.Packet;
|
import net.minecraft.network.protocol.Packet;
|
||||||
import net.minecraft.network.protocol.game.ClientboundAddMobPacket;
|
import net.minecraft.network.protocol.game.ClientboundAddMobPacket;
|
||||||
import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket;
|
import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket;
|
||||||
|
@ -42,6 +43,7 @@ import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
import org.spongepowered.asm.mixin.Overwrite;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
@ -81,10 +83,14 @@ public abstract class ServerEntityMixin implements ServerEntityBridge {
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
|
||||||
private Set<ServerPlayerConnection> trackedPlayers;
|
private Set<ServerPlayerConnection> trackedPlayers;
|
||||||
|
@Unique private int lastTick;
|
||||||
|
@Unique private int lastUpdate, lastPosUpdate, lastMapUpdate;
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
private void arclight$init(ServerLevel serverWorld, Entity entity, int updateFrequency, boolean sendVelocityUpdates, Consumer<Packet<?>> packetConsumer, CallbackInfo ci) {
|
private void arclight$init(ServerLevel serverWorld, Entity entity, int updateFrequency, boolean sendVelocityUpdates, Consumer<Packet<?>> packetConsumer, CallbackInfo ci) {
|
||||||
trackedPlayers = new HashSet<>();
|
trackedPlayers = new HashSet<>();
|
||||||
|
lastTick = ArclightConstants.currentTick - 1;
|
||||||
|
lastUpdate = lastPosUpdate = lastMapUpdate = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void arclight$constructor(ServerLevel serverWorld, Entity entity, int updateFrequency, boolean sendVelocityUpdates, Consumer<Packet<?>> packetConsumer) {
|
public void arclight$constructor(ServerLevel serverWorld, Entity entity, int updateFrequency, boolean sendVelocityUpdates, Consumer<Packet<?>> packetConsumer) {
|
||||||
|
@ -112,9 +118,14 @@ public abstract class ServerEntityMixin implements ServerEntityBridge {
|
||||||
this.lastPassengers = list;
|
this.lastPassengers = list;
|
||||||
this.broadcastAndSend(new ClientboundSetPassengersPacket(this.entity));
|
this.broadcastAndSend(new ClientboundSetPassengersPacket(this.entity));
|
||||||
}
|
}
|
||||||
|
int elapsedTicks = ArclightConstants.currentTick - this.lastTick;
|
||||||
|
if (elapsedTicks < 0) {
|
||||||
|
elapsedTicks = 0;
|
||||||
|
}
|
||||||
|
this.lastTick = ArclightConstants.currentTick;
|
||||||
if (this.entity instanceof ItemFrame itemFrame) {
|
if (this.entity instanceof ItemFrame itemFrame) {
|
||||||
ItemStack itemstack = itemFrame.getItem();
|
ItemStack itemstack = itemFrame.getItem();
|
||||||
if (this.tickCount % 10 == 0 && itemstack.getItem() instanceof MapItem) {
|
if (this.tickCount / 10 != this.lastMapUpdate && itemstack.getItem() instanceof MapItem) {
|
||||||
MapItemSavedData mapdata = MapItem.getSavedData(itemstack, this.level);
|
MapItemSavedData mapdata = MapItem.getSavedData(itemstack, this.level);
|
||||||
if (mapdata != null) {
|
if (mapdata != null) {
|
||||||
for (ServerPlayerConnection connection : this.trackedPlayers) {
|
for (ServerPlayerConnection connection : this.trackedPlayers) {
|
||||||
|
@ -129,7 +140,7 @@ public abstract class ServerEntityMixin implements ServerEntityBridge {
|
||||||
}
|
}
|
||||||
this.sendDirtyEntityData();
|
this.sendDirtyEntityData();
|
||||||
}
|
}
|
||||||
if (this.tickCount % this.updateInterval == 0 || this.entity.hasImpulse || this.entity.getEntityData().isDirty()) {
|
if (this.tickCount / this.updateInterval != this.lastUpdate || this.entity.hasImpulse || this.entity.getEntityData().isDirty()) {
|
||||||
if (this.entity.isPassenger()) {
|
if (this.entity.isPassenger()) {
|
||||||
int i1 = Mth.floor(this.entity.getYRot() * 256.0F / 360.0F);
|
int i1 = Mth.floor(this.entity.getYRot() * 256.0F / 360.0F);
|
||||||
int l1 = Mth.floor(this.entity.getXRot() * 256.0F / 360.0F);
|
int l1 = Mth.floor(this.entity.getXRot() * 256.0F / 360.0F);
|
||||||
|
@ -143,13 +154,13 @@ public abstract class ServerEntityMixin implements ServerEntityBridge {
|
||||||
this.sendDirtyEntityData();
|
this.sendDirtyEntityData();
|
||||||
this.wasRiding = true;
|
this.wasRiding = true;
|
||||||
} else {
|
} else {
|
||||||
++this.teleportDelay;
|
this.teleportDelay += elapsedTicks;
|
||||||
int l = Mth.floor(this.entity.getYRot() * 256.0F / 360.0F);
|
int l = Mth.floor(this.entity.getYRot() * 256.0F / 360.0F);
|
||||||
int k1 = Mth.floor(this.entity.getXRot() * 256.0F / 360.0F);
|
int k1 = Mth.floor(this.entity.getXRot() * 256.0F / 360.0F);
|
||||||
Vec3 vector3d = this.entity.position().subtract(ClientboundMoveEntityPacket.packetToEntity(this.xp, this.yp, this.zp));
|
Vec3 vector3d = this.entity.position().subtract(ClientboundMoveEntityPacket.packetToEntity(this.xp, this.yp, this.zp));
|
||||||
boolean flag3 = vector3d.lengthSqr() >= (double) 7.6293945E-6F;
|
boolean flag3 = vector3d.lengthSqr() >= (double) 7.6293945E-6F;
|
||||||
Packet<?> ipacket1 = null;
|
Packet<?> ipacket1 = null;
|
||||||
boolean flag4 = flag3 || this.tickCount % 60 == 0;
|
boolean flag4 = flag3 || this.tickCount / 60 != this.lastPosUpdate;
|
||||||
boolean flag = Math.abs(l - this.yRotp) >= 1 || Math.abs(k1 - this.xRotp) >= 1;
|
boolean flag = Math.abs(l - this.yRotp) >= 1 || Math.abs(k1 - this.xRotp) >= 1;
|
||||||
if (flag4) {
|
if (flag4) {
|
||||||
this.updateSentPos();
|
this.updateSentPos();
|
||||||
|
@ -200,7 +211,10 @@ public abstract class ServerEntityMixin implements ServerEntityBridge {
|
||||||
}
|
}
|
||||||
this.entity.hasImpulse = false;
|
this.entity.hasImpulse = false;
|
||||||
}
|
}
|
||||||
++this.tickCount;
|
this.lastUpdate = this.tickCount / this.updateInterval;
|
||||||
|
this.lastPosUpdate = this.tickCount / 60;
|
||||||
|
this.lastMapUpdate = this.tickCount / 10;
|
||||||
|
this.tickCount += elapsedTicks;
|
||||||
if (this.entity.hurtMarked) {
|
if (this.entity.hurtMarked) {
|
||||||
boolean cancelled = false;
|
boolean cancelled = false;
|
||||||
if (this.entity instanceof ServerPlayer) {
|
if (this.entity instanceof ServerPlayer) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user