From ae674913c03ebd1d2a061d9b90f078b6adf3f919 Mon Sep 17 00:00:00 2001 From: darkweird Date: Thu, 11 Nov 2021 16:17:19 +0300 Subject: [PATCH] feature(PathFinding-Behaviour): extract Pathfinding's Behaviors to `PathfindingBehavior` module --- .../common/attackFollowedEntity.behavior | 47 --- assets/behaviors/common/doRandomMove.behavior | 9 - assets/behaviors/common/flee.behavior | 22 -- assets/behaviors/common/follow.behavior | 38 -- assets/behaviors/common/hostile.behavior | 8 - .../behaviors/common/restrictedStray.behavior | 37 -- assets/behaviors/common/stray.behavior | 31 -- .../creatures/aggressiveCritter.behavior | 21 -- assets/behaviors/creatures/critter.behavior | 25 -- .../creatures/curiousCritter.behavior | 23 -- .../creatures/friendlyCritter.behavior | 22 -- .../creatures/hostileCritter.behavior | 19 - .../creatures/scaredCritter.behavior | 24 -- .../creatures/territorialCritter.behavior | 41 --- assets/behaviors/creatures/worker.behavior | 16 - .../dynamicPathfindingFollow.behavior | 38 -- .../pointPathfindingFollow.behavior | 31 -- .../staticPathfindingFollow.behavior | 32 -- assets/behaviors/work/doBuildBlock.behavior | 18 - assets/behaviors/work/doRemoveBlock.behavior | 19 - assets/behaviors/work/doWalkTo.behavior | 24 -- assets/behaviors/work/moveToWork.behavior | 24 -- assets/prefabs/behaviorNodes/condition.prefab | 22 -- .../behaviorNodes/ensureTargetPresent.prefab | 12 - .../prefabs/behaviorNodes/findPathTo.prefab | 12 - assets/prefabs/behaviorNodes/findWork.prefab | 12 - .../prefabs/behaviorNodes/finishWork.prefab | 12 - assets/prefabs/behaviorNodes/jump.prefab | 12 - assets/prefabs/behaviorNodes/log.prefab | 22 -- .../behaviorNodes/moveAlongPath.prefab | 12 - assets/prefabs/behaviorNodes/moveTo.prefab | 12 - .../behaviorNodes/setTargetLocalPlayer.prefab | 12 - .../setTargetToNearbyBlock.prefab | 12 - .../behaviorNodes/setTargetToWork.prefab | 12 - assets/prefabs/buildWall.prefab | 17 - assets/prefabs/jobBuildBlock.prefab | 20 - assets/prefabs/jobRemoveBlock.prefab | 20 - assets/prefabs/jobWalkToBlock.prefab | 20 - assets/ui/gridrenderer.ui | 131 ------- module.txt | 4 - .../actions/EnsureTargetPresentAction.java | 22 -- .../actions/NearbyBlockRestricted.java | 97 ----- .../SetTargetToFollowedEntityAction.java | 38 -- ...ToNearbyBlockAwayFromInstigatorAction.java | 81 ----- .../actions/SetTargetToTerritory.java | 33 -- .../behaviors/actions/StopMovingAction.java | 31 -- .../org/terasology/grid/BlockRenderer.java | 11 - .../org/terasology/grid/EntityRenderer.java | 11 - .../org/terasology/grid/GridRenderSystem.java | 26 -- .../org/terasology/grid/GridRenderer.java | 149 -------- .../terasology/grid/GridRendererButton.java | 14 - .../terasology/grid/GridRendererScreen.java | 12 - .../grid/renderers/DefaultBlockRenderer.java | 66 ---- .../grid/renderers/DefaultEntityRenderer.java | 47 --- .../grid/renderers/WalkableBlockRenderer.java | 33 -- .../grid/renderers/WorkRenderer.java | 37 -- .../move/ContinuousMoveAlongPathNode.java | 43 --- .../minion/move/FindPathToNode.java | 95 ----- .../minion/move/MinionMoveComponent.java | 47 --- .../minion/move/MinionMoveSystem.java | 81 ----- .../minion/move/MoveAlongPathNode.java | 73 ---- .../terasology/minion/move/MoveToAction.java | 87 ----- .../minion/move/SetTargetLocalPlayerNode.java | 41 --- .../move/SetTargetToNearbyBlockNode.java | 63 ---- .../minion/move/SetupContinuousMoveNode.java | 36 -- .../terasology/minion/work/FindWorkNode.java | 100 ----- .../minion/work/FinishWorkNode.java | 70 ---- .../minion/work/MinionWorkComponent.java | 32 -- .../minion/work/SetTargetToWorkNode.java | 42 --- .../java/org/terasology/minion/work/Work.java | 32 -- .../org/terasology/minion/work/WorkBoard.java | 344 ------------------ .../terasology/minion/work/WorkComponent.java | 24 -- .../terasology/minion/work/WorkFactory.java | 99 ----- .../minion/work/WorkRenderSystem.java | 67 ---- .../minion/work/WorkTargetComponent.java | 79 ---- .../org/terasology/minion/work/WorkType.java | 114 ------ .../minion/work/kmeans/Cluster.java | 273 -------------- .../minion/work/systems/BuildBlock.java | 156 -------- .../minion/work/systems/RemoveBlock.java | 124 ------- .../minion/work/systems/WalkToBlock.java | 103 ------ .../behaviors/BehaviorsLoadingTest.java | 43 +++ .../minion/work/ClusterDebugger.java | 328 ----------------- 82 files changed, 43 insertions(+), 4206 deletions(-) delete mode 100644 assets/behaviors/common/attackFollowedEntity.behavior delete mode 100644 assets/behaviors/common/doRandomMove.behavior delete mode 100644 assets/behaviors/common/flee.behavior delete mode 100644 assets/behaviors/common/follow.behavior delete mode 100644 assets/behaviors/common/hostile.behavior delete mode 100644 assets/behaviors/common/restrictedStray.behavior delete mode 100644 assets/behaviors/common/stray.behavior delete mode 100644 assets/behaviors/creatures/aggressiveCritter.behavior delete mode 100644 assets/behaviors/creatures/critter.behavior delete mode 100644 assets/behaviors/creatures/curiousCritter.behavior delete mode 100644 assets/behaviors/creatures/friendlyCritter.behavior delete mode 100644 assets/behaviors/creatures/hostileCritter.behavior delete mode 100644 assets/behaviors/creatures/scaredCritter.behavior delete mode 100644 assets/behaviors/creatures/territorialCritter.behavior delete mode 100644 assets/behaviors/creatures/worker.behavior delete mode 100644 assets/behaviors/pathfinding/dynamicPathfindingFollow.behavior delete mode 100644 assets/behaviors/pathfinding/pointPathfindingFollow.behavior delete mode 100644 assets/behaviors/pathfinding/staticPathfindingFollow.behavior delete mode 100644 assets/behaviors/work/doBuildBlock.behavior delete mode 100644 assets/behaviors/work/doRemoveBlock.behavior delete mode 100644 assets/behaviors/work/doWalkTo.behavior delete mode 100644 assets/behaviors/work/moveToWork.behavior delete mode 100644 assets/prefabs/behaviorNodes/condition.prefab delete mode 100644 assets/prefabs/behaviorNodes/ensureTargetPresent.prefab delete mode 100644 assets/prefabs/behaviorNodes/findPathTo.prefab delete mode 100644 assets/prefabs/behaviorNodes/findWork.prefab delete mode 100644 assets/prefabs/behaviorNodes/finishWork.prefab delete mode 100644 assets/prefabs/behaviorNodes/jump.prefab delete mode 100644 assets/prefabs/behaviorNodes/log.prefab delete mode 100644 assets/prefabs/behaviorNodes/moveAlongPath.prefab delete mode 100644 assets/prefabs/behaviorNodes/moveTo.prefab delete mode 100644 assets/prefabs/behaviorNodes/setTargetLocalPlayer.prefab delete mode 100644 assets/prefabs/behaviorNodes/setTargetToNearbyBlock.prefab delete mode 100644 assets/prefabs/behaviorNodes/setTargetToWork.prefab delete mode 100644 assets/prefabs/buildWall.prefab delete mode 100644 assets/prefabs/jobBuildBlock.prefab delete mode 100644 assets/prefabs/jobRemoveBlock.prefab delete mode 100644 assets/prefabs/jobWalkToBlock.prefab delete mode 100644 assets/ui/gridrenderer.ui delete mode 100644 src/main/java/org/terasology/behaviors/actions/EnsureTargetPresentAction.java delete mode 100644 src/main/java/org/terasology/behaviors/actions/NearbyBlockRestricted.java delete mode 100644 src/main/java/org/terasology/behaviors/actions/SetTargetToFollowedEntityAction.java delete mode 100644 src/main/java/org/terasology/behaviors/actions/SetTargetToNearbyBlockAwayFromInstigatorAction.java delete mode 100644 src/main/java/org/terasology/behaviors/actions/SetTargetToTerritory.java delete mode 100644 src/main/java/org/terasology/behaviors/actions/StopMovingAction.java delete mode 100644 src/main/java/org/terasology/grid/BlockRenderer.java delete mode 100644 src/main/java/org/terasology/grid/EntityRenderer.java delete mode 100644 src/main/java/org/terasology/grid/GridRenderSystem.java delete mode 100644 src/main/java/org/terasology/grid/GridRenderer.java delete mode 100644 src/main/java/org/terasology/grid/GridRendererButton.java delete mode 100644 src/main/java/org/terasology/grid/GridRendererScreen.java delete mode 100644 src/main/java/org/terasology/grid/renderers/DefaultBlockRenderer.java delete mode 100644 src/main/java/org/terasology/grid/renderers/DefaultEntityRenderer.java delete mode 100644 src/main/java/org/terasology/grid/renderers/WalkableBlockRenderer.java delete mode 100644 src/main/java/org/terasology/grid/renderers/WorkRenderer.java delete mode 100644 src/main/java/org/terasology/minion/move/ContinuousMoveAlongPathNode.java delete mode 100644 src/main/java/org/terasology/minion/move/FindPathToNode.java delete mode 100644 src/main/java/org/terasology/minion/move/MinionMoveComponent.java delete mode 100644 src/main/java/org/terasology/minion/move/MinionMoveSystem.java delete mode 100644 src/main/java/org/terasology/minion/move/MoveAlongPathNode.java delete mode 100644 src/main/java/org/terasology/minion/move/MoveToAction.java delete mode 100644 src/main/java/org/terasology/minion/move/SetTargetLocalPlayerNode.java delete mode 100644 src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java delete mode 100644 src/main/java/org/terasology/minion/move/SetupContinuousMoveNode.java delete mode 100644 src/main/java/org/terasology/minion/work/FindWorkNode.java delete mode 100644 src/main/java/org/terasology/minion/work/FinishWorkNode.java delete mode 100644 src/main/java/org/terasology/minion/work/MinionWorkComponent.java delete mode 100644 src/main/java/org/terasology/minion/work/SetTargetToWorkNode.java delete mode 100644 src/main/java/org/terasology/minion/work/Work.java delete mode 100644 src/main/java/org/terasology/minion/work/WorkBoard.java delete mode 100644 src/main/java/org/terasology/minion/work/WorkComponent.java delete mode 100644 src/main/java/org/terasology/minion/work/WorkFactory.java delete mode 100644 src/main/java/org/terasology/minion/work/WorkRenderSystem.java delete mode 100644 src/main/java/org/terasology/minion/work/WorkTargetComponent.java delete mode 100644 src/main/java/org/terasology/minion/work/WorkType.java delete mode 100644 src/main/java/org/terasology/minion/work/kmeans/Cluster.java delete mode 100644 src/main/java/org/terasology/minion/work/systems/BuildBlock.java delete mode 100644 src/main/java/org/terasology/minion/work/systems/RemoveBlock.java delete mode 100644 src/main/java/org/terasology/minion/work/systems/WalkToBlock.java create mode 100644 src/test/java/org/terasology/behaviors/BehaviorsLoadingTest.java delete mode 100644 src/test/java/org/terasology/minion/work/ClusterDebugger.java diff --git a/assets/behaviors/common/attackFollowedEntity.behavior b/assets/behaviors/common/attackFollowedEntity.behavior deleted file mode 100644 index f3e5cb87..00000000 --- a/assets/behaviors/common/attackFollowedEntity.behavior +++ /dev/null @@ -1,47 +0,0 @@ -{ - sequence: [ - { - dynamic: [ - { - sequence: [ - { continue_following_check: { minDistance: 2}}, - { - animation: { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - { - parallel: [ - { - loop: { - child: { - sequence: [ - set_target_to_followed_entity, - { sleep: {time: 0.5}} - ] - } - } - }, - move_to - ] - } - ] - }, - { - sequence: [ - stop_moving, - { - animation: { - play: "engine:Stand.animationPool", - loop: "engine:Stand.animationPool" - } - }, - damage_followed_entity, - {sleep: {time: 0.3}} - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/assets/behaviors/common/doRandomMove.behavior b/assets/behaviors/common/doRandomMove.behavior deleted file mode 100644 index b674529a..00000000 --- a/assets/behaviors/common/doRandomMove.behavior +++ /dev/null @@ -1,9 +0,0 @@ -{ - sequence : [ - { - set_target_nearby_block : { moveProbability: 65 } - }, - move_to - ] -} - diff --git a/assets/behaviors/common/flee.behavior b/assets/behaviors/common/flee.behavior deleted file mode 100644 index 36abde34..00000000 --- a/assets/behaviors/common/flee.behavior +++ /dev/null @@ -1,22 +0,0 @@ -{ - sequence:[ - { - animation : { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - { - set_speed : { - speedMultiplier: 1.2 - } - - }, - { - sequence : [ - set_target_nearby_block_away_from_instigator, - move_to - ] - } - ] -} \ No newline at end of file diff --git a/assets/behaviors/common/follow.behavior b/assets/behaviors/common/follow.behavior deleted file mode 100644 index 9c9260cc..00000000 --- a/assets/behaviors/common/follow.behavior +++ /dev/null @@ -1,38 +0,0 @@ -{ - sequence:[ - { - continue_following_check: { - minDistance: 4 - } - }, - { - animation : { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - { - set_speed : { - speedMultiplier: 0.4 - } - }, - { - parallel: [ - { - loop: { - child: { - sequence: [ - set_target_to_followed_entity, - { sleep: {time: 0.2}} - ] - } - } - }, - move_to - ] - }, - { - set_speed : { speedMultiplier: 0 } - } - ] -} diff --git a/assets/behaviors/common/hostile.behavior b/assets/behaviors/common/hostile.behavior deleted file mode 100644 index 7bc09d4e..00000000 --- a/assets/behaviors/common/hostile.behavior +++ /dev/null @@ -1,8 +0,0 @@ -{ - sequence: [ - check_attack_stop, - { set_speed : {speedMultiplier: 0.9}}, - { lookup: {tree: "Behaviors:attackFollowedEntity"}} - ] - -} \ No newline at end of file diff --git a/assets/behaviors/common/restrictedStray.behavior b/assets/behaviors/common/restrictedStray.behavior deleted file mode 100644 index a44b2fc2..00000000 --- a/assets/behaviors/common/restrictedStray.behavior +++ /dev/null @@ -1,37 +0,0 @@ -{ - sequence : [ - { - set_speed : { speedMultiplier: 0.3 } - }, - { - animation : { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - { - sequence : [ - { - set_target_nearby_block_restricted : { moveProbability: 65 } - }, - { - move_to: { distance: 2} - } - ] - }, - { - animation : { - play: "engine:Stand.animationPool", - loop: "engine:Stand.animationPool" - } - }, - { - set_speed : { speedMultiplier: 0 } - }, - { - sleep : { - time : 3 - } - } - ] -} diff --git a/assets/behaviors/common/stray.behavior b/assets/behaviors/common/stray.behavior deleted file mode 100644 index 8413cfb7..00000000 --- a/assets/behaviors/common/stray.behavior +++ /dev/null @@ -1,31 +0,0 @@ -{ - - sequence : [ - { - set_speed : { speedMultiplier: 0.3 } - }, - { - animation : { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - { - lookup: { tree: "Behaviors:doRandomMove" } - }, - { - animation : { - play: "engine:Stand.animationPool", - loop: "engine:Stand.animationPool" - } - }, - { - set_speed : { speedMultiplier: 0 } - }, - { - sleep : { - time : 3 - } - } - ] -} diff --git a/assets/behaviors/creatures/aggressiveCritter.behavior b/assets/behaviors/creatures/aggressiveCritter.behavior deleted file mode 100644 index 516e0f03..00000000 --- a/assets/behaviors/creatures/aggressiveCritter.behavior +++ /dev/null @@ -1,21 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:AttackOnHit", - values: ["N instigator exists"], - child: { - lookup: { - tree: "Behaviors:hostile" - } - } - } - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - - ] -} \ No newline at end of file diff --git a/assets/behaviors/creatures/critter.behavior b/assets/behaviors/creatures/critter.behavior deleted file mode 100644 index 22999722..00000000 --- a/assets/behaviors/creatures/critter.behavior +++ /dev/null @@ -1,25 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:Fleeing", - child: { - sequence: [ - check_flee_stop, - { - lookup: { - tree: "Behaviors:flee" - } - } - ] - } - } - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - - ] -} \ No newline at end of file diff --git a/assets/behaviors/creatures/curiousCritter.behavior b/assets/behaviors/creatures/curiousCritter.behavior deleted file mode 100644 index fb5ac04f..00000000 --- a/assets/behaviors/creatures/curiousCritter.behavior +++ /dev/null @@ -1,23 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:FindNearbyPlayers", - values: ["N charactersWithinRange nonEmpty"], - child: { - sequence: [ - { sleep: {time: 0.1f }}, - target_character, - { - sequence: [ - check_target_stop, - { lookup: {tree: "Behaviors:lookAtTargetedEntity"}} - ] - } - ] - } - } - }, - { lookup: { tree: "Behaviors:stray" }} - ] -} \ No newline at end of file diff --git a/assets/behaviors/creatures/friendlyCritter.behavior b/assets/behaviors/creatures/friendlyCritter.behavior deleted file mode 100644 index a706bec1..00000000 --- a/assets/behaviors/creatures/friendlyCritter.behavior +++ /dev/null @@ -1,22 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:FindNearbyPlayers", - values: ["N charactersWithinRange nonEmpty"], - child: { - sequence: [ - { sleep: {time: 0.1f }}, - followCharacter, - { lookup: {tree: "Behaviors:follow" }} - ] - } - } - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - ] -} \ No newline at end of file diff --git a/assets/behaviors/creatures/hostileCritter.behavior b/assets/behaviors/creatures/hostileCritter.behavior deleted file mode 100644 index b2c2c314..00000000 --- a/assets/behaviors/creatures/hostileCritter.behavior +++ /dev/null @@ -1,19 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:FindNearbyPlayers", - values: ["N charactersWithinRange nonEmpty"], - child: { - sequence: [ - { sleep: {time: 0.1f }}, - followCharacter, - { lookup: {tree: "Behaviors:hostile" }} - - ] - } - } - }, - { lookup: { tree: "Behaviors:stray" }} - ] -} \ No newline at end of file diff --git a/assets/behaviors/creatures/scaredCritter.behavior b/assets/behaviors/creatures/scaredCritter.behavior deleted file mode 100644 index d04847c7..00000000 --- a/assets/behaviors/creatures/scaredCritter.behavior +++ /dev/null @@ -1,24 +0,0 @@ -{ - dynamic: [ - { - guard: { - componentPresent: "Behaviors:FindNearbyPlayers", - values: ["N charactersWithinRange nonEmpty"], - child: { - sequence: [ - { sleep: {time: 0.1f }}, - flee_from_character, - { lookup: {tree: "Behaviors:flee" }} - - ] - } - } - }, - { - lookup: { - tree: "Behaviors:stray" - } - } - - ] -} \ No newline at end of file diff --git a/assets/behaviors/creatures/territorialCritter.behavior b/assets/behaviors/creatures/territorialCritter.behavior deleted file mode 100644 index 648bcba4..00000000 --- a/assets/behaviors/creatures/territorialCritter.behavior +++ /dev/null @@ -1,41 +0,0 @@ -{ - "selector": [ - { - "guard": { - "componentPresent": "Behaviors:TerritoryDistance", - "values": ["V distanceSquared < 25"], - "child": { - "selector": [ - { - "guard": { - "componentPresent": "Behaviors:FindNearbyPlayers", - "values": ["N charactersWithinRange nonEmpty"], - "child": { - "sequence": [ - "set_target_nearby_player", - { - "lookup": { - "tree": "Behaviors:hostile" - } - } - ] - } - } - }, - { - "lookup": { - "tree": "Behaviors:stray" - } - } - ] - } - } - }, - { - "sequence": [ - "set_target_territory", - "move_to" - ] - } - ] -} \ No newline at end of file diff --git a/assets/behaviors/creatures/worker.behavior b/assets/behaviors/creatures/worker.behavior deleted file mode 100644 index 35cee7d9..00000000 --- a/assets/behaviors/creatures/worker.behavior +++ /dev/null @@ -1,16 +0,0 @@ -{ - sequence: [ - { - move_to: { - distance: 0.7 - } - }, - { - selector: [ - { lookup: { tree: "Behaviors:doWalkTo" }}, - { lookup: { tree: "Behaviors:doBuildBlock" }}, - { lookup: { tree: "Behaviors:doRemoveBlock" }} - ] - } - ] -} \ No newline at end of file diff --git a/assets/behaviors/pathfinding/dynamicPathfindingFollow.behavior b/assets/behaviors/pathfinding/dynamicPathfindingFollow.behavior deleted file mode 100644 index 1d37c79c..00000000 --- a/assets/behaviors/pathfinding/dynamicPathfindingFollow.behavior +++ /dev/null @@ -1,38 +0,0 @@ -{ - sequence: [ - { - animation : { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - { - set_speed : { - speedMultiplier: 0.4 - } - }, - { - loop: { - child: { - sequence: [ - set_target_to_followed_entity, - find_path, - setup_continuous_pathfinding, - { - timeout: { - time: 3, - child: { - move_along_path_continuous: { - child: { - move_to: {} - } - } - } - } - } - ] - } - } - } - ] -} diff --git a/assets/behaviors/pathfinding/pointPathfindingFollow.behavior b/assets/behaviors/pathfinding/pointPathfindingFollow.behavior deleted file mode 100644 index c8639061..00000000 --- a/assets/behaviors/pathfinding/pointPathfindingFollow.behavior +++ /dev/null @@ -1,31 +0,0 @@ -{ - sequence: [ - { - animation : { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - { - set_speed : { - speedMultiplier: 0.4 - } - }, - { - loop: { - child: { - sequence: [ - find_path, - { - move_along_path: { - child: { - move_to: {} - } - } - } - ] - } - } - } - ] -} diff --git a/assets/behaviors/pathfinding/staticPathfindingFollow.behavior b/assets/behaviors/pathfinding/staticPathfindingFollow.behavior deleted file mode 100644 index b3be7299..00000000 --- a/assets/behaviors/pathfinding/staticPathfindingFollow.behavior +++ /dev/null @@ -1,32 +0,0 @@ -{ - sequence: [ - { - animation : { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - { - set_speed : { - speedMultiplier: 0.4 - } - }, - { - loop: { - child: { - sequence: [ - set_target_to_followed_entity, - find_path, - { - move_along_path: { - child: { - move_to: {} - } - } - } - ] - } - } - } - ] -} diff --git a/assets/behaviors/work/doBuildBlock.behavior b/assets/behaviors/work/doBuildBlock.behavior deleted file mode 100644 index 7b13ed8e..00000000 --- a/assets/behaviors/work/doBuildBlock.behavior +++ /dev/null @@ -1,18 +0,0 @@ -{ - selector : [ - { - sequence : [ - { - timeout : { time: 1, child : find_work } - }, - { - lookup : { tree : "Behaviors:moveToWork" } - }, - { - finish_work : { child : jump } - } - ] - }, - finish_work - ] -} diff --git a/assets/behaviors/work/doRemoveBlock.behavior b/assets/behaviors/work/doRemoveBlock.behavior deleted file mode 100644 index 895450a4..00000000 --- a/assets/behaviors/work/doRemoveBlock.behavior +++ /dev/null @@ -1,19 +0,0 @@ -{ - selector: [ - { - sequence : [ - { - timeout : { - time: 1, - child : find_work - } - }, - { - lookup : { tree: "Behaviors:moveToWork" } - }, - finish_work - ] - }, - finish_work - ] -} diff --git a/assets/behaviors/work/doWalkTo.behavior b/assets/behaviors/work/doWalkTo.behavior deleted file mode 100644 index 08a9fd74..00000000 --- a/assets/behaviors/work/doWalkTo.behavior +++ /dev/null @@ -1,24 +0,0 @@ -{ - selector : [ - { - sequence : [ - {log: {message: "WalkTo "}}, - { - timeout : { - time : 1, - child : find_work - } - }, - {log: {message: "second part"}}, - { - lookup: { - tree: "Behaviors:moveToWork" - } - }, - {log: {message: "third part"}}, - finish_work - ] - }, - finish_work - ] -} diff --git a/assets/behaviors/work/moveToWork.behavior b/assets/behaviors/work/moveToWork.behavior deleted file mode 100644 index c03e5a11..00000000 --- a/assets/behaviors/work/moveToWork.behavior +++ /dev/null @@ -1,24 +0,0 @@ -{ - sequence : [ - {log: {message: "moveto 1"}}, - set_target_work, - { - animation : { - play: "engine:Walk.animationPool", - loop: "engine:Walk.animationPool" - } - }, - {log: {message: "moveto 2"}}, - { - move_to : { - distance : 0.6 - } - }, - { - animation : { - play: "engine:Stand.animationPool", - loop: "engine:Stand.animationPool" - } - } - ] -} diff --git a/assets/prefabs/behaviorNodes/condition.prefab b/assets/prefabs/behaviorNodes/condition.prefab deleted file mode 100644 index 781b8d0b..00000000 --- a/assets/prefabs/behaviorNodes/condition.prefab +++ /dev/null @@ -1,22 +0,0 @@ -{ - "BehaviorNode": { - "action": "condition", - "name": "condition", - "displayName": "Condition", - "category": "logic", - "shape": "rect", - "description": "Properties: distance\nMoves the actor to the target defined by MinionMoveComponent.\nSUCCESS: when distance between actor and target is below distance.\nFAILURE: when there is no target.", - "color": [ - 0.7, - 0.7, - 0.7, - 255 - ], - "textColor": [ - 0, - 0, - 0, - 255 - ] - } -} diff --git a/assets/prefabs/behaviorNodes/ensureTargetPresent.prefab b/assets/prefabs/behaviorNodes/ensureTargetPresent.prefab deleted file mode 100644 index 8b2c6599..00000000 --- a/assets/prefabs/behaviorNodes/ensureTargetPresent.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "ensure_target_present", - "name" : "ensure_target_present", - "displayName" : "EnsureTargetPresent", - "category" : "logic", - "shape" : "rect", - "description": "Check if target is present which is ready to mate.\nSUCCESS / FAILURE: if target is successfully found or not.", - "color" : [180, 180, 180, 255], - "textColor" : [0, 0, 0, 255] - } -} \ No newline at end of file diff --git a/assets/prefabs/behaviorNodes/findPathTo.prefab b/assets/prefabs/behaviorNodes/findPathTo.prefab deleted file mode 100644 index 4be05cb8..00000000 --- a/assets/prefabs/behaviorNodes/findPathTo.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "find_path", - "name" : "find_path", - "displayName" : "Find Path", - "category" : "path", - "shape" : "rect", - "description": "Requests a path to a target defined using the MinionMoveComponent.target.\nSUCCESS / FAILURE: when paths is found or not found (invalid).\nRUNNING: as long as path is searched.", - "color" : [0.7, 0.7, 0.7, 255], - "textColor" : [ 0, 0, 0, 255] - } -} diff --git a/assets/prefabs/behaviorNodes/findWork.prefab b/assets/prefabs/behaviorNodes/findWork.prefab deleted file mode 100644 index f1a5666e..00000000 --- a/assets/prefabs/behaviorNodes/findWork.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "find_work", - "name" : "find_work", - "displayName" : "Find Work", - "category" : "work", - "shape" : "rect", - "description": "Properties: filter\nSearches for open work of specific type (filter). If work is found, the actor is assigned.\nSUCCESS: When work is found and assigned.", - "color" : [0.7, 0.7, 0.7, 255], - "textColor" : [ 0, 0, 0, 255] - } -} diff --git a/assets/prefabs/behaviorNodes/finishWork.prefab b/assets/prefabs/behaviorNodes/finishWork.prefab deleted file mode 100644 index 2a6ba4ae..00000000 --- a/assets/prefabs/behaviorNodes/finishWork.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "finish_work", - "name" : "finish_work", - "displayName" : "Finish Work", - "category" : "work", - "shape" : "rect", - "color" : [0.7, 0.7, 0.7, 255], - "description": "Decorator\nDoes the actual work, once the actor is in range. The child node is started.\nSUCCESS: when work is done (depends on work type).\nFAILURE: if no work is assigned or target is not reachable.", - "textColor" : [ 0, 0, 0, 255] - } -} diff --git a/assets/prefabs/behaviorNodes/jump.prefab b/assets/prefabs/behaviorNodes/jump.prefab deleted file mode 100644 index 8cb064c9..00000000 --- a/assets/prefabs/behaviorNodes/jump.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "jump", - "name" : "jump", - "displayName" : "Jump", - "category" : "moving", - "shape" : "rect", - "color" : [0.7, 0.7, 0.7, 255], - "description": "Trigger a single jump into the air.\nSUCCESS: when the actor is grounded after the jump again.", - "textColor" : [ 0, 0, 0, 255] - } -} diff --git a/assets/prefabs/behaviorNodes/log.prefab b/assets/prefabs/behaviorNodes/log.prefab deleted file mode 100644 index fd023ae7..00000000 --- a/assets/prefabs/behaviorNodes/log.prefab +++ /dev/null @@ -1,22 +0,0 @@ -{ - "BehaviorNode": { - "action": "log", - "name": "log", - "displayName": "Log Message", - "category": "debug", - "shape": "rect", - "description": "Properties: message\nLogs a message from the Actor in the console.\nReturns SUCCESS upon logging the message.", - "color": [ - 0.7, - 0.7, - 0.7, - 255 - ], - "textColor": [ - 0, - 0, - 0, - 255 - ] - } -} diff --git a/assets/prefabs/behaviorNodes/moveAlongPath.prefab b/assets/prefabs/behaviorNodes/moveAlongPath.prefab deleted file mode 100644 index 746c7cbf..00000000 --- a/assets/prefabs/behaviorNodes/moveAlongPath.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "move_along_path", - "name" : "move_along_path", - "displayName" : "Move Along Path", - "category" : "path", - "shape" : "rect", - "description": "Decorator\nCall child node, as long as the actor has not reached the end of the path. Sets MinionMoveComponent.target to next step in path.\nSUCCESS: when actor has reached end of path.\nFAILURE: if no path was found previously.", - "color" : [0.7, 0.7, 0.7, 255], - "textColor" : [ 0, 0, 0, 255] - } -} diff --git a/assets/prefabs/behaviorNodes/moveTo.prefab b/assets/prefabs/behaviorNodes/moveTo.prefab deleted file mode 100644 index df502c71..00000000 --- a/assets/prefabs/behaviorNodes/moveTo.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "move_to", - "name" : "move_to", - "displayName" : "Move To", - "category" : "moving", - "shape" : "rect", - "description": "Properties: distance\nMoves the actor to the target defined by MinionMoveComponent.\nSUCCESS: when distance between actor and target is below distance.\nFAILURE: when there is no target.", - "color" : [0.7, 0.7, 0.7, 255], - "textColor" : [ 0, 0, 0, 255] - } - } diff --git a/assets/prefabs/behaviorNodes/setTargetLocalPlayer.prefab b/assets/prefabs/behaviorNodes/setTargetLocalPlayer.prefab deleted file mode 100644 index c62d8b18..00000000 --- a/assets/prefabs/behaviorNodes/setTargetLocalPlayer.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "set_target_local_player", - "name" : "set_target_local_player", - "displayName" : "Set Target To Local Player", - "category" : "moving", - "shape" : "rect", - "description": "Set MinionMoveComponent.target to the block below local player.\nAlways returns SUCCESS.", - "color" : [0.7, 0.7, 0.7, 255], - "textColor" : [ 0, 0, 0, 255] - } -} diff --git a/assets/prefabs/behaviorNodes/setTargetToNearbyBlock.prefab b/assets/prefabs/behaviorNodes/setTargetToNearbyBlock.prefab deleted file mode 100644 index 8ac7a4c8..00000000 --- a/assets/prefabs/behaviorNodes/setTargetToNearbyBlock.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "set_target_nearby_block", - "name" : "set_target_nearby_block", - "displayName" : "Set target to a random nearby block", - "category" : "moving", - "shape" : "rect", - "description": "Set MinionMoveComponent's target to a nearby block.\nReturns always SUCCESS", - "color" : [0.7, 0.7, 0.7, 255], - "textColor" : [ 0, 0, 0, 255] - } -} diff --git a/assets/prefabs/behaviorNodes/setTargetToWork.prefab b/assets/prefabs/behaviorNodes/setTargetToWork.prefab deleted file mode 100644 index d9a21566..00000000 --- a/assets/prefabs/behaviorNodes/setTargetToWork.prefab +++ /dev/null @@ -1,12 +0,0 @@ -{ - "BehaviorNode" : { - "action" : "set_target_work", - "name" : "set_target_work", - "displayName" : "Set target to work", - "category" : "work", - "shape" : "rect", - "color" : [0.7, 0.7, 0.7, 255], - "description": "Set MinionMoveComponent's target to the work's target.\nSUCCESS: if valid work target position found.\nFAILURE: otherwise", - "textColor" : [ 0, 0, 0, 255] - } -} diff --git a/assets/prefabs/buildWall.prefab b/assets/prefabs/buildWall.prefab deleted file mode 100644 index ef14c777..00000000 --- a/assets/prefabs/buildWall.prefab +++ /dev/null @@ -1,17 +0,0 @@ -{ - "parent": "engine:iconItem", - "DisplayName": { - "name": "Build Wall" - }, - "Item": { - "icon": "engine:items#scissors", - "usage": "ON_BLOCK" - }, - "PlaySoundAction": { - "sounds": "engine:click" - }, - "BuildWall": { - "blockType": "engine:dirt" - }, - "BlockSelection": {} -} diff --git a/assets/prefabs/jobBuildBlock.prefab b/assets/prefabs/jobBuildBlock.prefab deleted file mode 100644 index 17621450..00000000 --- a/assets/prefabs/jobBuildBlock.prefab +++ /dev/null @@ -1,20 +0,0 @@ -{ - "parent": "engine:iconItem", - "DisplayName": { - "name": "Build Block" - }, - "Item": { - "icon": "engine:items#buildBlockJob", - "usage": "ON_BLOCK" - }, - "PlaySoundAction": { - "sounds": "engine:click" - }, - "Work": { - "workType": "Behaviors:buildBlock" - }, - "BlockSelection": { - "shouldRender": true - }, - "OnItemActivateSelection": {} -} diff --git a/assets/prefabs/jobRemoveBlock.prefab b/assets/prefabs/jobRemoveBlock.prefab deleted file mode 100644 index cccfac03..00000000 --- a/assets/prefabs/jobRemoveBlock.prefab +++ /dev/null @@ -1,20 +0,0 @@ -{ - "parent" : "engine:iconItem", - "DisplayName": { - "name": "Remove Block" - }, - "Item" : { - "icon" : "engine:items#removeBlockJob", - "usage" : "ON_BLOCK" - }, - "PlaySoundAction" : { - "sounds" : "engine:click" - }, - "Work" : { - "workType" : "Behaviors:removeBlock" - }, - "BlockSelection" : { - "shouldRender" : true - }, - "OnItemActivateSelection" : {} -} diff --git a/assets/prefabs/jobWalkToBlock.prefab b/assets/prefabs/jobWalkToBlock.prefab deleted file mode 100644 index 0340b8ff..00000000 --- a/assets/prefabs/jobWalkToBlock.prefab +++ /dev/null @@ -1,20 +0,0 @@ -{ - "parent": "engine:iconItem", - "DisplayName": { - "name": "Walk To Block" - }, - "Item": { - "icon": "engine:items#walkToJob", - "usage": "ON_BLOCK" - }, - "PlaySoundAction": { - "sounds": "engine:click" - }, - "Work": { - "workType": "Behaviors:walkToBlock" - }, - "BlockSelection": { - "shouldRender": true - }, - "OnItemActivateSelection": {} -} diff --git a/assets/ui/gridrenderer.ui b/assets/ui/gridrenderer.ui deleted file mode 100644 index b195fcd2..00000000 --- a/assets/ui/gridrenderer.ui +++ /dev/null @@ -1,131 +0,0 @@ -{ - "type" : "pathfinding:GridRendererScreen", - "skin" : "engine:behaviorEditor", - "contents" : { - "type" : "migLayout", - "layoutConstraints" : "", - "colConstraints" : "[min][grow, fill][min]", - "rowConstraints" : "[min][min][grow, fill][grow, fill]", - "contents" : [ - { - "type" : "GridRenderer", - "id" : "tree", - "layoutInfo" : { - "cc" : "cell 1 2, spany 2" - } - }, - { - "type" : "ScrollableArea", - "content" : { - "type" : "propertyLayout", - "id" : "properties", - "rowConstraints" : "[min]" - }, - "layoutInfo" : { - "cc" : "cell 2 2, aligny top, w 220!, h 300!" - } - }, - { - "type" : "ScrollableArea", - "content" : { - "type" : "propertyLayout", - "id" : "entity_properties", - "rowConstraints" : "[min]" - }, - "layoutInfo" : { - "cc" : "cell 2 3, aligny top, w 220!, h 300!" - } - }, - { - "type" : "migLayout", - "layoutInfo" : { - "cc" : "cell 0 0 3" - }, - "contents" : [ - { - "type" : "UIDropdown", - "id" : "select_entity", - "layoutInfo" : { - "cc" : "w 300!" - } - }, - { - "type" : "UIButton", - "id" : "copy", - "text" : "copy" - }, - { - "type" : "UIButton", - "id" : "paste", - "text" : "paste" - }, - { - "type" : "UIButton", - "id" : "layout", - "text" : "layout" - }, - { - "type" : "UIButton", - "id" : "new", - "text" : "new" - }, - { - "type" : "UIButton", - "id" : "remove", - "text" : "remove" - }, - { - "type" : "UIButton", - "id" : "assign", - "text" : "assign" - } - ] - }, - { - "type" : "migLayout", - "layoutInfo" : { - "cc" : "cell 0 1 3" - }, - "contents" : [ - { - "type" : "UIDropdown", - "id" : "select_tree", - "layoutInfo" : { - "cc" : "w 300!" - } - }, - { - "type" : "UIButton", - "id" : "debug_reset", - "text" : "[]" - }, - { - "type" : "UIButton", - "id" : "debug_pause", - "text" : "||" - }, - { - "type" : "UIButton", - "id" : "debug_step", - "text" : "|>" - }, - { - "type" : "UIButton", - "id" : "debug_run", - "text" : ">>" - } - ] - }, - { - "type" : "ScrollableArea", - "content" : { - "type" : "UIList", - "id" : "palette" - }, - "layoutInfo" : { - "cc" : "cell 0 2, spany 2, h 500!" - } - } - ] - } -} diff --git a/module.txt b/module.txt index 0aade3ce..34938735 100644 --- a/module.txt +++ b/module.txt @@ -20,10 +20,6 @@ "id": "Inventory", "minVersion": "1.1.0" }, - { - "id": "Pathfinding", - "minVersion": "1.0.0" - }, { "id": "ModuleTestingEnvironment", "minVersion": "0.3.0", diff --git a/src/main/java/org/terasology/behaviors/actions/EnsureTargetPresentAction.java b/src/main/java/org/terasology/behaviors/actions/EnsureTargetPresentAction.java deleted file mode 100644 index e663d8f4..00000000 --- a/src/main/java/org/terasology/behaviors/actions/EnsureTargetPresentAction.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.behaviors.actions; - -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.minion.move.MinionMoveComponent; - -@BehaviorAction(name = "ensure_target_present") -public class EnsureTargetPresentAction extends BaseAction { - @Override - public BehaviorState modify(Actor actor, BehaviorState behaviorState) { - MinionMoveComponent minionMoveComponent = actor.getComponent(MinionMoveComponent.class); - - if (minionMoveComponent.target != null) { - return BehaviorState.SUCCESS; - } - return BehaviorState.FAILURE; - } -} diff --git a/src/main/java/org/terasology/behaviors/actions/NearbyBlockRestricted.java b/src/main/java/org/terasology/behaviors/actions/NearbyBlockRestricted.java deleted file mode 100644 index 53ff39f9..00000000 --- a/src/main/java/org/terasology/behaviors/actions/NearbyBlockRestricted.java +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.behaviors.actions; - -import com.google.common.collect.Lists; -import org.joml.Vector3f; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.behaviors.components.StrayRestrictionComponent; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.world.block.BlockArea; -import org.terasology.minion.move.MinionMoveComponent; -import org.terasology.navgraph.WalkableBlock; - -import java.util.List; -import java.util.Random; - -/** - * Sets a character's {@link MinionMoveComponent} target to a random nearby block inside the area defined in the - * character's {@link StrayRestrictionComponent}. - */ -@BehaviorAction(name = "set_target_nearby_block_restricted") -public class NearbyBlockRestricted extends BaseAction { - - private static final Logger logger = LoggerFactory.getLogger(NearbyBlockRestricted.class); - - /** - * The random number provider for choosing the nearby block. - */ - private Random random = new Random(); - - /** - * The world region that this character is allowed to stray in. Defines an x&z area in world space. - */ - private BlockArea allowedRegion = new BlockArea(BlockArea.INVALID); - - /** - * The probability out of 100 that this character will have a new target selected when this node is run. - */ - private int moveProbability = 100; - - @Override - public void construct(Actor actor) { - if (!actor.hasComponent(StrayRestrictionComponent.class)) { - logger.warn("Actor used behavior node set_target_nearby_block_restricted, but doesn't have a StrayRestrictionComponent!"); - return; - } - - StrayRestrictionComponent strayRestriction = actor.getComponent(StrayRestrictionComponent.class); - allowedRegion.set(strayRestriction.allowedRegion); - } - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - if (random.nextInt(100) > (99 - moveProbability)) { - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent.currentBlock != null) { - WalkableBlock target = randomNearbyBlockRestricted(moveComponent.currentBlock); - moveComponent.target = new Vector3f(target.getBlockPosition()); - actor.save(moveComponent); - } else { - return BehaviorState.FAILURE; - } - } - return BehaviorState.SUCCESS; - } - - /** - * Finds a block close to the character, with the condition that this block must be inside character's allowed - * area. - * - * @param startBlock The block that this character is currently standing on. - * @return A random nearby block nearby inside the allowed area. - */ - private WalkableBlock randomNearbyBlockRestricted(WalkableBlock startBlock) { - WalkableBlock currentBlock = startBlock; - for (int i = 0; i < random.nextInt(10) + 3; i++) { - WalkableBlock[] neighbors = currentBlock.neighbors; - List existingNeighbors = Lists.newArrayList(); - - for (WalkableBlock neighbor : neighbors) { - if (allowedRegion == null || (neighbor != null && allowedRegion.contains(neighbor.x(), neighbor.z()))) { - existingNeighbors.add(neighbor); - } - } - if (existingNeighbors.size() > 0) { - currentBlock = existingNeighbors.get(random.nextInt(existingNeighbors.size())); - } - } - logger.debug("Looking for a block: my block is {}, found destination {}", startBlock.getBlockPosition(), currentBlock.getBlockPosition()); - return currentBlock; - } - -} diff --git a/src/main/java/org/terasology/behaviors/actions/SetTargetToFollowedEntityAction.java b/src/main/java/org/terasology/behaviors/actions/SetTargetToFollowedEntityAction.java deleted file mode 100644 index 577c6952..00000000 --- a/src/main/java/org/terasology/behaviors/actions/SetTargetToFollowedEntityAction.java +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.behaviors.actions; - -import org.joml.Vector3f; -import org.terasology.behaviors.components.FollowComponent; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.minion.move.MinionMoveComponent; - -@BehaviorAction(name = "set_target_to_followed_entity") -public class SetTargetToFollowedEntityAction extends BaseAction { - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent.currentBlock != null) { - EntityRef followedEntity = actor.getComponent(FollowComponent.class).entityToFollow; - if (followedEntity != null && followedEntity != EntityRef.NULL) { - moveComponent.target = followedEntity.getComponent(LocationComponent.class).getWorldPosition(new Vector3f()); - actor.save(moveComponent); - } else { - return BehaviorState.FAILURE; - } - - } else { - return BehaviorState.FAILURE; - } - return BehaviorState.SUCCESS; - - } -} - diff --git a/src/main/java/org/terasology/behaviors/actions/SetTargetToNearbyBlockAwayFromInstigatorAction.java b/src/main/java/org/terasology/behaviors/actions/SetTargetToNearbyBlockAwayFromInstigatorAction.java deleted file mode 100644 index d7a2b2d7..00000000 --- a/src/main/java/org/terasology/behaviors/actions/SetTargetToNearbyBlockAwayFromInstigatorAction.java +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.behaviors.actions; - -import com.google.common.collect.Lists; -import org.joml.RoundingMode; -import org.joml.Vector3f; -import org.joml.Vector3i; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.behaviors.components.FleeingComponent; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.engine.registry.In; -import org.terasology.minion.move.MinionMoveComponent; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; - -import java.util.List; -import java.util.Random; - -import static java.lang.Integer.min; - -@BehaviorAction(name = "set_target_nearby_block_away_from_instigator") -public class SetTargetToNearbyBlockAwayFromInstigatorAction extends BaseAction { - - private static final Logger logger = LoggerFactory.getLogger(SetTargetToNearbyBlockAwayFromInstigatorAction.class); - private static final int RANDOM_BLOCK_ITERATIONS = 10; - - @In - private PathfinderSystem pathfinderSystem; - - private Random random = new Random(); - - @Override - public BehaviorState modify(Actor actor, BehaviorState state) { - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent.currentBlock != null) { - WalkableBlock target = findRandomNearbyBlockAwayFromPlayer(moveComponent.currentBlock, actor); - moveComponent.target = new Vector3f(target.getBlockPosition()); - actor.save(moveComponent); - } else { - return BehaviorState.FAILURE; - } - return BehaviorState.SUCCESS; - } - - private WalkableBlock findRandomNearbyBlockAwayFromPlayer(WalkableBlock startBlock, Actor actor) { - WalkableBlock currentBlock = startBlock; - FleeingComponent fleeingComponent = actor.getComponent(FleeingComponent.class); - Vector3i playerPosition = new Vector3i( - fleeingComponent.instigator.getComponent(LocationComponent.class).getWorldPosition(new Vector3f()), - RoundingMode.FLOOR); - 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) { - // Sorting the list of neighboring blocks based on distance from player (farthest first) - existingNeighbors.sort((one, two) -> { - double a = one.getBlockPosition().distanceSquared(playerPosition); - double b = two.getBlockPosition().distanceSquared(playerPosition); - return a > b ? -1 - : a < b ? 1 - : 0; - }); - // Select any of the first 4 neighboring blocks to make path random and not linear - currentBlock = existingNeighbors.get(random.nextInt(min(4, existingNeighbors.size()))); - } - } - return currentBlock; - } - -} diff --git a/src/main/java/org/terasology/behaviors/actions/SetTargetToTerritory.java b/src/main/java/org/terasology/behaviors/actions/SetTargetToTerritory.java deleted file mode 100644 index 0636f544..00000000 --- a/src/main/java/org/terasology/behaviors/actions/SetTargetToTerritory.java +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.behaviors.actions; - -import org.joml.Vector3f; -import org.terasology.behaviors.components.TerritoryDistance; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.minion.move.MinionMoveComponent; - -@BehaviorAction(name = "set_target_territory") -public class SetTargetToTerritory extends BaseAction { - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - if (!actor.hasComponent(TerritoryDistance.class) || !actor.hasComponent(MinionMoveComponent.class)) { - return BehaviorState.FAILURE; - } - - Vector3f territory = actor.getComponent(TerritoryDistance.class).location; - - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent.target.equals(territory)) { - return BehaviorState.SUCCESS; - } - - moveComponent.target = territory; - actor.save(moveComponent); - - return BehaviorState.SUCCESS; - } -} diff --git a/src/main/java/org/terasology/behaviors/actions/StopMovingAction.java b/src/main/java/org/terasology/behaviors/actions/StopMovingAction.java deleted file mode 100644 index 4cdb6eb4..00000000 --- a/src/main/java/org/terasology/behaviors/actions/StopMovingAction.java +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.behaviors.actions; - -import org.joml.Vector3f; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.characters.CharacterMoveInputEvent; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.minion.move.MinionMoveComponent; - -@BehaviorAction(name = "stop_moving") -public class StopMovingAction extends BaseAction { - - @Override - public void construct(Actor actor) { - - // Calculating a lot of superfluous stuff to debug; this'll get cleaned up when stopping is figured out - LocationComponent locationComponent = actor.getComponent(LocationComponent.class); - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - Vector3f worldPos = locationComponent.getWorldPosition(new Vector3f()); - Vector3f targetDirection = moveComponent.target.sub(worldPos, new Vector3f()); - - float yaw = (float) Math.atan2(targetDirection.x, targetDirection.z); - - CharacterMoveInputEvent wantedInput = new CharacterMoveInputEvent(0, 0, 0, new Vector3f(), false, false, false, - (long) (actor.getDelta() * 1000)); - actor.getEntity().send(wantedInput); - } -} diff --git a/src/main/java/org/terasology/grid/BlockRenderer.java b/src/main/java/org/terasology/grid/BlockRenderer.java deleted file mode 100644 index c8f50eb4..00000000 --- a/src/main/java/org/terasology/grid/BlockRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid; - -import org.joml.Vector3i; -import org.terasology.joml.geom.Rectanglei; -import org.terasology.nui.Canvas; - -public interface BlockRenderer { - void renderBlock(Canvas canvas, Vector3i blockPos, Rectanglei screenRegion); -} diff --git a/src/main/java/org/terasology/grid/EntityRenderer.java b/src/main/java/org/terasology/grid/EntityRenderer.java deleted file mode 100644 index d7f98e3c..00000000 --- a/src/main/java/org/terasology/grid/EntityRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid; - -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.joml.geom.Rectanglei; -import org.terasology.nui.Canvas; - -public interface EntityRenderer { - void renderBlock(Canvas canvas, EntityRef entity, Rectanglei screenRegion); -} diff --git a/src/main/java/org/terasology/grid/GridRenderSystem.java b/src/main/java/org/terasology/grid/GridRenderSystem.java deleted file mode 100644 index 46fc16d8..00000000 --- a/src/main/java/org/terasology/grid/GridRenderSystem.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid; - -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.event.ReceiveEvent; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.network.ClientComponent; -import org.terasology.engine.registry.In; -import org.terasology.engine.rendering.nui.NUIManager; -import org.terasology.input.ButtonState; - -@RegisterSystem -public class GridRenderSystem extends BaseComponentSystem { - @In - private NUIManager nuiManager; - - @ReceiveEvent(components = ClientComponent.class) - public void onToggleConsole(GridRendererButton event, EntityRef entity) { - if (event.getState() == ButtonState.DOWN) { - nuiManager.toggleScreen("pathfinding:gridrenderer"); - event.consume(); - } - } -} diff --git a/src/main/java/org/terasology/grid/GridRenderer.java b/src/main/java/org/terasology/grid/GridRenderer.java deleted file mode 100644 index 1b2e1e54..00000000 --- a/src/main/java/org/terasology/grid/GridRenderer.java +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid; - -import org.joml.Vector2f; -import org.joml.Vector2i; -import org.joml.Vector3f; -import org.joml.Vector3i; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.entitySystem.entity.EntityManager; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.logic.characters.CharacterComponent; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.engine.logic.players.LocalPlayer; -import org.terasology.engine.logic.selection.ApplyBlockSelectionEvent; -import org.terasology.engine.registry.CoreRegistry; -import org.terasology.engine.world.block.BlockRegion; -import org.terasology.grid.renderers.DefaultBlockRenderer; -import org.terasology.grid.renderers.WalkableBlockRenderer; -import org.terasology.grid.renderers.WorkRenderer; -import org.terasology.input.Keyboard; -import org.terasology.joml.geom.Rectanglei; -import org.terasology.minion.work.Work; -import org.terasology.minion.work.WorkComponent; -import org.terasology.minion.work.WorkFactory; -import org.terasology.nui.BaseInteractionListener; -import org.terasology.nui.Canvas; -import org.terasology.nui.Color; -import org.terasology.nui.InteractionListener; -import org.terasology.nui.events.NUIMouseClickEvent; -import org.terasology.nui.events.NUIMouseDragEvent; -import org.terasology.nui.events.NUIMouseReleaseEvent; -import org.terasology.nui.events.NUIMouseWheelEvent; -import org.terasology.nui.layouts.ZoomableLayout; - -public class GridRenderer extends ZoomableLayout { - private static final Logger logger = LoggerFactory.getLogger(GridRenderer.class); - - private DefaultBlockRenderer blockRenderer; - private WalkableBlockRenderer walkableBlockRenderer; - private WorkRenderer workRenderer; - private EntityRenderer entityRenderer; - private int y; - private int yDiff = -1; - private Vector2i startDrag; - private Vector2i endDrag; - private InteractionListener listener = new BaseInteractionListener() { - @Override - public boolean onMouseClick(NUIMouseClickEvent event) { - startDrag = event.getRelativeMousePosition(); - endDrag = event.getRelativeMousePosition(); - return true; - } - - @Override - public void onMouseDrag(NUIMouseDragEvent event) { - endDrag = event.getRelativeMousePosition(); - } - - @Override - public void onMouseRelease(NUIMouseReleaseEvent event) { - Work work = CoreRegistry.get(WorkFactory.class).getWork("pathfinding:walkToBlock"); - WorkComponent workComponent = new WorkComponent(); - workComponent.uri = work.getUri(); - EntityRef entityRef = CoreRegistry.get(EntityManager.class).create(workComponent, new LocationComponent(), - new CharacterComponent()); - - Vector2f start = screenToWorld(startDrag); - Vector2f end = screenToWorld(endDrag); - BlockRegion rect = new BlockRegion((int) start.x, y, (int) start.y).union((int) end.x, y, (int) end.y); - ApplyBlockSelectionEvent selectionEvent = new ApplyBlockSelectionEvent(entityRef, rect); - entityRef.send(selectionEvent); - startDrag = null; - endDrag = null; - } - - @Override - public boolean onMouseWheel(NUIMouseWheelEvent event) { - - if (!event.getKeyboard().isKeyDown(Keyboard.Key.LEFT_SHIFT.getId())) { - yDiff += event.getWheelTurns() > 0 ? -1 : +1; - } - return false; - } - }; - - public GridRenderer() { - initialize(); - } - - public GridRenderer(String id) { - super(id); - initialize(); - } - - private void initialize() { - blockRenderer = CoreRegistry.get(DefaultBlockRenderer.class); - walkableBlockRenderer = CoreRegistry.get(WalkableBlockRenderer.class); - entityRenderer = CoreRegistry.get(EntityRenderer.class); - workRenderer = CoreRegistry.get(WorkRenderer.class); - } - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - - canvas.addInteractionRegion(listener); - - Vector3f playerPosition = CoreRegistry.get(LocalPlayer.class).getCharacterEntity().getComponent(LocationComponent.class).getWorldPosition( - new Vector3f()); - Vector2f windowSize = getWindowSize(); - Vector2f topLeft = new Vector2f(playerPosition.x - windowSize.x / 2, playerPosition.z - windowSize.y / 2); - setWindowPosition(topLeft); - - Rectanglei region = canvas.getRegion(); - Vector2f worldStart = screenToWorld(new Vector2i(region.minX, region.minY)); - Vector2f worldEnd = screenToWorld(new Vector2i(region.maxX, region.maxY)); - - y = (int) playerPosition.y + yDiff; - - for (int z = (int) worldStart.y; z < (int) worldEnd.y; z++) { - for (int x = (int) worldStart.x; x < (int) worldEnd.x; x++) { - Vector2i tileStart = worldToScreen(new Vector2f(x, z)); - Vector2i tileEnd = worldToScreen(new Vector2f(x + 1, z + 1)); - - Rectanglei screenRegion = new Rectanglei(tileStart.x, tileStart.y, tileStart.x + tileEnd.x - 1, tileStart.y + tileEnd.y - 1); - - blockRenderer.renderBlock(canvas, new Vector3i(x, y, z), screenRegion); - walkableBlockRenderer.renderBlock(canvas, new Vector3i(x, y, z), screenRegion); - workRenderer.renderBlock(canvas, new Vector3i(x, y, z), screenRegion); - } - } - - for (EntityRef entity : CoreRegistry.get(EntityManager.class).getEntitiesWith(LocationComponent.class, CharacterComponent.class)) { - Vector3f worldPos = entity.getComponent(LocationComponent.class).getWorldPosition(new Vector3f()); - Vector2i min = worldToScreen(new Vector2f(worldPos.x - 0.4f, worldPos.z - 0.4f)); - Vector2i max = worldToScreen(new Vector2f(worldPos.x + 0.4f, worldPos.z + 0.4f)); - entityRenderer.renderBlock(canvas, entity, new Rectanglei(min, max)); - } - - if (startDrag != null && endDrag != null) { - canvas.drawLine(startDrag.x, startDrag.y, endDrag.x, startDrag.y, Color.white); - canvas.drawLine(endDrag.x, startDrag.y, endDrag.x, endDrag.y, Color.white); - canvas.drawLine(endDrag.x, endDrag.y, startDrag.x, endDrag.y, Color.white); - canvas.drawLine(startDrag.x, endDrag.y, startDrag.x, startDrag.y, Color.white); - } - } -} diff --git a/src/main/java/org/terasology/grid/GridRendererButton.java b/src/main/java/org/terasology/grid/GridRendererButton.java deleted file mode 100644 index 484ac89e..00000000 --- a/src/main/java/org/terasology/grid/GridRendererButton.java +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid; - -import org.terasology.engine.input.BindButtonEvent; -import org.terasology.engine.input.DefaultBinding; -import org.terasology.engine.input.RegisterBindButton; -import org.terasology.input.InputType; -import org.terasology.input.Keyboard; - -@RegisterBindButton(id = "grid_renderer", description = "Toggle grid renderer") -@DefaultBinding(type = InputType.KEY, id = Keyboard.KeyId.F6) -public class GridRendererButton extends BindButtonEvent { -} diff --git a/src/main/java/org/terasology/grid/GridRendererScreen.java b/src/main/java/org/terasology/grid/GridRendererScreen.java deleted file mode 100644 index edc7cd75..00000000 --- a/src/main/java/org/terasology/grid/GridRendererScreen.java +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid; - -import org.terasology.engine.rendering.nui.CoreScreenLayer; - -public class GridRendererScreen extends CoreScreenLayer { - @Override - public void initialise() { - - } -} diff --git a/src/main/java/org/terasology/grid/renderers/DefaultBlockRenderer.java b/src/main/java/org/terasology/grid/renderers/DefaultBlockRenderer.java deleted file mode 100644 index d1e81866..00000000 --- a/src/main/java/org/terasology/grid/renderers/DefaultBlockRenderer.java +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid.renderers; - -import org.joml.Vector2fc; -import org.joml.Vector3i; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.registry.In; -import org.terasology.engine.registry.Share; -import org.terasology.engine.rendering.assets.texture.Texture; -import org.terasology.engine.utilities.Assets; -import org.terasology.engine.world.WorldProvider; -import org.terasology.engine.world.block.Block; -import org.terasology.engine.world.block.BlockPart; -import org.terasology.engine.world.block.tiles.WorldAtlas; -import org.terasology.grid.BlockRenderer; -import org.terasology.joml.geom.Rectanglei; -import org.terasology.nui.Canvas; -import org.terasology.nui.Color; -import org.terasology.nui.ScaleMode; - -@RegisterSystem -@Share(value = DefaultBlockRenderer.class) -public class DefaultBlockRenderer extends BaseComponentSystem implements BlockRenderer { - @In - private WorldProvider worldProvider; - @In - private WorldAtlas worldAtlas; - - private Texture terrainTex; - private float relativeTileSize; - - @Override - public void initialise() { - terrainTex = Assets.getTexture("engine:terrain").get(); - relativeTileSize = 0.0625f; - } - - @Override - public void renderBlock(Canvas canvas, Vector3i blockPos, Rectanglei screenRegion) { - Color color = new Color(1f, 1f, 1f, 1f); - int depth = 0; - blockPos.y++; - float max = 10; - while (blockPos.y >= 0) { - Block block = worldProvider.getBlock(blockPos); - - if (!block.isTranslucent()) { - Vector2fc textureAtlasPos = block.getPrimaryAppearance().getTextureAtlasPos(BlockPart.TOP); - canvas.drawTextureRaw(terrainTex, screenRegion, color, ScaleMode.SCALE_FILL, - textureAtlasPos.x(), textureAtlasPos.y(), relativeTileSize, relativeTileSize); - break; - } // TODO alpha blocks: else { } - - blockPos.y--; - depth++; - if (depth >= max) { - break; - } - color = new Color(1 - depth / max, 1 - depth / max, 1 - depth / max, 1); - } - - } -} - diff --git a/src/main/java/org/terasology/grid/renderers/DefaultEntityRenderer.java b/src/main/java/org/terasology/grid/renderers/DefaultEntityRenderer.java deleted file mode 100644 index 448fd94f..00000000 --- a/src/main/java/org/terasology/grid/renderers/DefaultEntityRenderer.java +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid.renderers; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.logic.characters.CharacterComponent; -import org.terasology.engine.registry.Share; -import org.terasology.grid.EntityRenderer; -import org.terasology.joml.geom.Rectanglei; -import org.terasology.minion.move.MinionMoveComponent; -import org.terasology.nui.Canvas; -import org.terasology.nui.Color; - -@RegisterSystem -@Share(value = EntityRenderer.class) -public class DefaultEntityRenderer extends BaseComponentSystem implements EntityRenderer { - private static final Logger logger = LoggerFactory.getLogger(DefaultEntityRenderer.class); - - @Override - public void renderBlock(Canvas canvas, EntityRef entity, Rectanglei screenRegion) { - CharacterComponent characterComponent = entity.getComponent(CharacterComponent.class); - - // float yaw = TeraMath.PI / 2 - characterComponent.yaw / 180.f * TeraMath.PI; - - float yaw = 0.5f; // I'm going to hell, TODO resolve yaw - int w = screenRegion.maxX - screenRegion.minX; - int h = screenRegion.maxY - screenRegion.minY; - int x0 = screenRegion.minX + w / 2 + (int) (Math.cos(yaw) * w); - int y0 = screenRegion.minY + h / 2 + (int) (Math.sin(yaw) * h); - int x1 = screenRegion.minX + w / 2 + (int) (Math.cos(yaw + Math.PI / 2) * w); - int y1 = screenRegion.minY + h / 2 + (int) (Math.sin(yaw + Math.PI / 2) * h); - int x2 = screenRegion.minX + w / 2 + (int) (Math.cos(yaw - Math.PI / 2) * w); - int y2 = screenRegion.minY + h / 2 + (int) (Math.sin(yaw - Math.PI / 2) * h); - - Color color = Color.YELLOW; - if (entity.hasComponent(MinionMoveComponent.class)) { - color = Color.BLUE; - } - canvas.drawLine(x0, y0, x1, y1, color); - canvas.drawLine(x0, y0, x2, y2, color); - canvas.drawLine(x1, y1, x2, y2, color); - } -} diff --git a/src/main/java/org/terasology/grid/renderers/WalkableBlockRenderer.java b/src/main/java/org/terasology/grid/renderers/WalkableBlockRenderer.java deleted file mode 100644 index f8093649..00000000 --- a/src/main/java/org/terasology/grid/renderers/WalkableBlockRenderer.java +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid.renderers; - -import org.joml.Vector3i; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.registry.In; -import org.terasology.engine.registry.Share; -import org.terasology.grid.BlockRenderer; -import org.terasology.joml.geom.Rectanglei; -import org.terasology.navgraph.NavGraphSystem; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.nui.Canvas; -import org.terasology.nui.Color; - -/** - * Created by synopia on 12.02.14. - */ -@RegisterSystem -@Share(value = WalkableBlockRenderer.class) -public class WalkableBlockRenderer extends BaseComponentSystem implements BlockRenderer { - @In - private NavGraphSystem navGraphSystem; - - @Override - public void renderBlock(Canvas canvas, Vector3i blockPos, Rectanglei screenRegion) { - WalkableBlock block = navGraphSystem.getBlock(blockPos); - if (block != null) { - canvas.drawLine(screenRegion.minX, screenRegion.minY, screenRegion.minX + 1, screenRegion.minY, Color.GREEN); - } - } -} diff --git a/src/main/java/org/terasology/grid/renderers/WorkRenderer.java b/src/main/java/org/terasology/grid/renderers/WorkRenderer.java deleted file mode 100644 index 73930a29..00000000 --- a/src/main/java/org/terasology/grid/renderers/WorkRenderer.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.grid.renderers; - -import org.joml.Vector3i; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.registry.In; -import org.terasology.engine.registry.Share; -import org.terasology.engine.world.BlockEntityRegistry; -import org.terasology.grid.BlockRenderer; -import org.terasology.joml.geom.Rectanglei; -import org.terasology.minion.work.WorkTargetComponent; -import org.terasology.nui.Canvas; -import org.terasology.nui.Color; - -@RegisterSystem -@Share(value = WorkRenderer.class) -public class WorkRenderer extends BaseComponentSystem implements BlockRenderer { - @In - private BlockEntityRegistry registry; - - @Override - public void renderBlock(Canvas canvas, Vector3i blockPos, Rectanglei screenRegion) { - EntityRef entity = registry.getExistingBlockEntityAt(blockPos); - if (entity != null && entity.hasComponent(WorkTargetComponent.class)) { - WorkTargetComponent workTargetComponent = entity.getComponent(WorkTargetComponent.class); - - canvas.drawLine(screenRegion.minX, screenRegion.minY, screenRegion.maxX, screenRegion.minY, Color.WHITE); - canvas.drawLine(screenRegion.maxX, screenRegion.minY, screenRegion.maxX, screenRegion.maxY, Color.WHITE); - canvas.drawLine(screenRegion.maxX, screenRegion.maxY, screenRegion.minX, screenRegion.maxY, Color.WHITE); - canvas.drawLine(screenRegion.minX, screenRegion.maxY, screenRegion.minX, screenRegion.minY, Color.WHITE); - - } - } -} diff --git a/src/main/java/org/terasology/minion/move/ContinuousMoveAlongPathNode.java b/src/main/java/org/terasology/minion/move/ContinuousMoveAlongPathNode.java deleted file mode 100644 index 1236be36..00000000 --- a/src/main/java/org/terasology/minion/move/ContinuousMoveAlongPathNode.java +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import org.joml.Vector3f; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.navgraph.WalkableBlock; - -/** - * Call child node, as long as the actor has not reached the end of the path. Sets MinionMoveComponent.target to - * next step in path.
Old construct() from original {@link MoveAlongPathNode} moved to - * {@link SetupContinuousMoveNode} to allow for path travelling to be interrupted. This enables a character to follow - * a moving target. - *
- * SUCCESS: when actor has reached end of path.
- * FAILURE: if no path was found previously.
- *
- */ -@BehaviorAction(name = "move_along_path_continuous", isDecorator = true) -public class ContinuousMoveAlongPathNode extends BaseAction { - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (result != BehaviorState.SUCCESS) { - return result; - } - moveComponent.currentIndex++; - if (moveComponent.currentIndex < moveComponent.path.size()) { - WalkableBlock block = moveComponent.path.get(moveComponent.currentIndex); - moveComponent.target = new Vector3f(block.getBlockPosition()).add(new Vector3f(0, 1, 0)); - actor.save(moveComponent); - return BehaviorState.RUNNING; - } else { - moveComponent.path = null; - actor.save(moveComponent); - return BehaviorState.SUCCESS; - } - } -} diff --git a/src/main/java/org/terasology/minion/move/FindPathToNode.java b/src/main/java/org/terasology/minion/move/FindPathToNode.java deleted file mode 100644 index 85fb1f2c..00000000 --- a/src/main/java/org/terasology/minion/move/FindPathToNode.java +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.MoreExecutors; -import com.google.common.util.concurrent.SettableFuture; -import org.joml.Vector3f; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.registry.CoreRegistry; -import org.terasology.engine.registry.In; -import org.terasology.navgraph.NavGraphSystem; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; -import org.terasology.pathfinding.model.Path; - -import java.util.Arrays; -import java.util.List; - -/** - * Requests a path to a target defined using the MinionMoveComponent.target.

- * SUCCESS / FAILURE: when paths is found or not found (invalid).
- * RUNNING: as long as path is searched.
- *
Auto generated javadoc - modify README.markdown instead! - */ -@BehaviorAction(name = "find_path") -public class FindPathToNode extends BaseAction { - - @In - private transient NavGraphSystem navGraphSystem; - - @In - private transient PathfinderSystem pathfinderSystem; - - @Override - public void setup() { - navGraphSystem = CoreRegistry.get(NavGraphSystem.class); - pathfinderSystem = CoreRegistry.get(PathfinderSystem.class); - } - - @Override - public void construct(final Actor actor) { - if (pathfinderSystem == null) { - setup(); - } - final MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - Vector3f targetLocation = moveComponent.target; - moveComponent.path = null; - actor.save(moveComponent); - WalkableBlock currentBlock = moveComponent.currentBlock; - if (currentBlock == null || targetLocation == null) { - moveComponent.path = Path.INVALID; - return; - } - WalkableBlock workTarget = navGraphSystem.getBlock(targetLocation); - if (workTarget == null) { - moveComponent.path = Path.INVALID; - return; - } - SettableFuture> pathFuture = pathfinderSystem.requestPath( - actor.getEntity(), currentBlock.getBlockPosition(), - Arrays.asList(workTarget.getBlockPosition())); - - Futures.addCallback(pathFuture, new FutureCallback>() { - @Override - public void onSuccess(List paths) { - if (paths == null) { - moveComponent.path = Path.INVALID; - } else if (paths.size() > 0) { - moveComponent.path = paths.get(0); - } - actor.save(moveComponent); - } - - @Override - public void onFailure(Throwable t) { - moveComponent.path = Path.INVALID; - } - }, MoreExecutors.directExecutor()); - } - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - final MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent.path == null) { - return BehaviorState.RUNNING; - } - return moveComponent.path == Path.INVALID ? BehaviorState.FAILURE : BehaviorState.SUCCESS; - } -} - diff --git a/src/main/java/org/terasology/minion/move/MinionMoveComponent.java b/src/main/java/org/terasology/minion/move/MinionMoveComponent.java deleted file mode 100644 index b7138a6b..00000000 --- a/src/main/java/org/terasology/minion/move/MinionMoveComponent.java +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import org.joml.Vector3f; -import org.terasology.gestalt.entitysystem.component.Component; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.model.Path; -import org.terasology.persistence.typeHandling.annotations.SerializedName; - -public class MinionMoveComponent implements Component { - - public enum Type { - @SerializedName("direct") - DIRECT, - @SerializedName("path") - PATH - } - - public Type type = Type.DIRECT; - public Vector3f target; - public boolean targetReached; - public boolean breaking; - - public transient Path path; - public int currentIndex; - - public transient WalkableBlock currentBlock; - public transient boolean horizontalCollision; - public transient boolean jumpMode; - public transient float jumpCooldown; - - @Override - public void copyFrom(MinionMoveComponent other) { - this.type = other.type; - this.target = new Vector3f(other.target); - this.targetReached = other.targetReached; - this.breaking = other.breaking; - this.path = other.path; - this.currentIndex = other.currentIndex; - this.currentBlock = other.currentBlock; - this.horizontalCollision = other.horizontalCollision; - this.jumpMode = other.jumpMode; - this.jumpCooldown = other.jumpCooldown; - } -} - diff --git a/src/main/java/org/terasology/minion/move/MinionMoveSystem.java b/src/main/java/org/terasology/minion/move/MinionMoveSystem.java deleted file mode 100644 index 52897a61..00000000 --- a/src/main/java/org/terasology/minion/move/MinionMoveSystem.java +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import com.google.common.collect.Sets; -import org.joml.Vector3f; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.entity.lifecycleEvents.BeforeDeactivateComponent; -import org.terasology.engine.entitySystem.entity.lifecycleEvents.OnActivatedComponent; -import org.terasology.engine.entitySystem.event.ReceiveEvent; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterMode; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.logic.characters.events.HorizontalCollisionEvent; -import org.terasology.engine.logic.characters.events.OnEnterBlockEvent; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.engine.registry.In; -import org.terasology.navgraph.NavGraphChanged; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; - -import java.util.Set; - -@RegisterSystem(RegisterMode.AUTHORITY) -public class MinionMoveSystem extends BaseComponentSystem { - @In - private PathfinderSystem pathfinderSystem; - - private Set entities = Sets.newHashSet(); - - @ReceiveEvent - public void worldChanged(NavGraphChanged event, EntityRef entityRef) { - for (EntityRef entity : entities) { - setupEntity(entity); - } - } - - @ReceiveEvent - public void onCollision(HorizontalCollisionEvent event, EntityRef minion, MinionMoveComponent movementComponent) { - movementComponent.horizontalCollision = true; - minion.saveComponent(movementComponent); - } - - @ReceiveEvent - public void onMinionEntersBlock(OnEnterBlockEvent event, EntityRef minion, - LocationComponent locationComponent, MinionMoveComponent moveComponent) { - setupEntity(minion); - } - - @ReceiveEvent - public void onMinionActivation(OnActivatedComponent event, EntityRef minion, - LocationComponent locationComponent, MinionMoveComponent moveComponent) { - setupEntity(minion); - entities.add(minion); - } - - @ReceiveEvent - public void onMinionDeactivation(BeforeDeactivateComponent event, EntityRef minion, - LocationComponent locationComponent, MinionMoveComponent moveComponent) { - entities.remove(minion); - } - - private void setupEntity(EntityRef minion) { - MinionMoveComponent moveComponent = minion.getComponent(MinionMoveComponent.class); - WalkableBlock block = pathfinderSystem.getBlock(minion); - moveComponent.currentBlock = block; - if (block != null && moveComponent.target == null) { - moveComponent.target = new Vector3f(block.getBlockPosition()); - } - minion.saveComponent(moveComponent); - } - - @Override - public void initialise() { - } - - @Override - public void shutdown() { - - } -} diff --git a/src/main/java/org/terasology/minion/move/MoveAlongPathNode.java b/src/main/java/org/terasology/minion/move/MoveAlongPathNode.java deleted file mode 100644 index 113e1b36..00000000 --- a/src/main/java/org/terasology/minion/move/MoveAlongPathNode.java +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import org.joml.Vector3f; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.engine.registry.CoreRegistry; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathRenderSystem; -import org.terasology.pathfinding.model.Path; - -/** - * Call child node, as long as the actor has not reached the end of the path. Sets MinionMoveComponent.target to next step in path.
- *
- * SUCCESS: when actor has reached end of path.
- * FAILURE: if no path was found previously.
- *
- * Auto generated javadoc - modify README.markdown instead! - */ -@BehaviorAction(name = "move_along_path", isDecorator = true) -public class MoveAlongPathNode extends BaseAction { - private static final Logger logger = LoggerFactory.getLogger(MoveAlongPathNode.class); - - // @In - private transient PathRenderSystem pathRenderSystem; - - @Override - public void construct(Actor actor) { - // TODO: Temporary fix for injection malfunction in actions, ideally remove this in the future. - pathRenderSystem = CoreRegistry.get(PathRenderSystem.class); - - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent != null && moveComponent.path != null && moveComponent.path != Path.INVALID) { - pathRenderSystem.addPath(moveComponent.path); - moveComponent.currentIndex = 0; - WalkableBlock block = moveComponent.path.get(moveComponent.currentIndex); - logger.debug("Start moving along path to step " + moveComponent.currentIndex + " " + block.getBlockPosition()); - moveComponent.target = new Vector3f(block.getBlockPosition()); - actor.save(moveComponent); - } - } - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (result != BehaviorState.SUCCESS) { - return result; - } - moveComponent.currentIndex++; - if (moveComponent.currentIndex < moveComponent.path.size()) { - WalkableBlock block = moveComponent.path.get(moveComponent.currentIndex); - logger.debug(" Continue moving along path to step " + moveComponent.currentIndex + " " + block.getBlockPosition()); - Vector3f pos = new Vector3f(block.getBlockPosition()); - pos.add(new Vector3f(0, 1, 0)); - moveComponent.target = pos; - actor.save(moveComponent); - return BehaviorState.RUNNING; - } else { - pathRenderSystem.removePath(moveComponent.path); - LocationComponent locationComponent = actor.getComponent(LocationComponent.class); - logger.debug("Finished moving along path pos = " + locationComponent.getWorldPosition(new Vector3f()) + " " + - "block = " + moveComponent.currentBlock); - return BehaviorState.SUCCESS; - } - } - -} diff --git a/src/main/java/org/terasology/minion/move/MoveToAction.java b/src/main/java/org/terasology/minion/move/MoveToAction.java deleted file mode 100644 index 3f604af5..00000000 --- a/src/main/java/org/terasology/minion/move/MoveToAction.java +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import org.joml.Math; -import org.joml.Vector3f; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.logic.characters.CharacterMoveInputEvent; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.nui.properties.Range; - -import static org.joml.Math.abs; - -/** - * Properties: distance
- *
Moves the actor to the target defined by MinionMoveComponent.

- * SUCCESS: when distance between actor and target is below distance.
- * FAILURE: when there is no target.
- *
Auto generated javadoc - modify README.markdown instead! - */ -@BehaviorAction(name = "move_to") -public class MoveToAction extends BaseAction { - private static Logger logger = LoggerFactory.getLogger(MoveToAction.class); - @Range(min = 0, max = 10) - private float distance = 0.2f; - - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - BehaviorState state = BehaviorState.FAILURE; - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - - if (moveComponent.target == null) { - return BehaviorState.FAILURE; - } - if (moveComponent.type == MinionMoveComponent.Type.DIRECT) { - - boolean reachedTarget = processDirect(actor, moveComponent); - state = reachedTarget ? BehaviorState.SUCCESS : BehaviorState.RUNNING; - - } - if (moveComponent != null && moveComponent.target != null) { - if (moveComponent.horizontalCollision) { - moveComponent.horizontalCollision = false; - moveComponent.jumpCooldown = 0.3f; - } - moveComponent.jumpCooldown -= actor.getDelta(); - moveComponent.jumpMode = moveComponent.jumpCooldown > 0; - actor.save(moveComponent); - - } - return state; - } - - private boolean processDirect(Actor actor, MinionMoveComponent moveComponent) { - - LocationComponent locationComponent = actor.getComponent(LocationComponent.class); - boolean reachedTarget = false; - Vector3f worldPos = locationComponent.getWorldPosition(new Vector3f()); - Vector3f targetDirection = moveComponent.target.sub(worldPos, new Vector3f()); - Vector3f drive = new Vector3f(); - float yaw = (float) Math.atan2(targetDirection.x, targetDirection.z); - float requestedYaw = (float) (180f + Math.toDegrees(yaw)); - - if (abs(targetDirection.x) < distance && (abs(targetDirection.y) < 2f) && (abs(targetDirection.z) < distance)) { - drive.set(0, 0, 0); - reachedTarget = true; - } else { - targetDirection.normalize(); - drive.set(targetDirection); - } - - CharacterMoveInputEvent wantedInput = new CharacterMoveInputEvent(0, 0, requestedYaw, - drive, false, false, - moveComponent.jumpMode, (long) (actor.getDelta() * 1000)); - actor.getEntity().send(wantedInput); - - - return reachedTarget; - } - -} diff --git a/src/main/java/org/terasology/minion/move/SetTargetLocalPlayerNode.java b/src/main/java/org/terasology/minion/move/SetTargetLocalPlayerNode.java deleted file mode 100644 index 8438e963..00000000 --- a/src/main/java/org/terasology/minion/move/SetTargetLocalPlayerNode.java +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import org.joml.Vector3f; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.logic.players.LocalPlayer; -import org.terasology.engine.registry.In; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; - -/** - * Set MinionMoveComponent.target to the block below local player.
- *
- * Always returns SUCCESS.
- *
- * Auto generated javadoc - modify README.markdown instead! - */ -@BehaviorAction(name = "set_target_local_player") -public class SetTargetLocalPlayerNode extends BaseAction { - @In - private LocalPlayer localPlayer; - @In - private PathfinderSystem pathfinderSystem; - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - Vector3f position = localPlayer.getPosition(new Vector3f()); - WalkableBlock block = pathfinderSystem.getBlock(position); - if (block != null) { - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - moveComponent.target = new Vector3f(block.getBlockPosition()); - actor.save(moveComponent); - } - return BehaviorState.SUCCESS; - } - -} diff --git a/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java b/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java deleted file mode 100644 index 0860dac0..00000000 --- a/src/main/java/org/terasology/minion/move/SetTargetToNearbyBlockNode.java +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import com.google.common.collect.Lists; -import org.joml.Vector3f; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.registry.In; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; - -import java.util.List; -import java.util.Random; - - -@BehaviorAction(name = "set_target_nearby_block") -public class SetTargetToNearbyBlockNode extends BaseAction { - private static final Logger logger = LoggerFactory.getLogger(SetTargetToNearbyBlockNode.class); - private int moveProbability = 100; - private transient Random random = new Random(); - @In - private PathfinderSystem pathfinderSystem; - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - if (random.nextInt(100) > (99 - moveProbability)) { - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent.currentBlock != null) { - WalkableBlock target = findRandomNearbyBlock(moveComponent.currentBlock); - moveComponent.target = new Vector3f(target.getBlockPosition()); - actor.save(moveComponent); - } else { - return BehaviorState.FAILURE; - } - } - return BehaviorState.SUCCESS; - } - - private WalkableBlock findRandomNearbyBlock(WalkableBlock startBlock) { - WalkableBlock currentBlock = startBlock; - for (int i = 0; i < random.nextInt(10) + 3; 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())); - } - } - logger.debug(String.format("Looking for a block: my block is %s, found destination %s", - startBlock.getBlockPosition(), currentBlock.getBlockPosition())); - return currentBlock; - } - -} diff --git a/src/main/java/org/terasology/minion/move/SetupContinuousMoveNode.java b/src/main/java/org/terasology/minion/move/SetupContinuousMoveNode.java deleted file mode 100644 index bedfff76..00000000 --- a/src/main/java/org/terasology/minion/move/SetupContinuousMoveNode.java +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.move; - -import org.joml.Vector3f; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.model.Path; - -/** - * Essential setup for a character to travel along a determined path. This is exported from - * {@link MoveAlongPathNode#construct(Actor)}, which allows for characters to interrupt travelling along a path. - * This is essential for characters following a moving object. - */ -@BehaviorAction(name = "setup_continuous_pathfinding") -public class SetupContinuousMoveNode extends BaseAction { - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - if (moveComponent != null && moveComponent.path != null && moveComponent.path != Path.INVALID) { - moveComponent.currentIndex = 0; - WalkableBlock block = moveComponent.path.get(moveComponent.currentIndex); - moveComponent.target = new Vector3f(block.getBlockPosition()); - actor.save(moveComponent); - - return BehaviorState.SUCCESS; - } - - return BehaviorState.FAILURE; - } -} diff --git a/src/main/java/org/terasology/minion/work/FindWorkNode.java b/src/main/java/org/terasology/minion/work/FindWorkNode.java deleted file mode 100644 index 565fd01b..00000000 --- a/src/main/java/org/terasology/minion/work/FindWorkNode.java +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.engine.registry.CoreRegistry; -import org.terasology.engine.registry.In; -import org.terasology.nui.properties.OneOf; - -/** - * Properties: filter
- *
- * Searches for open work of specific type (filter). If work is found, the actor is assigned.
- *
- * SUCCESS: When work is found and assigned.
- *
- * Auto generated javadoc - modify README.markdown instead! - */ -@BehaviorAction(name = "find_work") -public class FindWorkNode extends BaseAction { - private static final Logger logger = LoggerFactory.getLogger(FindWorkNode.class); - - @OneOf.Provider(name = "work") - private String filter = "Behaviors:removeBlock"; - - @In - private transient WorkBoard workBoard; - - @In - private transient WorkFactory workFactory; - - @Override - public void setup() { - workBoard = CoreRegistry.get(WorkBoard.class); - workFactory = CoreRegistry.get(WorkFactory.class); - } - - @Override - public void construct(final Actor actor) { - - - final MinionWorkComponent actorWork = actor.getComponent(MinionWorkComponent.class); -// logger.info("FINDWORK CONSTRUCT"); - if (actorWork.currentWork != null) { - WorkTargetComponent currentJob = actorWork.currentWork.getComponent(WorkTargetComponent.class); - if (currentJob != null) { - logger.info("Removing current work from actor " + currentJob.getUri() + " at " + actorWork.currentWork); - currentJob.assignedMinion = null; - - actorWork.currentWork.saveComponent(currentJob); - } - } - actorWork.filter = filter != null ? workFactory.getWork(filter) : null; - if (actorWork.filter != null) { - workBoard.getWork(actor.getEntity(), actorWork.filter, (cluster, position, work) -> { - actorWork.workSearchDone = true; - actorWork.currentWork = work; - actorWork.target = position; - actor.save(actorWork); - return true; - }); - } else { - actorWork.workSearchDone = true; - } - actor.save(actorWork); - } - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - if (workFactory == null) { - setup(); - } - - - if (!constructed) { - - construct(actor); - constructed = true; - } - final MinionWorkComponent actorWork = actor.getComponent(MinionWorkComponent.class); - if (!actorWork.workSearchDone) { - return BehaviorState.RUNNING; - } - if (actorWork.currentWork != null) { - WorkTargetComponent workTargetComponent = actorWork.currentWork.getComponent(WorkTargetComponent.class); - if (workTargetComponent != null && workTargetComponent.getWork() != null) { - logger.info("Found new work for " + toString() + " " + workTargetComponent.getUri() + " at " + actorWork.currentWork); - workTargetComponent.assignedMinion = actor.getEntity(); - actorWork.currentWork.saveComponent(workTargetComponent); - return BehaviorState.SUCCESS; - } - } - return BehaviorState.FAILURE; - } -} diff --git a/src/main/java/org/terasology/minion/work/FinishWorkNode.java b/src/main/java/org/terasology/minion/work/FinishWorkNode.java deleted file mode 100644 index 8f68b450..00000000 --- a/src/main/java/org/terasology/minion/work/FinishWorkNode.java +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; - -/** - * Does the actual work, once the actor is in range. The child node is started.
- *
- * SUCCESS: when work is done (depends on work type).
- * FAILURE: if no work is assigned or target is not reachable.
- *
- * Auto generated javadoc - modify README.markdown instead! - */ -@BehaviorAction(name = "finish_work") -public class FinishWorkNode extends BaseAction { - private static final Logger logger = LoggerFactory.getLogger(FinishWorkNode.class); - - @Override - public void construct(Actor actor) { - MinionWorkComponent actorWork = actor.getComponent(MinionWorkComponent.class); - EntityRef currentWork = actorWork.currentWork; - if (currentWork == null) { - return; - } - WorkTargetComponent jobTargetComponent = currentWork.getComponent(WorkTargetComponent.class); - if (jobTargetComponent == null) { - return; - } - Work work = jobTargetComponent.getWork(); - if (!work.canMinionWork(currentWork, actor.getEntity())) { - logger.info("Not in range, work aborted " + currentWork); - jobTargetComponent.assignedMinion = null; - currentWork.saveComponent(jobTargetComponent); - actorWork.currentWork = null; - actor.save(actorWork); - return; - } - actorWork.cooldown = work.cooldownTime(); - actor.save(actorWork); - logger.info("Reached work " + currentWork); - work.letMinionWork(currentWork, actor.getEntity()); - } - - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - MinionWorkComponent actorWork = actor.getComponent(MinionWorkComponent.class); - if (actorWork.currentWork != null) { - actorWork.cooldown -= actor.getDelta(); - actor.save(actorWork); - - if (actorWork.cooldown > 0) { - return BehaviorState.RUNNING; - } else { - logger.info("Work finished"); - actorWork.currentWork = null; - actor.save(actorWork); - return BehaviorState.SUCCESS; - } - } - return BehaviorState.FAILURE; - } - -} diff --git a/src/main/java/org/terasology/minion/work/MinionWorkComponent.java b/src/main/java/org/terasology/minion/work/MinionWorkComponent.java deleted file mode 100644 index fb851c84..00000000 --- a/src/main/java/org/terasology/minion/work/MinionWorkComponent.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import org.joml.Vector3i; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.gestalt.entitysystem.component.Component; - -/** - * Work's minion component. Indicates, the minion is currently executing a work. - * - */ - -public class MinionWorkComponent implements Component { - public transient EntityRef currentWork; - public transient Vector3i target; - public transient float cooldown; - public transient Work filter; - public transient boolean workSearchDone; - - public MinionWorkComponent() { - } - - @Override - public void copyFrom(MinionWorkComponent other) { - this.currentWork = other.currentWork; - this.target = new Vector3i(other.target); - this.cooldown = other.cooldown; - this.filter = other.filter; - this.workSearchDone = other.workSearchDone; - } -} diff --git a/src/main/java/org/terasology/minion/work/SetTargetToWorkNode.java b/src/main/java/org/terasology/minion/work/SetTargetToWorkNode.java deleted file mode 100644 index 863cb57e..00000000 --- a/src/main/java/org/terasology/minion/work/SetTargetToWorkNode.java +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import org.joml.Vector3f; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.logic.behavior.BehaviorAction; -import org.terasology.engine.logic.behavior.core.Actor; -import org.terasology.engine.logic.behavior.core.BaseAction; -import org.terasology.engine.logic.behavior.core.BehaviorState; -import org.terasology.minion.move.MinionMoveComponent; -import org.terasology.navgraph.WalkableBlock; - -import java.util.List; - -/** - * Set MinionMoveComponent's target to the work's target.
- *
- * SUCCESS: if valid work target position found.
- * FAILURE: otherwise
- *
- * Auto generated javadoc - modify README.markdown instead! - */ -@BehaviorAction(name = "set_target_work") -public class SetTargetToWorkNode extends BaseAction { - @Override - public BehaviorState modify(Actor actor, BehaviorState result) { - EntityRef work = actor.getComponent(MinionWorkComponent.class).currentWork; - if (work != null) { - WorkTargetComponent workTargetComponent = work.getComponent(WorkTargetComponent.class); - List targetPositions = workTargetComponent.getWork().getTargetPositions(work); - if (targetPositions.size() > 0) { - WalkableBlock block = targetPositions.get(0); - MinionMoveComponent moveComponent = actor.getComponent(MinionMoveComponent.class); - moveComponent.target = new Vector3f(block.getBlockPosition()); - actor.save(moveComponent); - return BehaviorState.SUCCESS; - } - } - return BehaviorState.FAILURE; - } -} diff --git a/src/main/java/org/terasology/minion/work/Work.java b/src/main/java/org/terasology/minion/work/Work.java deleted file mode 100644 index 15692cf0..00000000 --- a/src/main/java/org/terasology/minion/work/Work.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import org.terasology.engine.core.SimpleUri; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.navgraph.WalkableBlock; - -import java.util.List; - -/** - * Defines a work on a block. - * - */ -public interface Work { - /** - * Returns list of positions that are valid to work on this work. - */ - List getTargetPositions(EntityRef block); - - boolean canMinionWork(EntityRef block, EntityRef minion); - - boolean isAssignable(EntityRef block); - - void letMinionWork(EntityRef block, EntityRef minion); - - boolean isRequestable(EntityRef block); - - SimpleUri getUri(); - - float cooldownTime(); -} diff --git a/src/main/java/org/terasology/minion/work/WorkBoard.java b/src/main/java/org/terasology/minion/work/WorkBoard.java deleted file mode 100644 index 14b8b36b..00000000 --- a/src/main/java/org/terasology/minion/work/WorkBoard.java +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import com.google.common.collect.Maps; -import org.joml.Vector3i; -import org.joml.Vector3ic; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.entitySystem.entity.EntityManager; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.entity.lifecycleEvents.BeforeRemoveComponent; -import org.terasology.engine.entitySystem.entity.lifecycleEvents.OnActivatedComponent; -import org.terasology.engine.entitySystem.entity.lifecycleEvents.OnAddedComponent; -import org.terasology.engine.entitySystem.entity.lifecycleEvents.OnChangedComponent; -import org.terasology.engine.entitySystem.event.ReceiveEvent; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.entitySystem.systems.UpdateSubscriberSystem; -import org.terasology.engine.logic.characters.CharacterComponent; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.engine.logic.selection.ApplyBlockSelectionEvent; -import org.terasology.engine.registry.In; -import org.terasology.engine.registry.Share; -import org.terasology.engine.utilities.concurrency.Task; -import org.terasology.engine.utilities.concurrency.TaskMaster; -import org.terasology.engine.world.BlockEntityRegistry; -import org.terasology.engine.world.block.BlockRegion; -import org.terasology.minion.move.MinionMoveComponent; -import org.terasology.minion.work.kmeans.Cluster; -import org.terasology.navgraph.NavGraphChanged; -import org.terasology.navgraph.WalkableBlock; - -import java.util.Map; - -@RegisterSystem -@Share(value = WorkBoard.class) -public class WorkBoard extends BaseComponentSystem implements UpdateSubscriberSystem { - private static final Logger logger = LoggerFactory.getLogger(WorkBoard.class); - private final Map workTypes = Maps.newHashMap(); - private TaskMaster taskMaster = TaskMaster.createPriorityTaskMaster("Workboard", 1, 1024); - - @In - private BlockEntityRegistry blockEntityRegistry; - @In - private EntityManager entityManager; - @In - private WorkFactory workFactory; - - private float cooldown = 5; - - @Override - public void update(float delta) { - cooldown -= delta; - if (cooldown < 0) { - for (WorkType type : workTypes.values()) { - logger.info(type.toString()); - } - cooldown = 5; - } - } - - @Override - public void initialise() { - logger.info("Initialize WorkBoard"); - } - - @ReceiveEvent - public void onNavGraph(NavGraphChanged event, EntityRef entityRef) { - offer(new UpdateChunkTask()); - } - - @ReceiveEvent - public void onAdded(OnAddedComponent event, EntityRef entityRef, WorkTargetComponent workTarget) { - if (workTarget == null) { - return; - } - offer(new UpdateTargetTask(entityRef)); - } - - @ReceiveEvent - public void onActivated(OnActivatedComponent event, EntityRef entityRef, WorkTargetComponent workTarget) { - if (workTarget == null) { - return; - } - offer(new UpdateTargetTask(entityRef)); - } - - @ReceiveEvent - public void onRemove(BeforeRemoveComponent event, EntityRef entityRef, WorkTargetComponent workTarget) { - offer(new RemoveTargetTask(entityRef)); - } - - @ReceiveEvent - public void onChange(OnChangedComponent event, EntityRef entityRef, WorkTargetComponent workTarget) { - offer(new UpdateTargetTask(entityRef)); - } - - public void getWork(EntityRef entity, Work filter, WorkBoardCallback callback) { - if (filter == null) { - return; - } - WorkType workType = getWorkType(filter); - offer(new FindWorkTask(entity, workType, callback)); - } - - @ReceiveEvent(components = {LocationComponent.class, CharacterComponent.class}) - public void onSelectionChanged(ApplyBlockSelectionEvent event, EntityRef entity) { - Work work = workFactory.getWork(event.getSelectedItemEntity()); - if (work == null) { - return; - } - BlockRegion selection = event.getSelection(); - for (Vector3ic pos : selection) { - EntityRef blockEntity = blockEntityRegistry.getBlockEntityAt(pos); - if (work.isAssignable(blockEntity)) { - WorkTargetComponent workTargetComponent = blockEntity.getComponent(WorkTargetComponent.class); - if (workTargetComponent != null) { - blockEntity.removeComponent(WorkTargetComponent.class); - } - workTargetComponent = new WorkTargetComponent(); - workTargetComponent.setWork(work); - blockEntity.addComponent(workTargetComponent); - } - } - } - - @Override - public void shutdown() { - taskMaster.shutdown(new ShutdownTask(), false); - } - - public void offer(WorkBoardTask task) { - taskMaster.offer(task); - } - - public WorkType getWorkType(Work work) { - if (work == null) { - return null; - } - WorkType workType = workTypes.get(work); - if (workType == null) { - workType = new WorkType(work); - workTypes.put(work, workType); - } - return workType; - } - - public interface WorkBoardCallback { - boolean workReady(Cluster cluster, Vector3i position, EntityRef work); - } - - public interface WorkBoardTask extends Task, Comparable { - int getPriority(); - } - - private final class UpdateChunkTask implements WorkBoardTask { - @Override - public int getPriority() { - return 0; - } - - @Override - public int compareTo(WorkBoardTask o) { - return Integer.compare(this.getPriority(), o.getPriority()); - } - - @Override - public String getName() { - return "WorkBoard:UpdateChunk"; - } - - @Override - public void run() { - for (EntityRef work : entityManager.getEntitiesWith(WorkTargetComponent.class)) { - WorkTargetComponent workTargetComponent = work.getComponent(WorkTargetComponent.class); - WorkType workType = getWorkType(workTargetComponent.getWork()); - if (workType != null) { - workType.update(work); - } - } - } - - @Override - public boolean isTerminateSignal() { - return false; - } - } - - private final class UpdateTargetTask implements WorkBoardTask { - private EntityRef target; - - private UpdateTargetTask(EntityRef target) { - this.target = target; - } - - @Override - public int getPriority() { - return 1; - } - - @Override - public int compareTo(WorkBoardTask o) { - return Integer.compare(this.getPriority(), o.getPriority()); - } - - @Override - public String getName() { - return "WorkBoard:UpdateTarget"; - } - - @Override - public void run() { - WorkTargetComponent component = target.getComponent(WorkTargetComponent.class); - if (component != null) { - WorkType workType = getWorkType(component.getWork()); - workType.update(target); - } - } - - @Override - public boolean isTerminateSignal() { - return false; - } - } - - private final class RemoveTargetTask implements WorkBoardTask { - private EntityRef target; - - private RemoveTargetTask(EntityRef target) { - this.target = target; - } - - @Override - public int getPriority() { - return 2; - } - - @Override - public int compareTo(WorkBoardTask o) { - return Integer.compare(this.getPriority(), o.getPriority()); - } - - @Override - public String getName() { - return "WorkBoard:RemoveTarget"; - } - - @Override - public void run() { - WorkTargetComponent component = target.getComponent(WorkTargetComponent.class); - if (component != null) { - WorkType workType = getWorkType(component.getWork()); - workType.remove(target); - } - } - - @Override - public boolean isTerminateSignal() { - return false; - } - } - - private static final class FindWorkTask implements WorkBoardTask { - private EntityRef target; - private WorkType workType; - private WorkBoardCallback callback; - - private FindWorkTask(EntityRef target, WorkType workType, WorkBoardCallback callback) { - this.target = target; - this.workType = workType; - this.callback = callback; - } - - @Override - public int getPriority() { - return 10; - } - - @Override - public int compareTo(WorkBoardTask o) { - return Integer.compare(this.getPriority(), o.getPriority()); - } - - @Override - public String getName() { - return "WorkBoard:FindWorkTask"; - } - - @Override - public void run() { - WalkableBlock block; - block = target.getComponent(MinionMoveComponent.class).currentBlock; - if (block == null) { - throw new IllegalStateException("No block " + target); - } - Vector3i currentPosition = block.getBlockPosition(); - Cluster nearestCluster = workType.getCluster().findNearestCluster(currentPosition); - if (nearestCluster != null) { - Vector3i nearestTarget = nearestCluster.findNearest(currentPosition); - if (nearestTarget != null) { - EntityRef work = workType.getWorkForTarget(nearestTarget); - if (callback.workReady(nearestCluster, nearestTarget, work)) { - workType.removeRequestable(work); - } - return; - } - } - callback.workReady(null, null, null); - } - - @Override - public boolean isTerminateSignal() { - return false; - } - } - - public static class ShutdownTask implements WorkBoardTask { - @Override - public int getPriority() { - return -1; - } - - @Override - public int compareTo(WorkBoardTask o) { - return Integer.compare(this.getPriority(), o.getPriority()); - } - - @Override - public String getName() { - return "WorkBoard:ShutdownTask"; - } - - @Override - public void run() { - - } - - @Override - public boolean isTerminateSignal() { - return true; - } - } -} diff --git a/src/main/java/org/terasology/minion/work/WorkComponent.java b/src/main/java/org/terasology/minion/work/WorkComponent.java deleted file mode 100644 index 0bcdeae3..00000000 --- a/src/main/java/org/terasology/minion/work/WorkComponent.java +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import org.terasology.engine.core.SimpleUri; -import org.terasology.gestalt.entitysystem.component.Component; - -public class WorkComponent implements Component { - public String workType; - public transient SimpleUri uri; - - public SimpleUri getUri() { - if (uri == null) { - uri = new SimpleUri(workType); - } - return uri; - } - - @Override - public void copyFrom(WorkComponent other) { - this.workType = other.workType; - this.uri = other.uri; - } -} diff --git a/src/main/java/org/terasology/minion/work/WorkFactory.java b/src/main/java/org/terasology/minion/work/WorkFactory.java deleted file mode 100644 index 0b1a1855..00000000 --- a/src/main/java/org/terasology/minion/work/WorkFactory.java +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.core.SimpleUri; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.registry.In; -import org.terasology.engine.registry.Share; -import org.terasology.engine.world.block.Block; -import org.terasology.engine.world.block.BlockManager; -import org.terasology.nui.databinding.ReadOnlyBinding; -import org.terasology.nui.itemRendering.StringTextRenderer; -import org.terasology.nui.properties.OneOfProviderFactory; - -import java.util.List; -import java.util.Map; - -@RegisterSystem -@Share(value = WorkFactory.class) -public class WorkFactory extends BaseComponentSystem { - private static final Logger logger = LoggerFactory.getLogger(WorkFactory.class); - - - @In - private OneOfProviderFactory providerFactory; - - @In - private BlockManager blockManager; - - private Map workRegistry = Maps.newHashMap(); - private List works = Lists.newArrayList(); - // TODO REAL IDLE - private SimpleUri idle = new SimpleUri("Pathfinding:idle"); - - /* Kept to pass to RemoveBlock nodes if needed - so they don't - * have to fetch their own Air block from somewhere - */ - private Block air; - - public void register(Work work) { - workRegistry.put(work.getUri(), work); - works.add(work); - } - - public List getWorks() { - return works; - } - - public Work getWork(String uri) { - return workRegistry.get(new SimpleUri(uri)); - } - - public Work getWork(EntityRef workItem) { - WorkComponent workComponent = workItem.getComponent(WorkComponent.class); - if (workComponent != null) { - return workRegistry.get(workComponent.getUri()); - } - return workRegistry.get(idle); - } - - @Override - public void initialise() { - logger.info("Initialize WorkFactory"); - providerFactory.register("work", new ReadOnlyBinding>() { - @Override - public List get() { - List result = Lists.newArrayList(); - for (Work work : works) { - result.add(work.getUri().toString()); - } - return result; - } - }, new StringTextRenderer() { - @Override - public String getString(String value) { - return value.substring(value.indexOf(':') + 1); - } - }); - - - } - - @Override - public void shutdown() { - } - - public Block getAir() { - if (air == null) { - air = blockManager.getBlock(BlockManager.AIR_ID); - } - return air; - } -} diff --git a/src/main/java/org/terasology/minion/work/WorkRenderSystem.java b/src/main/java/org/terasology/minion/work/WorkRenderSystem.java deleted file mode 100644 index 8d4d9edb..00000000 --- a/src/main/java/org/terasology/minion/work/WorkRenderSystem.java +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import org.joml.Vector3f; -import org.joml.Vector3i; -import org.terasology.engine.entitySystem.entity.EntityManager; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterMode; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.entitySystem.systems.RenderSystem; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.engine.registry.In; -import org.terasology.engine.rendering.world.selection.BlockSelectionRenderer; -import org.terasology.engine.utilities.Assets; -import org.terasology.engine.world.block.BlockComponent; - -@RegisterSystem(RegisterMode.CLIENT) -public class WorkRenderSystem extends BaseComponentSystem implements RenderSystem { - @In - private EntityManager entityManager; - private BlockSelectionRenderer selectionRenderer; - - @Override - public void initialise() { - selectionRenderer = new BlockSelectionRenderer(Assets.getTexture("engine:selection").orElse(null)); - } - - @Override - public void renderOverlay() { - selectionRenderer.beginRenderOverlay(); - Vector3i pos = new Vector3i(); - for (EntityRef entityRef : entityManager.getEntitiesWith(BlockComponent.class, WorkTargetComponent.class)) { - LocationComponent location = entityRef.getComponent(LocationComponent.class); - Vector3f worldPosition = location.getWorldPosition(new Vector3f()); - pos.set((int) worldPosition.x, (int) worldPosition.y, (int) worldPosition.z); - WorkTargetComponent work = entityRef.getComponent(WorkTargetComponent.class); - if (work.isRequestable(entityRef)) { - selectionRenderer.renderMark(pos); - } else if (work.isAssignable(entityRef)) { - selectionRenderer.renderMark2(pos); - } - } - selectionRenderer.endRenderOverlay(); - } - - @Override - public void renderAlphaBlend() { - //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public void renderOpaque() { - //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public void renderShadows() { - //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public void shutdown() { - //To change body of implemented methods use File | Settings | File Templates. - } -} diff --git a/src/main/java/org/terasology/minion/work/WorkTargetComponent.java b/src/main/java/org/terasology/minion/work/WorkTargetComponent.java deleted file mode 100644 index 90beb3e0..00000000 --- a/src/main/java/org/terasology/minion/work/WorkTargetComponent.java +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import org.terasology.engine.core.SimpleUri; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.registry.CoreRegistry; -import org.terasology.engine.world.block.ForceBlockActive; -import org.terasology.gestalt.entitysystem.component.Component; -import org.terasology.navgraph.WalkableBlock; - -import java.util.List; - -/** - * Work's block component. Using this component, jobs can be assigned to individual blocks - */ -@ForceBlockActive -public class WorkTargetComponent implements Component, Work { - public String workUri; - public transient EntityRef assignedMinion; - private transient Work work; - - public WorkTargetComponent() { - } - - public void setWork(Work work) { - this.work = work; - this.workUri = work.getUri().toString(); - } - - public Work getWork() { - if (work == null) { - work = CoreRegistry.get(WorkFactory.class).getWork(workUri); - } - return work; - } - - @Override - public List getTargetPositions(EntityRef block) { - return getWork().getTargetPositions(block); - } - - @Override - public boolean canMinionWork(EntityRef block, EntityRef minion) { - return getWork().canMinionWork(block, minion); - } - - @Override - public boolean isAssignable(EntityRef block) { - return getWork().isAssignable(block); - } - - @Override - public void letMinionWork(EntityRef block, EntityRef minion) { - getWork().letMinionWork(block, minion); - } - - @Override - public float cooldownTime() { - return getWork().cooldownTime(); - } - - @Override - public boolean isRequestable(EntityRef block) { - return getWork().isRequestable(block); - } - - @Override - public SimpleUri getUri() { - return getWork().getUri(); - } - - @Override - public void copyFrom(WorkTargetComponent other) { - this.workUri = other.workUri; - this.assignedMinion = other.assignedMinion; - this.work = other.work; - } -} diff --git a/src/main/java/org/terasology/minion/work/WorkType.java b/src/main/java/org/terasology/minion/work/WorkType.java deleted file mode 100644 index 02f78914..00000000 --- a/src/main/java/org/terasology/minion/work/WorkType.java +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import org.joml.Vector3f; -import org.joml.Vector3i; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.minion.work.kmeans.Cluster; -import org.terasology.navgraph.WalkableBlock; - -import java.util.Map; -import java.util.Set; - -public class WorkType { - private final Work work; - private final Set openWork = Sets.newHashSet(); - private final Set requestableWork = Sets.newHashSet(); - private final Map mapping = Maps.newHashMap(); - private Cluster cluster; - - public WorkType(Work work) { - this.work = work; - cluster = new Cluster(8, 4, 1, new Cluster.DistanceFunction() { - @Override - public float distance(Vector3i element, Vector3i target) { - EntityRef workEntity = mapping.get(element); - if (workEntity != null && requestableWork.contains(workEntity)) { - return (float) element.distance(target); - } - return Float.MAX_VALUE; - } - - @Override - public float distance(Vector3i element, Vector3f target) { - Vector3f diff = new Vector3f(element); - diff.sub(target); - return diff.length(); - } - }); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - int remaining = 10; - for (EntityRef workEntity : openWork) { - remaining--; - if (remaining == 0) { - break; - } - sb.append(workEntity); - sb.append(", "); - } - return work.getUri() + ": open=" + openWork.size() + " requestable=" + requestableWork.size() + " targets=" + mapping.size() + " " + sb; - } - - public void update(EntityRef workEntity) { - WorkTargetComponent workComponent = workEntity.getComponent(WorkTargetComponent.class); - if (workComponent != null && work.isAssignable(workEntity)) { - openWork.add(workEntity); - if (workComponent.assignedMinion == null && workComponent.isRequestable(workEntity)) { - requestableWork.add(workEntity); - for (WalkableBlock block : work.getTargetPositions(workEntity)) { - cluster.add(block.getBlockPosition()); - mapping.put(block.getBlockPosition(), workEntity); - } - } else { - remove(workEntity); - } - } else { - remove(workEntity); - } - } - - public Vector3i findNearestTarget(Vector3i position) { - return cluster.findNearest(position); - } - - public EntityRef getWorkForTarget(Vector3i position) { - return mapping.get(position); - } - - public void remove(EntityRef workEntity) { - if (workEntity != null) { - openWork.remove(workEntity); - requestableWork.remove(workEntity); - for (WalkableBlock block : work.getTargetPositions(workEntity)) { - cluster.remove(block.getBlockPosition()); - mapping.remove(block.getBlockPosition()); - } - } - } - - public Cluster getCluster() { - return cluster; - } - - public void removeRequestable(EntityRef workEntity) { - if (!workEntity.exists()) { - return; - } - requestableWork.remove(workEntity); - for (WalkableBlock block : work.getTargetPositions(workEntity)) { - cluster.remove(block.getBlockPosition()); - mapping.remove(block.getBlockPosition()); - } - } - - public Cluster findNearestCluster(Vector3i position) { - return cluster.findNearestCluster(position); - } -} diff --git a/src/main/java/org/terasology/minion/work/kmeans/Cluster.java b/src/main/java/org/terasology/minion/work/kmeans/Cluster.java deleted file mode 100644 index ef647dbd..00000000 --- a/src/main/java/org/terasology/minion/work/kmeans/Cluster.java +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work.kmeans; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import org.joml.Vector3f; -import org.joml.Vector3i; -import org.terasology.engine.utilities.random.MersenneRandom; -import org.terasology.engine.utilities.random.Random; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Stack; - -public class Cluster { - private Map distances = Maps.newHashMap(); - private List children = Lists.newArrayList(); - private Vector3f position = new Vector3f(); - private DistanceFunction distanceFunction; - private float maxDistanceBeforeSplit; - private int splitCount; - private Random random = new MersenneRandom(); - private boolean dirty = true; - private int depth; - - public Cluster(float maxDistanceBeforeSplit, int splitCount, int depth, DistanceFunction distanceFunction) { - this.maxDistanceBeforeSplit = maxDistanceBeforeSplit; - this.distanceFunction = distanceFunction; - this.splitCount = splitCount; - this.depth = depth; - } - - protected Cluster create() { - return new Cluster(maxDistanceBeforeSplit, splitCount, depth + 1, distanceFunction); - } - - public void add(Vector3i element) { - distances.put(element, new Distance(Float.MAX_VALUE)); - dirty = true; - } - - public void add(Vector3i element, Distance distance) { - distances.put(element, distance); - dirty = true; - } - - public void remove(Vector3i element) { - if (distances.remove(element) != null) { - for (Cluster cluster : children) { - cluster.remove(element); - } - } - dirty = true; - } - - public Vector3i findNearest(Vector3i target) { - float minDist = Float.MAX_VALUE; - Vector3i nearest = null; - for (Map.Entry entry : distances.entrySet()) { - Vector3i element = entry.getKey(); - float distance = distanceFunction.distance(element, new Vector3f(target)); - if (distance < minDist) { - nearest = element; - minDist = distance; - } - } - if (nearest != null) { - return nearest; - } - return null; - } - - public Cluster findNearestCluster(Vector3i target) { - hkMean(); - - if (children.size() == 0 || distances.size() == 0) { - return this; - } - float minDist = Float.MAX_VALUE; - Cluster nearestCluster = null; - for (Cluster cluster : children) { - if (cluster.distances.size() == 0 && cluster.children.size() == 0) { - continue; - } - - float distance = distanceFunction.distance(target, cluster.getPosition()); - if (distance < minDist) { - nearestCluster = cluster; - minDist = distance; - } - } - if (nearestCluster != null) { - return nearestCluster.findNearestCluster(target); - } - return null; - } - - public boolean hkMean() { - if (!dirty) { - return false; - } - - Stack stack = new Stack<>(); - stack.push(this); - - while (!stack.isEmpty()) { - Cluster current = stack.pop(); - float maxDistance = 0; - for (Map.Entry entry : current.distances.entrySet()) { - float distance = entry.getValue().getDistance(); - if (distance > maxDistance) { - maxDistance = distance; - } - } - - if (maxDistance > current.maxDistanceBeforeSplit) { - current.kMean(); - stack.addAll(current.children); - } - } - dirty = false; - return true; - } - - public void kMean() { - int max = Math.min(splitCount, distances.size()); - if (max >= children.size()) { - for (int i = children.size(); i < max; i++) { - Cluster cluster = create(); - children.add(cluster); - cluster.setPosition(new Vector3f(randomAround(position.x), randomAround(position.y), randomAround(position.z))); - } - } - - float dist = Float.MAX_VALUE; - while (dist > 0.1f) { - dist = iterate(); - updateChildren(); - } - } - - public List getLeafCluster() { - return getLeafCluster(new ArrayList()); - } - - public List getLeafCluster(List list) { - if (getChildren().size() > 0) { - for (Cluster cluster : getChildren()) { - cluster.getLeafCluster(list); - } - return list; - } else if (getDistances().size() > 0) { - list.add(this); - return list; - } - return list; - } - - private float randomAround(float value) { - return random.nextFloat(value - maxDistanceBeforeSplit / 2, value + maxDistanceBeforeSplit / 2); - } - - public float iterate() { - float totalDistChange = 0; - - clearChildren(); - for (Map.Entry entry : distances.entrySet()) { - float minDist = Float.MAX_VALUE; - Cluster nearestCluster = null; - Vector3i element = entry.getKey(); - Distance distance = entry.getValue(); - - for (Cluster cluster : children) { - float dist = distanceFunction.distance(element, cluster.getPosition()); - if (dist < minDist) { - nearestCluster = cluster; - minDist = dist; - } - } - if (nearestCluster != null) { - totalDistChange += distance.setDistance(minDist); - nearestCluster.add(element, distance); - } - } - if (distances.size() > 0) { - totalDistChange /= distances.size(); - } else { - totalDistChange = 0; - } - - return totalDistChange; - } - - public int getElementCount() { - return distances.size(); - } - - private void updateChildren() { - for (Cluster cluster : children) { - cluster.updateCluster(); - } - } - - private void clearChildren() { - for (Cluster cluster : children) { - cluster.clear(); - } - } - - public void clear() { - distances.clear(); - dirty = true; - } - - public List getChildren() { - return children; - } - - public void updateCluster() { - position = new Vector3f(); - for (Vector3i element : distances.keySet()) { - position.add(new Vector3f(element)); - } - position.mul(1.f / distances.size()); - } - - public int getDepth() { - return depth; - } - - public Vector3f getPosition() { - return position; - } - - public void setPosition(Vector3f position) { - this.position = position; - } - - public Map getDistances() { - return distances; - } - - @Override - public String toString() { - return position.toString() + " " + distances.size(); - } - - public static final class Distance { - private float distance; - - private Distance(float distance) { - this.distance = distance; - } - - public float getDistance() { - return distance; - } - - public float setDistance(float value) { - float diff = Math.abs(distance - value); - distance = value; - return diff; - } - } - - public interface DistanceFunction { - float distance(Vector3i element, Vector3f target); - - float distance(Vector3i element, Vector3i target); - } -} diff --git a/src/main/java/org/terasology/minion/work/systems/BuildBlock.java b/src/main/java/org/terasology/minion/work/systems/BuildBlock.java deleted file mode 100644 index 0d083827..00000000 --- a/src/main/java/org/terasology/minion/work/systems/BuildBlock.java +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work.systems; - -import com.google.common.collect.Lists; -import org.joml.Vector3i; -import org.joml.Vector3ic; -import org.terasology.engine.core.SimpleUri; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.ComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.registry.In; -import org.terasology.engine.world.WorldProvider; -import org.terasology.engine.world.block.Block; -import org.terasology.engine.world.block.BlockComponent; -import org.terasology.engine.world.block.BlockManager; -import org.terasology.minion.work.Work; -import org.terasology.minion.work.WorkFactory; -import org.terasology.minion.work.WorkTargetComponent; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; - -import java.util.List; - -@RegisterSystem -public class BuildBlock extends BaseComponentSystem implements Work, ComponentSystem { - private static final int[][] DIRECT_NEIGHBORS = new int[][]{ - {-1, 0, 0}, {1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {0, 0, -1}, {0, 0, 1} - }; - private final SimpleUri uri; - @In - private PathfinderSystem pathfinderSystem; - @In - private WorkFactory workFactory; - @In - private WorldProvider worldProvider; - @In - private BlockManager blockManager; - private Block blockType; - - public BuildBlock() { - uri = new SimpleUri("Behaviors:buildBlock"); - } - - @Override - public void initialise() { - workFactory.register(this); - //TODO: set this based on configuration settings instead - setBlock("CoreAssets:Dirt"); - } - - @Override - public void shutdown() { - - } - - @Override - public SimpleUri getUri() { - return uri; - } - - public List getTargetPositions(EntityRef block) { - List targetPositions = Lists.newArrayList(); - if (block == null || !block.hasComponent(BlockComponent.class) || blockType == null) { - return targetPositions; - } - Vector3i position = block.getComponent(BlockComponent.class).getPosition(new Vector3i()); - position.y--; - WalkableBlock walkableBlock = pathfinderSystem.getBlock(position); - if (walkableBlock != null) { - targetPositions.add(walkableBlock); - } - - return targetPositions; - } - - @Override - public boolean canMinionWork(EntityRef block, EntityRef minion) { - WalkableBlock actualBlock = pathfinderSystem.getBlock(minion); - Vector3i position = block.getComponent(BlockComponent.class).getPosition(new Vector3i()); - position.y--; - WalkableBlock expectedBlock = pathfinderSystem.getBlock(position); - return actualBlock == expectedBlock && blockType != null; - } - - @Override - public boolean isAssignable(EntityRef block) { - Vector3i position = block.getComponent(BlockComponent.class).getPosition(new Vector3i()); - Block type = worldProvider.getBlock(position); - return type.isPenetrable() && blockType != null; - } - - @Override - public void letMinionWork(EntityRef block, EntityRef minion) { - block.removeComponent(WorkTargetComponent.class); - Vector3ic pos = block.getComponent(BlockComponent.class).getPosition(); - worldProvider.setBlock(pos, blockType); - } - - @Override - public boolean isRequestable(EntityRef block) { - Vector3i position = block.getComponent(BlockComponent.class).getPosition(new Vector3i()); - Vector3i pos = new Vector3i(); - for (int[] neighbor : DIRECT_NEIGHBORS) { - pos.set(position.x + neighbor[0], position.y + neighbor[1], position.z + neighbor[2]); - Block solid = worldProvider.getBlock(pos); - if (!solid.isPenetrable()) { - return true; - } - } - return false; - } - - @Override - public float cooldownTime() { - return 1; - } - - @Override - public String toString() { - return "Build Block"; - } - - /** - * Set the block type that this behavior will use to build - * - * @param blockUri The name (URI) of the block to use. Uses "CoreAssets:Dirt" by default. - * @return True if block exists or intentionally set to null. False if block not found. - */ - public boolean setBlock(String blockUri) { - Block tempBlock = blockManager.getBlock(blockUri); - if (tempBlock == null && blockUri != null) { - return false; - } - blockType = tempBlock; - return true; - } - - /** - * Set the block type that this behavior will use to build - * - * @param block The block to use. Uses "CoreAssets:Dirt" by default. - */ - public void setBlock(Block block) { - blockType = block; - } - - /** - * @return The block that will be placed - */ - public Block getBlock() { - return blockType; - } -} - diff --git a/src/main/java/org/terasology/minion/work/systems/RemoveBlock.java b/src/main/java/org/terasology/minion/work/systems/RemoveBlock.java deleted file mode 100644 index 94c5546d..00000000 --- a/src/main/java/org/terasology/minion/work/systems/RemoveBlock.java +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2021 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work.systems; - -import com.google.common.collect.Lists; -import org.joml.Vector3f; -import org.joml.Vector3i; -import org.joml.Vector3ic; -import org.terasology.engine.core.SimpleUri; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.ComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.engine.registry.In; -import org.terasology.engine.world.WorldProvider; -import org.terasology.engine.world.block.Block; -import org.terasology.engine.world.block.BlockComponent; -import org.terasology.minion.work.Work; -import org.terasology.minion.work.WorkFactory; -import org.terasology.minion.work.WorkTargetComponent; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; - -import java.util.List; - -@RegisterSystem -public class RemoveBlock extends BaseComponentSystem implements Work, ComponentSystem { - private static final int[][] NEIGHBORS = new int[][]{ - {-1, 0, 0}, {1, 0, 0}, {0, 0, -1}, {0, 0, 1}, -// {-1, 1, 0}, {1, 1, 0}, {0, 1, -1}, {0, 1, 1}, - {-1, -1, 0}, {1, -1, 0}, {0, -1, -1}, {0, -1, 1}, - {-1, -2, 0}, {1, -2, 0}, {0, -2, -1}, {0, -2, 1}, - }; - - @In - private PathfinderSystem pathfinderSystem; - @In - private WorldProvider worldProvider; - @In - private WorkFactory workFactory; - - private final SimpleUri uri; - - - - - public RemoveBlock() { - uri = new SimpleUri("Behaviors:removeBlock"); - } - - @Override - public void initialise() { - workFactory.register(this); - - } - - @Override - public void shutdown() { - } - - @Override - public SimpleUri getUri() { - return uri; - } - - @Override - public List getTargetPositions(EntityRef block) { - List result = Lists.newArrayList(); - - Vector3i worldPos = block.getComponent(BlockComponent.class).getPosition(new Vector3i()); - WalkableBlock walkableBlock; - Vector3i pos = new Vector3i(); - for (int[] neighbor : NEIGHBORS) { - pos.set(worldPos.x + neighbor[0], worldPos.y + neighbor[1], worldPos.z + neighbor[2]); - walkableBlock = pathfinderSystem.getBlock(pos); - if (walkableBlock != null) { - result.add(walkableBlock); - } - } - return result; - } - - @Override - public boolean canMinionWork(EntityRef block, EntityRef minion) { - Vector3f pos = block.getComponent(LocationComponent.class).getWorldPosition(new Vector3f()) - .sub(minion.getComponent(LocationComponent.class).getWorldPosition(new Vector3f())); - pos.y /= 4; - float length = pos.length(); - return length < 2; - } - - @Override - public void letMinionWork(EntityRef block, EntityRef minion) { - block.removeComponent(WorkTargetComponent.class); - Vector3ic pos = block.getComponent(BlockComponent.class).getPosition(); - worldProvider.setBlock(pos, workFactory.getAir()); - } - - @Override - public boolean isAssignable(EntityRef block) { - Vector3ic pos = block.getComponent(BlockComponent.class).getPosition(); - Block type = worldProvider.getBlock(pos); - return !type.isPenetrable(); - } - - @Override - public boolean isRequestable(EntityRef block) { - return true; - } - - @Override - public float cooldownTime() { - return 0; - } - - @Override - public String toString() { - return "Remove Block"; - } -} - - - diff --git a/src/main/java/org/terasology/minion/work/systems/WalkToBlock.java b/src/main/java/org/terasology/minion/work/systems/WalkToBlock.java deleted file mode 100644 index 953da38d..00000000 --- a/src/main/java/org/terasology/minion/work/systems/WalkToBlock.java +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work.systems; - -import com.google.common.collect.Lists; -import org.joml.Vector3i; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.engine.core.SimpleUri; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.systems.BaseComponentSystem; -import org.terasology.engine.entitySystem.systems.ComponentSystem; -import org.terasology.engine.entitySystem.systems.RegisterSystem; -import org.terasology.engine.registry.In; -import org.terasology.engine.world.block.BlockComponent; -import org.terasology.minion.work.Work; -import org.terasology.minion.work.WorkFactory; -import org.terasology.minion.work.WorkTargetComponent; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; - -import java.util.List; - -@RegisterSystem -public class WalkToBlock extends BaseComponentSystem implements Work, ComponentSystem { - private static final Logger logger = LoggerFactory.getLogger(WalkToBlock.class); - private final SimpleUri uri; - @In - private PathfinderSystem pathfinderSystem; - @In - private WorkFactory workFactory; - - public WalkToBlock() { - uri = new SimpleUri("Behaviors:walkToBlock"); - } - - @Override - public void initialise() { - workFactory.register(this); - } - - @Override - public void shutdown() { - - } - - @Override - public SimpleUri getUri() { - return uri; - } - - public List getTargetPositions(EntityRef block) { - List targetPositions = Lists.newArrayList(); - if (block == null || !block.hasComponent(BlockComponent.class)) { - return targetPositions; - } - WalkableBlock walkableBlock = pathfinderSystem.getBlock(block.getComponent(BlockComponent.class).getPosition(new Vector3i())); - if (walkableBlock != null) { - targetPositions.add(walkableBlock); - } - - return targetPositions; - } - - @Override - public boolean canMinionWork(EntityRef block, EntityRef minion) { - WalkableBlock actualBlock = pathfinderSystem.getBlock(minion); - WalkableBlock expectedBlock = pathfinderSystem.getBlock(block.getComponent(BlockComponent.class).getPosition(new Vector3i())); - logger.info("{} - {}", actualBlock.getBlockPosition(), expectedBlock.getBlockPosition()); - return actualBlock == expectedBlock; - } - - @Override - public boolean isAssignable(EntityRef block) { - if (block == null || !block.hasComponent(BlockComponent.class)) { - return false; - } - WalkableBlock walkableBlock = pathfinderSystem.getBlock(block.getComponent(BlockComponent.class).getPosition(new Vector3i())); - return walkableBlock != null; - } - - @Override - public void letMinionWork(EntityRef block, EntityRef minion) { - block.removeComponent(WorkTargetComponent.class); - } - - @Override - public boolean isRequestable(EntityRef block) { - return true; - } - - @Override - public float cooldownTime() { - return 0; - } - - @Override - public String toString() { - return "Walk To Block"; - } -} - - diff --git a/src/test/java/org/terasology/behaviors/BehaviorsLoadingTest.java b/src/test/java/org/terasology/behaviors/BehaviorsLoadingTest.java new file mode 100644 index 00000000..07655e09 --- /dev/null +++ b/src/test/java/org/terasology/behaviors/BehaviorsLoadingTest.java @@ -0,0 +1,43 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.behaviors; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.terasology.engine.logic.behavior.asset.BehaviorTree; +import org.terasology.engine.registry.In; +import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.assets.management.AssetManager; +import org.terasology.moduletestingenvironment.MTEExtension; +import org.terasology.moduletestingenvironment.extension.Dependencies; + +import java.util.stream.Stream; + +@Tag("Mte") +@ExtendWith(MTEExtension.class) +@Dependencies({"ModuleTestingEnvironment", "Behaviors"}) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class BehaviorsLoadingTest { + + @In + AssetManager assetManager; + + public Stream behaviors() { + return assetManager.getAvailableAssets(BehaviorTree.class) + .stream() + .map(Arguments::of); + } + + @ParameterizedTest + @MethodSource("behaviors") + void behaviorsTest(ResourceUrn urn) { + Assertions.assertDoesNotThrow(() -> + assetManager.getAsset(urn, BehaviorTree.class)); + } +} diff --git a/src/test/java/org/terasology/minion/work/ClusterDebugger.java b/src/test/java/org/terasology/minion/work/ClusterDebugger.java deleted file mode 100644 index 1fd4c16e..00000000 --- a/src/test/java/org/terasology/minion/work/ClusterDebugger.java +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright 2020 The Terasology Foundation -// SPDX-License-Identifier: Apache-2.0 -package org.terasology.minion.work; - -import com.google.common.collect.Sets; -import org.joml.Vector3i; -import org.terasology.core.world.generator.AbstractBaseWorldGenerator; -import org.terasology.engine.WorldProvidingHeadlessEnvironment; -import org.terasology.engine.core.ComponentSystemManager; -import org.terasology.engine.core.SimpleUri; -import org.terasology.engine.entitySystem.entity.EntityManager; -import org.terasology.engine.entitySystem.entity.EntityRef; -import org.terasology.engine.entitySystem.entity.internal.EngineEntityManager; -import org.terasology.engine.entitySystem.systems.UpdateSubscriberSystem; -import org.terasology.engine.logic.characters.CharacterComponent; -import org.terasology.engine.logic.location.LocationComponent; -import org.terasology.engine.logic.selection.ApplyBlockSelectionEvent; -import org.terasology.engine.monitoring.PerformanceMonitor; -import org.terasology.engine.registry.CoreRegistry; -import org.terasology.engine.world.block.BlockRegion; -import org.terasology.minion.move.MinionMoveComponent; -import org.terasology.minion.work.kmeans.Cluster; -import org.terasology.minion.work.systems.WalkToBlock; -import org.terasology.navgraph.Entrance; -import org.terasology.navgraph.Floor; -import org.terasology.navgraph.NavGraphSystem; -import org.terasology.navgraph.WalkableBlock; -import org.terasology.nui.properties.OneOfProviderFactory; -import org.terasology.pathfinding.PathfinderTestGenerator; -import org.terasology.pathfinding.componentSystem.PathfinderSystem; - -import javax.swing.JFrame; -import javax.swing.JPanel; -import java.awt.Color; -import java.awt.Graphics; -import java.awt.HeadlessException; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionListener; -import java.awt.event.MouseWheelEvent; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class ClusterDebugger extends JFrame { - private WorldProvidingHeadlessEnvironment env; - private final int mapWidth; - private final int mapHeight; - private int level; - private WalkableBlock hovered; - private NavGraphSystem world; - private EntityManager entityManager; - private EngineEntityManager engineEntityManager; - private WalkToBlock walkToBlock; - private Vector3i nearest; - private Vector3i target; - private final WorkBoard workBoard; - private List leafCluster; - private final Object mutex = new Object(); - - public ClusterDebugger() throws HeadlessException { - env = new WorldProvidingHeadlessEnvironment(); - env.setupWorldProvider(new AbstractBaseWorldGenerator(new SimpleUri("")) { - @Override - public void initialize() { - register(new PathfinderTestGenerator(true, true)); - } - }); - //env.registerBlock("CoreAssets:Dirt", new Block(), false); TODO: Update to match recent changes in WorldProvidingHeadlessEnvironment - - entityManager = CoreRegistry.get(EntityManager.class); - mapWidth = 160; - mapHeight = 100; - - WorkFactory workFactory = new WorkFactory(); - CoreRegistry.get(ComponentSystemManager.class).register(workFactory); - CoreRegistry.put(WorkFactory.class, workFactory); - - world = new NavGraphSystem(); - CoreRegistry.get(ComponentSystemManager.class).register(world); - CoreRegistry.put(NavGraphSystem.class, world); - PathfinderSystem pathfinderSystem = new PathfinderSystem(); - CoreRegistry.get(ComponentSystemManager.class).register(pathfinderSystem); - CoreRegistry.put(PathfinderSystem.class, pathfinderSystem); - CoreRegistry.put(OneOfProviderFactory.class, new OneOfProviderFactory()); - - workBoard = new WorkBoard(); - CoreRegistry.get(ComponentSystemManager.class).register(workBoard); - - for (int x = 0; x < mapWidth / 16 + 1; x++) { - for (int z = 0; z < mapHeight / 16 + 1; z++) { - world.updateChunk(new Vector3i(x, 0, z)); - } - } - level = 45; - - - walkToBlock = new WalkToBlock(); - CoreRegistry.get(ComponentSystemManager.class).register(walkToBlock); - - add(new DebugPanel()); - } - - private boolean isEntrance(WalkableBlock block) { - boolean isEntrance = false; - for (Entrance entrance : block.floor.entrances()) { - if (entrance.getAbstractBlock() == block) { - isEntrance = true; - break; - } - } - return isEntrance; - } - - public static void main(String[] args) throws InterruptedException { - final ClusterDebugger debugger = new ClusterDebugger(); - debugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - debugger.pack(); - debugger.setVisible(true); - - while (true) { - Thread.sleep(100); - debugger.update(0.1f); - } - } - - public void update(float dt) { - entityManager.getEventSystem().process(); - for (UpdateSubscriberSystem updater : CoreRegistry.get(ComponentSystemManager.class).iterateUpdateSubscribers()) { - PerformanceMonitor.startActivity(updater.getClass().getSimpleName()); - updater.update(dt); - PerformanceMonitor.endActivity(); - } - WorkType workType = workBoard.getWorkType(walkToBlock); - List leafs = workType.getCluster().getLeafCluster(); - synchronized (mutex) { - leafCluster = leafs; - } - } - - private final class DebugPanel extends JPanel { - - private WalkableBlock block; - - private DebugPanel() { - addMouseMotionListener(new MouseMotionListener() { - @Override - public void mouseDragged(MouseEvent e) { - } - - @Override - public void mouseMoved(MouseEvent e) { - int hoverX = e.getX() * mapWidth / getWidth(); - int hoverZ = e.getY() * mapHeight / getHeight(); - hovered = world.getBlock(new Vector3i(hoverX, level, hoverZ)); - repaint(); - } - - }); - addMouseWheelListener(new MouseAdapter() { - @Override - public void mouseWheelMoved(MouseWheelEvent e) { - level += e.getWheelRotation(); - repaint(); - } - }); - addMouseListener(new MouseAdapter() { - - - @Override - public void mousePressed(MouseEvent e) { - int clickedX = e.getX() * mapWidth / getWidth(); - int clickedZ = e.getY() * mapHeight / getHeight(); - block = world.getBlock(new Vector3i(clickedX, level, clickedZ)); - repaint(); - } - - @Override - public void mouseReleased(MouseEvent e) { - int clickedX = e.getX() * mapWidth / getWidth(); - int clickedZ = e.getY() * mapHeight / getHeight(); - WalkableBlock lastBlock = world.getBlock(new Vector3i(clickedX, level, clickedZ)); - - if (e.getButton() == MouseEvent.BUTTON1) { - int minX = Math.min(block.x(), lastBlock.x()); - int maxX = Math.max(block.x(), lastBlock.x()); - int minY = Math.min(block.height(), lastBlock.height()); - int maxY = Math.max(block.height(), lastBlock.height()); - int minZ = Math.min(block.z(), lastBlock.z()); - int maxZ = Math.max(block.z(), lastBlock.z()); - final EntityRef item = entityManager.create(); - WorkComponent workComponent = new WorkComponent(); - workComponent.uri = walkToBlock.getUri(); - item.addComponent(workComponent); - item.addComponent(new LocationComponent()); - item.addComponent(new CharacterComponent()); - - final BlockRegion selection = new BlockRegion(minX, minY, minZ).setSize(maxX, maxY, maxZ); - ApplyBlockSelectionEvent event = new ApplyBlockSelectionEvent(item, selection); - item.send(event); - } else { - target = new Vector3i(lastBlock.x(), lastBlock.height(), lastBlock.z()); - EntityRef entity = entityManager.create(); - MinionMoveComponent moveComponent = new MinionMoveComponent(); - moveComponent.currentBlock = lastBlock; - entity.addComponent(moveComponent); - workBoard.getWork(entity, walkToBlock, (cluster, position, work) -> { - nearest = position; - return true; - }); - - } - } - }); - } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - Floor hoveredFloor = null; - if (hovered != null) { - hoveredFloor = hovered.floor; - } - - for (int z = 0; z < mapHeight; z++) { - for (int x = 0; x < mapWidth; x++) { - int screenX = x * getWidth() / mapWidth; - int screenY = z * getHeight() / mapHeight; - int tileWidth = (x + 1) * getWidth() / mapWidth - screenX; - int tileHeight = (z + 1) * getHeight() / mapHeight - screenY; - WalkableBlock current = world.getBlock(new Vector3i(x, level, z)); - if (current != null) { - boolean isEntrance = isEntrance(current); - - if (current.floor == hoveredFloor) { - if (isEntrance) { - g.setColor(Color.red); - - } else { - g.setColor(Color.blue); - } - } else { - if (isEntrance) { - g.setColor(Color.lightGray); - } else { - g.setColor(Color.cyan); - } - } - } else { - g.setColor(Color.black); - } - g.fillRect(screenX, screenY, tileWidth, tileHeight); - } - } - if (hovered != null) { - boolean isEntrance = isEntrance(hovered); - - int screenX = hovered.x() * getWidth() / mapWidth; - int screenY = hovered.z() * getHeight() / mapHeight; - int tileWidth = (hovered.x() + 1) * getWidth() / mapWidth - screenX; - int tileHeight = (hovered.z() + 1) * getHeight() / mapHeight - screenY; - int x = screenX + tileWidth / 2; - int y = screenY + tileHeight / 2; - Set entrances; - if (isEntrance) { - entrances = Sets.newHashSet(); - for (Floor floor : hovered.floor.neighborRegions) { - entrances.addAll(floor.entrances()); - } - } else { - entrances = Sets.newHashSet(hovered.floor.entrances()); - } - - for (Entrance entrance : entrances) { - WalkableBlock current = entrance.getAbstractBlock(); - screenX = current.x() * getWidth() / mapWidth; - screenY = current.z() * getHeight() / mapHeight; - tileWidth = (current.x() + 1) * getWidth() / mapWidth - screenX; - tileHeight = (current.z() + 1) * getHeight() / mapHeight - screenY; - int ex = screenX + tileWidth / 2; - int ey = screenY + tileHeight / 2; - if (current.height() == level) { - g.setColor(Color.BLACK); - } else { - g.setColor(Color.LIGHT_GRAY); - } - g.drawLine(x, y, ex, ey); - } - } - - synchronized (mutex) { - if (leafCluster != null) { - int id = 1; - for (Cluster cluster : leafCluster) { - drawCluster(g, cluster, (float) id / leafCluster.size()); - id++; - } - } - } - if (nearest != null) { - drawBlock(g, nearest.x, nearest.z, "O", Color.white); - } - if (target != null) { - drawBlock(g, target.x, target.z, "X", Color.white); - } - } - - private void drawCluster(Graphics g, Cluster parent, float color) { - Map distances = parent.getDistances(); - Color col = new Color(color, color, color); - for (Map.Entry entry : distances.entrySet()) { - Vector3i position = entry.getKey(); - drawBlock(g, position.x, position.z, "", col); - } - } - - private void drawBlock(Graphics g, int x, int z, String text, Color color) { - int screenX = x * getWidth() / mapWidth; - int screenY = z * getHeight() / mapHeight; - int tileWidth = (x + 1) * getWidth() / mapWidth - screenX; - int tileHeight = (z + 1) * getHeight() / mapHeight - screenY; - g.setColor(color); - g.fillRect(screenX, screenY, tileWidth, tileHeight); - g.setColor(Color.black); - g.drawString(text, screenX, screenY + 8); - } - } -}