CompassAngleState.java
net.minecraft.client.renderer.item.properties.numeric.CompassAngleState
信息
- 全限定名:net.minecraft.client.renderer.item.properties.numeric.CompassAngleState
- 类型:public class
- 包:net.minecraft.client.renderer.item.properties.numeric
- 源码路径:src/main/java/net/minecraft/client/renderer/item/properties/numeric/CompassAngleState.java
- 起始行号:L23
- 继承:NeedleDirectionHelper
- 职责:
TODO
字段/常量
-
MAP_CODEC- 类型:
MapCodec<CompassAngleState> - 修饰符:
public static final - 源码定位:
L24 - 说明:
TODO
- 类型:
-
wobbler- 类型:
NeedleDirectionHelper.Wobbler - 修饰符:
private final - 源码定位:
L31 - 说明:
TODO
- 类型:
-
noTargetWobbler- 类型:
NeedleDirectionHelper.Wobbler - 修饰符:
private final - 源码定位:
L32 - 说明:
TODO
- 类型:
-
compassTarget- 类型:
CompassAngleState.CompassTarget - 修饰符:
private final - 源码定位:
L33 - 说明:
TODO
- 类型:
-
random- 类型:
RandomSource - 修饰符:
private final - 源码定位:
L34 - 说明:
TODO
- 类型:
内部类/嵌套类型
net.minecraft.client.renderer.item.properties.numeric.CompassAngleState.CompassTarget- 类型:
enum - 修饰符:
public static - 源码定位:
L103 - 说明:
TODO
- 类型:
构造器
public CompassAngleState(boolean wobble, CompassAngleState.CompassTarget compassTarget) @ L36
- 构造器名:CompassAngleState
- 源码定位:L36
- 修饰符:public
参数:
- wobble: boolean
- compassTarget: CompassAngleState.CompassTarget
说明:
TODO
方法
下面的方法块按源码顺序生成。
protected float calculate(ItemStack itemStack, ClientLevel level, int seed, ItemOwner owner) @ L43
- 方法名:calculate
- 源码定位:L43
- 返回类型:float
- 修饰符:protected
参数:
- itemStack: ItemStack
- level: ClientLevel
- seed: int
- owner: ItemOwner
说明:
TODO
private float getRandomlySpinningRotation(int seed, long gameTime) @ L52
- 方法名:getRandomlySpinningRotation
- 源码定位:L52
- 返回类型:float
- 修饰符:private
参数:
- seed: int
- gameTime: long
说明:
TODO
private float getRotationTowardsCompassTarget(ItemOwner owner, long gameTime, BlockPos compassTargetPos) @ L61
- 方法名:getRotationTowardsCompassTarget
- 源码定位:L61
- 返回类型:float
- 修饰符:private
参数:
- owner: ItemOwner
- gameTime: long
- compassTargetPos: BlockPos
说明:
TODO
private static boolean isValidCompassTargetPos(ItemOwner owner, GlobalPos positionToPointTo) @ L78
- 方法名:isValidCompassTargetPos
- 源码定位:L78
- 返回类型:boolean
- 修饰符:private static
参数:
- owner: ItemOwner
- positionToPointTo: GlobalPos
说明:
TODO
private static double getAngleFromEntityToPos(ItemOwner owner, BlockPos position) @ L84
- 方法名:getAngleFromEntityToPos
- 源码定位:L84
- 返回类型:double
- 修饰符:private static
参数:
- owner: ItemOwner
- position: BlockPos
说明:
TODO
private static float getWrappedVisualRotationY(ItemOwner owner) @ L90
- 方法名:getWrappedVisualRotationY
- 源码定位:L90
- 返回类型:float
- 修饰符:private static
参数:
- owner: ItemOwner
说明:
TODO
private static int hash(int input) @ L94
- 方法名:hash
- 源码定位:L94
- 返回类型:int
- 修饰符:private static
参数:
- input: int
说明:
TODO
protected CompassAngleState.CompassTarget target() @ L98
- 方法名:target
- 源码定位:L98
- 返回类型:CompassAngleState.CompassTarget
- 修饰符:protected
参数:
- 无
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class CompassAngleState extends NeedleDirectionHelper {
public static final MapCodec<CompassAngleState> MAP_CODEC = RecordCodecBuilder.mapCodec(
i -> i.group(
Codec.BOOL.optionalFieldOf("wobble", true).forGetter(NeedleDirectionHelper::wobble),
CompassAngleState.CompassTarget.CODEC.fieldOf("target").forGetter(CompassAngleState::target)
)
.apply(i, CompassAngleState::new)
);
private final NeedleDirectionHelper.Wobbler wobbler;
private final NeedleDirectionHelper.Wobbler noTargetWobbler;
private final CompassAngleState.CompassTarget compassTarget;
private final RandomSource random = RandomSource.create();
public CompassAngleState(boolean wobble, CompassAngleState.CompassTarget compassTarget) {
super(wobble);
this.wobbler = this.newWobbler(0.8F);
this.noTargetWobbler = this.newWobbler(0.8F);
this.compassTarget = compassTarget;
}
@Override
protected float calculate(ItemStack itemStack, ClientLevel level, int seed, ItemOwner owner) {
GlobalPos compassTargetPos = this.compassTarget.get(level, itemStack, owner);
long gameTime = level.getGameTime();
return !isValidCompassTargetPos(owner, compassTargetPos)
? this.getRandomlySpinningRotation(seed, gameTime)
: this.getRotationTowardsCompassTarget(owner, gameTime, compassTargetPos.pos());
}
private float getRandomlySpinningRotation(int seed, long gameTime) {
if (this.noTargetWobbler.shouldUpdate(gameTime)) {
this.noTargetWobbler.update(gameTime, this.random.nextFloat());
}
float targetRotation = this.noTargetWobbler.rotation() + hash(seed) / 2.1474836E9F;
return Mth.positiveModulo(targetRotation, 1.0F);
}
private float getRotationTowardsCompassTarget(ItemOwner owner, long gameTime, BlockPos compassTargetPos) {
float angleToTarget = (float)getAngleFromEntityToPos(owner, compassTargetPos);
float ownerYRotation = getWrappedVisualRotationY(owner);
float targetRotation;
if (owner.asLivingEntity() instanceof Player player && player.isLocalPlayer() && player.level().tickRateManager().runsNormally()) {
if (this.wobbler.shouldUpdate(gameTime)) {
this.wobbler.update(gameTime, 0.5F - (ownerYRotation - 0.25F));
}
targetRotation = angleToTarget + this.wobbler.rotation();
} else {
targetRotation = 0.5F - (ownerYRotation - 0.25F - angleToTarget);
}
return Mth.positiveModulo(targetRotation, 1.0F);
}
private static boolean isValidCompassTargetPos(ItemOwner owner, @Nullable GlobalPos positionToPointTo) {
return positionToPointTo != null
&& positionToPointTo.dimension() == owner.level().dimension()
&& !(positionToPointTo.pos().distToCenterSqr(owner.position()) < 1.0E-5F);
}
private static double getAngleFromEntityToPos(ItemOwner owner, BlockPos position) {
Vec3 target = Vec3.atCenterOf(position);
Vec3 ownerPosition = owner.position();
return Math.atan2(target.z() - ownerPosition.z(), target.x() - ownerPosition.x()) / (float) (Math.PI * 2);
}
private static float getWrappedVisualRotationY(ItemOwner owner) {
return Mth.positiveModulo(owner.getVisualRotationYInDegrees() / 360.0F, 1.0F);
}
private static int hash(int input) {
return input * 1327217883;
}
protected CompassAngleState.CompassTarget target() {
return this.compassTarget;
}
@OnlyIn(Dist.CLIENT)
public static enum CompassTarget implements StringRepresentable {
NONE("none") {
@Override
public @Nullable GlobalPos get(ClientLevel level, ItemStack itemStack, @Nullable ItemOwner owner) {
return null;
}
},
LODESTONE("lodestone") {
@Override
public @Nullable GlobalPos get(ClientLevel level, ItemStack itemStack, @Nullable ItemOwner owner) {
LodestoneTracker tracker = itemStack.get(DataComponents.LODESTONE_TRACKER);
return tracker != null ? tracker.target().orElse(null) : null;
}
},
SPAWN("spawn") {
@Override
public GlobalPos get(ClientLevel level, ItemStack itemStack, @Nullable ItemOwner owner) {
return level.getRespawnData().globalPos();
}
},
RECOVERY("recovery") {
@Override
public @Nullable GlobalPos get(ClientLevel level, ItemStack itemStack, @Nullable ItemOwner owner) {
return (owner == null ? null : owner.asLivingEntity()) instanceof Player player ? player.getLastDeathLocation().orElse(null) : null;
}
};
public static final Codec<CompassAngleState.CompassTarget> CODEC = StringRepresentable.fromEnum(CompassAngleState.CompassTarget::values);
private final String name;
private CompassTarget(String name) {
this.name = name;
}
@Override
public String getSerializedName() {
return this.name;
}
abstract @Nullable GlobalPos get(final ClientLevel level, final ItemStack itemStack, final @Nullable ItemOwner entity);
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
字段/继承
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.positiveModulo()
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
RandomSource.create()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
StringRepresentable.fromEnum()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Vec3.atCenterOf()
- 引用位置: