Glad you got it working. I wouldn’t recommend executing all logic on the client **and **server – I would only execute logic which deals with visuals on the client. Movements, animations, anything the client needs to see instantly. Then, still execute all game-effecting logic like movement on the server. So, you would essentially be doing very similar things on the server and client, but the paradigm is that any logic done on the client is *only *for visual purposes and to keep the client in sync with the server. In this example, you would not run the possess logic on the client, but rather prepare the client as much as you possibly can, in order to keep visuals clean, smooth, and lag-free for the client.
The animation blueprint will be executed on the clients as well. You don’t want to do different logic based on authority inside of the animation blueprint. Rather, it is best practice to setup replicated variables inside of the character itself, retrieve those variables from the character inside of the anim bp, and then set your behavior based on those variables. The server will handle the replicated variables with server specific logic. Like, are we driving a vehicle? Set this variable here. Then, in the animation blueprint, retrieve that variable for reference, and handle accordingly. Make sure the anchor points and everything else you rely upon within the anim bp are replicated and set by the server. Not replicated inside of the animation blueprint itself, but the variables your retrieve from the character.
In a more “advanced” setup, you’d have owner-only variables, play animations for the owner based on those, and then have everyone else use the replicated variables from the server. This makes the client see things instantaneously, and gives a buttery smooth (and lag free) experience for players. In this example, you’d have two variables, we’ll say they’re booleans, isDrivingVehicleServer (replicated) and isDrivingVehicleOwner (not replicated). The server always sets isDrivingVehicleServer, and the owner always sets isDrivingVehicleOwner. In the animation blueprint, to check if we should be doing IK logic for the hands on the steering wheel, we would essentially say “am I a non-owner and isDrivingVehicleServer = true?” OR “am I the owner and isDrivingVehicleOwner = true?”.
Oh, also, just thought I’d mention since you’re working with a dedicated server. Test your setup on the client with the net pktlag=150 console command, where 150 is any number you’d like to simulate for ping. If you don’t set things up to be done by the client and server, while testing with simulated lag, you’ll notice very quickly why a person would do things on both the client and server. In a server-authoritative setup, there will be very noticeable delays for everything. This is the exact problem we alleviate by doing visuals locally, and logic on the server.