Interoperation between Behavior Tree, Animation Blueprint, and Character Blueprint

Hello, I’m making an enemy which simply moves to the player and attacks the player if it’s near enough.
I’m lost while trying to figure out the best way to interoperate between the behavior tree, animation blueprint and the character blueprint.
I’ve found this similar question, but still have some questions.

  1. I want the attack animation to be in sync with the actual collision check. Adding a notifier state, adding a socket to the skeleton, and cast from the socket to check for the collisions in the notifier state would do the job.

    1-1. Is this the ‘best’ way in terms of maintainability?

    1-2. What if this is a multiplayer game? AFAIK, the animation notifiers are client-side, so the collision checks will be unreliable.

  2. How do I play the ‘attack’ animation? I want the enemy’s animation system to be centralized as much as possible. That being so, I don’t like to call ‘play animation’ in the behavior tree. Then I guess I’ll need to set a blackboard variable and check for it in the animation blueprint to play the animation, but this seems like the former one but with an extra step. Do you recommend dividing the responsibility of playing animation into 2 parts(animation blueprint and behavior tree), or is there another way to solve this problem?

  3. How do I know the attack is finished in the behavior tree? Do I check whether the attack animation is being played or not? Again, if doing so, would that be reliable in the multiplayer?

  4. What should I do if I want to do something in the character blueprint when an attack happens? Should I cast the owner to the enemy’s blueprint class in the anim notifier and call the function I want? This cast seems unneccesary, is there any way to avoid it?

Thanks in advance.