Hay muchas formas. te expongo una, muy simple. Dudo que muchos juegos hagan esto, pero es un método xD
Puedes tener en tu programa, un array de armas, por ejemplo. Cada arma, tiene estos punteros a función: getDamage(), getRecoil(), isAuto() y renderGun() (por ejemplo).
En una archivo XML por ejemplo, pone:
<weapon>
<name>NyanGun</name>
<folder>nyangun</folder>
<DLL>nyangun.dll</DLL>
</weapon>
Entonces, cargas esa DLL. Coges en la DLL, las funciones getDamage, getRecoil, etc etc, y las colocas en la clase weapon. Luego esa "weapon", que realmente son punteros a funciones de la DLL, la metes en tu array de armas, y listo. Ya tienes tu nueva arma.
Cuando la quieras renderizar, llamas a weaponList[ i ]->renderGun().
En caso de que necesite texturas, pues pondrías las texturas junto a la DLL en la carpeta (por ejemplo).
Es un ejemplo simple, pero te puede servir. Una DLL puede tener toda la información que quieras, así que es un método factible de crear MODS.
Cada juego tiene lo suyo, y si vas a hacer un programa con mods, utiliza el método que más te guste.
EDITO: Si a alguien se le ocurre algún otro método, o sabe de alguno que sea potente, que lo diga. Cuantos más métodos de hacer esto se expongan, mejor
!