class CCitadelWeaponInfo
{
    uint8 pad_0000[8];
public:
    // MPropertyStartGroup = Firing Behavior
    // MPropertyDescription = Bullet Damage
    float32 m_flBulletDamage;
    // MPropertyDescription = Damage Type
    ECitadelDamageType m_eDamageType;
    // MPropertyDescription = Number of bullets to fire per shot
    int32 m_iBullets;
    // MPropertyDescription = Max to fire upon SplitShot (-1 = use default)
    int32 m_iSplitShotsMax;
    // MPropertyDescription = If true, take full damage when hit by any of the bullets rather than being split across all bullets.
    bool m_bHitOnceAcrossAllBullets;
    // MPropertyDescription = How many bullets must hit an orb in order to fully claim it.
    int32 m_iBulletsToFullyClaimOrb;
    // MPropertyDescription = If > 0, this bullet will apply its damage in a radius where it impacts (this is how to make something like a rocket).
    float32 m_flExplosionRadius;
    // MPropertyDescription = Damage scale at the extent of the explosion radius.
    // MPropertySuppressExpr = m_flExplosionRadius == 0
    // MPropertyAttributeRange = 0 1
    float32 m_flExplosionDamageScaleAtMaxRadius;
    // MPropertySuppressExpr = m_flExplosionRadius == 0
    // MPropertyDescription = Does the explosion collect gold (i.e soul orbs)?
    bool m_bAllowExplosionToCollectGold;
    // MPropertyDescription = Clip Size
    int32 m_iClipSize;
    // MPropertyDescription = The time between shots. In burst it's the time between starting a new burst.
    float32 m_flCycleTime;
    // MPropertyDescription = A delay after triggering a shot when the bullets comes out.
    float32 m_flBulletCreationDelay;
    // MPropertyDescription = How many shots to fire per burst
    int32 m_iBurstShotCount;
    // MPropertyDescription = The time between shoots within a burst
    // MPropertySuppressExpr = m_iBurstShotCount == 1
    float32 m_flIntraBurstCycleTime;
    // MPropertyDescription = How much ammo to consume to shoot this gun.
    int32 m_iAmmoConsumedPerShot;
    // MPropertyDescription = The maximum distance bullets will travel
    float32 m_flRange;
    // MPropertyDescription = The maximum distance bullets will travel while zoomed. If 0, uses Range.
    float32 m_flRangeWhileZoomed;
    // MPropertyDescription = The distance where damage falloff begins. Damage scale before this is clamped to 'Damage Falooff Start Scale'.
    float32 m_flDamageFalloffStartRange;
    // MPropertyDescription = The distance where damage falloff ends.  Beyond this range, damage scale is clamped to 'Damage Falloff End Scale'
    float32 m_flDamageFalloffEndRange;
    // MPropertyDescription = The bias in the damage falloff range
    // MPropertyAttributeRange = 0 1
    float32 m_flDamageFalloffBias;
    // MPropertyDescription = Damage falloff start range.
    float32 m_flDamageFalloffStartScale;
    // MPropertyDescription = Damage falloff end range
    float32 m_flDamageFalloffEndScale;
    // MPropertyDescription = If true, this bullet will not pass through portals.  It will impact them instead
    bool m_bDontPassThroughPortals;
    // MPropertyDescription = If true and the bullet impacted a teammate, should we play an impact effect?
    bool m_bPlayImpactEffectsOnTeammates;
    // MPropertyDescription = If > 0, bullets will continue through thin surfaces with their damage scaled by this amount
    float32 m_flPenetrationPercent;
    // MPropertyDescription = How long does it takes to aim down sights. 
    float32 m_flIronSightsTime;
    // MPropertyStartGroup = Firing Behavior/+Reload
    // MPropertyDescription = How long a reload takes
    // MPropertyFriendlyName = Reload Duration
    float32 m_reloadDuration;
    // MPropertyDescription = Compute duration from the active weapon info, instead of the stat value. Used when overloading GetWeaponInfo()
    bool m_bReloadUseActiveWeaponInfoDuration;
    // MPropertyDescription = Reload a single bullet when the reload duration completes rather than the entire clip
    bool m_bReloadSingleBullets;
    // MPropertyDescription = Allows canceling out of the reload at any time by firing your gun.
    bool m_bReloadSingleBulletsAllowCancel;
    // MPropertyDescription = Initial Delay before starting to reload bullets when using single bullet reload.
    float32 m_flReloadSingleBulletsInitialDelay;
    // MPropertyStartGroup = Firing Behavior/Crits
    // MPropertyDescription = Are we allowed to crit via headshots and weakpoints
    bool m_bCanCrit;
    // MPropertyDescription = The distance where crit bonus damage begins to change
    // MPropertySuppressExpr = m_bCanCrit == false
    float32 m_flCritBonusStartRange;
    // MPropertyDescription = The distance where crit bonus damage ends its change
    // MPropertySuppressExpr = m_bCanCrit == false
    float32 m_flCritBonusEndRange;
    // MPropertyDescription = Crit multiplier up to the 'Crit Bonus Start Range'
    // MPropertySuppressExpr = m_bCanCrit == false
    float32 m_flCritBonusStart;
    // MPropertyDescription = Crit multiplier at and beyond  'Crit Bonus End Range'
    // MPropertySuppressExpr = m_bCanCrit == false
    float32 m_flCritBonusEnd;
    // MPropertyDescription = Bonus on top of the multiplier when critting NPCs
    // MPropertySuppressExpr = m_bCanCrit == false
    float32 m_flCritBonusAgainstNPCs;
    // MPropertyDescription = What units can this crit on?
    // MPropertySuppressExpr = m_bCanCrit == false
    CITADEL_UNIT_TARGET_TYPE m_eCritFilter;
    // MPropertyDescription = What units should always receive a crit
    // MPropertySuppressExpr = m_bCanCrit == false
    CITADEL_UNIT_TARGET_TYPE m_eCritAlwaysFilter;
    // MPropertyStartGroup = Firing Behavior/Spinup
    // MPropertyDescription = Does the cycle time of this weapon change the more you fire it?
    bool m_bSpinsUp;
    // MPropertyDescription = -1 means use m_flCycleTime
    // MPropertySuppressExpr = m_bSpinsUp == false
    float32 m_flMaxSpinCycleTime;
    // MPropertySuppressExpr = m_bSpinsUp == false
    float32 m_flSpinIncreaseRate;
    // MPropertySuppressExpr = m_bSpinsUp == false
    float32 m_flSpinDecayRate;
    // MPropertySuppressExpr = m_bSpinsUp == false
    float32 m_flBuildUpRate;
    // MPropertyStartGroup = Firing Behavior/SemiAuto
    // MPropertyDescription = Does this weapon function as semi-auto, i.e you have to release the key to fire again
    bool m_bIsSemiAuto;
    // MPropertyStartGroup = Bullet Travel
    float32 m_flBulletSpeed;
    float32 m_flBulletSpeedRandomFactor;
    float32 m_flBulletGravityScale;
    float32 m_flBulletRadius;
    float32 m_flBulletRadiusVsWorld;
    float32 m_flBulletLifetime;
    float32 m_flVerticalAimBias;
    // MPropertyDescription = Scale of how much of the owner's currenty velocity to apply to the bullet (think Tribes discs)
    float32 m_flBulletInheritShooterVelocityScale;
    // MPropertyStartGroup = Zoom
    // MPropertyDescription = Do we zoom on right-click?
    bool m_bCanZoom;
    // MPropertyDescription = Absolute FOV when gun is zoomed. [Obsolete]: See m_flZoomFOV_Relative.
    // MPropertySuppressExpr = m_bCanZoom == false
    float32 m_flZoomFOV;
    // MPropertySuppressExpr = m_bCanZoom == false
    // MPropertyDescription = FOV Added onto user's base FOV. Should typically be negative.
    float32 m_flZoomFOV_Relative;
    // MPropertyStartGroup = Movement Speeds
    // MPropertyDescription = How fast we can walk when zoomed/shooting/reloading
    float32 m_flZoomMoveSpeedPercent;
    float32 m_flShootMoveSpeedPercent;
    float32 m_flReloadMoveSpeedPercent;
    // MPropertyStartGroup = Spread
    // MPropertyDescription = Does the weapon use our consistent spiral spread pattern? Turn off for true random spread.
    bool m_bUsesSpreadPattern;
    // MPropertyDescription = Base spread when shooting down sights
    float32 m_Spread;
    // MPropertyDescription = Does the first shot ( e.g. at min decay ) ignore spread?
    bool m_bFirstShotPerfectAccuracy;
    // MPropertyDescription = Shooting spread penalty when shooting down sights 
    CRangeFloat m_AimingShootSpreadPenalty;
    // MPropertyDescription = Scale of multi-bullet (shotgun) spread in Y-axis
    float32 m_flScatterYawScale;
    // MPropertyDescription = Spread increase per shot. 0-1, % of max shoot penalty to add per shot.
    float32 m_flShootSpreadPenaltyPerShot;
    // MPropertyDescription = How much to normalize shoot spread penalty per shot based on fire rate pct. Y values between 0.0-1.0
    CitadelSpreadPerShotNormalization_t m_ShootSpreadPenaltyPerShotNormalization;
    // MPropertyDescription = Delay after shooting stops to start decaying shooting spread penalty.  -1 means use Cycle Time
    float32 m_flShootSpreadPenaltyDecayDelay;
    // MPropertyDescription = How much shoot spread penalty to decay per second
    float32 m_flShootSpreadPenaltyDecay;
    // MPropertyDescription = Spread penalty decay. This is used for things like mantle and dash.
    float32 m_flSpreadPenaltyDecay;
    // MPropertyDescription = NPCS ONLY. Spread penalty when aiming up
    float32 m_flShootingUpSpreadPenalty;
    // MPropertyDescription = NPCS ONLY. The amount of time the weapon is idle befoer we fully replenish the clip (0 means don't do it)
    float32 m_flAutoReplenishClip;
    // MPropertyDescription = NPCS ONLY. Aiming spread for npc guns. 
    CRangeFloat m_NpcAimingSpread;
    // MPropertyDescription = Shotgun Scatter offsets. Allows you to manually define where pellets from shotguns go. 
    CUtlVector<Vector2D> m_vecScatterOffsets;
    // MPropertyDescription = Shotgun Scatter pellet factor. Spread for shotguns is used to determine per pellet spread. This control the overall spread of the pattern.
    float32 m_flPelletScatterFactor;
    // MPropertyDescription = Shotgun Scatter pellet spread factor. Before applying spread to individual pellets, this factor is applied. No pellet spread is applied to the first bullet.
    float32 m_flPelletScatterSpreadFactor;
    // MPropertyDescription = Shotgun Scatter only. Should spread be applied to the first pellet?
    bool m_bApplySpreadToFirstPellet;
    // MPropertyDescription = Shotgun Pellet Spawn Origin Offsets. Allows you to manually define where pellets can be created.
    CUtlVector<Vector2D> m_vecOriginOffsets;
    // MPropertyStartGroup = Recoil
    // MPropertyDescription = Vertical view punch per shot
    float32 m_flVerticalPunch;
    // MPropertyDescription = Horizontal view punch per shot
    float32 m_flHorizontalPunch;
    CitadelWeaponRecoilData_t m_HorizontalRecoil;
    CitadelWeaponRecoilData_t m_VerticallRecoil;
    // MPropertyDescription = Factor for how much faster than cycle time it should take for recoil to reach it's peak. 1 = cycle time, 2 = 1/2 * cycletime, etc.
    float32 m_flRecoilSpeed;
    // MPropertyDescription = Factor for how much faster than cycle time before we should start recovering from recoil.
    float32 m_flRecoilRecoveryDelayFactor;
    // MPropertyDescription = How fast does recoil recovery down to the original crosshair position.
    float32 m_flRecoilRecoverySpeed;
    // MPropertyDescription = What % of cycletime does it take to reduce recoil index by 1.
    float32 m_flRecoilShotIndexRecoveryTimeFactor;
    int32 m_nRecoilSeed;
    // MPropertyStartGroup = Visuals
    // MPropertyDescription = Effect to actually fire into the world from this weapon. CP3.X = radius, CP3.Y = fire rate, CP3.Z = DPS.
    CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>> m_szBulletTravelTracerParticle;
    CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>> m_szSelfBulletTravelTracerParticle;
    CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>> m_szBulletLinkParticle;
    bool m_bUseDesatForFriendlyNonHeroTracer;
    // MPropertyDescription = What attachments to use when shooting this weapon.  By default we use the gun muzzles of the model.  Change to 'Custom' to allow specifying a custom attachment.
    EAttachmentSourceType m_eAttachmentSourceType;
    // MPropertySuppressExpr = m_eAttachmentSourceType != EAttachmentSource_Custom
    CUtlString m_strCustomAttachmentSource;
    CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>> m_szMuzzleFlashEffectName;
    // MPropertyDescription = Bullet impact effect.  CP0=position & surface normal, CP1=position & reflect dir, CP2=position & bullet dir, CP3=damage CP4=normal CP5=explosion radius
    CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>> m_strWeaponImpactEffect;
    // MPropertyFriendlyName = Surface Impact Effects
    // MPropertyDescription = Per surface impact effects.  CP0=position & surface normal, CP1=position & reflect dir, CP2=position & bullet dir, CP3=damage CP4=normal CP5=explosion radius
    CUtlOrderedMap<CUtlStringToken, PerSurfaceImpactEffects_t> m_mapImpactEffects;
    // MPropertyDescription = Use the ability name of the weapon instead of the generic primary weapon name
    bool m_bUseWeaponAbilityName;
    // MPropertyDescription = Amount of force to apply to breakables and ragdolls
    float32 m_flDamageForce;
    // MPropertyStartGroup = Sounds
    CSoundEventName m_strShootSound;
    CSoundEventName m_strFirstShotSound;
    CSoundEventName m_strShotReleaseSound;
    CSoundEventName m_strBulletLoopingSound;
    CSoundEventName m_strBulletWhizSound;
    CSoundEventName m_strBulletImpactSound;
    float32 m_flBulletWhizDistance;
    CSoundEventName m_strReloadSound;
    CSoundEventName m_strReloadEndSound;
    CSoundEventName m_strLocalPlayerBulletImpactSound;
    CSoundEventName m_strLocalPlayerBulletImpactHeavySound;
    CSoundEventName m_strZoomInSound;
    CSoundEventName m_strZoomOutSound;
    CSoundEventName m_strSpinUpSound;
    CSoundEventName m_strSpinDownSound;
    CSoundEventName m_strSpinUpLoopSound;
private:
    uint8 pad_0758[28];
public:
    // MPropertyStartGroup = Networking
    // MPropertyDescription = Max Lag Compensation. Reduces favor-the-shooter is lower than sv_maxunlag
    float32 m_flMaxLagCompensation;
};

KV3 Class Defaults

{
    m_flBulletDamage = 0.0
    m_eDamageType = "CITADEL_DAMAGETYPE_BULLET"
    m_iBullets = 1
    m_iSplitShotsMax = -1
    m_bHitOnceAcrossAllBullets = false
    m_iBulletsToFullyClaimOrb = 1
    m_flExplosionRadius = 0.0
    m_flExplosionDamageScaleAtMaxRadius = 0.3
    m_bAllowExplosionToCollectGold = false
    m_iClipSize = 0
    m_flCycleTime = 0.15
    m_flBulletCreationDelay = 0.0
    m_iBurstShotCount = 1
    m_flIntraBurstCycleTime = 0.0
    m_iAmmoConsumedPerShot = 1
    m_flRange = 8192.0
    m_flRangeWhileZoomed = 0.0
    m_flDamageFalloffStartRange = 0.0
    m_flDamageFalloffEndRange = 900.0
    m_flDamageFalloffBias = 0.5
    m_flDamageFalloffStartScale = 1.0
    m_flDamageFalloffEndScale = 0.0
    m_bDontPassThroughPortals = false
    m_bPlayImpactEffectsOnTeammates = false
    m_flPenetrationPercent = 0.0
    m_flIronSightsTime = 0.1
    m_reloadDuration = 0.0
    m_bReloadUseActiveWeaponInfoDuration = false
    m_bReloadSingleBullets = false
    m_bReloadSingleBulletsAllowCancel = false
    m_flReloadSingleBulletsInitialDelay = 0.0
    m_bCanCrit = true
    m_flCritBonusStartRange = 0.0
    m_flCritBonusEndRange = 0.0
    m_flCritBonusStart = 1.0
    m_flCritBonusEnd = 1.0
    m_flCritBonusAgainstNPCs = 0.2
    m_eCritFilter = "CITADEL_UNIT_TARGET_ALL"
    m_eCritAlwaysFilter = ""
    m_bSpinsUp = false
    m_flMaxSpinCycleTime = -1.0
    m_flSpinIncreaseRate = 0.0
    m_flSpinDecayRate = 0.0
    m_flBuildUpRate = -1.0
    m_bIsSemiAuto = false
    m_flBulletSpeed = 1000.0
    m_flBulletSpeedRandomFactor = 0.0
    m_flBulletGravityScale = 1.0
    m_flBulletRadius = 0.0
    m_flBulletRadiusVsWorld = 0.0
    m_flBulletLifetime = 0.0
    m_flVerticalAimBias = 0.0
    m_flBulletInheritShooterVelocityScale = 0.0
    m_bCanZoom = true
    m_flZoomFOV = 70.0
    m_flZoomFOV_Relative = -5.0
    m_flZoomMoveSpeedPercent = 0.75
    m_flShootMoveSpeedPercent = 0.75
    m_flReloadMoveSpeedPercent = 1.0
    m_bUsesSpreadPattern = true
    m_Spread = 0.2
    m_bFirstShotPerfectAccuracy = false
    m_AimingShootSpreadPenalty = 0.0
    m_flScatterYawScale = 1.0
    m_flShootSpreadPenaltyPerShot = 0.0
    m_ShootSpreadPenaltyPerShotNormalization = 
    {
        m_bNormalizeSpreadPerShot = false
        m_FireRatePctRange = [ 0.0, 100.0 ]
        m_SpreadPerShotFactor = 1.0
    }
    m_flShootSpreadPenaltyDecayDelay = -1.0
    m_flShootSpreadPenaltyDecay = 1.0
    m_flSpreadPenaltyDecay = 3.0
    m_flShootingUpSpreadPenalty = 0.0
    m_flAutoReplenishClip = 0.0
    m_NpcAimingSpread = 0.0
    m_vecScatterOffsets = [  ]
    m_flPelletScatterFactor = 1.0
    m_flPelletScatterSpreadFactor = 0.5
    m_bApplySpreadToFirstPellet = false
    m_vecOriginOffsets = [  ]
    m_flVerticalPunch = 1.0
    m_flHorizontalPunch = 0.5
    m_HorizontalRecoil = 
    {
        m_Range = 0.0
        m_flBurstSlope = 0.0
        m_flBurstExponent = 1.0
        m_flBurstConstant = 0.0
    }
    m_VerticallRecoil = 
    {
        m_Range = 0.0
        m_flBurstSlope = 0.0
        m_flBurstExponent = 1.0
        m_flBurstConstant = 0.0
    }
    m_flRecoilSpeed = 1.0
    m_flRecoilRecoveryDelayFactor = 1.0
    m_flRecoilRecoverySpeed = 1.0
    m_flRecoilShotIndexRecoveryTimeFactor = 0.25
    m_nRecoilSeed = 0
    m_szBulletTravelTracerParticle = resource_name:"particles/weapon_fx/default_tracer.vpcf"
    m_szSelfBulletTravelTracerParticle = resource_name:""
    m_szBulletLinkParticle = resource_name:""
    m_bUseDesatForFriendlyNonHeroTracer = true
    m_eAttachmentSourceType = "EAttachmentSource_WeaponMuzzles"
    m_strCustomAttachmentSource = "ability_cast"
    m_szMuzzleFlashEffectName = resource_name:""
    m_strWeaponImpactEffect = resource_name:""
    m_mapImpactEffects = 
    {
    }
    m_bUseWeaponAbilityName = false
    m_flDamageForce = 50.0
    m_strShootSound = soundevent:""
    m_strFirstShotSound = soundevent:""
    m_strShotReleaseSound = soundevent:""
    m_strBulletLoopingSound = soundevent:""
    m_strBulletWhizSound = soundevent:""
    m_strBulletImpactSound = soundevent:""
    m_flBulletWhizDistance = 150.0
    m_strReloadSound = soundevent:""
    m_strReloadEndSound = soundevent:""
    m_strLocalPlayerBulletImpactSound = soundevent:""
    m_strLocalPlayerBulletImpactHeavySound = soundevent:""
    m_strZoomInSound = soundevent:""
    m_strZoomOutSound = soundevent:""
    m_strSpinUpSound = soundevent:""
    m_strSpinDownSound = soundevent:""
    m_strSpinUpLoopSound = soundevent:""
    m_flMaxLagCompensation = 340282346638528859811704183484516925440.0
}