AI 목표와 탑승
AI 목표
EntityDefinition.builder(texture)
.goal(4, SeekGlowBlockGoal::new) // 몹마다 새 목표 객체를 만듦
.build();
SeekGlowBlockGoal.java
final class SeekGlowBlockGoal implements AiGoal { // canStart, shouldContinue, start, tick, stop
private BlockPos target;
@Override
public boolean canStart(MobView mob) {
target = find(mob.world(), mob.blockPos()); // 주변의 빛나는 블록 찾기
return target != null;
}
@Override
public boolean shouldContinue(MobView mob) {
return mob.isNavigating();
}
@Override
public void start(MobView mob) {
mob.navigateTo(target.x() + 0.5, target.y(), target.z() + 0.5, 1.0);
}
@Override
public void tick(MobView mob) {
mob.lookAt(target.x() + 0.5, target.y() + 0.5, target.z() + 0.5);
}
@Override
public void stop(MobView mob) {
mob.stopNavigating();
}
}
- 목표는 게임의 목표 스케줄러가 서버 스레드에서 실행합니다.
- 숫자가 낮을수록 우선순위가 높습니다. 같은 제어(
GoalControl:MOVE,LOOK,JUMP,TARGET)를 쓰는 목표끼리는 동시에 실행되지 않으며, 목표가 쓰는 제어는controls()를 재정의해 정합니다. - 기본 목표의 우선순위는 0(뜨기), 1(도망), 2(공격), 3(유혹), 5(배회), 6–7(둘러보기)입니다.
targetGoal(priority, factory)는 공격 대상을 고르는 목표를 등록합니다.- 팩토리는 몹마다 한 번 호출되므로 목표 객체에 상태를 저장해도 됩니다.
MobView
| 메서드 | 뜻 |
|---|---|
navigateTo(x, y, z, speed) | 길찾기를 시작 |
isNavigating(), stopNavigating() | 길찾기 상태 확인과 중지 |
lookAt(x, y, z) | 바라볼 곳 지정 |
target(), setTarget(living) | 공격 대상 |
이동과 탑승
EntityDefinition.builder(texture)
.rideable(true) // 빈손으로 사용하면 탑승하고, 이동 키로 조종
.noGravity().notPushable();
entity.setVelocity(0, 0.5, 0);
player.startRiding(golem);
EntityView의 이동 관련 메서드:
| 메서드 | 뜻 |
|---|---|
velocity(), setVelocity(x, y, z) | 속도(Vector3). 플레이어의 속도는 클라이언트로 전달 |
yaw(), pitch(), setRotation(yaw, pitch) | 방향 |
hasNoGravity(), setNoGravity(bool) | 중력 |
isOnGround() | 땅 위 여부 |
vehicle(), passengers(), startRiding(vehicle), stopRiding() | 탈것과 승객 |
rideable(true)인 몹은 말처럼 조종할 수 있습니다. 조종 이동은 말과 마찬가지로 탑승한 플레이어의 클라이언트가 계산합니다.rideable(false)인 몹은 탈 수만 있고 조종할 수는 없습니다.
사람 확인 필요
탈것 조종은 키 입력을 자동화할 수 없으므로 사람이 직접 확인해야 합니다.