54 lines
1.5 KiB
Java
54 lines
1.5 KiB
Java
|
package net.minecraft.network.protocol.game;
|
||
|
|
||
|
import net.minecraft.world.phys.Vec3;
|
||
|
import org.jetbrains.annotations.VisibleForTesting;
|
||
|
|
||
|
public class VecDeltaCodec {
|
||
|
private static final double TRUNCATION_STEPS = 4096.0;
|
||
|
private Vec3 base = Vec3.ZERO;
|
||
|
|
||
|
@VisibleForTesting
|
||
|
static long encode(double p_238018_) {
|
||
|
return Math.round(p_238018_ * 4096.0);
|
||
|
}
|
||
|
|
||
|
@VisibleForTesting
|
||
|
static double decode(long p_238020_) {
|
||
|
return p_238020_ / 4096.0;
|
||
|
}
|
||
|
|
||
|
public Vec3 decode(long p_238022_, long p_238023_, long p_238024_) {
|
||
|
if (p_238022_ == 0L && p_238023_ == 0L && p_238024_ == 0L) {
|
||
|
return this.base;
|
||
|
} else {
|
||
|
double d0 = p_238022_ == 0L ? this.base.x : decode(encode(this.base.x) + p_238022_);
|
||
|
double d1 = p_238023_ == 0L ? this.base.y : decode(encode(this.base.y) + p_238023_);
|
||
|
double d2 = p_238024_ == 0L ? this.base.z : decode(encode(this.base.z) + p_238024_);
|
||
|
return new Vec3(d0, d1, d2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public long encodeX(Vec3 p_238026_) {
|
||
|
return encode(p_238026_.x) - encode(this.base.x);
|
||
|
}
|
||
|
|
||
|
public long encodeY(Vec3 p_238028_) {
|
||
|
return encode(p_238028_.y) - encode(this.base.y);
|
||
|
}
|
||
|
|
||
|
public long encodeZ(Vec3 p_238030_) {
|
||
|
return encode(p_238030_.z) - encode(this.base.z);
|
||
|
}
|
||
|
|
||
|
public Vec3 delta(Vec3 p_238032_) {
|
||
|
return p_238032_.subtract(this.base);
|
||
|
}
|
||
|
|
||
|
public void setBase(Vec3 p_238034_) {
|
||
|
this.base = p_238034_;
|
||
|
}
|
||
|
|
||
|
public Vec3 getBase() {
|
||
|
return this.base;
|
||
|
}
|
||
|
}
|