mirror of https://github.com/cabaletta/baritone
Fix all usages of `Helper.mc`
This commit is contained in:
parent
dd7b492b0c
commit
75d47bb110
|
@ -19,6 +19,8 @@ package baritone.api.command.datatypes;
|
|||
|
||||
import baritone.api.command.argument.IArgConsumer;
|
||||
import baritone.api.command.exception.CommandException;
|
||||
import baritone.api.utils.Helper;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
@ -93,8 +95,13 @@ public enum RelativeFile implements IDatatypePost<File, File> {
|
|||
.filter(s -> !s.contains(" "));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static File gameDir() {
|
||||
File gameDir = HELPER.mc.gameDir.getAbsoluteFile();
|
||||
return gameDir(Helper.mc);
|
||||
}
|
||||
|
||||
public static File gameDir(Minecraft mc) {
|
||||
File gameDir = mc.gameDir.getAbsoluteFile();
|
||||
if (gameDir.getName().equals(".")) {
|
||||
return gameDir.getParentFile();
|
||||
}
|
||||
|
|
|
@ -75,6 +75,8 @@ public interface IPlayerContext {
|
|||
return new Vec3d(player().posX, player().posY + player().getEyeHeight(), player().posZ);
|
||||
}
|
||||
|
||||
BetterBlockPos viewerPos();
|
||||
|
||||
default Rotation playerRotations() {
|
||||
return new Rotation(player().rotationYaw, player().rotationPitch);
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@ import java.util.concurrent.Executor;
|
|||
import java.util.concurrent.SynchronousQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* @author Brady
|
||||
|
@ -100,11 +101,11 @@ public class Baritone implements IBaritone {
|
|||
this.playerContext = new BaritonePlayerContext(this, mc);
|
||||
|
||||
{
|
||||
this.registerBehavior(pathingBehavior = new PathingBehavior(this));
|
||||
this.registerBehavior(lookBehavior = new LookBehavior(this));
|
||||
this.registerBehavior(inventoryBehavior = new InventoryBehavior(this));
|
||||
this.registerBehavior(inputOverrideHandler = new InputOverrideHandler(this));
|
||||
this.registerBehavior(waypointBehavior = new WaypointBehavior(this));
|
||||
pathingBehavior = this.registerBehavior(PathingBehavior::new);
|
||||
lookBehavior = this.registerBehavior(LookBehavior::new);
|
||||
inventoryBehavior = this.registerBehavior(InventoryBehavior::new);
|
||||
inputOverrideHandler = this.registerBehavior(InputOverrideHandler::new);
|
||||
waypointBehavior = this.registerBehavior(WaypointBehavior::new);
|
||||
}
|
||||
|
||||
this.pathingControlManager = new PathingControlManager(this);
|
||||
|
@ -125,15 +126,21 @@ public class Baritone implements IBaritone {
|
|||
this.commandManager = new CommandManager(this);
|
||||
}
|
||||
|
||||
public void registerBehavior(Behavior behavior) {
|
||||
this.gameEventHandler.registerEventListener(behavior);
|
||||
}
|
||||
|
||||
public <T extends Behavior> T registerBehavior(Function<Baritone, T> constructor) {
|
||||
final T behavior = constructor.apply(this);
|
||||
this.registerBehavior(behavior);
|
||||
return behavior;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PathingControlManager getPathingControlManager() {
|
||||
return this.pathingControlManager;
|
||||
}
|
||||
|
||||
public void registerBehavior(Behavior behavior) {
|
||||
this.gameEventHandler.registerEventListener(behavior);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputOverrideHandler getInputOverrideHandler() {
|
||||
return this.inputOverrideHandler;
|
||||
|
@ -173,6 +180,7 @@ public class Baritone implements IBaritone {
|
|||
return this.lookBehavior;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExploreProcess getExploreProcess() {
|
||||
return this.exploreProcess;
|
||||
}
|
||||
|
@ -182,6 +190,7 @@ public class Baritone implements IBaritone {
|
|||
return this.mineProcess;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FarmProcess getFarmProcess() {
|
||||
return this.farmProcess;
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ public final class BaritoneProvider implements IBaritoneProvider {
|
|||
this.all = Collections.singletonList(this.primary);
|
||||
|
||||
// Setup chat control, just for the primary instance
|
||||
new ExampleBaritoneControl(this.primary);
|
||||
this.primary.registerBehavior(ExampleBaritoneControl::new);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
|
||||
package baritone.command;
|
||||
|
||||
import baritone.Baritone;
|
||||
import baritone.api.BaritoneAPI;
|
||||
import baritone.api.IBaritone;
|
||||
import baritone.api.Settings;
|
||||
import baritone.api.command.argument.ICommandArgument;
|
||||
import baritone.api.command.exception.CommandNotEnoughArgumentsException;
|
||||
|
@ -30,6 +30,7 @@ import baritone.api.event.events.TabCompleteEvent;
|
|||
import baritone.api.event.listener.AbstractGameEventListener;
|
||||
import baritone.api.utils.Helper;
|
||||
import baritone.api.utils.SettingsUtil;
|
||||
import baritone.behavior.Behavior;
|
||||
import baritone.command.argument.ArgConsumer;
|
||||
import baritone.command.argument.CommandArguments;
|
||||
import baritone.command.manager.CommandManager;
|
||||
|
@ -49,14 +50,14 @@ import java.util.stream.Stream;
|
|||
|
||||
import static baritone.api.command.IBaritoneChatControl.FORCE_COMMAND_PREFIX;
|
||||
|
||||
public class ExampleBaritoneControl implements Helper, AbstractGameEventListener {
|
||||
public class ExampleBaritoneControl extends Behavior implements Helper {
|
||||
|
||||
private static final Settings settings = BaritoneAPI.getSettings();
|
||||
private final ICommandManager manager;
|
||||
|
||||
public ExampleBaritoneControl(IBaritone baritone) {
|
||||
public ExampleBaritoneControl(Baritone baritone) {
|
||||
super(baritone);
|
||||
this.manager = baritone.getCommandManager();
|
||||
baritone.getGameEventHandler().registerEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -100,7 +101,7 @@ public class ExampleBaritoneControl implements Helper, AbstractGameEventListener
|
|||
return false;
|
||||
} else if (msg.trim().equalsIgnoreCase("orderpizza")) {
|
||||
try {
|
||||
((IGuiScreen) mc.currentScreen).openLink(new URI("https://www.dominos.com/en/pages/order/"));
|
||||
((IGuiScreen) ctx.minecraft().currentScreen).openLink(new URI("https://www.dominos.com/en/pages/order/"));
|
||||
} catch (NullPointerException | URISyntaxException ignored) {}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -21,10 +21,7 @@ import baritone.api.IBaritone;
|
|||
import baritone.api.command.Command;
|
||||
import baritone.api.command.argument.IArgConsumer;
|
||||
import baritone.api.command.exception.CommandException;
|
||||
import baritone.api.command.exception.CommandInvalidStateException;
|
||||
import baritone.api.pathing.goals.GoalBlock;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
@ -39,11 +36,7 @@ public class ComeCommand extends Command {
|
|||
@Override
|
||||
public void execute(String label, IArgConsumer args) throws CommandException {
|
||||
args.requireMax(0);
|
||||
Entity entity = mc.getRenderViewEntity();
|
||||
if (entity == null) {
|
||||
throw new CommandInvalidStateException("render view entity is null");
|
||||
}
|
||||
baritone.getCustomGoalProcess().setGoalAndPath(new GoalBlock(new BlockPos(entity)));
|
||||
baritone.getCustomGoalProcess().setGoalAndPath(new GoalBlock(ctx.viewerPos()));
|
||||
logDirect("Coming");
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ public class ExploreFilterCommand extends Command {
|
|||
@Override
|
||||
public void execute(String label, IArgConsumer args) throws CommandException {
|
||||
args.requireMax(2);
|
||||
File file = args.getDatatypePost(RelativeFile.INSTANCE, mc.gameDir.getAbsoluteFile().getParentFile());
|
||||
File file = args.getDatatypePost(RelativeFile.INSTANCE, ctx.minecraft().gameDir.getAbsoluteFile().getParentFile());
|
||||
boolean invert = false;
|
||||
if (args.hasAny()) {
|
||||
if (args.getString().equalsIgnoreCase("invert")) {
|
||||
|
@ -65,7 +65,7 @@ public class ExploreFilterCommand extends Command {
|
|||
@Override
|
||||
public Stream<String> tabComplete(String label, IArgConsumer args) throws CommandException {
|
||||
if (args.hasExactlyOne()) {
|
||||
return RelativeFile.tabComplete(args, RelativeFile.gameDir());
|
||||
return RelativeFile.tabComplete(args, RelativeFile.gameDir(ctx.minecraft()));
|
||||
}
|
||||
return Stream.empty();
|
||||
}
|
||||
|
|
|
@ -37,8 +37,8 @@ public class RenderCommand extends Command {
|
|||
public void execute(String label, IArgConsumer args) throws CommandException {
|
||||
args.requireMax(0);
|
||||
BetterBlockPos origin = ctx.playerFeet();
|
||||
int renderDistance = (mc.gameSettings.renderDistanceChunks + 1) * 16;
|
||||
mc.renderGlobal.markBlockRangeForRenderUpdate(
|
||||
int renderDistance = (ctx.minecraft().gameSettings.renderDistanceChunks + 1) * 16;
|
||||
ctx.minecraft().renderGlobal.markBlockRangeForRenderUpdate(
|
||||
origin.x - renderDistance,
|
||||
0,
|
||||
origin.z - renderDistance,
|
||||
|
|
|
@ -92,7 +92,7 @@ public class SelCommand extends Command {
|
|||
if (action == Action.POS2 && pos1 == null) {
|
||||
throw new CommandInvalidStateException("Set pos1 first before using pos2");
|
||||
}
|
||||
BetterBlockPos playerPos = mc.getRenderViewEntity() != null ? BetterBlockPos.from(new BlockPos(mc.getRenderViewEntity())) : ctx.playerFeet();
|
||||
BetterBlockPos playerPos = ctx.viewerPos();
|
||||
BetterBlockPos pos = args.hasAny() ? args.getDatatypePost(RelativeBlockPos.INSTANCE, playerPos) : playerPos;
|
||||
args.requireMax(0);
|
||||
if (action == Action.POS1) {
|
||||
|
@ -198,7 +198,7 @@ public class SelCommand extends Command {
|
|||
baritone.getBuilderProcess().build("Fill", composite, origin);
|
||||
logDirect("Filling now");
|
||||
} else if (action == Action.COPY) {
|
||||
BetterBlockPos playerPos = mc.getRenderViewEntity() != null ? BetterBlockPos.from(new BlockPos(mc.getRenderViewEntity())) : ctx.playerFeet();
|
||||
BetterBlockPos playerPos = ctx.viewerPos();
|
||||
BetterBlockPos pos = args.hasAny() ? args.getDatatypePost(RelativeBlockPos.INSTANCE, playerPos) : playerPos;
|
||||
args.requireMax(0);
|
||||
ISelection[] selections = manager.getSelections();
|
||||
|
@ -239,7 +239,7 @@ public class SelCommand extends Command {
|
|||
clipboardOffset = origin.subtract(pos);
|
||||
logDirect("Selection copied");
|
||||
} else if (action == Action.PASTE) {
|
||||
BetterBlockPos playerPos = mc.getRenderViewEntity() != null ? BetterBlockPos.from(new BlockPos(mc.getRenderViewEntity())) : ctx.playerFeet();
|
||||
BetterBlockPos playerPos = ctx.viewerPos();
|
||||
BetterBlockPos pos = args.hasAny() ? args.getDatatypePost(RelativeBlockPos.INSTANCE, playerPos) : playerPos;
|
||||
args.requireMax(0);
|
||||
if (clipboard == null) {
|
||||
|
|
|
@ -54,7 +54,7 @@ public class SurfaceCommand extends Command {
|
|||
for (int currentIteratedY = startingYPos; currentIteratedY < worldHeight; currentIteratedY++) {
|
||||
final BetterBlockPos newPos = new BetterBlockPos(playerPos.getX(), currentIteratedY, playerPos.getZ());
|
||||
|
||||
if (!(mc.world.getBlockState(newPos).getBlock() instanceof BlockAir) && newPos.getY() > playerPos.getY()) {
|
||||
if (!(ctx.world().getBlockState(newPos).getBlock() instanceof BlockAir) && newPos.getY() > playerPos.getY()) {
|
||||
Goal goal = new GoalBlock(newPos.up());
|
||||
logDirect(String.format("Going to: %s", goal.toString()));
|
||||
baritone.getCustomGoalProcess().setGoalAndPath(goal);
|
||||
|
|
|
@ -19,11 +19,12 @@ package baritone.utils;
|
|||
|
||||
import baritone.api.BaritoneAPI;
|
||||
import baritone.api.Settings;
|
||||
import baritone.api.utils.Helper;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.entity.RenderManager;
|
||||
import net.minecraft.client.renderer.texture.TextureManager;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
|
||||
|
@ -35,7 +36,8 @@ public interface IRenderer {
|
|||
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
BufferBuilder buffer = tessellator.getBuffer();
|
||||
RenderManager renderManager = Helper.mc.getRenderManager();
|
||||
RenderManager renderManager = Minecraft.getMinecraft().getRenderManager();
|
||||
TextureManager textureManager = Minecraft.getMinecraft().getTextureManager();
|
||||
Settings settings = BaritoneAPI.getSettings();
|
||||
|
||||
float[] color = new float[] {1.0F, 1.0F, 1.0F, 255.0F};
|
||||
|
|
|
@ -22,7 +22,7 @@ import baritone.api.event.events.RenderEvent;
|
|||
import baritone.api.pathing.calc.IPath;
|
||||
import baritone.api.pathing.goals.*;
|
||||
import baritone.api.utils.BetterBlockPos;
|
||||
import baritone.api.utils.Helper;
|
||||
import baritone.api.utils.IPlayerContext;
|
||||
import baritone.api.utils.interfaces.IGoalRenderPos;
|
||||
import baritone.behavior.PathingBehavior;
|
||||
import baritone.pathing.path.PathExecutor;
|
||||
|
@ -52,31 +52,40 @@ public final class PathRenderer implements IRenderer {
|
|||
private PathRenderer() {}
|
||||
|
||||
public static void render(RenderEvent event, PathingBehavior behavior) {
|
||||
float partialTicks = event.getPartialTicks();
|
||||
Goal goal = behavior.getGoal();
|
||||
if (Helper.mc.currentScreen instanceof GuiClick) {
|
||||
((GuiClick) Helper.mc.currentScreen).onRender();
|
||||
final IPlayerContext ctx = behavior.ctx;
|
||||
if (ctx.world() == null) {
|
||||
return;
|
||||
}
|
||||
if (ctx.minecraft().currentScreen instanceof GuiClick) {
|
||||
((GuiClick) ctx.minecraft().currentScreen).onRender();
|
||||
}
|
||||
|
||||
int thisPlayerDimension = behavior.baritone.getPlayerContext().world().provider.getDimensionType().getId();
|
||||
int currentRenderViewDimension = BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext().world().provider.getDimensionType().getId();
|
||||
final float partialTicks = event.getPartialTicks();
|
||||
final Goal goal = behavior.getGoal();
|
||||
|
||||
final int thisPlayerDimension = ctx.world().provider.getDimensionType().getId();
|
||||
final int currentRenderViewDimension = BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext().world().provider.getDimensionType().getId();
|
||||
|
||||
if (thisPlayerDimension != currentRenderViewDimension) {
|
||||
// this is a path for a bot in a different dimension, don't render it
|
||||
return;
|
||||
}
|
||||
|
||||
Entity renderView = Helper.mc.getRenderViewEntity();
|
||||
|
||||
if (renderView.world != BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext().world()) {
|
||||
System.out.println("I have no idea what's going on");
|
||||
System.out.println("The primary baritone is in a different world than the render view entity");
|
||||
System.out.println("Not rendering the path");
|
||||
return;
|
||||
}
|
||||
// TODO: This is goofy 💀 (pr/deprecateHelperMc)
|
||||
// renderView isn't even needed for drawGoal since it's only used to
|
||||
// calculate GoalYLevel x/z bounds, and ends up just cancelling itself
|
||||
// out because of viewerPosX/Y/Z. I just changed it to center around the
|
||||
// actual player so the goal box doesn't follow the camera in freecam.
|
||||
// Entity renderView = Helper.mc.getRenderViewEntity();
|
||||
// if (renderView.world != BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext().world()) {
|
||||
// System.out.println("I have no idea what's going on");
|
||||
// System.out.println("The primary baritone is in a different world than the render view entity");
|
||||
// System.out.println("Not rendering the path");
|
||||
// return;
|
||||
// }
|
||||
|
||||
if (goal != null && settings.renderGoal.value) {
|
||||
drawGoal(renderView, goal, partialTicks, settings.colorGoalBox.value);
|
||||
drawGoal(ctx.player(), goal, partialTicks, settings.colorGoalBox.value);
|
||||
}
|
||||
|
||||
if (!settings.renderPath.value) {
|
||||
|
@ -86,9 +95,9 @@ public final class PathRenderer implements IRenderer {
|
|||
PathExecutor current = behavior.getCurrent(); // this should prevent most race conditions?
|
||||
PathExecutor next = behavior.getNext(); // like, now it's not possible for current!=null to be true, then suddenly false because of another thread
|
||||
if (current != null && settings.renderSelectionBoxes.value) {
|
||||
drawManySelectionBoxes(renderView, current.toBreak(), settings.colorBlocksToBreak.value);
|
||||
drawManySelectionBoxes(renderView, current.toPlace(), settings.colorBlocksToPlace.value);
|
||||
drawManySelectionBoxes(renderView, current.toWalkInto(), settings.colorBlocksToWalkInto.value);
|
||||
drawManySelectionBoxes(ctx.player(), current.toBreak(), settings.colorBlocksToBreak.value);
|
||||
drawManySelectionBoxes(ctx.player(), current.toPlace(), settings.colorBlocksToPlace.value);
|
||||
drawManySelectionBoxes(ctx.player(), current.toWalkInto(), settings.colorBlocksToWalkInto.value);
|
||||
}
|
||||
|
||||
//drawManySelectionBoxes(player, Collections.singletonList(behavior.pathStart()), partialTicks, Color.WHITE);
|
||||
|
@ -111,12 +120,12 @@ public final class PathRenderer implements IRenderer {
|
|||
|
||||
currentlyRunning.pathToMostRecentNodeConsidered().ifPresent(mr -> {
|
||||
drawPath(mr, 0, settings.colorMostRecentConsidered.value, settings.fadePath.value, 10, 20);
|
||||
drawManySelectionBoxes(renderView, Collections.singletonList(mr.getDest()), settings.colorMostRecentConsidered.value);
|
||||
drawManySelectionBoxes(ctx.player(), Collections.singletonList(mr.getDest()), settings.colorMostRecentConsidered.value);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public static void drawPath(IPath path, int startIndex, Color color, boolean fadeOut, int fadeStart0, int fadeEnd0) {
|
||||
private static void drawPath(IPath path, int startIndex, Color color, boolean fadeOut, int fadeStart0, int fadeEnd0) {
|
||||
IRenderer.startLines(color, settings.pathRenderLineWidthPixels.value, settings.renderPathIgnoreDepth.value);
|
||||
|
||||
int fadeStart = fadeStart0 + startIndex;
|
||||
|
@ -159,7 +168,7 @@ public final class PathRenderer implements IRenderer {
|
|||
IRenderer.endLines(settings.renderPathIgnoreDepth.value);
|
||||
}
|
||||
|
||||
public static void emitLine(double x1, double y1, double z1, double x2, double y2, double z2) {
|
||||
private static void emitLine(double x1, double y1, double z1, double x2, double y2, double z2) {
|
||||
double vpX = renderManager.viewerPosX;
|
||||
double vpY = renderManager.viewerPosY;
|
||||
double vpZ = renderManager.viewerPosZ;
|
||||
|
@ -202,11 +211,11 @@ public final class PathRenderer implements IRenderer {
|
|||
IRenderer.endLines(settings.renderSelectionBoxesIgnoreDepth.value);
|
||||
}
|
||||
|
||||
public static void drawGoal(Entity player, Goal goal, float partialTicks, Color color) {
|
||||
private static void drawGoal(Entity player, Goal goal, float partialTicks, Color color) {
|
||||
drawGoal(player, goal, partialTicks, color, true);
|
||||
}
|
||||
|
||||
public static void drawGoal(Entity player, Goal goal, float partialTicks, Color color, boolean setupRender) {
|
||||
private static void drawGoal(Entity player, Goal goal, float partialTicks, Color color, boolean setupRender) {
|
||||
double renderPosX = renderManager.viewerPosX;
|
||||
double renderPosY = renderManager.viewerPosY;
|
||||
double renderPosZ = renderManager.viewerPosZ;
|
||||
|
@ -245,7 +254,7 @@ public final class PathRenderer implements IRenderer {
|
|||
if (settings.renderGoalXZBeacon.value) {
|
||||
glPushAttrib(GL_LIGHTING_BIT);
|
||||
|
||||
Helper.mc.getTextureManager().bindTexture(TileEntityBeaconRenderer.TEXTURE_BEACON_BEAM);
|
||||
textureManager.bindTexture(TileEntityBeaconRenderer.TEXTURE_BEACON_BEAM);
|
||||
|
||||
if (settings.renderGoalIgnoreDepth.value) {
|
||||
GlStateManager.disableDepth();
|
||||
|
|
|
@ -22,7 +22,10 @@ import baritone.api.cache.IWorldData;
|
|||
import baritone.api.utils.*;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
|
@ -68,6 +71,12 @@ public final class BaritonePlayerContext implements IPlayerContext {
|
|||
return this.baritone.getWorldProvider().getCurrentWorld();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BetterBlockPos viewerPos() {
|
||||
final Entity entity = this.mc.getRenderViewEntity();
|
||||
return entity == null ? this.playerFeet() : BetterBlockPos.from(new BlockPos(entity));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Rotation playerRotations() {
|
||||
return this.baritone.getLookBehavior().getEffectiveRotation().orElseGet(IPlayerContext.super::playerRotations);
|
||||
|
|
Loading…
Reference in New Issue