Some of the code was made at a time I didn't know how to make exceptions so back then I just used ArithmeticExceptions for capabilities. I do got an exception for that now tho so I should probably change it so thanks for pointing that out.
I did fix it and the solution was a large mix of things so I'm not exactly sure what fixed it, but I know a few of the things I needed to do were this:
private static final LazyOptional<IStatus> lazyStatus = LazyOptional.of(Status::new);
This line in my capability provider was static which was what was causing it to transfer over worlds, making it not static however made it stop saving.
To fix that I had to change the parameters in both my readNBT and writeNBT calls from
STATUS_CAP, this.instance, Status.capSide, nbt
to
STATUS_CAP, this.lazyStatus.orElseThrow(MissingStatus::new), Status.capSide, nbt
because instance was a variable I for some reason created, which was never used other than in these functions, that was the default value of the capability
After that I just had to fix up networking a bunch to get everything completely working, and the only problem there is I had no way to discern the packets being sent at the time, but yea fixing that got them all working correctly