Article View: alt.games.unreal.tournament
Article #191407Re: The final skill to master ... any advice?
From: goPostal
Date: Wed, 17 Dec 2008 14:38
Date: Wed, 17 Dec 2008 14:38
25 lines
17338 bytes
17338 bytes
"ยงฤรdarts" <sixdartsREMOVE@hotmail.com> wrote in message
news:VsadnYncI41oWNXUnZ2dnUVZ_gednZ2d@giganews.com...
> OK. I can rocket jump. I can hammer jump. .. I can shoot my teleporter
> puck all the way across a map with rockets or a shock ball. I've done
> skeet
> shooting with teleporter pucks and the shock rifle. I can even slide
> across
> the floor and break dance. Other UT skills I have gained over the years
> are
> too numerous to name.
>
> What I can not figure out how to do is block incoming fire with my impact
> hammer. I've seen it done and I know guys who can do it fairly regularly.
> I did it accidentally once, but I'll be dipped in shit if I know how I did
> it.
>
> So, any tips? What weapons can be blocked? What weapons can not be
> blocked? And how the hell does one accomplish this?
OK I pulled the code for the hammer. There is a very small area in which to
block the incoming weapon fire, so timing is crucial. Here is the weapon
code (I'll explain it later when I get home):
//=============================================================================// ImpactHammer.//=============================================================================class ImpactHammer extends TournamentWeapon;#exec MESH IMPORT MESH=ImpactHammer ANIVFILE=MODELS\impact_a.3DDATAFILE=MODELS\impact_d.3D X=0 Y=0 Z=0#exec MESH ORIGIN MESH=ImpactHammer X=0 Y=0 Z=0 YAW=64 PITCH=0 ROLL=-56#exec MESH SEQUENCE MESH=ImpactHammer SEQ=All STARTFRAME=0NUMFRAMES=56#exec MESH SEQUENCE MESH=ImpactHammer SEQ=Select STARTFRAME=0NUMFRAMES=17#exec MESH SEQUENCE MESH=ImpactHammer SEQ=Still STARTFRAME=17NUMFRAMES=1#exec MESH SEQUENCE MESH=ImpactHammer SEQ=Pull STARTFRAME=17NUMFRAMES=5#exec MESH SEQUENCE MESH=ImpactHammer SEQ=Shake STARTFRAME=22NUMFRAMES=10#exec MESH SEQUENCE MESH=ImpactHammer SEQ=Fire STARTFRAME=35NUMFRAMES=16#exec MESH SEQUENCE MESH=ImpactHammer SEQ=Down STARTFRAME=51NUMFRAMES=5#exec TEXTURE IMPORT NAME=JImpactHammer1 FILE=MODELS\imp1.PCX GROUP=SkinsLODSET=2#exec TEXTURE IMPORT NAME=JImpactHammer2 FILE=MODELS\imp2.PCX GROUP=SkinsLODSET=2#exec TEXTURE IMPORT NAME=JImpactHammer3 FILE=MODELS\imp3.pCX GROUP=SkinsLODSET=2#exec TEXTURE IMPORT NAME=JImpactHammer4 FILE=MODELS\imp4.PCX GROUP=SkinsLODSET=2#exec MESHMAP SCALE MESHMAP=ImpactHammer X=0.006 Y=0.006 Z=0.007#exec MESHMAP SETTEXTURE MESHMAP=ImpactHammer NUM=0 TEXTURE=JImpactHammer1#exec MESHMAP SETTEXTURE MESHMAP=ImpactHammer NUM=1 TEXTURE=JImpactHammer2#exec MESHMAP SETTEXTURE MESHMAP=ImpactHammer NUM=2 TEXTURE=JImpactHammer3#exec MESHMAP SETTEXTURE MESHMAP=ImpactHammer NUM=3 TEXTURE=JImpactHammer4#exec MESH IMPORT MESH=ImpPick ANIVFILE=MODELS\imppick_a.3DDATAFILE=MODELS\imppick_d.3D X=0 Y=0 Z=0#exec MESH ORIGIN MESH=ImpPick X=0 Y=0 Z=0 YAW=0 ROLL=-64#exec MESH SEQUENCE MESH=ImpPick SEQ=All STARTFRAME=0 NUMFRAMES=1#exec MESH SEQUENCE MESH=ImpPick SEQ=Still STARTFRAME=0 NUMFRAMES=1#exec TEXTURE IMPORT NAME=JImpPick1 FILE=MODELS\imp0.PCX GROUP=SkinsLODSET=2#exec MESHMAP SCALE MESHMAP=ImpPick X=0.1 Y=0.1 Z=0.2#exec MESHMAP SETTEXTURE MESHMAP=ImpPick NUM=1 TEXTURE=JImpPick1#exec MESH IMPORT MESH=ImpactHandm ANIVFILE=MODELS\impacthand_a.3DDATAFILE=MODELS\impacthand_d.3D#exec MESH ORIGIN MESH=ImpactHandm X=30 Y=-130 Z=-157 YAW=64 ROLL=-64#exec MESH SEQUENCE MESH=ImpactHandm SEQ=All STARTFRAME=0 NUMFRAMES=13#exec MESH SEQUENCE MESH=ImpactHandm SEQ=Pull STARTFRAME=1 NUMFRAMES=10#exec MESH SEQUENCE MESH=ImpactHandm SEQ=Shake STARTFRAME=12 NUMFRAMES=1#exec MESH SEQUENCE MESH=ImpactHandm SEQ=Still STARTFRAME=0 NUMFRAMES=1#exec MESHMAP SCALE MESHMAP=ImpactHandm X=0.06 Y=0.06 Z=0.12#exec MESHMAP SETTEXTURE MESHMAP=ImpactHandm NUM=1 TEXTURE=JImpPick1#exec TEXTURE IMPORT NAME=IconHammer FILE=TEXTURES\HUD\WpnMpact.PCXGROUP="Icons" MIPS=OFF#exec TEXTURE IMPORT NAME=UseHammer FILE=TEXTURES\HUD\UseMpact.PCXGROUP="Icons" MIPS=OFF#exec AUDIO IMPORT FILE="Sounds\ImpactHammer\impact-regularfire.WAV"NAME="ImpactFire" GROUP="ASMD"#exec AUDIO IMPORT FILE="Sounds\ImpactHammer\impact-altfireSTART.WAV"NAME="ImpactAltFireStart" GROUP="ASMD"#exec AUDIO IMPORT FILE="Sounds\ImpactHammer\impact-altfireRELEASE.WAV"NAME="ImpactAltFireRelease" GROUP="ASMD"#exec AUDIO IMPORT FILE="Sounds\ImpactHammer\impacthammerloop.WAV"NAME="ImpactLoop" GROUP="ASMD"#exec AUDIO IMPORT FILE="Sounds\ImpactHammer\impactpickup.WAV"NAME="ImpactPickup" GROUP="ASMD"var float ChargeSize, Count;var() sound AltFireSound;var() sound TensionSound;function float RateSelf( out int bUseAltMode ){ local float EnemyDist; local bool bRetreating; local Pawn P; bUseAltMode = 0; P = Pawn(Owner); if ( (P == None) || (P.Enemy == None) ) return 0; EnemyDist = VSize(P.Enemy.Location - Owner.Location); if ( (EnemyDist < 750) && P.IsA('Bot') && Bot(P).bNovice && (P.Skill <=2) && !P.Enemy.IsA('Bot') && (ImpactHammer(P.Enemy.Weapon) != None) ) return FClamp(300/(EnemyDist + 1), 0.6, 0.75); if ( EnemyDist > 400 ) return 0.1; if ( (P.Weapon != self) && (EnemyDist < 120) ) return 0.25; return ( FMin(0.8, 81/(EnemyDist + 1)) );}function float SuggestAttackStyle(){ return 10.0;}function float SuggestDefenseStyle(){ return -2.0;}simulated function PlayPostSelect(){ local Bot B; if ( Level.NetMode == NM_Client ) { Super.PlayPostSelect(); return; } B = Bot(Owner); if ( (B != None) && (B.Enemy != None) ) { B.PlayFiring(); B.bFire = 1; B.bAltFire = 0; Fire(1.0); }}simulated function bool ClientFire( float Value ){ if ( bCanClientFire ) { if ( (PlayerPawn(Owner) != None) && ((Level.NetMode == NM_Standalone) ||PlayerPawn(Owner).Player.IsA('ViewPort')) ) { if ( InstFlash != 0.0 ) PlayerPawn(Owner).ClientInstantFlash( InstFlash, InstFog); PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); } if ( Affector != None ) Affector.FireEffect(); Owner.PlayOwnedSound(Misc1Sound, SLOT_Misc,1.3*Pawn(Owner).SoundDampening); PlayAnim('Pull', 0.2, 0.05); if ( Role < ROLE_Authority ) GotoState('ClientFiring'); return true; } return false;}function Fire( float Value ){ bPointing=True; bCanClientFire = true; ClientFire(Value); Pawn(Owner).PlayRecoil(FiringSpeed); GoToState('Firing');}function AltFire( float Value ){ bPointing=True; bCanClientFire = true; Pawn(Owner).PlayRecoil(FiringSpeed); TraceAltFire(); ClientAltFire(value); GoToState('AltFiring');}simulated function ClientWeaponEvent(name EventType){ if ( EventType == 'FireBlast' ) { PlayFiring(); GotoState('ClientFireBlast'); }}simulated function PlayFiring(){ if (Owner != None) { if ( Affector != None ) Affector.FireEffect(); Owner.PlayOwnedSound(FireSound, SLOT_Misc,1.7*Pawn(Owner).SoundDampening,,,); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); PlayAnim( 'Fire', 0.65 ); }}simulated function PlayAltFiring(){ if (Owner != None) { if ( Affector != None ) Affector.FireEffect(); PlayOwnedSound(AltFireSound, SLOT_Misc,1.7*Pawn(Owner).SoundDampening,,,); LoopAnim( 'Fire', 0.65); }}state Firing{ function AltFire(float F) { } function Tick( float DeltaTime ) { local Pawn P; local Rotator EnemyRot; local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local actor HitActor; if ( bChangeWeapon ) GotoState('DownWeapon'); if ( Bot(Owner) != None ) { if ( Bot(Owner).Enemy == None ) Bot(Owner).bFire = 0; else Bot(Owner).bFire = 1; } P = Pawn(Owner); if ( P == None ) { AmbientSound = None; GotoState(''); return; } else if( P.bFire==0 ) { TraceFire(0); PlayFiring(); GoToState('FireBlast'); return; } ChargeSize += 0.75 * DeltaTime; Count += DeltaTime; if ( Count > 0.2 ) { Count = 0; Owner.MakeNoise(1.0); } if (ChargeSize > 1) { if ( !P.IsA('PlayerPawn') && (P.Enemy != None) ) { EnemyRot = Rotator(P.Enemy.Location - P.Location); EnemyRot.Yaw = EnemyRot.Yaw & 65535; if ( (abs(EnemyRot.Yaw - (P.Rotation.Yaw & 65535)) > 8000) && (abs(EnemyRot.Yaw - (P.Rotation.Yaw & 65535)) <57535) ) return; GetAxes(EnemyRot,X,Y,Z); } else GetAxes(P.ViewRotation, X, Y, Z); StartTrace = P.Location + CalcDrawOffset() + FireOffset.X * X +FireOffset.Y * Y + FireOffset.Z * Z; if ( (Level.NetMode == NM_Standalone) && P.IsA('PlayerPawn') ) EndTrace = StartTrace + 25 * X; else EndTrace = StartTrace + 60 * X; HitActor = Trace(HitLocation, HitNormal, EndTrace, StartTrace,true); if ( (HitActor != None) && (HitActor.DrawType == DT_Mesh) ) { ProcessTraceHit(HitActor, HitLocation, HitNormal,vector(AdjustedAim), Y, Z); PlayFiring(); GoToState('FireBlast'); } } } function BeginState() { ChargeSize = 0.0; Count = 0.0; } function EndState() { Super.EndState(); AmbientSound = None; }Begin: FinishAnim(); AmbientSound = TensionSound; SoundVolume = 255*Pawn(Owner).SoundDampening; LoopAnim('Shake', 0.9);}state ClientFiring{ simulated function AnimEnd() { AmbientSound = TensionSound; SoundVolume = 255*Pawn(Owner).SoundDampening; LoopAnim('Shake', 0.9); Disable('AnimEnd'); }}state FireBlast{ function Fire(float F) { } function AltFire(float F) { }Begin: if ( (Level.NetMode != NM_Standalone) && Owner.IsA('PlayerPawn') && (ViewPort(PlayerPawn(Owner).Player) == None) ) PlayerPawn(Owner).ClientWeaponEvent('FireBlast'); FinishAnim(); Finish();}state ClientFireBlast{ simulated function bool ClientFire(float Value) { return false; } simulated function bool ClientAltFire(float Value) { return false; } simulated function AnimEnd() { if ( Pawn(Owner) == None ) { PlayIdleAnim(); GotoState(''); } else if ( !bCanClientFire ) GotoState(''); else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else if ( Pawn(Owner).bAltFire != 0 ) Global.ClientAltFire(0); else { PlayIdleAnim(); GotoState(''); } }}function TraceFire(float accuracy){ local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local actor Other; Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation, X, Y, Z); StartTrace = Owner.Location + CalcDrawOffset() + FireOffset.Y * Y +FireOffset.Z * Z; AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, AimError,False, False); EndTrace = StartTrace + 120.0 * vector(AdjustedAim); Other = Pawn(Owner).TraceShot(HitLocation, HitNormal, EndTrace,StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim), Y,Z);}function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal,Vector X, Vector Y, Vector Z){ if ( (Other == None) || (Other == Owner) || (Other == self) || (Owner ==None)) return; ChargeSize = FMin(ChargeSize, 1.5); if ( (Other == Level) || Other.IsA('Mover') ) { ChargeSize = FMax(ChargeSize, 1.0); if ( VSize(HitLocation - Owner.Location) < 80 ) Spawn(class'ImpactMark',,, HitLocation+HitNormal,Rotator(HitNormal)); Owner.TakeDamage(36.0, Pawn(Owner), HitLocation, -69000.0 *ChargeSize * X, MyDamageType); } if ( Other != Level ) { if ( Other.bIsPawn && (VSize(HitLocation - Owner.Location) > 90) ) return; Other.TakeDamage(60.0 * ChargeSize, Pawn(Owner), HitLocation,66000.0 * ChargeSize * X, MyDamageType); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); }}function TraceAltFire(){ local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local actor Other; local Projectile P; local float speed; Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation, X, Y, Z); StartTrace = Owner.Location + CalcDrawOffset() + FireOffset.X * X +FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, AimError,False, False); EndTrace = StartTrace + 180 * vector(AdjustedAim); Other = Pawn(Owner).TraceShot(HitLocation, HitNormal, EndTrace,StartTrace); ProcessAltTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y, Z); // push aside projectiles ForEach VisibleCollidingActors(class'Projectile', P, 550,Owner.Location) if ( ((P.Physics == PHYS_Projectile) || (P.Physics == PHYS_Falling)) && (Normal(P.Location - Owner.Location) Dot X) > 0.9 ) { P.speed = VSize(P.Velocity); if ( P.Velocity Dot Y > 0 ) P.Velocity = P.Speed * Normal(P.Velocity + (750 -VSize(P.Location - Owner.Location)) * Y); else P.Velocity = P.Speed * Normal(P.Velocity - (750 -VSize(P.Location - Owner.Location)) * Y); }}function ProcessAltTraceHit(Actor Other, Vector HitLocation, VectorHitNormal, Vector X, Vector Y, Vector Z){ local vector realLoc; local float scale; if ( (Other == None) || (Other == Owner) || (Other == self) || (Owner ==None) ) return; realLoc = Owner.Location + CalcDrawOffset(); scale = VSize(realLoc - HitLocation)/180; if ( (Other == Level) || Other.IsA('Mover') ) { Owner.TakeDamage(24.0 * scale, Pawn(Owner), HitLocation, -40000.0 *X * scale, MyDamageType); } else { Other.TakeDamage(20 * scale, Pawn(Owner), HitLocation, 30000.0 * X *scale, MyDamageType); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); }}simulated function PlayIdleAnim(){ local Bot B; B = Bot(Owner); if ( (B != None) && (B.Enemy != None) ) { B.PlayFiring(); B.bFire = 1; B.bAltFire = 0; Fire(1.0); } else if ( Mesh != PickupViewMesh ) TweenAnim( 'Still', 1.0);}defaultproperties{ InstFlash=0.0 InstFog=(X=475.00000,Y=325.00000,Z=145.00000) MyDamageType=Impact InventoryGroup=1 AltFireSound=Sound'Botpack.ImpactFire' TensionSound=Sound'Botpack.ImpactLoop' bMeleeWeapon=True bRapidFire=true RefireRate=1.000000 AltRefireRate=1.000000 FireSound=Sound'Botpack.ImpactAltFireRelease' Misc1Sound=Sound'Botpack.ImpactAltFireStart' DeathMessage="%o got smeared by %k's piston." PickupMessage="You got the Impact Hammer." ItemName="Impact Hammer" PlayerViewOffset=(X=3.800000,Y=-1.600000,Z=-1.800000) PlayerViewMesh=Mesh'Botpack.ImpactHammer' PickupViewMesh=Mesh'Botpack.ImpPick' Mesh=Mesh'Botpack.ImpPick' ThirdPersonMesh=Mesh'Botpack.ImpactHandm' StatusIcon=Texture'Botpack.Icons.UseHammer' PickupSound=Sound'UnrealShare.Pickups.WeaponPickup' SelectSound=Sound'Botpack.ImpactPickup' Icon=Texture'Botpack.Icons.UseHammer' bMeshCurvy=False bNoSmooth=False SoundRadius=50 SoundVolume=200 WeaponDescription="Classification: Melee Piston\\n\\nPrimary Fire: Whentrigger is held down, touch opponents with this piston to inflict massivedamage.\\n\\nSecondary Fire: Damages opponents at close range and has theability to deflect projectiles.\\n\\nTechniques: Shoot at the ground whilejumping to jump extra high." NameColor=(R=255,G=192,B=0)}
Technical Details
Message-ID:
<T982l.10123$297.4107@newsfe23.iad>Path:
mbox-mo1.pugleaf.net!border1.nntp.dca.giganews.com!nntp.giganews.com!nx01.iad.newshosting.com!newshosting.com!69.16.185.21.MISMATCH!npeer03.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!post02.iad.highwinds-media.com!newsfe23.iad.POSTED!7564ea0f!not-for-mailReferences:
<VsadnYncI41oWNXUnZ2dnUVZ_gednZ2d@giganews.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!border1.nntp.dca.giganews.com!nntp.giganews.com!nx01.iad.newshosting.com!newshosting.com!69.16.185.21.MISMATCH!npeer03.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!post02.iad.highwinds-media.com!newsfe23.iad.POSTED!7564ea0f!not-for-mail From: "goPostal" <agutgopostal@hotmail.com> Newsgroups: alt.games.unreal.tournament References: <VsadnYncI41oWNXUnZ2dnUVZ_gednZ2d@giganews.com> Subject: Re: The final skill to master ... any advice? Lines: 26 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 X-RFC2646: Format=Flowed; Original Message-ID: <T982l.10123$297.4107@newsfe23.iad> NNTP-Posting-Host: ajhcoboonebdnpflemaihmdmaafnapij X-Complaints-To: abuse@charter.net X-Trace: aeeollfjikkhiokkfkhgnhldfhiklkalbdcaanpebdiddmokajhcoboonebdnpflbdfofdgpkjebbdjepndfkgbimhcfpaepgdogmpfpenaaojaeibccabbpihmlbflgbgjklipccefckbgb NNTP-Posting-Date: Wed, 17 Dec 2008 14:38:43 UTC Date: Wed, 17 Dec 2008 06:38:42 -0800 Bytes: 17228 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit