So I don't know, it doesn't seem like you can fix the model in Blender. I spent a few days looking into it. There were a few things that looked promising, but I was not able to get them to work.
One was baking the animation. If you select an object then go to the menu on top under object > animation > bake, then it can bake the animation into the object. This seems to be designed for rigged meshes maybe. I don't know, some people said they did it but it was messing up the animation for me. And even when I sort of got it working (with a few pieces missing like the bullet and clutch) there were still 2 animation tracks (one for the arms and one for the gun) in which case it still wouldn't work.
The other option I saw was to combine all the objects together, and then copy and paste all the keyframes onto the same track. I didn't try this, cause it seems like a hack and too much work anyhow. And there is a high chance of messing something up, and it's a manual process you'll have to do each time you export the model (like if you update anything). So I don't consider this a viable option.
But one thing I did think about was doing it in Godot. I think I found one trick that might work. Leave the glb file as-is, the same one you sent me, and just create the animation frames in code. The AnimationPlayer works based on seconds, not frames, so you have to do some math to convert the clips. But the idea is that you would have a script running on _process() that will check the AnimationPlayer timecode and then either loop or stop based on what you want. However, I think you will lose the ability to blend animations like this, so it may not be the best solution either. This code just has the gun firing non-stop like a machine gun.
onready var gun = get_node("Gun")
onready var anim = gun.get_node("AnimationPlayer")
func _ready():
anim.get_animation("Animation").set_loop(true)
anim.play("Animation")
func _process(delta):
if anim.current_animation_position > 0.3:
anim.seek(0.0)
I also tried messing with the AnimationTree and StateMachine but they seem to be for mixing distinct animations (like run and jump) not for pieces of the same animation, so that wasn't working either. So I don't know. I think I've done enough research and there is not a simple solution. Most likely it will have to be a modification to the original source animation so that it will work better with Godot.