Ranged Weapons
Custom Ammo Types
Custom moddable ammo types are supported without adding a new Ammo class to the game via AmmoGeneric, check out the "12 Gauge Shotgun" for an example of use.
<object Name="12 Gauge Shotgun" Inherits="BaseMagazineRifle"> <part Name="Render" DisplayName="12 gauge shotgun" RenderString=")"></part> <part Name="Physics" bUsesTwoSlots="true" Weight="16"></part> <part Name="Commerce" Value="100"></part> <part Name="MissileWeapon" Skill="Rifle" NoWildfire="true" NoAmmoProjectile="Ammo12Gauge" ShotsPerAction="8" AmmoPerAction="1" ShotsPerAnimation="8" WeaponAccuracy="35" RangeIncrement="6"></part> <!-- heres the important bit that links the loader to AmmoPart="Ammo12Gauge", but we're going to use "AmmoGeneric" instead of an actual in game class part called "Ammo12Gauge"--> <part Name="MagazineAmmoLoader" ProjectileObject="" AmmoPart="Ammo12Gauge" MaxAmmo="6"></part> <!-- --> <part Name="Description" Short="A stockless, pump-action shotgun of jet black."></part> <part Name="Metal"></part> <tag Name="Tier" Value="3"></tag> <part Name="Examiner" AlternateDisplayName="rifle" Complexity="3" Difficulty="0"></part> </object> <object Name="Projectile12Gauge" Inherits="TemporaryProjectile"> <part Name="Projectile" BasePenetration="4" BaseDamage="1d10" ColorString="&y"></part> <part Name="Physics" IsReal="false"></part> </object> <object Name="12 Gauge Shell" Inherits="TemporaryProjectile"> <part Name="Render" DisplayName="12 gauge 00 buckshot" ColorString="&y"></part> <!-- heres the important bit that links it to AmmoPart="Ammo12Gauge" in the 12 Gauge Shotgun definition, give it an AmmoGeneric component and two tags, AmmoPartType with the value set to Ammo12Gauge, and a tag with just the name of the ammo part name itself --> <part Name="AmmoGeneric" ProjectileObject="Projectile12Gauge"></part> <tag Name="AmmoPartType" Value="Ammo12Gauge"></tag> <tag Name="Ammo12Gauge"></tag> <!-- --> <part Name="Physics" Category="Ammo"></part> <part Name="Description" Short="A brass-cased cartridge of round lead balls."></part> <part Name="TinkerItem" Bits="C" CanBuild="true" CanRepair="false" CanDisassemble="false" NumberMade="4"></part> <part Name="Commerce" Value="0.04"></part> </object>
AmmoSlug's code, if you want a template to create a new Ammo part: https://pastebin.com/gcYJpAh3
Ammo Generic With Multiple Specialized Ammo Types
<object Name="Explosive 12 Gauge Shell" Inherits="TemporaryProjectile"> <part Name="AmmoGeneric" ProjectileObject="Projectile12Gauge" SpecializedProjectileObject="Explosive_Projectile12Gauge"></part> </object> <object Name="AP 12 Gauge Shell" Inherits="TemporaryProjectile"> <part Name="AmmoGeneric" ProjectileObject="Projectile12Gauge" SpecializedProjectileObject="AP_Projectile12Gauge"></part> </object> <object Name="Explosive_Projectile12Gauge" Inherits="TemporaryProjectile"> ... </object> <object Name="AP_Projectile12Gauge" Inherits="TemporaryProjectile"> ... </object>
Scripting Impact Ammo Effects
Here's an example ammo part you can put on the projectile object that poisons on hit.
using System; namespace XRL.World.Parts { [Serializable] public class Example_MissilePoisonOnHit : IPart { public int Chance = 0; int Strength = 15; string DamageIncrement = "3d3"; string Duration = "6-9"; public Example_MissilePoisonOnHit() { Name = "Example_MissilePoisonOnHit"; } public override void Register(GameObject Object) { Object.RegisterPartEvent(this, "ProjectileHit"); } public override bool FireEvent(Event E) { if (E.ID == "ProjectileHit") { if (Rules.Stat.Random(1, 100) <= Chance) { GameObject Defender = E.GetParameter("Defender") as GameObject; if (Defender == null) return true; if( !Defender.Statistics.ContainsKey("Toughness") || Rules.Stat.Roll("1d20")+Defender.Statistics["Toughness"].Modifier <= 10+Strength ) { Defender.ApplyEffect( new Effects.Poisoned( Rules.Stat.Roll(Duration), DamageIncrement, Strength, ParentObject.pPhysics.Equipped ) ); } } } return base.FireEvent(E); } } }