It's good you are working on it
Though I would argue that copying stacks just to check the fluid type doesn't seem like the right idea, there are tank properties, and that's one of the examples where a separate method would be handy. One for tankproperties, another for old logic. Well, if separate code base isn't a problem, than some code definitely needs to be rewritten before forking, I agree (especially mutability). What I say is it doesn't seem to be rewritten in a meaningful way right now that will help that much further.
Also, immutability is not such a big problem. Well, there are places where there might be needed some architectural changes to escape too much of copy-and-change, it's just time consuming usually. (And also produces an infinity of bugs along the way). Java went a long way from mutable times, and that's where lambdas are useful. As for single return, if it is really needed to return multiple values (though I don't see right now how that is required when changing mutable to immutable), tuple is always good enough, and most changes associated with such can be easily refacrored.
As for capabilities, most stuff is already written and now requires only to be separated to diffeent classes it seems (and to implement quite simple methods get/hasCapability and initCapabilities). Yeah, painful, but will need to be done still.
Anyway, that's just my opinion here, carry on the great work