Warning, /frameworks/ktexteditor/autotests/src/test.uc is written in an unsupported language. File is not indexed.

0001 //=============================================================================
0002 // Shield Gun
0003 //=============================================================================
0004 class ShieldGun extends Weapon
0005     config(user);
0006 
0007 #EXEC OBJ LOAD FILE=InterfaceContent.utx
0008 
0009 var Sound       ShieldHitSound;
0010 var String              ShieldHitForce;
0011 
0012 replication
0013 {
0014     reliable if (Role == ROLE_Authority)
0015         ClientTakeHit;
0016 }
0017 
0018 simulated function DoAutoSwitch()
0019 {
0020 }
0021 
0022 simulated event RenderOverlays( Canvas Canvas )
0023 {
0024     local int m;
0025 
0026     if ((Hand < -1.0) || (Hand > 1.0))
0027     {
0028                 for (m = 0; m < NUM_FIRE_MODES; m++)
0029                 {
0030                         if (FireMode[m] != None)
0031                         {
0032                                 FireMode[m].DrawMuzzleFlash(Canvas);
0033                         }
0034                 }
0035         }
0036     Super.RenderOverlays(Canvas);
0037 }
0038 
0039 // AI Interface
0040 function GiveTo(Pawn Other, optional Pickup Pickup)
0041 {
0042         Super.GiveTo(Other, Pickup);
0043         
0044         if ( Bot(Other.Controller) != None )
0045                 Bot(Other.Controller).bHasImpactHammer = true;
0046 }
0047 
0048 function bool CanAttack(Actor Other)
0049 {
0050         return true;
0051 }
0052 
0053 simulated function Timer()
0054 {
0055         local Bot B;
0056 
0057     if (ClientState == WS_BringUp)
0058     {
0059                 // check if owner is bot waiting to do impact jump
0060                 B = Bot(Instigator.Controller);
0061                 if ( (B != None) && B.bPreparingMove && (B.ImpactTarget != None) )
0062                 {
0063                         B.ImpactJump();
0064                         B = None;
0065                 }
0066     }
0067         Super.Timer();
0068         if ( (B != None) && (B.Enemy != None) )
0069                 BotFire(false);
0070 }
0071 
0072 function FireHack(byte Mode)
0073 {
0074         if ( Mode == 0 )
0075         {
0076                 FireMode[0].PlayFiring();
0077                 FireMode[0].FlashMuzzleFlash();
0078                 FireMode[0].StartMuzzleSmoke();
0079                 IncrementFlashCount(0);
0080         }
0081 }
0082 
0083 /* BestMode()
0084 choose between regular or alt-fire
0085 */
0086 function byte BestMode()
0087 {
0088         local float EnemyDist;
0089         local bot B;
0090 
0091         B = Bot(Instigator.Controller);
0092         if ( (B == None) || (B.Enemy == None) )
0093                 return 1;
0094 
0095         EnemyDist = VSize(B.Enemy.Location - Instigator.Location);
0096         if ( EnemyDist > 2 * Instigator.GroundSpeed )
0097                 return 1;
0098         if ( (B.MoveTarget != B.Enemy) && ((EnemyDist > 0.5 * Instigator.GroundSpeed) 
0099                 || (((B.Enemy.Location - Instigator.Location) Dot vector(Instigator.Rotation)) <= 0)) )
0100                 return 1;
0101         return 0;
0102 }
0103 
0104 // super desireable for bot waiting to impact jump
0105 function float GetAIRating()
0106 {
0107         local Bot B;
0108         local float EnemyDist;
0109 
0110         B = Bot(Instigator.Controller);
0111         if ( B == None )
0112                 return AIRating;
0113 
0114         if ( B.bPreparingMove && (B.ImpactTarget != None) )
0115                 return 9;
0116 
0117         if ( B.PlayerReplicationInfo.HasFlag != None )
0118         {
0119                 if ( Instigator.Health < 50 )
0120                         return AIRating + 0.35;
0121                 return AIRating + 0.25;
0122         }
0123                 
0124         if ( B.Enemy == None )
0125                 return AIRating;
0126 
0127         EnemyDist = VSize(B.Enemy.Location - Instigator.Location);
0128         if ( B.Stopped() && (EnemyDist > 100) )
0129                 return 0.1;
0130                 
0131         if ( (EnemyDist < 750) && (B.Skill <= 2) && !B.Enemy.IsA('Bot') && (ShieldGun(B.Enemy.Weapon) != None) )
0132                 return FClamp(300/(EnemyDist + 1), 0.6, 0.75);
0133 
0134         if ( EnemyDist > 400 )
0135                 return 0.1;
0136         if ( (Instigator.Weapon != self) && (EnemyDist < 120) )
0137                 return 0.25;
0138 
0139         return ( FMin(0.6, 90/(EnemyDist + 1)) );
0140 }
0141 
0142 // End AI interface
0143 
0144 function AdjustPlayerDamage( out int Damage, Pawn InstigatedBy, Vector HitLocation, 
0145                                                          out Vector Momentum, class<DamageType> DamageType)
0146 {
0147     local int Drain;
0148         local vector Reflect;
0149     local vector HitNormal;
0150     local float DamageMax;
0151 
0152         DamageMax = 100.0;
0153         if ( DamageType == class'Fell' )
0154                 DamageMax = 20.0;
0155     else if( !DamageType.default.bArmorStops || (DamageType == class'DamTypeShieldImpact' && InstigatedBy == Instigator) )
0156         return;
0157 
0158     if ( CheckReflect(HitLocation, HitNormal, 0) )
0159     {
0160         Drain = Min( Ammo[1].AmmoAmount*2, Damage );
0161                 Drain = Min(Drain,DamageMax);
0162             Reflect = MirrorVectorByNormal( Normal(Location - HitLocation), Vector(Instigator.Rotation) );
0163         Damage -= Drain;
0164         Momentum *= 1.25;
0165         Ammo[1].UseAmmo(Drain/2);
0166         DoReflectEffect(Drain/2);
0167     }
0168 }
0169 
0170 function DoReflectEffect(int Drain)
0171 {
0172     PlaySound(ShieldHitSound, SLOT_None);
0173     ShieldAltFire(FireMode[1]).TakeHit(Drain);
0174     ClientTakeHit(Drain);
0175 }
0176 
0177 simulated function ClientTakeHit(int Drain)
0178 {
0179         ClientPlayForceFeedback(ShieldHitForce);
0180     ShieldAltFire(FireMode[1]).TakeHit(Drain);
0181 }
0182 
0183 function bool CheckReflect( Vector HitLocation, out Vector RefNormal, int AmmoDrain )
0184 {
0185     local Vector HitDir;
0186     local Vector FaceDir;
0187 
0188     if (!FireMode[1].bIsFiring || Ammo[0].AmmoAmount == 0) return false;
0189 
0190     FaceDir = Vector(Instigator.Controller.Rotation);
0191     HitDir = Normal(Instigator.Location - HitLocation + Vect(0,0,8));
0192     //Log(self@"HitDir"@(FaceDir dot HitDir));
0193 
0194     RefNormal = FaceDir;
0195 
0196     if ( FaceDir dot HitDir < -0.37 ) // 68 degree protection arc
0197     {
0198         if (AmmoDrain > 0)
0199             Ammo[0].UseAmmo(AmmoDrain);
0200         return true;
0201     }
0202     return false;
0203 }
0204 
0205 function AnimEnd(int channel)
0206 {
0207     if (FireMode[0].bIsFiring)
0208     {
0209         LoopAnim('Charged');
0210     }
0211     else if (!FireMode[1].bIsFiring)    
0212     {
0213         Super.AnimEnd(channel);
0214     }
0215 }
0216 
0217 function float SuggestAttackStyle()
0218 {
0219     return 0.8;
0220 }
0221 
0222 function float SuggestDefenseStyle()
0223 {
0224     return -0.8;
0225 }
0226 
0227 simulated function float ChargeBar()
0228 {
0229         return FMin(1,FireMode[0].HoldTime/ShieldFire(FireMode[0]).FullyChargedTime);
0230 } 
0231 
0232 defaultproperties
0233 {
0234     ItemName="Shield Gun"
0235     IconMaterial=Material'InterfaceContent.Hud.SkinA'
0236     IconCoords=(X1=200,Y1=281,X2=321,Y2=371)
0237 
0238         bShowChargingBar=true
0239     bCanThrow=false
0240     FireModeClass(0)=ShieldFire
0241     FireModeClass(1)=ShieldAltFire
0242     InventoryGroup=1
0243     Mesh=mesh'Weapons.ShieldGun_1st'
0244     BobDamping=2.2
0245     PickupClass=class'ShieldGunPickup'
0246     EffectOffset=(X=15.0,Y=6.7,Z=1.2)
0247     bMeleeWeapon=true
0248     ShieldHitSound=Sound'WeaponSounds.ShieldGun.ShieldReflection'
0249     DrawScale=0.4
0250     PutDownAnim=PutDown
0251     DisplayFOV=60
0252     PlayerViewOffset=(X=2,Y=-0.7,Z=-2.7)
0253     PlayerViewPivot=(Pitch=500,Roll=0,Yaw=500)
0254 
0255     UV2Texture=Material'XGameShaders.WeaponEnvShader'    
0256 
0257     AttachmentClass=class'ShieldAttachment'
0258     SelectSound=Sound'WeaponSounds.ShieldGun_change'
0259         SelectForce="ShieldGun_change"
0260         ShieldHitForce="ShieldReflection"
0261 
0262         AIRating=0.35
0263         CurrentRating=0.35
0264 
0265         DefaultPriority=2
0266 }