[Setup] Product=Grapple Version=100 Archive=Grapple.umod SrcPath=..\Grapple MasterPath=.. Requires=UT2003Requirement Visible=False Group=SetupGroup Group=GrappleGroup [UT2003Requirement] Product=UT2003 Version=2199 [GrappleGroup] Visible=True Selected=True Ini=System\UT2003.ini,Engine.GameEngine.ServerPackages=Grapple File=(Src=System\Grapple.u,Size=44049) File=(Src=System\Grapple.int,Size=115) [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=455,Flags=3) Copy=(Src=System\Manifest.int~,Master=System\Manifest.int~,Size=672,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=587,Flags=3) [Setup] LocalProduct=Freefall ReadMe=Help\ReadmeFreefall.html SetupWindowTitle=Freefall Setup WindowTitle=Freefall ProductURL=http://www.lloydslounge.com/Freefall.html VersionURL=http://www.lloydslounge.com/Freefall.html Developer=SocratesJohnson DeveloperURL=http://www.lloydslounge.com/ Logo=Help\Logo.bmp Description=A no-gravity mutator. Push off walls using the jump key. Try not to get caught out in the open! ;) [UT2003Requirement] LocalProduct=UT2003 ProductURL=http://www.unrealtournament2003.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ [FreefallGroup] Caption=Freefall [Setup] LocalProduct=Grapple ReadMe=Help\ReadmeGrapple.html SetupWindowTitle=Grapple Setup WindowTitle=Grapple ProductURL=http://www.lloydslounge.com/Grapple.html VersionURL=http://www.lloydslounge.com/Grapple.html Developer=SocratesJohnson DeveloperURL=http://www.lloydslounge.com/ Logo=Help\Logo.bmp Description=A Grappling hook mutator [UT2003Requirement] LocalProduct=UT2003 ProductURL=http://www.unrealtournament2003.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ [GrappleGroup] Caption=Grapple *yx@C؉H3&OgSxNoneGrappleGrappleLauncher GrappleFireCoreTickEngine ViewPlayerSystemPutDownIsFirstPersonPlayerControllerVector EffectOffsetFireModeClassdoGrapplePullAllowTranslocationBy XWeapons FireHack DestroyedTimer SoundPitch beaconboneShouldTranslocatorHop ModifyPlayer PlayFiring StopFiringClientPlayForceFeedbackDoRecallEffect ViewCameraHasAmmo SoundVolumeClientSetViewTargetSpawnProjectileMeshRotatorweaponClassName DescriptionGrappleBeamEffectPawnGrappleMutator LinkColorAmmoChargeRateAmmoChargeMaxRepAmmo AmmoCharge MaxCamDistRecallFireForceTransFireForceRecallFireSoundTransFireSoundPickup ReduceAmmoGetAimGetTipLocationSetLinkStatusAlternateTranslocDest HudColorWeaponCentered UV2TextureExplosionDecalClientStopFire ModeTickIntBox ImpactSoundMomentumTransferDefaultPriority SelectForceY2X2Y1X1 SelectSoundGrappleVelocityProjectileClass IconCoords IconMaterialPlayerViewPivotPlayerViewOffsetColor AdjustToss GroupNamebUpdateSimulatedPosition ItemNameInventoryGroup BobDampingKarma Lighting CollisionForce LightColor MovementCollisionRadiusCollisionHeight SelectAnim GiveWeaponIsHumanControlled PutDownAnim IsRelevant IdleAnimRateUser RemoteRole WeaponChange AIRatingbUnlitGiveToRenderOverlaysPhysicsCurrentRating bCanThrowbAlwaysRelevant bProjTarget DrawScale AdjustAimbOnlyDirtyReplication ProcessTouchEffectIsRelevant StartFireNetUpdateFrequencybNetTemporary AmbientGlowReachedDestinationCalcDrawOffset DisplayFOV ChargeBar AllowFireDestroyEffects GetAmmoCount SoundRadius bOwnerNoSee LifeSpan GetViewAxes Reselect GetAIRatingSpeedAttachmentClassPostBeginPlay MyDamageTypeBotFireIncrementFlashCount GiveAmmo DoAutoSwitch ConsumeAmmo InitEffects DoFireEffectFlashMuzzleFlashStartMuzzleSmoke bNetNotifyHitWallbBounceMutatorIsAllowed FriendlyName DamageRadius AttachToBone TweenTimeClampToMaxParticles DetailModemStartParticles mSizeRange mRegenRange FireAnimRate FireAnim LightRadiusSkins EyeHeightloadLightBrightness TextBuffer WeaponPickup DrawColorPackageClassRoleBeamTextureSoundbHiddenObjectNMode FunctionWallSetPosSetViewTarget ScriptTextInLatentExecutionGravity LightTypeA bAltFire MoveTargetFocushandLocDiffdt FiringMode OldWeaponLinkBCXYFZG FireModeR LocationStruct RotationMaxAmmoPrimaryCurAmmoPrimary bFinished bJustSpawnedWPPendingWeaponBotAnchor Velocity ReturnValueProceduralSound bIsFiring InAimErrorbSilentNetMode bDropDetail mSpawnVecA TimeSecondsmWaveAmplitude mWaveShift mWaveLockEndbSuperRelevant NextMutatorTeam ViewTargetM DistancedistDirStart HitLocation HitNormal DeltaTimeOther Attachment bNetOwner bNetInitial xEmitter InstigatorLastRenderTimeSizeXSizeYbDynamicLight bDeleteMeOwner LightHueWeapon WeaponFireSparks UnrealGame JumpSpot StrPropertyTransLauncher AmbientSoundSquadSquadAITranslocZOffsetbHasTranslocatorbTranslocatorHopTranslocationTargetRealTranslocationTargetInterfaceContentSkinA XGameShadersWeaponEnvShaderScreenNoiseFB TransCamFBZoomFXWeaponShaders XEffectsLinkMuzFlashBeam3rdLinkProtSphere LinkSparks RocketMarkTransRecallEffect LevelInfo DesiredRegen WeaponSounds P1GrenFloor1 PGrenFloor1MiscLinkslslink_muz_green link_muz_red XEffectMatlink_muz_yellowlink_muz_blueLinkBeamGreenFBLinkBeamYellowFBLinkBeamRedFBLinkBeamBlueFBTranslocatorModuleRegenerationTranslocatorFire Translocatortranslocator_changeXGame StartEffectxWeaponAttachmentxPawn ProjectileHUDxPlayerStructProperty LinkFire LinkScale BeamSoundsProjectileFireArrayProperty NamePropertyObjectPropertyPlayerReplicationInfoFloatProperty AIController ControllerTransDummyBeaconTransAttachment SoundGroupPhysicsVolumeLinkBeamEffectLinkBeamChildWeaponAttachmentDamTypeTeleFrag TransBeaconNavigationPointMutatorCanvasLevel MuzFlash EndEffectclr tileScaleX tileScaleY bLockedOnOldAmmoTTarget TTargetLoc DummyBeacon RecallEffect OldLinksShader OldLinkColor LinkedPawnbHitSomethingPrevLocPrevRot ProtSphere NumChildrenChildRotDiff WiggleMeBeamDirWeaponsTransLauncher_1st BoolProperty IntProperty ByteProperty FinalBlend SkeletalMeshActorGB bDeployedStyle newGrapplegrapbPreparingMove) GL -9:9:$6K#%YUYU3fE5 | | | | | | | | | | | |YU3f | | | | | | |3f&߻3fE53f&߻3fE53fE53fE5YU3f&߻3fE53fE53fE5YU3fE53f&߻3f%3f3f&߻YU3fɧ ɧ ɧ ɧ ɧ ɧ ɧ ɧ ɧ sCY3f3fYU3fɧ ==={L3fH[࿬3f3f3fYUYU3fwR^3f3fwR^3fHHH3f3fH3fd4YU3fɧ YUYU3fɧ ɧ ɧ ɧ ɧ ɧ ɧ ɧ sCYɧ Hɧ 3fɧ ɧ Hɧ 3fɧ ɧ ɧ ɧ ɧ ɧ ɧ ɧ Hɧ 3f3f3fɧ d.$zE-$?,"+$?*$L>  ^3a c$>HC]Translocator_changeg$l$mS : BA{$pBB9*OT N: @@M:#U$ff?GLKZ?G"BF"E"D"bS] Grapple";I^Q-9:9:$" YUg] KÆ3f K K K K KÂHF$DX$BA$PCGI@<kwSRrv$AB$@@"p$?x@hSA@$@\$@@]$?oSUFF cA&BP KÅH3fb3f3f3f3f3f%3f%3f3f%3f3f3f3f%uL0>?-@ 9D b;;< h4u!9?& & Doclass GrappleBeamEffect extends LinkBeamEffect; /* function HitWall( vector HitNormal, actor HitWall ) { Destroy(); } */ simulated function Tick(float dt) { local float LocDiff, RotDiff, WiggleMe,ls; local int c, n; local Vector BeamDir,X,Y,Z; local xWeaponAttachment Attachment; //local actor HitActor; // if (VSize(EndEffect) == 0.0) { // return; // } if (Role == ROLE_Authority && (Instigator == None || Instigator.Controller == None)) { Destroy(); return; } if (Level.NetMode == NM_DedicatedServer) { StartEffect = Instigator.Location + Instigator.EyeHeight*Vect(0,0,1); SetLocation(StartEffect); return; } // set beam start location if ( Instigator == None ) { SetLocation(StartEffect); } else { if ( Instigator.IsFirstPerson() ) { if ( (Instigator.Weapon == None) || Instigator.Weapon.WeaponCentered() || (Instigator.Weapon.Instigator == None) ) SetLocation( Instigator.Location ); else { Instigator.Weapon.GetViewAxes(X, Y, Z); SetLocation( (Instigator.Location + Instigator.CalcDrawOffset(Instigator.Weapon) + EffectOffset.X * X + Instigator.Weapon.Hand * EffectOffset.Y * Y + EffectOffset.Z * Z) ); } } else { Attachment = xPawn(Instigator).WeaponAttachment; if (Attachment != None && (Level.TimeSeconds - Attachment.LastRenderTime) < 1) SetLocation( Attachment.GetTipLocation() ); else SetLocation( Instigator.Location + Instigator.EyeHeight*Vect(0,0,1) + Normal(EndEffect - Instigator.Location) * 25.0 ); } if (Role == ROLE_Authority) // what clients will use if their instigator is not relevant yet StartEffect = Location; } BeamDir = Normal(EndEffect - Location); if (Instigator != None && Instigator.IsHumanControlled()) SetRotation(xPlayer(Instigator.Controller).GetAim()); else SetRotation(Rotator(BeamDir)); if (MuzFlash == None) MuzFlash = Spawn(class'LinkMuzFlashBeam3rd', self); MuzFlash.bHidden = (Instigator == None || Instigator.IsFirstPerson()); if (Sparks == None && EffectIsRelevant(EndEffect, false)) { Sparks = Spawn(class'LinkSparks', self); } ls = class'LinkFire'.default.LinkScale[Min(Links,5)]; if (Links != OldLinks || LinkColor != OldLinkColor) { // beam size mSizeRange[0] = default.mSizeRange[0] * (ls*0.6 + 1); mWaveShift = default.mWaveShift * (ls*0.6 + 1); // create/destroy children NumChildren = Min(Links+1, MAX_CHILDREN); for (c=0; c 0) { Skins[0] = FinalBlend'XEffectMat.LinkBeamYellowFB'; MuzFlash.Skins[0] = Texture'XEffectMat.link_muz_yellow'; LightHue = 40; } else { Skins[0] = FinalBlend'XEffectMat.LinkBeamGreenFB'; MuzFlash.Skins[0] = Texture'XEffectMat.link_muz_green'; LightHue = 100; } } else if (LinkColor == 1) { Skins[0] = FinalBlend'XEffectMat.LinkBeamRedFB'; MuzFlash.Skins[0] = Texture'XEffectMat.link_muz_red'; LightHue = 0; } else { Skins[0] = FinalBlend'XEffectMat.LinkBeamBlueFB'; MuzFlash.Skins[0] = Texture'XEffectMat.link_muz_blue'; LightHue = 160; } AmbientSound = BeamSounds[Min(Links,3)]; MuzFlash.mSizeRange[0] = MuzFlash.default.mSizeRange[0] * (ls*0.5 + 1); MuzFlash.mSizeRange[1] = MuzFlash.mSizeRange[0]; LightBrightness = 180 + 40*ls; LightRadius = 6 + 3*ls; if (Sparks != None) { Sparks.SetLinkStatus(Links, (LinkColor > 0), ls); Sparks.bHidden = (LinkColor > 0); Sparks.LightHue = LightHue; Sparks.LightBrightness = LightBrightness; Sparks.LightRadius = LightRadius - 3; } if (LinkColor > 0 && LinkedPawn != None) { if (ProtSphere == None) { ProtSphere = Spawn(class'LinkProtSphere'); if (LinkColor == 2) ProtSphere.Skins[0] = Texture'XEffectMat.link_muz_blue'; } } OldLinks = Links; OldLinkColor = LinkColor; } if ( Level.bDropDetail || Level.DetailMode == DM_Low ) { bDynamicLight = false; LightType = LT_None; } else if ( bDynamicLight ) LightType = LT_Steady; if (LinkedPawn != None) { EndEffect = LinkedPawn.Location + LinkedPawn.EyeHeight*Vect(0,0,0.5) - BeamDir*30.0; } mSpawnVecA = EndEffect; mWaveLockEnd = bLockedOn || (LinkColor > 0); // magic wiggle code if (bLockedOn || (LinkColor > 0)) { mWaveAmplitude = FMax(0.0, mWaveAmplitude - (mWaveAmplitude+5)*4.0*dt); } else { LocDiff = VSize((Location - PrevLoc) * Vect(1,1,5)); RotDiff = VSize(Vector(Rotation) - Vector(PrevRot)); WiggleMe = FMax(LocDiff*0.02, RotDiff*4.0); mWaveAmplitude = FMax(1.0, mWaveAmplitude - mWaveAmplitude*1.0*dt); mWaveAmplitude = FMin(16.0, mWaveAmplitude + WiggleMe); } PrevLoc = Location; PrevRot = Rotation; for (c=0; c 0); //mWaveLockEnd; Child[c].Skins[0] = Skins[0]; } } if (Sparks != None) { Sparks.SetLocation(EndEffect-BeamDir*10.0); if (bHitSomething) Sparks.SetRotation(Rotation); else Sparks.SetRotation(Rotator(-BeamDir)); Sparks.mRegenRange[0] = Sparks.DesiredRegen; Sparks.mRegenRange[1] = Sparks.DesiredRegen; Sparks.bDynamicLight = true; } if (LinkColor > 0 && LinkedPawn != None) { if (ProtSphere != None) { ProtSphere.SetLocation(EndEffect); ProtSphere.SetRotation(Rotation); ProtSphere.bHidden = false; if (LinkedPawn.IsFirstPerson()) ProtSphere.mSizeRange[0] = 20.0; else ProtSphere.mSizeRange[0] = 35.0; ProtSphere.mSizeRange[1] = ProtSphere.mSizeRange[0]; } } else { if (ProtSphere != None) ProtSphere.bHidden = true; } /* if ( bHitSomething && (Level.NetMode != NM_DedicatedServer) && (Level.TimeSeconds - ScorchTime > 0.07) ) { ScorchTime = Level.TimeSeconds; HitActor = trace(HitLocation,HitNormal,EndEffect + 100*BeamDir,EndEffect - 100*BeamDir,true); if ( (HitActor != None) && HitActor.bWorldGeometry ) spawn(class'LinkScorch',,,HitLocation,rotator(-HitNormal)); } */ } C class GrappleMutator extends Mutator; var String weaponClassName; function bool MutatorIsAllowed() { return true; } function ModifyPlayer(Pawn Other) { Other.GiveWeapon(weaponClassName); //log("ModifyPlayer(), gave grapple to pawn "$Other.OwnerName, 'GRAPPLE'); if ( NextMutator != None ) NextMutator.ModifyPlayer(Other); } function bool IsRelevant(Actor Other, out byte bSuperRelevant) { if (TransLauncher(Other) != None) { return false; } return super.IsRelevant(Other, bSuperRelevant); } dN(2e+{3f+{[XWZVY$]Grapple.GrappleLauncherQ] MovementW] Grapple%]Grappling Hook!nefvgN :~6w * a4w*a iO69:9:$w.* Ur * a  !r*a !a=' j/31-a8 kmq8  nolq}<.? pAN29D B7 rGw *Mw.* --' -'r.*--( -( s5!Z r.*sr*r*r*a  54.a:$ (..a.*a9$ ( ~ue' CSE`'.*r*X-w* A -Xr5w*r raL>(@%r tz>k{ US-.Sw*9:9:$ T:class GrappleFire extends ProjectileFire; var() Sound TransFireSound; var() Sound RecallFireSound; var TransDummyBeacon DummyBeacon; var TransRecallEffect RecallEffect; var bool bDeployed; // meaningful for client var() String TransFireForce; var() String RecallFireForce; var int GrappleVelocity; replication { reliable if ( bNetOwner && (ROLE < ROLE_Authority) ) doGrapplePull; } simulated function DestroyEffects() { Super.DestroyEffects(); if (DummyBeacon != None) DummyBeacon.Destroy(); if (RecallEffect != None) RecallEffect.Destroy(); } function InitEffects() { // don't even spawn on server if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) ) return; Super.InitEffects(); if( DummyBeacon == None ) DummyBeacon = Spawn(class'TransDummyBeacon'); Weapon.AttachToBone(DummyBeacon, 'beaconbone'); if ( RecallEffect == None ) RecallEffect = Spawn(class'TransRecallEffect'); Weapon.AttachToBone(RecallEffect, 'beaconbone'); SetTimer(0.1, true); } simulated function PlayFiring() { if (!bDeployed) { Weapon.PlayAnim(FireAnim, FireAnimRate, TweenTime); ClientPlayForceFeedback( TransFireForce ); // jdf } } function Rotator AdjustAim(Vector Start, float InAimError) { return Instigator.Controller.Rotation; } simulated function bool AllowFire() { return ( GrappleLauncher(Weapon).AmmoCharge >= 1.0 ); } simulated function DoRecallEffect() { RecallEffect.mStartParticles = RecallEffect.ClampToMaxParticles(100); ClientPlayForceFeedback( RecallFireForce ); // jdf } simulated function Timer() { if (DummyBeacon != None) { if (GrappleLauncher(Weapon).Grapple != None && !bDeployed) { bDeployed = true; DummyBeacon.bHidden = true; } else if (GrappleLauncher(Weapon).Grapple == None && bDeployed) { bDeployed = false; DummyBeacon.bHidden = false; DoRecallEffect(); } } } function projectile SpawnProjectile(Vector Start, Rotator Dir) { local Grapple newGrapple; if (GrappleLauncher(Weapon).grapple == None) { if ( (Instigator == None) || (Instigator.PlayerReplicationInfo == None) || (Instigator.PlayerReplicationInfo.Team == None) ) newGrapple= Spawn(class'Grapple.Grapple',,, Start, Dir); GrappleLauncher(Weapon).grapple = newGrapple; Weapon.PlaySound(TransFireSound,SLOT_Interact,,,,,false); } else { GrappleLauncher(Weapon).ViewPlayer(); GrappleLauncher(Weapon).grapple.Destroy(); GrappleLauncher(Weapon).grapple = None; Weapon.PlaySound(RecallFireSound,SLOT_Interact,,,,,false); } return newGrapple; } simulated function ModeTick(float DeltaTime) { local Grapple grap; if (bIsFiring) { grap = GrappleLauncher(Weapon).grapple; if ((grap != none) && (grap.Physics == PHYS_None)) { doGrapplePull(grap); } } } simulated function doGrapplePull(Grapple grapple) { local Vector distance; if (Role == ROLE_Authority) { if (Weapon.Owner.Physics == PHYS_Walking) { Weapon.Owner.SetPhysics(PHYS_Falling); } distance = grapple.Location - Weapon.Owner.Location; Weapon.Owner.Velocity = Normal(distance) * GrappleVelocity; } } function DoFireEffect() { if (GrappleLauncher(Weapon).grapple == None) { Super.DoFireEffect(); } } function StopFiring() { if (GrappleLauncher(Weapon).grapple != None) { GrappleLauncher(Weapon).grapple.Destroy(); } } y3u 9:9:$I9:9:$o$'3   '9?6 G1f+w*a1-2 |P !r.* )53w.*.a & 89:9:$r*r*a 9:9:$ #?a  r*a  r*:r*a  C!"*a   z6!ի6"6*w.'w*$9?&a  6wa  #? A9:9:$w*`a+. 5a+9P r*a -r* cr* t(a 9:, L9:9:9:9:%%?9?&?9?&9:&,%,-9:9:$xr*a %@@9?w*aQ9:%#9:%% % $(N% % $d9:&% % $% % $9:,%%?9?&&%4C9?,(@9?,w*79:9:%-9:%9?,69:% w*6r*a 69:,% -9:9:$-($-$w* #?A-- 9:%X- 9:%9?,@&%a(#??@$9999#% ף<$@??&A#%8 . w*&a a+ ?9?@A9?@A-9:%%%  w*a  A -a+  a+9P%&-' 9:% w* w*a a+-(f  %A| % B&%  w*-' VHe a   c9:9:$99a+a<"@ EBV9:B%+w*a* .Zr * %%Q%RK%.%!! "  w. *6. w*yra   կ#? ,  #>  6?66  9:9:$)6 6  &6 9?69?, .( P ( HHyqw*.qw*w* - $ eclass GrappleLauncher extends Weapon config(user); #EXEC OBJ LOAD FILE=InterfaceContent.utx var Grapple grapple; var() float MaxCamDist; var() float AmmoCharge; var int RepAmmo,OldAmmo; var() float AmmoChargeMax; var() float AmmoChargeRate; replication { reliable if ( bNetOwner && (ROLE==ROLE_Authority) ) grapple,RepAmmo; } // AI Interface... function GiveTo(Pawn Other, optional Pickup Pickup) { Super.GiveTo(Other, Pickup); if ( Bot(Other.Controller) != None ) Bot(Other.Controller).bHasTranslocator = true; } function bool ShouldTranslocatorHop(Bot B) { local float dist; local Actor N; if ( B.bTranslocatorHop && (B.Focus == B.TranslocationTarget) && B.InLatentExecution(B.LATENT_MOVETOWARD) && B.Squad.AllowTranslocationBy(B) ) { //if ( (Grapple != None) && Grapple.IsMonitoring(B.Focus) ) if (Grapple != None) return false; dist = VSize(B.TranslocationTarget.Location - B.Pawn.Location); if ( dist < 300 ) { // see if next path is possible N = B.AlternateTranslocDest(); if ( (N == None) || ((vector(B.Rotation) Dot Normal(N.Location - B.Pawn.Location)) < 0.5) ) { if ( dist < 200 ) { B.TranslocationTarget = None; B.RealTranslocationTarget = None; return false; } } else { B.TranslocationTarget = N; B.RealTranslocationTarget = B.TranslocationTarget; B.Focus = N; return true; } } if ( (vector(B.Rotation) Dot Normal(B.TranslocationTarget.Location - B.Pawn.Location)) < 0.5 ) { SetTimer(0.1,false); return false; } return true; } return false; } simulated function Timer() { local Bot B; if ( Instigator != None ) { B = Bot(Instigator.Controller); if ( (B != None) && (B.TranslocationTarget != None) && (B.bPreparingMove || ShouldTranslocatorHop(B)) ) FireHack(0); } Super.Timer(); } function FireHack(byte Mode) { local Actor TTarget; local vector TTargetLoc; if ( Mode == 0 ) { if ( Grapple != None ) { // this shouldn't happen //Grapple.bNoAI = true; Grapple.Destroy(); Grapple = None; } TTarget = Bot(Instigator.Controller).TranslocationTarget; if ( TTarget == None ) return; // hack in translocator firing here FireMode[0].PlayFiring(); FireMode[0].FlashMuzzleFlash(); FireMode[0].StartMuzzleSmoke(); IncrementFlashCount(0); ProjectileFire(FireMode[0]).SpawnProjectile(Instigator.Location,Rot(0,0,0)); // find correct initial velocity TTargetLoc = TTarget.Location; if ( JumpSpot(TTarget) != None ) { TTargetLoc.Z += JumpSpot(TTarget).TranslocZOffset; if ( (Instigator.Anchor != None) && Instigator.ReachedDestination(Instigator.Anchor) ) { // start from same point as in test Grapple.SetLocation(Grapple.Location + Instigator.Anchor.Location + (Instigator.CollisionHeight - Instigator.Anchor.CollisionHeight) * vect(0,0,1)- Instigator.Location); } } else if ( TTarget.Velocity != vect(0,0,0) ) { TTargetLoc += 0.3 * TTarget.Velocity; TTargetLoc.Z = 0.5 * (TTargetLoc.Z + TTarget.Location.Z); } else if ( (Instigator.Physics == PHYS_Falling) && (Instigator.Location.Z < TTarget.Location.Z) && (Instigator.PhysicsVolume.Gravity.Z > -800) ) TTargetLoc.Z += 128; Grapple.Velocity = Bot(Instigator.Controller).AdjustToss(Grapple.Speed, Grapple.Location, TTargetLoc,false); // Grapple.SetTranslocationTarget(Bot(Instigator.Controller).RealTranslocationTarget); } } // super desireable for bot waiting to translocate function float GetAIRating() { local Bot B; B = Bot(Instigator.Controller); if ( B == None ) return AIRating; if ( B.bPreparingMove && (B.TranslocationTarget != None) ) return 10; if ( B.bTranslocatorHop && ((B.Focus == B.MoveTarget) || ((B.TranslocationTarget != None) && (B.Focus == B.TranslocationTarget))) && B.Squad.AllowTranslocationBy(B) ) { if ( Instigator.Weapon == self ) SetTimer(0.2,false); return 4; } if ( Instigator.Weapon == self ) return AIRating; } function bool BotFire(bool bFinished, optional name FiringMode) { return false; } // End AI interface simulated function Weapon WeaponChange( byte F, bool bSilent ) { if (grapple != None) grapple.Destroy(); return super.WeaponChange(F, bSilent); } simulated function bool HasAmmo() { return true; } function ConsumeAmmo(int mode, float load) { } function ReduceAmmo() { enable('Tick'); AmmoCharge -= 1; RepAmmo -= 1; //if ( Bot(Instigator.Controller) != None ) //Bot(Instigator.Controller).TranslocFreq = 3 + FMax(Bot(Instigator.Controller).TranslocFreq,Level.TimeSeconds); } simulated function GetAmmoCount(out float MaxAmmoPrimary, out float CurAmmoPrimary) { MaxAmmoPrimary = AmmoChargeMax; CurAmmoPrimary = AmmoCharge; } function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned) { Super.GiveAmmo(m, WP,bJustSpawned); AmmoCharge = Default.AmmoCharge; RepAmmo = int(AmmoCharge); } simulated function bool StartFire(int Mode) { if ( (Mode == 1) || (Instigator.Controller.bAltFire == 0) || (PlayerController(Instigator.Controller) == None) ) return Super.StartFire(Mode); if ( (OldWeapon != None) && OldWeapon.HasAmmo() ) Instigator.PendingWeapon = OldWeapon; ClientStopFire(0); Instigator.Controller.StopFiring(); PutDown(); return false; } simulated function Tick(float dt) { /* if ( Bot(Instigator.Controller) != None ) { if ((Grapple != none) && (Grapple.Physics == PHYS_None)) { log("do grapple pull"); GrappleFire(FireMode[0]).doGrapplePull(Grapple); } } */ if (Role == ROLE_Authority) { if ( AmmoCharge >= AmmoChargeMax ) { if ( RepAmmo != int(AmmoCharge) ) // condition to avoid unnecessary bNetDirty of ammo RepAmmo = int(AmmoCharge); disable('Tick'); return; } AmmoCharge += dt*AmmoChargeRate; AmmoCharge = FMin(AmmoCharge, AmmoChargeMax); if ( RepAmmo != int(AmmoCharge) ) // condition to avoid unnecessary bNetDirty of ammo RepAmmo = int(AmmoCharge); } else { // client simulation of the charge bar AmmoCharge = FMin(AmmoCharge+dt*AmmoChargeRate, AmmoChargeMax); if (OldAmmo > RepAmmo) AmmoCharge -= 1.0; OldAmmo = RepAmmo; } } simulated function DoAutoSwitch() { } simulated function ViewPlayer() { if ( Instigator.Controller.IsA('PlayerController') && PlayerController(Instigator.Controller).ViewTarget == grapple ) { PlayerController(Instigator.Controller).ClientSetViewTarget( Instigator ); PlayerController(Instigator.Controller).SetViewTarget( Instigator ); grapple.SetRotation(PlayerController(Instigator.Controller).Rotation); } } simulated function ViewCamera() { if ( grapple!=None ) { if ( Instigator.Controller.IsA('PlayerController') ) { PlayerController(Instigator.Controller).SetViewTarget(grapple); PlayerController(Instigator.Controller).ClientSetViewTarget(grapple); PlayerController(Instigator.Controller).SetRotation( grapple.Rotation ); } } } simulated function Reselect() { if ( (grapple == None) || (Instigator.Controller.IsA('PlayerController') && (PlayerController(Instigator.Controller).ViewTarget == grapple)) ) ViewPlayer(); else ViewCamera(); } simulated event RenderOverlays( Canvas Canvas ) { local float tileScaleX, tileScaleY, dist, clr; if ( PlayerController(Instigator.Controller).ViewTarget == grapple ) { tileScaleX = Canvas.SizeX / 640.0f; tileScaleY = Canvas.SizeY / 480.0f; Canvas.DrawColor.R = 255; Canvas.DrawColor.G = 255; Canvas.DrawColor.B = 255; Canvas.DrawColor.A = 255; Canvas.Style = 255; Canvas.SetPos(0,0); Canvas.DrawTile( Material'TransCamFB', Canvas.SizeX, Canvas.SizeY, 0.0, 0.0, 512, 512 ); // !! hardcoded size Canvas.SetPos(0,0); dist = VSize(grapple.Location - Instigator.Location); if ( dist > MaxCamDist ) { clr = 255.0; } else { clr = (dist / MaxCamDist); clr *= 255.0; } clr = Clamp( clr, 20.0, 255.0 ); Canvas.DrawColor.R = clr; Canvas.DrawColor.G = clr; Canvas.DrawColor.B = clr; Canvas.DrawColor.A = 255; Canvas.DrawTile( Material'ScreenNoiseFB', Canvas.SizeX, Canvas.SizeY, 0.0, 0.0, 512, 512 ); // !! hardcoded size } else { Super.RenderOverlays(Canvas); } } simulated function bool PutDown() { ViewPlayer(); if (grapple != None) { grapple.Destroy(); } return Super.PutDown(); } simulated function Destroyed() { if (grapple != None) grapple.Destroy(); Super.Destroyed(); } simulated function float ChargeBar() { return AmmoCharge - int(AmmoCharge); } K -r w*(  9?,8ir*C99   ?f9?,**(' 99   ?a=(('( vclass Grapple extends Projectile; var GrappleBeamEffect Beam; replication { unreliable if (bNetInitial && Role == ROLE_Authority) Beam; } simulated function HitWall( vector HitNormal, actor Wall ) { SetPhysics(PHYS_None); PlaySound(ImpactSound, SLOT_Misc ); SetRotation(Rotator(HitNormal) + rot(16384,0,0)); // can't grapple player if( Wall.IsA('Pawn') ) { Destroy(); } } function PostBeginPlay() { Beam = Spawn(class'GrappleBeamEffect',Instigator); Beam.EndEffect = Location; if ( Role == ROLE_Authority ) { Velocity = Speed * Vector(Rotation); SetRotation(Rotation + rot(16384,0,0)); } } simulated function Tick(float DeltaTime) { local GrappleBeamEffect GB; if ( Instigator.Role < ROLE_Authority ) { if ( Beam == None ) { ForEach DynamicActors(class'GrappleBeamEffect', GB ) { if ( !GB.bDeleteMe && (GB.Instigator != None) && (GB.Instigator == Instigator) ) { Beam = GB; break; } } } } if ( Beam != None ) { Beam.EndEffect = Location; } } simulated function Destroyed() { if ( Beam != None ) { Beam.Destroy(); } Super.Destroyed(); } simulated function ProcessTouch( actor Other, vector HitLocation ) { if ( Other == Instigator && Physics == PHYS_None ) Destroy(); } iJ/Hw.*.-' RT|Jw#9?9D La/! $r..  . a+.  jkqjjkIk'@xjCkXk@ktjWkPkAkqkwyOk@@Dk kB@@P kD@BkZk]@f@dklkyn)yQ@M~cB^@RkJBdkXkYBKjgnljEkOySPO@@kvkmjryik}nc@Q@`kknlpyZkEk\kg@~kDysBe@M@Ymej_@nkl|kt@'@jBby kzBdknBfybkEjQkum{mz@D@AluBFtw@htbn]n_lwtn{tPn`jjnNtulat tLtitfkxtjn\tnLnFBgP#ybycjpB^kAB]jUniB_tYkHkNtlftlL@Nko@HkIlWtOt~tvn|jOtt>t}B`lKBZtBJtqm]t[@@tstTk[t|tttJjVja\Y`jbnfnetEtDB@tM@KtNtkFl]akhttVty}zty@~t!@in}@WttH@Hl}ntByB{Bcla@GlvBIBH@|kFkLjnwn/P^ZRk3pMoToSoWqpkkCnhokojolomkGnGor_zA`G {xvGyF}}JPK~- Y~xF e~&y r~Y k [ xmE,TJT b \ nZ {d HZr TF ai nr { s HtTyv b+ oJm {tu Gs Tm ar mX yvEH {I Hh Ug aA mB y|l ENs R. _K k* xKs DWB Q\s ]3jNgx~J F~_ S| `tnmto | I I / U 0 a 1m 2{aR IaS U^sa_k o_V{_U Je$ Vs bVu oVq|JV JJU VJ%c|HDcDj]geCDM"GGT ieb8vU[ n ;zP[ u6Ax[ w[ CeV%OTYt_M\[ lGC xTEZr YuYe6~s>tL:r^p l,y40e x4OoUex4N d(Nrhe @hs LN#Y ~G| OTC @W q2WloIl^ Wl[d }5rp[ g @s As !Otv[ C$Ot[ sEs@ >Ysyr L x4_:X Rw~[ If=V P6S BI J!KHeUkzN[ epq[ ax4qmO^x4AmG[ niMz|.GNu[Public] Object=(Name=Grapple.GrappleMutator,Class=Class,MetaClass=Engine.Mutator,Description="Grapple Mutator") System\Manifest.iniSystem\Manifest.int~System\Manifest.int@KSystem\Grapple.uSystem\Grapple.ints#ڴ