1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Two Factor Authentication is now available on BeyondUnreal Forums. To configure it, visit your Profile and look for the "Two Step Verification" option on the left side. We can send codes via email (may be slower) or you can set up any TOTP Authenticator app on your phone (Authy, Google Authenticator, etc) to deliver codes. It is highly recommended that you configure this to keep your account safe.

ShottyShock Mutator

Discussion in 'Programming' started by Burningmace, Apr 13, 2006.

  1. Burningmace

    Burningmace Banned

    Joined:
    Feb 18, 2004
    Messages:
    59
    Likes Received:
    0
    I want to make a mutator that turns the Shock Rifle into what is in essence a shotgun. Basically, I want primary fire to fire 6 shock beams at random trajectories within a 10 degree cone. Secondary fire would fire the normal primary fire of the Shock Rifle.

    I can do the second part (simply set FireModeClass(1) to XWeapons.ShockBeamFire in the defaultproperties of my ShottyShock class).

    How can I do the first part?
     
  2. rich_zap

    rich_zap New Member

    Joined:
    Jul 18, 2004
    Messages:
    133
    Likes Received:
    0
    Have a look at what shockbeamfire is extended off of. It should be InstantFire.

    Inside instantfire is a function called DoFireEffect if you look at the bottom of this function there is a line that says:

    Code:
        DoTrace(StartTrace, R);
    what you want to do is repeat that line 6 times so it looks like the following:

    Code:
    function DoFireEffect()
    {
        local Vector StartTrace;
        local Rotator R, Aim;
            local int i
    
        Instigator.MakeNoise(1.0);
    
        // the to-hit trace always starts right in front of the eye
        StartTrace = Instigator.Location + Instigator.EyePosition();
        Aim = AdjustAim(StartTrace, AimError);
        R = rotator(vector(Aim) + VRand()*FRand()*Spread);
    
            For(i=0; i<6; i++)
            {
                       DoTrace(StartTrace, R);
            }
    }
    and to add the random directional element merely make the variable Spread something other than 0.
     
  3. Burningmace

    Burningmace Banned

    Joined:
    Feb 18, 2004
    Messages:
    59
    Likes Received:
    0
    Will the beams actually do damage? I thought DoFireEffect was simply for showing the beam on the screen, not for actually doing the damage...
     
  4. MonsOlympus

    MonsOlympus Active Member

    Joined:
    May 27, 2004
    Messages:
    2,224
    Likes Received:
    0
    Yes I think your right, you'll need to iterate through dofireeffect totally not just the trace. I think modedofire is the one your looking for.
     
  5. Burningmace

    Burningmace Banned

    Joined:
    Feb 18, 2004
    Messages:
    59
    Likes Received:
    0
    rich_zap, I just noticed a problem with your code... wouldn't that fire 6 beams in one single random direction, instead of 6 beams in different random directions? Maybe you meant this...
    Code:
        For(i=0; i<6; i++)
        {
            R = rotator(vector(Aim) + VRand()*FRand()*Spread);
            DoTrace(StartTrace, R);
        }
    
    Still, I tried this but it's not working.
     
    Last edited: Apr 14, 2006
  6. Burningmace

    Burningmace Banned

    Joined:
    Feb 18, 2004
    Messages:
    59
    Likes Received:
    0
    Never mind, fixed it. I forgot to edit my ShottyShockArena.uc to actually replace the weapon (I always clone my actual mutator class from the previous weapon mod I make).

    Here's my code...

    ShottyShockArena.uc
    Code:
    class ShottyShockArena extends Mutator
        config(user);
    
    function bool CheckReplacement( Actor Other, out byte bSuperRelevant )
    {
        bSuperRelevant = 0;
        if ( xWeaponBase(Other) != None )
        {
            if ( xWeaponBase(Other).WeaponType == class'ShockRifle' )
                xWeaponBase(Other).WeaponType = class'MutShottyShock.ShottyShockRifle';
            else
                return true;
        }
        else if ( WeaponPickup(Other) != None )
        {
            if ( string(Other.Class) ~= "XWeapons.ShockRiflePickup" )
                ReplaceWith( Other, "MutShottyShock.ShottyShockRiflePickup");
            else
                return true;
        }
        else
            return true;
    
    
        return false;
    }
    
    defaultproperties
    {
         GroupName="ShottyShock"
         FriendlyName="Shotty Shock Rifle"
         Description="Replaces the ASMD Shock Rifle with the new ASMD SS2 Rifle."
    }
    
    ShottyShockBeamFire.uc
    Code:
    class ShottyShockBeamFire extends ShockBeamFire;
    
    function DoFireEffect()
    {
        local Vector StartTrace,X,Y,Z;
        local Rotator R, Aim;
        local int i;
    
        Instigator.MakeNoise(1.0);
    
        StartTrace = Instigator.Location + Instigator.EyePosition();
        if ( PlayerController(Instigator.Controller) != None )
        {
    		// for combos
    	   Weapon.GetViewAxes(X,Y,Z);
    		StartTrace = StartTrace + X*class'ShockProjFire'.Default.ProjSpawnOffset.X;
    		if ( !Weapon.WeaponCentered() )
    			StartTrace = StartTrace + Weapon.Hand * Y*class'ShockProjFire'.Default.ProjSpawnOffset.Y + Z*class'ShockProjFire'.Default.ProjSpawnOffset.Z;
    	}
    	Aim = AdjustAim(StartTrace, AimError);
    	Spread = 0.3;
        for(i=0; i<6; i++)
        {
            R = rotator(vector(Aim) + VRand()*FRand()*Spread);
            DoTrace(StartTrace, R);
        }
    }
    
    defaultproperties
    {
         BeamEffectClass=Class'XWeapons.ShockBeamEffect'
         DamageType=Class'XWeapons.DamTypeShockBeam'
         DamageMin=45
         DamageMax=45
         TraceRange=17000.000000
         Momentum=60000.000000
         bReflective=True
         FireSound=SoundGroup'WeaponSounds.ShockRifle.ShockRifleFire'
         FireForce="ShockRifleFire"
         FireRate=0.700000
         AmmoClass=Class'XWeapons.ShockAmmo'
         AmmoPerFire=1
         ShakeRotTime=2.000000
         ShakeOffsetMag=(X=-8.000000)
         ShakeOffsetRate=(X=-600.000000)
         ShakeOffsetTime=3.200000
         BotRefireRate=0.700000
         FlashEmitterClass=Class'XEffects.ShockBeamMuzFlash'
         aimerror=700.000000
    }
    
    ShottyShockRifle.uc
    Code:
    //=============================================================================
    // Shock Rifle
    //=============================================================================
    class ShottyShockRifle extends ShockRifle
        config(user);
    
    defaultproperties
    {
         EffectColor=(B=255,R=192,A=128)
         FireModeClass(0)=Class'MutShottyShock.ShottyShockBeamFire'
         FireModeClass(1)=Class'XWeapons.ShockBeamFire'
         SelectAnim="Pickup"
         PutDownAnim="PutDown"
         SelectSound=Sound'WeaponSounds.ShockRifle.SwitchToShockRifle'
         SelectForce="SwitchToShockRifle"
         AIRating=0.630000
         CurrentRating=0.630000
         OldMesh=SkeletalMesh'Weapons.ShockRifle_1st'
         OldPickup="WeaponStaticMesh.ShockRiflePickup"
         OldCenteredOffsetY=-8.000000
         OldPlayerViewOffset=(X=-15.000000,Z=-5.000000)
         OldSmallViewOffset=(X=-8.000000,Y=4.000000,Z=-8.000000)
         OldPlayerViewPivot=(Pitch=1000,Yaw=-800,Roll=-500)
         OldCenteredYaw=-500
         Description="The new ASMD SS2 Rifle has two firing modes, allowing for short and long range attacks.||The primary fire emits a 6-beam shotgun like blast. As innacurate as this is, it is extremely powerful in a short range battle.|The secondary fire is the same as the original ASMD Shock Rifle's primary fire, allowing for higher accuracy in longer range attacks."
         EffectOffset=(X=65.000000,Y=14.000000,Z=-10.000000)
         DisplayFOV=70.000000
         Priority=5
         HudColor=(B=255,G=0,R=128)
         SmallViewOffset=(X=11.000000,Y=11.500000,Z=-4.000000)
         CenteredOffsetY=1.000000
         CenteredRoll=1000
         CenteredYaw=-1000
         CustomCrosshair=8
         CustomCrossHairColor=(G=0)
         CustomCrossHairScale=1.333000
         CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross2"
         InventoryGroup=4
         PickupClass=Class'XWeapons.ShockRiflePickup'
         PlayerViewOffset=(X=4.000000,Y=8.000000,Z=-2.000000)
         PlayerViewPivot=(Pitch=-1000)
         BobDamping=1.800000
         AttachmentClass=Class'XWeapons.ShockAttachment'
         IconMaterial=Texture'HUDContent.Generic.HUD'
         IconCoords=(X1=250,Y1=110,X2=330,Y2=145)
         ItemName="Shotty Shock Rifle"
         LightType=LT_Steady
         LightEffect=LE_NonIncidence
         LightHue=200
         LightSaturation=70
         LightBrightness=255.000000
         LightRadius=4.000000
         LightPeriod=3
         Mesh=SkeletalMesh'NewWeapons2004.ShockRifle'
         DrawScale=0.700000
         HighDetailOverlay=Combiner'UT2004Weapons.WeaponSpecMap2'
    }
    
    ShottyShockRiflePickup.uc
    Code:
    //=============================================================================
    // ShockRiflePickup
    //=============================================================================
    class ShottyShockRiflePickup extends ShockRiflePickup;
    
    defaultproperties
    {
         StandUp=(Y=0.250000,Z=0.000000)
         MaxDesireability=0.630000
         InventoryType=Class'MutShottyShock.ShottyShockRifle'
         PickupMessage="You got the Shotty Shock Rifle."
         PickupSound=Sound'PickupSounds.ShockRiflePickup'
         PickupForce="ShockRiflePickup"
         DrawType=DT_StaticMesh
         StaticMesh=StaticMesh'NewWeaponPickups.ShockPickupSM'
         DrawScale=0.550000
         Skins(0)=Texture'UT2004Weapons.NewWeaps.ShockRifleTex0'
         Skins(1)=FinalBlend'UT2004Weapons.Shaders.PurpleShockFinal'
    }
    
    It's bloody awesome against close range targets, and for long range targets you've always got secondary fire :)

    Anyway, feel free to use this mutator on your own server.
     
  7. rich_zap

    rich_zap New Member

    Joined:
    Jul 18, 2004
    Messages:
    133
    Likes Received:
    0
    Glad it worked :). Oops, for some reason i thought the randomizer code was in DoTrace, my bad.
     
    Last edited: Apr 14, 2006
  8. Burningmace

    Burningmace Banned

    Joined:
    Feb 18, 2004
    Messages:
    59
    Likes Received:
    0
    No problem, just glad I got it fixed :)
     

Share This Page