Rimfire (mod)

Rimfire is a weapons mod with custom textures and sounds. Its goal is to create quality content which mimics the base game's art style and weapon balance as much as possible.
It is compatible with versions Alpha 8+.
==Feature list==
===Weapons===
Here's a list of the weapons currently in the mod:
Mod version	Label 	Based on
init 	burstfire machinepistol 	Beretta 93R
init 	automatic shotgun 	AA-12/Auto-Assault Shotgun
init 	pocket revolver 	Derringer
init 	jagged rifle 	IMI Galil
init 	greasegun SMG 	M3 submachine gun
init 	mitrailleuse 	M134 minigun
init 	3-line rifle 	Mosin-Nagant
init 	hunting rifle 	Steyr Scout
init 	folding stock SMG 	Škorpion vz. 61
init 	combat shotgun 	Cobray Streetsweeper
init 	silenced PDW 	Steyr TMP
init 	machinepistol 	Intratec TEC-9
init 	modern SMG 	KRISS Vector
init 	specialist rifle 	Walther WA 2000
init 	military rifle 	H&K XM-8
1.2 	multiple grenade launcher	Milkor MGL
1.3 	detective pistol 	Sphinx AT 2000
1.3 	soviet pistol 	Tokarev TT-30
1.4 	deadeye rifle 	Armalite AR-50
1.4 	heavy AMR 	MICOR Leader 50
1.4 	counterfeit handgun 	Para Ordnance P14-45
1.4 	SASR 	PGM 'Hécate II'
1.5 	storm carbine 	Beretta Cx-4 Storm
1.5 	police carbine 	Ruger PC9
1.5 	civilian PCC 	H&K USC
1.8 	CAW shotgun 	H&K CAWS
1.9 	court revolver 	Taurus Judge
1.9 	aluminum-cast SMG 	Hafdasa C-4
1.9 	guerrilla rifle 	AK-47
1.9 	box-magazine GPMG 	Type 73
1.9 	replica LMG 	Madsen LMG
1.9 	RPG launcher 	RPG-7 Commando
2.1 	large-calibre revolver 	S&W Model 500
2.1 	rimfire pistol 	Ruger Mk III Standard
2.1 	aviation crew SMG 	H&K MP5K-PDW
2.1 	varmint rifle 	Ruger 10/22
2.1 	repeating rifle 	Spencer Repeating Rifle
2.1 	soviet DMR 	Dragunov SVD
2.1 	police AMR 	Barrett M82A1
2.1 	replica GPMG 	Rheinmetall MG60
2.1 	MAAWS 	Carl Gustaf recoilless rifle
2.1 	short crossbow 	
2.1 	charge pistol 	
2.1 	charge SMG 	
2.1 	charge shotgun 	
2.1 	charge sniper rifle 	
2.1 	atlatl 	Atlatl
===Research projects===
Rimfire added weapon crafting research since Alpha 13 since the base game included this.
Mod version	Project 	Requirements 	Unlocks crafting of..
v1.9 	small rockets 	machining 	RPG launcher
v1.9 	antimateriel weapons	plasteel guns 	deadeye rifle, heavy AMR, SASR
v1.9 	plasteel guns 	machining 	detective pistol, modern SMG, automatic shotgun, military rifle, deadeye rifle, multiple grenade launcher
v1.9 	multibarrel weapons 	microelectronics basics	mitrailleuse
v2.4 	antimateriel weapons	plasteel guns 	-
v2.4 	plasteel guns 	precision rifling 	detective pistol, modern SMG, automatic shotgun, military rifle, hunting rifle, multiple grenade launcher
v2.4 	small rockets 	gas operation 	RPG launcher, MAAWS
==Mod versions==
Game version 	Mod version	Release	Weapons #	Description 	Requirements 	Update post	Download	ModDB 	Nexus
Alpha 8 	1.0 	 	15 	Rimfire v1.0 first release, added fifteen weapons. 	 	 	Dropbox 	✓	✓
Alpha 8 	1.0 	CR 	15 		Rimfire v1.0 rebalanced to work with CombatRealism. 	 	 	Dropbox 	✓	✓
Alpha 9 	1.1 	 	15 	Rimfire v1.1's artstyle was adjusted to Alpha 9's. 	 	 	Dropbox 	✓	✓
Alpha 9 	1.1 	CR 	15 		Rimfire v1.1 rebalanced to work with CombatRealism. 	 	 	Dropbox 	✓	✓
Alpha 9 	1.2 	 	16 	Rimfire v1.2 added one grenade launcher. 	 	 	Dropbox 	✓	✓
Alpha 9 	1.2 	CR 	16 	Rimfire v1.2 rebalanced to work with CombatRealism. 	 	 	Dropbox 	✓	✓
Alpha 9 	1.2 	3DP 	0 	A Rimfire v1.2 (CR) patch for Enhanced 3D Printed Guns and Armor. 	Rimfire v1.2 (CR)	 	Forums 	✗	✗
Alpha 10 	1.3 	 	19 	Rimfire v1.3's artstyle was adjusted to Alpha 10's, three pistols were added. 	 	 	Dropbox 	✓	✓
Alpha 10 	1.3 	CR 	19 		Rimfire v1.3 rebalanced to work with CombatRealism. 	 	 	Dropbox 	✓	✓
Alpha 10 	1.3 	BSC 	0 	A Rimfire v1.3 (CR) patch for Brunayla's Security Co. 	Rimfire v1.3 (CR)	 	 	✗	✗
Alpha 11 	1.4 	 	23 	Rimfire v1.4 added three sniper rifles and a pistol. 	 	 	Dropbox 	✓	✓
Alpha 11 	1.5 	 	26 	Rimfire v1.5 added three carbines. 	 	 	Dropbox 	✓	✓
Alpha 11b 	1.6 	 	26 	Rimfire v1.6 rebalanced carbines and compiled DLL for Alpha 11b. 	 	 	Dropbox 	✓	✓
Alpha 12 	1.7 	 	26 	Rimfire v1.7 compiled DLL for Alpha 12. 	 	 	Dropbox 	✓	✓
Alpha 12 	1.8 	 	27 	Rimfire v1.8 added a shotgun and redid all sounds. 	 	 	Dropbox 	✓	✓
Alpha 12 	1.8 	CR 	27 	Rimfire v1.8 rebalanced to work with CombatRealism. 	 	 	Dropbox 	✓	✓
Alpha 12 	1.8 	CR_SK 	27 	Hardcore SK modified version of Rimfire v1.8 for CombatRealism. 	 	 	 	✗	✗
Alpha 12 	1.8 	TGP 	27 	TheGentlePack modified version of Rimfire. 	 	 	 	✗	✗
Alpha 13 	1.9 	 	33 	Rimfire v1.9 added six guns and reworked all graphics, added recipes and research. 	 	 	Dropbox 	✓	✓
Alpha 13 	2.0 	 	33 	Rimfire v2.0 had a Community Core Library v13 requirement and added RPG-7 smoke trails. 	 	 	Dropbox 	✓	✓
Alpha 14 	2.1 	 	48 	Rimfire v2.1 added fifteen guns, redid a few sounds and improved on the Mod Configuration Menu.	 	 	Dropbox 	✓	✓
Alpha 14 	2.1 	CR 	48 	Rimfire v2.1 stripped and balanced to work with CombatRealism 1.6.7.3. 	CR 1.6.7.3 	 	Dropbox 	✓	✓
Alpha 14 	2.1 	Hands 	0 	A Rimfire v2.1 (CR) patch for Clutter Misc v1.0.3's "Clutter Misc Module - Hands". 	 	 	Dropbox 	✓	✓
Alpha 16 	2.2 	 	48 	Rimfire v2.2 moved the GunMod menu over to HugsLib. 	 	 	Dropbox 	✓	✓
Alpha 16 	2.2 	CR 	48 	Rimfire v2.2 balanced to work with CombatRealism 1.6.9.2. 	CR 1.6.9.2+ 	 	Dropbox 	✓	✓
Alpha 17 	2.3 	 	48 	Rimfire v2.3 saw a graphical update to the HugsLib mod menu and some anti-materiel rifle nerfs.	 	 	Dropbox 	✓	✓
Beta 18 	2.4 	 	48 	Rimfire v2.4 made large changes to gun balance to fit vanilla DPS curves. 	 	 	Dropbox 	✓	✓
Release 1.0 	2.5 	 	48 	Rimfire v2.5 rebalanced all guns to 1.0 mechanics and DPS curves, again. 	 	 	Dropbox 	✓	✓
Release 1.1/1.2	2.6 	 	48 	Rimfire v2.6 brings Rimfire to RimWorld 1.1+. 	 	 	Dropbox 	✓	✓
==Mod source==
Game version	Mod version	Release	Description 	Download
Alpha 13 	2.0 	 	C# Source for "Rimfire/Assemblies/AntiMateriel.dll", "Rimfire/Assemblies/SmokeTrails.dll", "Rimfire/Assemblies/GunModMCM.dll"	Dropbox
Alpha 16 	2.1 	 	C# Source for several assemblies (including WIP ones for designated marksman rifles). 	Dropbox
Alpha 18 	2.4 	 	C# Source for three relevant assemblies. 	Dropbox
==Polls==
Question 	Option 	Votes	Percentage
What weapons do you want me to focus on? (Post comments)	Common weapons: Benelli M3, AK-47, M4A1 (weaponry you probably know) 	115 	55.6%
What weapons do you want me to focus on? (Post comments)	Uncommon weapons: South-African, Indian, South-American (weaponry you probably haven't heard of before)	92 	44.4%
What weapons do you want me to focus on? (Post comments)	Total 	207 	100.0%
==Def Compatibility==
Every ThingDef <defName> used in the mod has "RF_" as prefix (e.g "RF_Gun_Deringer") to prevent incompatibility issues with other mods. This should make it possible to run it with any Alpha 9+ mod without guns overriding each other.
==GunModMCM Compatibility==
Rimfire v2.0/2.1 add a Community Core Library (CCL) Mod Configuration Menu (MCM): the Gun Mod Config Menu while v2.2 adds a HugsLib Mod Setting Menu. This contains several options:
===Inactive weapon removal===
* Enabled: all disabled guns below are actively destroyed (untradable, destroy on drop, not saved),
* Disabled: disabled guns are prevented from being created anymore.
Added in v2.0, this option causes all weapons in the weapon selection list which are disabled (red cross) to have the following changed about them:
Inactive weapon removal state	XML tag 	Weapon state	Weapon state
Inactive weapon removal state	XML tag 	Enabled 	Disabled
Disabled 	canBeSpawningInventory	xml 	false
Disabled 	destroyOnDrop 	xml 	xml
Disabled 	isSaveable 	xml 	xml
Disabled 	menuHidden 	xml 	xml
Disabled 	equipmentType 	xml 	xml
Disabled 	tradeability 	xml 	Min(Sellable, xml)
Disabled 	smeltProducts 	xml 	xml
Enabled 	canBeSpawningInventory	xml 	false
Enabled 	destroyOnDrop 	xml 	true
Enabled 	isSaveable 	xml 	false
Enabled 	menuHidden 	xml 	true
Enabled 	equipmentType 	xml 	None
Enabled 	tradeability 	xml 	Never
Enabled 	smeltProducts 	xml 	.Clear()
*xml: The value from the XML file where this ThingDef is defined.
===Weapon crafting===
* Enabled: all enabled guns below are craftable,
* Disabled: none of the guns below are craftable.
Added in v2.0, this option causes all weapons in the weapon list to be non-craftable. This is to aid those people who do not enjoy weapon crafting to instantly remove the feature from all gun mods, temporarily.
===Categorization===
* Enabled: vanilla and modded guns will be visibly categorized by type (pistol, shotgun).
Added in v2.0, this option causes all weapons in the weapon list to be categorized into more descriptive categories, specifically the ones below (and possibly more, depending on the degree of compatibility implemented by other gun mods):
* GunModMCM_WeaponsMelee
** NeolithicMelee
** MedievalMelee
** IndustrialMelee
** SpacerMelee
* GunModMCM_WeaponsRanged
** GunModMCM_Grenades
** NeolithicRanged
** MedievalRanged
** IndustrialRanged
*** Pistols
*** Revolvers
*** Shotguns
*** Carbines
*** Rifles
*** SniperRifles
*** AntiMateriel
*** SubMachineGuns
*** MachineGuns
*** HeavyWeapons
** SpacerRanged
*** ChargeGuns
*** MechanoidGuns
GunModMCM looks for ThingCategoryDefs with names GunModMCM_basegame category which are used for categorization.
=====Simple ThingDef compatibility/requirement=====
<?xml version="1.0" encoding="utf-8"?>
<ThingDefs>
	<!-- WeaponsRanged is usually already defined -->
	<ThingDef Name="GunBase">
		<thingCategories>
			WeaponsRanged
		</thingCategories>
	</ThingDef>
	<!-- This ThingDef has a Rimfire GunModMCM !! REQUIREMENT !! -->
	<ThingDef ParentName="GunBase">
		<defName>Gun_Pistol_Requiring_Rimfire</defName>
		<thingCategories>
			<!-- Added by Rimfire (GunModMCM_WeaponsRanged > IndustrialRanged > Pistols) -->
			Pistols
		</thingCategories>
	</ThingDef>
	<!-- This ThingDef is Rimfire !! COMPATIBLE !! -->
	<ThingDef ParentName="GunBase">
		<defName>Gun_Rifle_With_Rimfire_Compatibility</defName>
		<weaponTags>
			<!-- Format: GunModMCM_[any ThingCategoryDef defName] -->
			GunModMCM_Pistols
		</weaponTags>
	</ThingDef>
	
</ThingDefs>
In above example, switching on Categorization causes ThingDef Gun_Pistol_Requiring_Rimfire to be removed from ThingCategoryDef WeaponsRanged childThingDefs and it also causes ThingCategoryDef IndustrialRanged to be added to ThingCategoryDef WeaponsRanged childCategories. Switching Categorization off causes the opposite to happen.
To understand this concept I suggest trying it for yourself in the ModConfigurationMenu.
Example usage: <weaponTags><li>GunModMCM_ChargeGuns</li></weaponTags> can be added to a custom Charge weapon to categorize it correctly if Categorization is turned on.
As can be seen, a mod author can choose between adding a GunModMCM requirement or adding GunModMCM compatibility - it is suggested to use compatibility because weaponTags will not interfere with game functioning if Rimfire is not active.
=====Adding new WeaponsMelee/WeaponsRanged subcategories=====
To add new categories, create each ThingCategoryDef up to the category you want added (their full defs are present in Rimfire Defs/ThingCategoryDefs/ and can just be copied).
<?xml version="1.0" encoding="utf-8"?>
<Defs>
	<!-- Adding these ThingCategoryDefs present in Rimfire makes "AztecMelee" Rimfire GunModMCM !! COMPATIBLE !! -->
	<ThingCategoryDef>
		<defName>GunModMCM_WeaponsMelee</defName>
		<label>melee weapons</label>
	</ThingCategoryDef>
	
		<!-- idem. -->
		<ThingCategoryDef>
			<defName>NeolithicMelee</defName>
			<label>neolithic weaponry</label>
			<parent>GunModMCM_WeaponsMelee</parent>
		</ThingCategoryDef>
	
			<!-- Without the two ThingCategoryDefs above, this would have a Rimfire GunModMCM !! REQUIREMENT !! -->
			<ThingCategoryDef>
				<defName>AztecMelee</defName>
				<label>aztec</label>
				<parent>NeolithicMelee</parent>
			</ThingCategoryDef>
	
</Defs>
As can be seen, a mod author can choose between adding a GunModMCM requirement or adding GunModMCM compatibility - it is suggested to use compatibility because the ThingCategoryDefs GunModMCM_basegame category and its children will not show up anywhere in the game without GunModMCM active. Adding ThingDefs to this new category can be done using the ThingDef requirement or compatibility method again.
=====Adding new categorizable ThingCategoryDefs=====
<?xml version="1.0" encoding="utf-8"?>
<Defs>
	<!-- This category will show up as child of Weapons regardless of anything -->
	<ThingCategoryDef>
		<defName>WeaponsChemical</defName>
		<label>chemical weapons</label>
		<parent>Weapons</parent>
	</ThingCategoryDef>
	<!-- This category is hidden UNLESS Rimfire with GunModMCM is active and Categorization is turned on -->
	<ThingCategoryDef>
		<defName>GunModMCM_WeaponsChemical</defName>
		<label>chemical weapons</label>
	</ThingCategoryDef>
		<ThingCategoryDef>
			<defName>NerveAgents</defName>
			<label>nerve agents</label>
			<parent>GunModMCM_WeaponsChemical</parent>
		</ThingCategoryDef>
		<ThingCategoryDef>
			<defName>BlisterAgents</defName>
			<label>blister agents</label>
			<parent>GunModMCM_WeaponsChemical</parent>
		</ThingCategoryDef>
	
</Defs>
* In above example, any ThingDef's thingCategories must contain both "WeaponsChemical" (to show up in vanilla) and their respective ThingCategoryDef chemical weaponry type (in case GunModMCM categorization is active).
This example shows the true flexibility of GunModMCM's Categorization option - any newly added subcategories of Weapons can now be categorized even further without the need to do so only partially: if the end user really enjoys categorization they will have this feature enabled already, and if the end user really dislikes categorization they won't have to deal with it at all.
=====Example compatibility=====
* On your modded Industrial techLevel shotgun, add in ThingDef.weaponTags "GunModMCM_Shotguns" to add the shotgun to be categorized into the subcategory "Shotguns",
* You have a modded Spacer techLevel laser rifle - copy ThingCategoryDefs GunModMCM_WeaponsRanged, SpacerRanged, add ThingCategoryDef LaserGuns with parent SpacerRanged. To the laser rifle ThingDef.thingCategories add LaserGuns and WeaponsRanged.
===Name package===
* Select your preferred gun name package - gun names are automatically updated and displayed below.
Added in Rimfire 2.0, the mod contains name databases in \Languages\English\Keyed, with names in the form <*prefix**defName*>. Any time the Name packages are changed, all ThingDefs which have a translation option available in such form will get a new label. All cached labels are reset so Things will display the new ThingDef names.
In Rimfire v2.0+, the following *prefix*es exist (and are hardcoded in v2.2):
* Short_
* Long_
* AEight_
* ANine_
* Simple_
Both Gun ThingDef and Weapon ThingDef names are present in these databases. This is necessary, compound names can not be generated because some name packages require a special name rather than *weapon name* bullet (e.g RPG launcher with rocket propelled grenade).
An example of a complete name database for the RF_Gun_USC and RF_Bullet_USC is the following:
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
	<Short_RF_Gun_USC>H&K USC</Short_RF_Gun_USC>
	<Short_RF_Bullet_USC>H&K USC bullet</Short_RF_Bullet_USC>
	<Long_RF_Gun_USC>Heckler & Koch HK USC</Long_RF_Gun_USC>
	<Long_RF_Bullet_USC>Heckler & Koch HK USC bullet</Long_RF_Bullet_USC>
	<AEight_RF_Gun_USC>USC carbine</AEight_RF_Gun_USC>
	<AEight_RF_Bullet_USC>USC carbine bullet</AEight_RF_Bullet_USC>
	<ANine_RF_Gun_USC>civilian PCC</ANine_RF_Gun_USC>
	<ANine_RF_Bullet_USC>civilian PCC bullet</ANine_RF_Bullet_USC>
	<Simple_RF_Gun_USC>multishot carbine</Simple_RF_Gun_USC>
	<Simple_RF_Bullet_USC>multishot carbine bullet</Simple_RF_Bullet_USC>
</LanguageData>
===Unlocked weapon disabling===
* Enabled: the filter below will extend toggles for vanilla guns and all mod guns.
Added in Rimfire v2.1 (and always on in v2.2), this allows ALL weapons added by ALL mods to be toggled with some exceptions - the full IEnumerable<ThingDef> is created as follows:
//GunModMCM.ModConfigurationMenu_GunMod
public override void Initialize()
{
	//..
	var enumerable = DefDatabase<ThingDef>.AllDefs.Where(
			x => x.equipmentType == EquipmentType.Primary
			&& x.stuffProps == null		//wood log
			&& x.ingestible == null		//beer
		);
	var pawnDroppedBodyParts = DefDatabase<PawnKindDef>.AllDefs
		.Where(x => !x.lifeStages.NullOrEmpty())
		.SelectMany<PawnKindDef, ThingDef>(x => {
							var list = new HashSet<ThingDef>();
							foreach (PawnKindLifeStage stage
								in x.lifeStages.Where(y => y.dropBodyPart != null
											&& y.dropBodyPart.thing != null))
							{
								list.Add(stage.dropBodyPart.thing);
							}
							return list.Count > 0
								? list
								: Enumerable.Empty<ThingDef>();
						 });
	var turretGunTops = DefDatabase<ThingDef>.AllDefs
		.Where(x => x.building != null
		 && x.building.turretGunDef != null)
		.Select<ThingDef, ThingDef>(x => x.building.turretGunDef);
	FuzzyGunList.Initialize(enumerable
	 .Except(pawnDroppedBodyParts)
	 .Except(turretGunTops));
	
	//..
}
This query excludes:
* <equipmentType> is not Primary
* <stuffProps> is not null (wood logs)
* <ingestible> is not null (beer)
* ThingDefs which are dropBodyPart for any PawnKindDef (elephant tusks)
* ThingDefs which are turretGunDef for any ThingDef building (turret guns)
Please ensure your weapons fit none of these excluded criteria.
===Nuke disallowed===
* Clears the currently loaded colony save file of any of the currently disallowed guns. This change CAN NOT BE REVERTED.
Added in v2.1 (and is only available in-game), this removes every disabled weapon from Find.ListerThings (everything on the ground) and PawnUtility.AllPawnsMapOrWorldAliveOrDead (every carried weapon).
The use case for this feature is when you decide to disable a certain weapon mid-game and want to ensure it's instantly removed from the game, not just blocked from being spawned in.
===Contact===
If any of this is not clear enough, consider sending me a PM on the forums: Alistaire.