How to change ACharacter pawn class?

Consider this:

I have multiple items that have health attributes and can also attack:

UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = "Health")
	float HealthPercentageDecimal();

	UFUNCTION(BlueprintImplementableEvent, Category = "Health")
	void OnHPZero();
	
	UFUNCTION(BlueprintImplementableEvent, Category = "Health")
	void OnTakeHitFromRaycast(const FHitResult Hit);

	UFUNCTION(BlueprintImplementableEvent, Category = "Health")
	void OnTakeHit();

	virtual void TakeHitFromRaycast(const int32 IncomingDamage, const FHitResult Hit);
	virtual void TakeHit(const int32 IncomingDamage);

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Health")
	int32 TotalHitPoints{100};

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attack")
	int32 AttackDamage{10};

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Health")
	int32 CurrentHitPoints{100};
	
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attack")
	float AttackRange{200};

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attack")
	float AttackCooldown{ 1.0 };

I have a APawn that needs ALL of these functions and properties.

I have an ACharacter that needs ALL of these functions and properties.

The pawn can NEVER be a Character, so a base class wont work.

A UInterface will only let me create BlueprintImplementableEvents.

What I would LIKE to do (as in other languages), is simply extend APawn with this functionality. But apparently C++ does not support this.

Is there a way to create a custom APawn and have ACharacter inherit from my custom pawn instead?

C++ does support it, but not UHT and UE4 reflection system. That why i said in previues answer, if you don’t plan to use those in blueprints you don’t need to do UInterface thing, just make interface class and add it as extra parent (Same as you did with that interface), because C++ support multi parenting and this will bypass UHT.

In fact you don’t need to get rid of blueprint support on those functions and properties (specially that you don’t have any UObject pointers), you can make wrapper functions that will get and set non register properties, as well call unregisted functions.

But would need to make extra interface for those BlueprintImplementableEvents.

Other solution would be if you not planing to distribute source code, coping ACharacter code from engine source code, with different class name and your pawn code as parent

So I think I saw you do this in another post - using getters and references. Is this common practice in UE4? I just want to make sure I’m doing it correctly. What I’m trying to do is such a simple thing in other languages and I want to make sure I’m not hacking a solution together.