Update Handcrafted v4.0.9
This commit is contained in:
@@ -19,11 +19,15 @@ public interface SittableBlock {
|
||||
if (!Seat.SITTING_POSITIONS.get(level.dimension()).contains(pos)) {
|
||||
Seat entity = Seat.of(level, pos, dir);
|
||||
if (level.addFreshEntity(entity)) {
|
||||
if (player.startRiding(entity)) {
|
||||
Seat.SITTING_POSITIONS.put(level.dimension(), pos.immutable());
|
||||
return true;
|
||||
}
|
||||
entity.removeSeat();
|
||||
// Do not mount in the same server tick in which the invisible
|
||||
// Seat is spawned. In 26.2 the passenger packet can otherwise
|
||||
// reach the client before the entity-spawn packet, producing
|
||||
// "Received passengers for unknown entity" and an immediate
|
||||
// client/server mount desync. Queue the rider and let Seat.tick()
|
||||
// mount it after the entity has entered normal tracking.
|
||||
Seat.SITTING_POSITIONS.put(level.dimension(), pos.immutable());
|
||||
entity.queueRider(player);
|
||||
return true;
|
||||
} else {
|
||||
entity.removeSeat();
|
||||
}
|
||||
|
||||
@@ -8,12 +8,8 @@ import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.world.level.storage.ValueInput;
|
||||
import net.minecraft.world.level.storage.ValueOutput;
|
||||
import net.minecraft.network.protocol.Packet;
|
||||
import net.minecraft.network.protocol.game.ClientGamePacketListener;
|
||||
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.server.level.ServerEntity;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.util.Mth;
|
||||
@@ -35,6 +31,8 @@ public class Seat extends Entity {
|
||||
private AABB shape;
|
||||
private boolean remove;
|
||||
private boolean canRotate;
|
||||
private Entity pendingRider;
|
||||
private int mountDelayTicks;
|
||||
|
||||
public Seat(EntityType<? extends Entity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
@@ -66,16 +64,9 @@ public class Seat extends Entity {
|
||||
return new AABB(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Packet<ClientGamePacketListener> getAddEntityPacket(ServerEntity serverEntity) {
|
||||
return new ClientboundAddEntityPacket(this, serverEntity, canRotate ? 1 : 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void recreateFromPacket(ClientboundAddEntityPacket packet) {
|
||||
super.recreateFromPacket(packet);
|
||||
this.canRotate = packet.getData() == 1;
|
||||
}
|
||||
// Use Minecraft's native entity spawn packet on 26.2.
|
||||
// The old custom ClientboundAddEntityPacket path from 1.21.x can race the
|
||||
// passenger packet, leaving the client with an unknown vehicle entity.
|
||||
|
||||
@Override
|
||||
public boolean hurtServer(ServerLevel level, DamageSource source, float damage) {
|
||||
@@ -122,11 +113,32 @@ public class Seat extends Entity {
|
||||
return super.getDismountLocationForPassenger(passenger);
|
||||
}
|
||||
|
||||
public void queueRider(Entity rider) {
|
||||
this.pendingRider = rider;
|
||||
// One complete entity tick is enough for ServerEntity tracking to send
|
||||
// the add-entity packet before we generate a passengers packet.
|
||||
this.mountDelayTicks = 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
if (!level().isClientSide() && (!(this.level().getBlockState(this.blockPosition()).getBlock() instanceof SittableBlock) || remove)) {
|
||||
removeSeat();
|
||||
if (!level().isClientSide()) {
|
||||
if (!(this.level().getBlockState(this.blockPosition()).getBlock() instanceof SittableBlock) || remove) {
|
||||
removeSeat();
|
||||
return;
|
||||
}
|
||||
|
||||
if (pendingRider != null) {
|
||||
if (mountDelayTicks-- <= 0) {
|
||||
Entity rider = pendingRider;
|
||||
pendingRider = null;
|
||||
if (!rider.isRemoved() && rider.level() == this.level() && rider.startRiding(this)) {
|
||||
return;
|
||||
}
|
||||
removeSeat();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user