I am having a hard time understanding the issues exactly and some of them are most likely due to some specific random mistake that is hard to predict.
Unreal Multiplayer is very trick, it would be best to just keep a multiplayer mock up as simple as possible until you are sure it’s entirely working, just movement being replicated, spawning and despawning. The issue you are describing sounds like it could be from a number of hard to isolate things but don’t despair and keep at it, I’ll give some thoughts…
First I wouldn’t mess with multiplayer until you can nail down your combat system perfectly against an immobile training dummy. While doing this i’d also work on the side when bored on a super simple multiplayer lever just to get spawning, despawning and moving in multiplayer mastered. The multiplayer issues sound like you might be triggering the same function many times where code is being double triggered by client + server. With multiplayer you really have to carefully track what is happening and no matter how much you do it, it’s a pain.
I use the blueprint “Print” node often when working in multiplayer to see if the trigger happened on the client or server. Print node will say CLIENT or SERVER on it so it’s a very easy good way to tell what is happening. Another trick is that if you set your game to 3+ character the outliner shows the client world, where as 1 or 2 players shows the server world. This is helpful to see what is being actually spawned server side. (By setting it to 3 sometimes and tracking what is spawning).
You have to use classes very carefully in multiplayer, the player controller is very important and the best way to isolate one client’s commands from another.
Focusing on the field of attacks and their names: I would not do unique names per field per player. Instead give each character a component that contains the code for handeling field of attacks. I would make an enumerator (Enumerator is a BP type you can make from the menu) that holds the 6 fields of attacks instead of using typed names. This way regardless of who is attacking who the function/event is the same: Player->Attack(OtherPlayer EAttackFields::RearLeftSide) . This translates to “Player do and attack on this other player at their RearLeftSide”
This is a concept called Object oriented program (OOP). It’s one of the most powerful and fundamental things to try to understand. This way your system could easily grow to have as many enemies on screen as you want and each has their own instance of the combat system. Enumerator is cleaner because you don’t have to type it and you can use it like an array.
Sorry for the ramble there was a lot to take in and I’m just running with what comes to mind.
Don’t be afraid to start over and over, you will improve each time, and all aspects of any project that has some substance (UI,Combat,AI,Menus] will have to be restarted many many times before you get each individual part working in a way that feels good and does exactly what you want.