I don’t think changing a config file to add a new weapon really counts as “modding” IMO But I do see your point. Things like NPC (written) dialogue, texture filepaths and other sorts might also belong outside of the code.
Okay, so now you’re storing weapons, their modifiers and items in HashMap<String, Object>s. Are you going to store player properties in a HashMap too? Game objects? I’d say you’re completely missing the point of object orientation. HashMaps also do not preserve the ordering of objects. This kills determinism for online games, and it might also be good to be able to control in which order for example modifiers are applied, because you’d want a +20% damage bonus to be applied before a +5 flat damage bonus so the % bonus is applied to the flat bonus too. What you’re doing is emulating objects with Strings in HashMaps. HashMaps themselves are in my opinion just a glorified emulation of references anyway, so you’re emulating objects and keeping them in emulated references. I’d stay far away from that kind of code if I were you… ._.

Okay, so now you’re storing weapons, their modifiers and items in HashMap<String, Object>s. Are you going to store player properties in a HashMap too? Game objects? I’d say you’re completely missing the point of object orientation. HashMaps also do not preserve the ordering of objects. This kills determinism for online games, and it might also be good to be able to control in which order for example modifiers are applied, because you’d want a +20% damage bonus to be applied before a +5 flat damage bonus so the % bonus is applied to the flat bonus too. What you’re doing is emulating objects with Strings in HashMaps. HashMaps themselves are in my opinion just a glorified emulation of references anyway, so you’re emulating objects and keeping them in emulated references. I’d stay far away from that kind of code if I were you… ._.
Nah, the statistics are in the HashMap but the modifiers are stored separately e.g. in a List.