There are variables on Character called BaseTranslationOffset and BaseRotationOffset that save the initial translation and rotation offset of the mesh, and those are the values used as the “default” when interpolating and smoothing.
I can’t find where you mention the code is using the default characters mesh’s relative transform.
However I did notice that the character stores off the BaseTranslationOffset and BaseRotationOffset in ACharacter::PostInitializeComponents(), which runs before BeginPlay(), so this is probably why you are seeing your changes in BeginPlay() not being reflected. I could move that caching to also be done in BeginPlay(), but of course you would have to call the parent function after your own to have it cache those properly, which is a bit error prone as well. I can add a “RecomputeMeshOffset” function, but you still have to know to call this. I will do this and it should solve your issue, but listing these caveats here for others that may find this issue.
If you are working in code, can you try adding this to the end of your BeginPlay():
BaseTranslationOffset = Mesh->RelativeLocation;
BaseRotationOffset = Mesh->RelativeRotation.Quaternion();
Otherwise in blueprints you could try adding your change in mesh location to the construction script instead. Or even more simply just translate the mesh down in the blueprint defaults, unless you’re not doing that for another reason.