[plugin/control] add .jumpToHighest()
This commit is contained in:
parent
e22e27fd69
commit
a6f5d0062a
@ -97,12 +97,16 @@ export class MovePathBlockedError extends Error {
|
|||||||
constructor() { super('Move path is possiblely blocked.'); }
|
constructor() { super('Move path is possiblely blocked.'); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export class NotOnGroundError extends Error {
|
||||||
|
constructor() { super('bot is not on ground, cannot jump'); }
|
||||||
|
};
|
||||||
|
|
||||||
async function moveAxisTask(bot, task, axis_raw, target_raw, level) {
|
async function moveAxisTask(bot, task, axis_raw, target_raw, level) {
|
||||||
const axis = AXIS[axis_raw];
|
const axis = AXIS[axis_raw];
|
||||||
assert.equal(typeof axis, 'number', 'axis');
|
assert.equal(typeof axis, 'number', 'axis');
|
||||||
assert.ok(0 <= axis && axis <= 3, 'axis');
|
assert.ok(0 <= axis && axis <= 3, 'axis');
|
||||||
assert.equal(typeof level, 'number', 'level');
|
assert.equal(typeof level, 'number', 'level');
|
||||||
assert.ok(target instanceof Vec3, 'target');
|
assert.ok(target_raw instanceof Vec3, 'target');
|
||||||
const stable_axis = "xz"[axis % 2];
|
const stable_axis = "xz"[axis % 2];
|
||||||
const target = target_raw.clone();
|
const target = target_raw.clone();
|
||||||
adjustXZ(target);
|
adjustXZ(target);
|
||||||
@ -145,7 +149,7 @@ async function moveAxisTask(bot, task, axis_raw, target_raw, level) {
|
|||||||
let time_used = 0, pos_queue = new Queue();
|
let time_used = 0, pos_queue = new Queue();
|
||||||
const TRACK_TICKS = 5;
|
const TRACK_TICKS = 5;
|
||||||
pos_queue.push(pos.clone());
|
pos_queue.push(pos.clone());
|
||||||
do {
|
while (true) {
|
||||||
await bot.waitForTicks(1);
|
await bot.waitForTicks(1);
|
||||||
task._interuptableHere();
|
task._interuptableHere();
|
||||||
|
|
||||||
@ -194,7 +198,7 @@ async function moveAxisTask(bot, task, axis_raw, target_raw, level) {
|
|||||||
logger('moveAxisTask() went past target.');
|
logger('moveAxisTask() went past target.');
|
||||||
throw new MoveInterferedError();
|
throw new MoveInterferedError();
|
||||||
}
|
}
|
||||||
} while (true);
|
}
|
||||||
bot.clearControlStates();
|
bot.clearControlStates();
|
||||||
task._ready(time_used);
|
task._ready(time_used);
|
||||||
}
|
}
|
||||||
@ -216,7 +220,7 @@ async function ladderAscendTask(bot, task, target_y) {
|
|||||||
|
|
||||||
const TRACK_TICKS = 10;
|
const TRACK_TICKS = 10;
|
||||||
let time_used = 0, last_y = start_pos.y;
|
let time_used = 0, last_y = start_pos.y;
|
||||||
do {
|
while (true) {
|
||||||
await bot.waitForTicks(1);
|
await bot.waitForTicks(1);
|
||||||
task._interuptableHere();
|
task._interuptableHere();
|
||||||
time_used += 1;
|
time_used += 1;
|
||||||
@ -247,7 +251,7 @@ async function ladderAscendTask(bot, task, target_y) {
|
|||||||
}
|
}
|
||||||
last_y = now_y;
|
last_y = now_y;
|
||||||
}
|
}
|
||||||
} while (true);
|
}
|
||||||
task._ready(time_used);
|
task._ready(time_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,6 +276,12 @@ export default function inject(bot) {
|
|||||||
|
|
||||||
bot.control.jumpUp = async (axis_raw, time=5) => {
|
bot.control.jumpUp = async (axis_raw, time=5) => {
|
||||||
const axis = AXIS[axis_raw];
|
const axis = AXIS[axis_raw];
|
||||||
|
assert.ok(typeof axis == 'number');
|
||||||
|
assert.ok(0 <= axis && axis <= 3);
|
||||||
|
assert.ok(typeof time == 'number');
|
||||||
|
if (!bot.entity.onGround) {
|
||||||
|
throw new NotOnGroundError();
|
||||||
|
}
|
||||||
bot.control.adjustXZ();
|
bot.control.adjustXZ();
|
||||||
await bot.look(axis * Math.PI / 2, 0, true);
|
await bot.look(axis * Math.PI / 2, 0, true);
|
||||||
let controls = new ControlState('forward', 'jump');
|
let controls = new ControlState('forward', 'jump');
|
||||||
@ -289,6 +299,14 @@ export default function inject(bot) {
|
|||||||
if (tactic == null) { tactic = {}; }
|
if (tactic == null) { tactic = {}; }
|
||||||
if (tactic.sprint == null) { tactic.sprint = dis > 3; }
|
if (tactic.sprint == null) { tactic.sprint = dis > 3; }
|
||||||
if (tactic.speed == null) { tactic.speed = tactic.sprint ? .355 : .216; }
|
if (tactic.speed == null) { tactic.speed = tactic.sprint ? .355 : .216; }
|
||||||
|
assert.ok(typeof axis == 'number');
|
||||||
|
assert.ok(0 <= axis && axis <= 3);
|
||||||
|
assert.ok(typeof dis == 'number');
|
||||||
|
assert.ok(typeof tactic.sprint == 'boolean');
|
||||||
|
assert.ok(typeof tactic.speed == 'number');
|
||||||
|
if (!bot.entity.onGround) {
|
||||||
|
throw new NotOnGroundError();
|
||||||
|
}
|
||||||
|
|
||||||
const axis = AXIS[axis_raw];
|
const axis = AXIS[axis_raw];
|
||||||
bot.control.adjustXZ();
|
bot.control.adjustXZ();
|
||||||
@ -323,11 +341,50 @@ export default function inject(bot) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bot.control.jump = async () => {
|
bot.control.jump = async () => {
|
||||||
|
if (!bot.entity.onGround) {
|
||||||
|
throw new NotOnGroundError();
|
||||||
|
}
|
||||||
bot.setControlState('jump', true);
|
bot.setControlState('jump', true);
|
||||||
await bot.waitForTicks(1);
|
await bot.waitForTicks(1);
|
||||||
bot.setControlState('jump', false);
|
bot.setControlState('jump', false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bot.control.jumpToHighest = () => {
|
||||||
|
let task = new Task();
|
||||||
|
queueMicrotask(async () => {
|
||||||
|
try {
|
||||||
|
task._start();
|
||||||
|
|
||||||
|
if (!bot.entity.onGround) {
|
||||||
|
throw new NotOnGroundError();
|
||||||
|
}
|
||||||
|
|
||||||
|
let controls = new ControlState('jump');
|
||||||
|
controls.apply(bot);
|
||||||
|
|
||||||
|
let time_used = 0;
|
||||||
|
while (true) {
|
||||||
|
await bot.waitForTicks(1);
|
||||||
|
task._interuptableHere();
|
||||||
|
|
||||||
|
time_used += 1;
|
||||||
|
if (time_used == 1) {
|
||||||
|
controls.jump = false;
|
||||||
|
controls.apply(bot);
|
||||||
|
}
|
||||||
|
if (bot.entity.velocity.y < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
task._ready(time_used);
|
||||||
|
} catch(err) {
|
||||||
|
bot.clearControlStates();
|
||||||
|
task._fail(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return task;
|
||||||
|
};
|
||||||
|
|
||||||
bot.control.ladderAscend = (target_y) => {
|
bot.control.ladderAscend = (target_y) => {
|
||||||
let task = new Task();
|
let task = new Task();
|
||||||
queueMicrotask(async () => {
|
queueMicrotask(async () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user