From f06925cd3c01f16b69b6dcc430df4fff97d1b9f8 Mon Sep 17 00:00:00 2001 From: Arthur Casals Date: Sat, 22 Jun 2019 11:57:42 +0200 Subject: [PATCH 1/4] Fixed stray loop and added probabilistic movement --- assets/behaviors/common/doRandomMove.behavior | 4 +- .../move/SetTargetToNearbyBlockNode.java | 37 ++++++++++--------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/assets/behaviors/common/doRandomMove.behavior b/assets/behaviors/common/doRandomMove.behavior index d411b4cf..b674529a 100644 --- a/assets/behaviors/common/doRandomMove.behavior +++ b/assets/behaviors/common/doRandomMove.behavior @@ -1,6 +1,8 @@ { sequence : [ - set_target_nearby_block, + { + set_target_nearby_block : { moveProbability: 65 } + }, move_to ] } diff --git a/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java b/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java index 4ccfa44e..559832a7 100644 --- a/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java +++ b/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java @@ -32,40 +32,41 @@ @BehaviorAction(name = "set_target_nearby_block") public class SetTargetToNearbyBlockNode extends BaseAction { - private static final int RANDOM_BLOCK_ITERATIONS = 10; private static final Logger logger = LoggerFactory.getLogger(SetTargetToNearbyBlockNode.class); private transient Random random = new Random(); @In private PathfinderSystem pathfinderSystem; + private int moveProbability = 100; @Override public BehaviorState modify(Actor actor, BehaviorState result) { - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent.currentBlock != null) { - WalkableBlock target = findRandomNearbyBlock(moveComponent.currentBlock); - moveComponent.target = target.getBlockPosition().toVector3f(); - actor.save(moveComponent); - } else { - return BehaviorState.FAILURE; + if (random.nextInt(100) > (99 - moveProbability)) { + MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); + if (moveComponent.currentBlock != null) { + WalkableBlock target = findRandomNearbyBlock(moveComponent.currentBlock); + moveComponent.target = target.getBlockPosition().toVector3f(); + actor.save(moveComponent); + } else { + return BehaviorState.FAILURE; + } } return BehaviorState.SUCCESS; } private WalkableBlock findRandomNearbyBlock(WalkableBlock startBlock) { WalkableBlock currentBlock = startBlock; - for (int i = 0; i < RANDOM_BLOCK_ITERATIONS; i++) { - WalkableBlock[] neighbors = currentBlock.neighbors; - List existingNeighbors = Lists.newArrayList(); - for (WalkableBlock neighbor : neighbors) { - if (neighbor != null) { - existingNeighbors.add(neighbor); - } - } - if (existingNeighbors.size() > 0) { - currentBlock = existingNeighbors.get(random.nextInt(existingNeighbors.size())); + + WalkableBlock[] neighbors = currentBlock.neighbors; + List existingNeighbors = Lists.newArrayList(); + for (WalkableBlock neighbor : neighbors) { + if (neighbor != null) { + existingNeighbors.add(neighbor); } } + if (existingNeighbors.size() > 0) { + currentBlock = existingNeighbors.get(random.nextInt(existingNeighbors.size())); + } logger.debug(String.format("Looking for a block: my block is %s, found destination %s", startBlock.getBlockPosition(), currentBlock.getBlockPosition())); return currentBlock; From 00cefaefb7630c51465cfe2c3d86941f6b8041b2 Mon Sep 17 00:00:00 2001 From: Arthur Casals Date: Sat, 22 Jun 2019 14:04:14 +0200 Subject: [PATCH 2/4] Re-included RANDOM loop, randomized this time --- .../move/SetTargetToNearbyBlockNode.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java b/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java index 559832a7..bbe59f1f 100644 --- a/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java +++ b/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java @@ -56,18 +56,18 @@ public BehaviorState modify(Actor actor, BehaviorState result) { private WalkableBlock findRandomNearbyBlock(WalkableBlock startBlock) { WalkableBlock currentBlock = startBlock; - - WalkableBlock[] neighbors = currentBlock.neighbors; - List existingNeighbors = Lists.newArrayList(); - for (WalkableBlock neighbor : neighbors) { - if (neighbor != null) { - existingNeighbors.add(neighbor); + for (int i = 0; i < random.nextInt(10) + 1; i++) { + WalkableBlock[] neighbors = currentBlock.neighbors; + List existingNeighbors = Lists.newArrayList(); + for (WalkableBlock neighbor : neighbors) { + if (neighbor != null) { + existingNeighbors.add(neighbor); + } + } + if (existingNeighbors.size() > 0) { + currentBlock = existingNeighbors.get(random.nextInt(existingNeighbors.size())); } } - if (existingNeighbors.size() > 0) { - currentBlock = existingNeighbors.get(random.nextInt(existingNeighbors.size())); - } - logger.debug(String.format("Looking for a block: my block is %s, found destination %s", startBlock.getBlockPosition(), currentBlock.getBlockPosition())); return currentBlock; } From cd0e7b37d6c0cf02fd1d68f2f5af3ee19da18ce0 Mon Sep 17 00:00:00 2001 From: Arthur Casals Date: Mon, 5 Aug 2019 15:46:54 -0300 Subject: [PATCH 3/4] Changed how reachTarget flag is raised in MoveTo minion action Reverting module.txt from debug settings Changed how reachTarget flag is raised in MoveTo minion action --- src/main/java/org/terasology/minion/move/MoveToAction.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/terasology/minion/move/MoveToAction.java b/src/main/java/org/terasology/minion/move/MoveToAction.java index b9ef0426..992947bb 100644 --- a/src/main/java/org/terasology/minion/move/MoveToAction.java +++ b/src/main/java/org/terasology/minion/move/MoveToAction.java @@ -80,16 +80,15 @@ private boolean processDirect(Actor actor, MinionMoveComponent moveComponent) { targetDirection.sub(moveComponent.target, worldPos); Vector3f drive = new Vector3f(); - // TODO review - is the yaw here being calculated properly? float yaw = (float) Math.atan2(targetDirection.x, targetDirection.z); - - if (targetDirection.x * targetDirection.x + targetDirection.z * targetDirection.z <= distance * distance) { + if((targetDirection.x < distance) && (targetDirection.y < distance) && (targetDirection.z < distance)) { drive.set(0, 0, 0); reachedTarget = true; } else { targetDirection.normalize(); drive.set(targetDirection); } + float requestedYaw = 180f + yaw * TeraMath.RAD_TO_DEG; CharacterMoveInputEvent wantedInput = new CharacterMoveInputEvent(0, 0, requestedYaw, drive, false, false, moveComponent.jumpMode, (long) (actor.getDelta() * 1000)); From f373898c91a286ed1975e9b8b826f9cf120ece60 Mon Sep 17 00:00:00 2001 From: Arthur Casals Date: Mon, 5 Aug 2019 16:19:32 -0300 Subject: [PATCH 4/4] Added a hard yaw reset when the minion reaches the target --- src/main/java/org/terasology/minion/move/MoveToAction.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/terasology/minion/move/MoveToAction.java b/src/main/java/org/terasology/minion/move/MoveToAction.java index 992947bb..b932c8fa 100644 --- a/src/main/java/org/terasology/minion/move/MoveToAction.java +++ b/src/main/java/org/terasology/minion/move/MoveToAction.java @@ -81,16 +81,18 @@ private boolean processDirect(Actor actor, MinionMoveComponent moveComponent) { Vector3f drive = new Vector3f(); float yaw = (float) Math.atan2(targetDirection.x, targetDirection.z); + float requestedYaw = 180f + yaw * TeraMath.RAD_TO_DEG; + + if((targetDirection.x < distance) && (targetDirection.y < distance) && (targetDirection.z < distance)) { drive.set(0, 0, 0); reachedTarget = true; + requestedYaw = 0f; } else { targetDirection.normalize(); drive.set(targetDirection); } - float requestedYaw = 180f + yaw * TeraMath.RAD_TO_DEG; - CharacterMoveInputEvent wantedInput = new CharacterMoveInputEvent(0, 0, requestedYaw, drive, false, false, moveComponent.jumpMode, (long) (actor.getDelta() * 1000)); actor.getEntity().send(wantedInput);