melee ai tweaks
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
This commit is contained in:
parent
61c5599265
commit
89a0df81a5
@ -14,7 +14,6 @@
|
|||||||
+ fix the vibes
|
+ fix the vibes
|
||||||
Stability
|
Stability
|
||||||
Movement penalty while swinging weapon
|
Movement penalty while swinging weapon
|
||||||
Only have ai strafe if its outside attack range
|
|
||||||
Ticketed randomizer node for BTs to more heavily weight attacking and waiting
|
Ticketed randomizer node for BTs to more heavily weight attacking and waiting
|
||||||
Slow down strafe movement somehow
|
Slow down strafe movement somehow
|
||||||
|
|
||||||
|
|||||||
@ -574,6 +574,8 @@ True behavior trees
|
|||||||
- Colections
|
- Colections
|
||||||
- Combat
|
- Combat
|
||||||
Melee ai using BT framework
|
Melee ai using BT framework
|
||||||
|
Server block nullchecks
|
||||||
|
Melee AI tweaks
|
||||||
|
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
|
|||||||
@ -101,12 +101,14 @@ public class ServerBlockTree implements BehaviorTree {
|
|||||||
this.stateTransitionUtil.reset();
|
this.stateTransitionUtil.reset();
|
||||||
setState(BlockState.COOLDOWN);
|
setState(BlockState.COOLDOWN);
|
||||||
//activate hitboxes
|
//activate hitboxes
|
||||||
List<Entity> attachedEntities = AttachUtils.getChildrenList(parent);
|
if(AttachUtils.hasChildren(parent)){
|
||||||
for(Entity currentAttached : attachedEntities){
|
List<Entity> attachedEntities = AttachUtils.getChildrenList(parent);
|
||||||
if(HitboxCollectionState.hasHitboxState(currentAttached)){
|
for(Entity currentAttached : attachedEntities){
|
||||||
HitboxCollectionState currentState = HitboxCollectionState.getHitboxState(currentAttached);
|
if(HitboxCollectionState.hasHitboxState(currentAttached)){
|
||||||
currentState.setActive(false);
|
HitboxCollectionState currentState = HitboxCollectionState.getHitboxState(currentAttached);
|
||||||
currentState.setBlockOverride(false);
|
currentState.setActive(false);
|
||||||
|
currentState.setBlockOverride(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,12 +133,14 @@ public class ServerBlockTree implements BehaviorTree {
|
|||||||
} break;
|
} break;
|
||||||
case COOLDOWN: {
|
case COOLDOWN: {
|
||||||
//activate hitboxes
|
//activate hitboxes
|
||||||
List<Entity> attachedEntities = AttachUtils.getChildrenList(parent);
|
if(AttachUtils.hasChildren(parent)){
|
||||||
for(Entity currentAttached : attachedEntities){
|
List<Entity> attachedEntities = AttachUtils.getChildrenList(parent);
|
||||||
if(HitboxCollectionState.hasHitboxState(currentAttached)){
|
for(Entity currentAttached : attachedEntities){
|
||||||
HitboxCollectionState currentState = HitboxCollectionState.getHitboxState(currentAttached);
|
if(HitboxCollectionState.hasHitboxState(currentAttached)){
|
||||||
currentState.setActive(false);
|
HitboxCollectionState currentState = HitboxCollectionState.getHitboxState(currentAttached);
|
||||||
currentState.setBlockOverride(false);
|
currentState.setActive(false);
|
||||||
|
currentState.setBlockOverride(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.stateTransitionUtil.simulate(BlockState.COOLDOWN);
|
this.stateTransitionUtil.simulate(BlockState.COOLDOWN);
|
||||||
|
|||||||
@ -44,7 +44,6 @@ public class TimerNode implements DecoratorNode {
|
|||||||
this.child = child;
|
this.child = child;
|
||||||
this.frameCount = frameCount;
|
this.frameCount = frameCount;
|
||||||
this.timerId = Globals.aiManager.getTimerService().createTimer();
|
this.timerId = Globals.aiManager.getTimerService().createTimer();
|
||||||
System.out.println("Created timer node with id " + this.timerId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -44,65 +44,148 @@ public class MeleeAITree {
|
|||||||
//preconditions here
|
//preconditions here
|
||||||
new HasWeaponNode(),
|
new HasWeaponNode(),
|
||||||
new MeleeTargetingNode(attackerTreeData.getAggroRange()),
|
new MeleeTargetingNode(attackerTreeData.getAggroRange()),
|
||||||
//determine strategy
|
|
||||||
new RandomizerNode(
|
|
||||||
//wait
|
|
||||||
new SequenceNode(
|
|
||||||
new PublishStatusNode("Waiting"),
|
|
||||||
new FaceTargetNode(),
|
|
||||||
new TimerNode(new SucceederNode(null), 1200)
|
|
||||||
),
|
|
||||||
|
|
||||||
//move to hover distance
|
//perform different actions based on distance to target
|
||||||
new SequenceNode(
|
new SelectorNode(
|
||||||
new PublishStatusNode("Strafing right"),
|
|
||||||
new InverterNode(new OnFailureNode(
|
|
||||||
new WalkStartNode(MovementRelativeFacing.RIGHT),
|
|
||||||
new FailerNode(null)
|
|
||||||
)),
|
|
||||||
new FaceTargetNode(),
|
|
||||||
new TimerNode(new SucceederNode(null), 600),
|
|
||||||
new SucceederNode(new WalkStopNode())
|
|
||||||
),
|
|
||||||
|
|
||||||
//move from hover distance to melee range
|
//in attack range
|
||||||
new SequenceNode(
|
new SequenceNode(
|
||||||
new PublishStatusNode("Strafing left"),
|
//check prior to performing action
|
||||||
new InverterNode(new OnFailureNode(
|
new MeleeRangeCheckNode(attackerTreeData,MeleeRangeCheckType.ATTACK),
|
||||||
new WalkStartNode(MovementRelativeFacing.LEFT),
|
|
||||||
new FailerNode(null)
|
|
||||||
)),
|
|
||||||
new FaceTargetNode(),
|
|
||||||
new TimerNode(new SucceederNode(null), 600),
|
|
||||||
new SucceederNode(new WalkStopNode())
|
|
||||||
),
|
|
||||||
|
|
||||||
//move towards target and attack
|
//set state
|
||||||
new SequenceNode(
|
|
||||||
new PublishStatusNode("Attack target"),
|
|
||||||
//move towards target if its outside of melee range
|
|
||||||
new UntilNode(AITreeNodeResult.SUCCESS,
|
|
||||||
//or
|
|
||||||
new SelectorNode(
|
|
||||||
//in range
|
|
||||||
new MeleeRangeCheckNode(attackerTreeData,MeleeRangeCheckType.ATTACK),
|
|
||||||
//approaching target
|
|
||||||
new SequenceNode(
|
|
||||||
new PublishStatusNode("Approaching target"),
|
|
||||||
new FaceTargetNode(),
|
|
||||||
new OnFailureNode(new IsMovingNode(), new WalkStartNode(MovementRelativeFacing.FORWARD)),
|
|
||||||
new MeleeRangeCheckNode(attackerTreeData,MeleeRangeCheckType.ATTACK)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
//stop walking now that we're in range
|
//stop walking now that we're in range
|
||||||
new PublishStatusNode("Slowing down"),
|
new PublishStatusNode("Slowing down"),
|
||||||
new WalkStopNode(),
|
new WalkStopNode(),
|
||||||
new UntilNode(AITreeNodeResult.FAILURE, new IsMovingNode()),
|
new UntilNode(AITreeNodeResult.FAILURE, new IsMovingNode()),
|
||||||
new PublishStatusNode("Attacking"),
|
|
||||||
new AttackStartNode()
|
//select action to perform
|
||||||
|
new RandomizerNode(
|
||||||
|
//wait
|
||||||
|
new SequenceNode(
|
||||||
|
new PublishStatusNode("Waiting"),
|
||||||
|
new FaceTargetNode(),
|
||||||
|
new TimerNode(new SucceederNode(null), 1200)
|
||||||
|
),
|
||||||
|
//attack
|
||||||
|
new SequenceNode(
|
||||||
|
new PublishStatusNode("Attacking"),
|
||||||
|
new FaceTargetNode(),
|
||||||
|
new AttackStartNode(),
|
||||||
|
new TimerNode(new SucceederNode(null), 150)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
//in aggro range
|
||||||
|
new SequenceNode(
|
||||||
|
//check prior to performing action
|
||||||
|
new MeleeRangeCheckNode(attackerTreeData,MeleeRangeCheckType.AGGRO),
|
||||||
|
|
||||||
|
//select action to perform
|
||||||
|
new RandomizerNode(
|
||||||
|
|
||||||
|
//wait
|
||||||
|
new SequenceNode(
|
||||||
|
new PublishStatusNode("Waiting"),
|
||||||
|
new FaceTargetNode(),
|
||||||
|
new TimerNode(new SucceederNode(null), 1200)
|
||||||
|
),
|
||||||
|
|
||||||
|
//strafe to the right
|
||||||
|
new SequenceNode(
|
||||||
|
new PublishStatusNode("Strafing right"),
|
||||||
|
new InverterNode(new OnFailureNode(
|
||||||
|
new WalkStartNode(MovementRelativeFacing.RIGHT),
|
||||||
|
new FailerNode(null)
|
||||||
|
)),
|
||||||
|
new FaceTargetNode(),
|
||||||
|
new TimerNode(new SucceederNode(null), 600),
|
||||||
|
new SucceederNode(new WalkStopNode())
|
||||||
|
),
|
||||||
|
|
||||||
|
//strafe to the left
|
||||||
|
new SequenceNode(
|
||||||
|
new PublishStatusNode("Strafing left"),
|
||||||
|
new InverterNode(new OnFailureNode(
|
||||||
|
new WalkStartNode(MovementRelativeFacing.LEFT),
|
||||||
|
new FailerNode(null)
|
||||||
|
)),
|
||||||
|
new FaceTargetNode(),
|
||||||
|
new TimerNode(new SucceederNode(null), 600),
|
||||||
|
new SucceederNode(new WalkStopNode())
|
||||||
|
),
|
||||||
|
|
||||||
|
//approach target
|
||||||
|
//move towards target and attack
|
||||||
|
new SequenceNode(
|
||||||
|
new PublishStatusNode("Move into attack range"),
|
||||||
|
new FaceTargetNode(),
|
||||||
|
new SucceederNode(new WalkStartNode(MovementRelativeFacing.FORWARD)),
|
||||||
|
new TimerNode(new SucceederNode(null), 600)
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
// //determine strategy
|
||||||
|
// new RandomizerNode(
|
||||||
|
// //wait
|
||||||
|
// new SequenceNode(
|
||||||
|
// new PublishStatusNode("Waiting"),
|
||||||
|
// new FaceTargetNode(),
|
||||||
|
// new TimerNode(new SucceederNode(null), 1200)
|
||||||
|
// ),
|
||||||
|
|
||||||
|
// //move to hover distance
|
||||||
|
// new SequenceNode(
|
||||||
|
// new PublishStatusNode("Strafing right"),
|
||||||
|
// new InverterNode(new OnFailureNode(
|
||||||
|
// new WalkStartNode(MovementRelativeFacing.RIGHT),
|
||||||
|
// new FailerNode(null)
|
||||||
|
// )),
|
||||||
|
// new FaceTargetNode(),
|
||||||
|
// new TimerNode(new SucceederNode(null), 600),
|
||||||
|
// new SucceederNode(new WalkStopNode())
|
||||||
|
// ),
|
||||||
|
|
||||||
|
// //move from hover distance to melee range
|
||||||
|
// new SequenceNode(
|
||||||
|
// new PublishStatusNode("Strafing left"),
|
||||||
|
// new InverterNode(new OnFailureNode(
|
||||||
|
// new WalkStartNode(MovementRelativeFacing.LEFT),
|
||||||
|
// new FailerNode(null)
|
||||||
|
// )),
|
||||||
|
// new FaceTargetNode(),
|
||||||
|
// new TimerNode(new SucceederNode(null), 600),
|
||||||
|
// new SucceederNode(new WalkStopNode())
|
||||||
|
// ),
|
||||||
|
|
||||||
|
// //move towards target and attack
|
||||||
|
// new SequenceNode(
|
||||||
|
// new PublishStatusNode("Attack target"),
|
||||||
|
// //move towards target if its outside of melee range
|
||||||
|
// new UntilNode(AITreeNodeResult.SUCCESS,
|
||||||
|
// //or
|
||||||
|
// new SelectorNode(
|
||||||
|
// //in range
|
||||||
|
// new MeleeRangeCheckNode(attackerTreeData,MeleeRangeCheckType.ATTACK),
|
||||||
|
// //approaching target
|
||||||
|
// new SequenceNode(
|
||||||
|
// new PublishStatusNode("Approaching target"),
|
||||||
|
// new FaceTargetNode(),
|
||||||
|
// new OnFailureNode(new IsMovingNode(), new WalkStartNode(MovementRelativeFacing.FORWARD)),
|
||||||
|
// new MeleeRangeCheckNode(attackerTreeData,MeleeRangeCheckType.ATTACK)
|
||||||
|
// )
|
||||||
|
// )
|
||||||
|
// ),
|
||||||
|
// //stop walking now that we're in range
|
||||||
|
// new PublishStatusNode("Slowing down"),
|
||||||
|
// new WalkStopNode(),
|
||||||
|
// new UntilNode(AITreeNodeResult.FAILURE, new IsMovingNode()),
|
||||||
|
// new PublishStatusNode("Attacking"),
|
||||||
|
// new AttackStartNode()
|
||||||
|
// )
|
||||||
|
// )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user