Hi,
EDIT: my answer only works for controller changed, not as a substitute of OnPossessed. For that you should use Restart as mentioned.
There are several options to let the client know when a Pawn has been possessed.
You can either use the BlueprintImplementableEvent “ReceiveControllerChanged”, bind to the Delegate “ReceiveControllerChangedDelegate” or override “NotifyControllerChanged”.
/** Event called after a pawn's controller has changed, on the server and owning client. This will happen at the same time as the delegate on GameInstance */
UFUNCTION(BlueprintImplementableEvent)
void ReceiveControllerChanged(AController* OldController, AController* NewController);
/** Event called after a pawn's controller has changed, on the server and owning client. This will happen at the same time as the delegate on GameInstance */
UPROPERTY(BlueprintAssignable, Category = Pawn)
FPawnControllerChangedSignature ReceiveControllerChangedDelegate;
/** Call to notify about a change in controller, on both the server and owning client. This calls the above event and delegate */
virtual void NotifyControllerChanged();