*E;@G.%G?];Nonesin2utCoreEngineSystemBotpackFireBeginMeshTimer BeginStatePickupMessage EndState TakeDamagePickupViewMeshAltFire ItemName SpriteAnim PickupSoundAnimEndFindInventoryType PlayIdleAnim NormalFireIcon ClientFireFinish PlayerPawnBot MultiSkinsClientAltFire SpawnRelic PlayRecoil ReplaceWith TraceFireTextureMutate PostRender PlayFiringSkinUseAmmo StatusIconVector DownWeaponIdleHandlePickupQueryAutoSwitchPriority GiveAmmo ActivateSetFontSetTextCreateControlSetDefaultDisplayPropertiesSetOwnerDisplayProcessTraceHitExplodeMaxDesireability SinTechs DrawScalePlayerViewOffsetSetHandPlayerViewMesh DeActivated Activatedshot LogPickupTick RespawnTime AdjustAimChangedWeaponPostBeginPlay PathNodeTournamentWeaponPlayAltFiringLogItemDeactivate DeathMessage SelectSound ShakeViewSelect AltFiring AIRatingPawnDropInventoryCarcassArmorImpactEffectPutDownCollisionHeightTournamentAmmo MyDamageTypeCollisionRadiusPickupViewScale RateSelfBlowUpClientInstantFlashDamageFlashO AltFireSoundThirdPersonMesh DestroyedSetTechWeapon FireSoundSuggestAttackStyleSwitchToBestWeaponUsedInWeaponSlot AmmoAmount CockingSound AmmoName SetTwoHandsPlayRepeatFiringArmorAbsorbDamage PlaySelectspeedbCollideActorsFlashYPickupAmmoCountUsedUp DrawBigNumDrownedMaxAmmobMeshEnviroMapChargeMomentumTransferAltDamageTypePickupGiveTo ProcessTouch SinMutatorInventoryGroup TweenDown BioshieldReturnToPreviousWeapon TechSoundFlyingSuggestDefenseStyleColorMagnumEject WeaponSetRenderOverlays Misc2Sound FiringSpeed MoveRocket ClientActiveSetDisplayProperties Repeater MuzzleScaleBringUp TraceShot ScriptedPawnT2 FireEffect CheckBeam SetRespawnSetSwitchPriorityThirdPersonScale PlaySpinDownMuzzleFlashVariationsSetup PlasmaBall SinPantsLoadingbDisplayableInv bIsAnArmorSinPlasmaBallMuzzleFlashScale ClientFiringu4 FireOffsetPhysicsExpireMessage SinHelmet boltloopProjectileFireTournamentPickup RemoteRoleFlashC Misc1Sound bActivatablebAutoActivate UpdateBeamActivateSound SetUpSlaveUserProjectileClassTeamFireTextureStrings DrawStatusFlashSAltProjectileClass WarnTargetExplosionDecalTeamTextureStringsLandedClientPutDown TestMagnumRegisteraHUDMutatorMutatorTakeDamage shakevert shakemagPlayerViewScale ShootLoadClientAltFiring CaptureSoundDownUT_ShieldBelt SinArmorshot2StyleTwiddlePlayPickupMessage ViewportSetEffectTextureSwayCheckForHUDMutatorSIN_invisibility NameColorArmorPriority spindownAdjustHitLocation LifeSpan ValidTouch TraceAltFireRotatorPlayFastReloading BecomeItem ClientReload RocketDeathPlayReloading RefireRate Explosion MaxSpeedTournamentHealth LightHueblownTouchBotDesireabilitySinAim shaketimeArmorAbsorptionbMuzzleFlashParticles GiveItemReceiveLocalizedMessageStationaryPawnMuzzleFlashStyleUWindow SpawnShellMuzzleFlashMesh bNoSmooth SinFlaggy doubleMagnumMuzzleFlashTextureStill bCanActivate SinSniperrunBeam MFTexture GetFreeMoveHitConcussionbolt boltstartConcussionGun FlashLength PlayerFirejoltedAltRefireRate bInstantHitbAltInstantHitbNetTemporary MeleeFire HellFireFire1bDrawMuzzleFlashGiveMinorWeapon Decapitated hitdamageSetOwnerLightingAdjustDesireFor PlasmaHit Shock2ProjDirectionalAttachPlayerJumpZScalingHealingAmount Projectile ModifyPlayer GiveWeaponsinBeamMass AmbientGlow ServerMove SpawnEffect DrawTypeFire2RegisterDamageMutator ComboMoveShoot BeginPlayClientAdjustPositionTournamentPlayerFistsCTFGame PlayFailed FlagIconT1DeathMatchPlusRenderTextureDeathQuadTech CheckforLock ClientDownHitWallActiveGiveInventoryCreated ActorEntered Plasmarifle SetMasterWarheadLauncherTechHUD SinCTFGame ExploWallOut ImpactSound bMeleeWeapon SoundVolume ParentAmmoUpdateRealWeaponlifeSwitchPriority UnspecifieddivisorCheckVisibility DoubleNameGetGrappleLauncherClientUpdatePosition SendAltFireDeActivateSound DropFromIdle2grappleCTFFlag PainRadius ShockRif2DiedPickupFunction plighing SendFireFell ReloadCount ClientFlashLightBrightness SpecialFire Lighting ZoneChange AddInventory ForceAltFire ForceFireCheckReplacementbFixedRotationDirClientMessage AddMutatordroppedSpawnNotificationbCollideWorldbUnlit ScaleGlowRaiseUp ToggleZoom LightEffect RotationRateDesiredRotationFeigningDeath PreBeginPlay LightType SoundRadius GameNamePlayPostSelect StopZoom LightRadiusLightSaturation TrueChainGun SpiderMine ShadowboltUseVamp ChainEnabledUseDQ PlayerLogin UseShield AmmoTech spiderammo bWarnTargetItemHUDPlasmaGrenadeWave BetaSniperSinChallengeCTFHUDDefaultWeaponScoreBoardTypeSinChallengeDominationHUD AimHelper UseVortexMachineGunAmmo Rippermk2 BeaconName SinWeapons SinBaseBolt MeleeEnabledGameReplicationInfoClass sniperammo sinctfrepSinCTFScoreboard GrapAmmoHealthEnabled bsinflag UseSplashMagClip DecapDamagesinbolt HealthDrop SpiderMineL MetSpidy metmrspidey SniperShell ShieldTech SinHealth5AssaultEnabled VengeanceSIN_GuidedMissile DegenerationGetTech SinHealthTech2UseFastSinHUDMutator Rotation UseEmpathySinDM EmpathyTech SinHealth100Sin2UTMenuItem ArmorEnabled RifleEnabledRazor3 ChaingunBetaSpidy sinriflehole SubSinBoltSinRocketPack ReleaseHook FastTechProtectionType1SinShotgunAmmo ChaingunAmmoUsedd NormalDamageAbsorptionPriority SIN_Grenade Regeneration sinshield PlasmaAmmo vamptech FireHookSin2UTDialogClientWindow Splashtech sin2uthudDoubleDamageTechNoProjectileZone RegenTechSinbulletholeEasyAimSin2utFramedWindowSinstarterboltSinAssaultHUD GrappleOffRocketEnabled SinHealth50 rsinflagMagnumenabledSinSpawnNotify HeldToolong SinRocket UseRegenPlayBotFiringPickupsEnabledzapped PlayAlarmbAltWarnTargetSuperExplosionboltend MenuHelpbSplashDamage MenuCaptionbOwnsCrosshair bSuperHeal RedColor bRapidFireRipperAltDeathRealSinSniper FinishingRocketLauncherUT_invisibility WarnCannons ChainGunShotgunenabled SinShotgunSinTechMutatorWingInExecute StakeOutUMenu RangedAttack TacticalMoveHunting GreenColornewflag EffectSound1PlasmaEnabledWeaponDescriptionPulsed ReturnSoundNotifyZooming ShootloopRedeemerDeath SpawnSound NumFramesS_Ammo SavedMoves bForceFire DeltaTime ClientLocOther AccuracyFireDirbWarnLocDiffNewMovebForceAltFire ProjClassDeltabTemp TimeStampCurrentTimeStamp clientErr ViewTargetReducedDamagePctPAmmo bestDist TranslocatorNewLocX ImpactHammer EnforcerDoubleEnforcer ShockRifle UT_BioRifle PulseGun SniperRiflehandBaseEyeHeight AdjustedAimHitLocNewVelX EyeHeight damageScalebFire projSpeed bAltFire NextMove ViewRotation NewWeapon bNetOwnerClipXNewLocYSkill bWaterZone HitLocation realbRun ClientClass bSizableC_GrappleLauncherUWindowDialogClientWindow bMuzzleFlashUWindowRootWindowUWindowCheckboxUWindowDialogControlUWindowWindowUWindowPulldownMenuUWindowLabelControlSetSize CreateWindow WindowTitleAlignWinLeftS2 DownSound WinHeight WinWidthWinTopbForceRootIconsbRight CurrentState bRealJumpripper WeaponName realbDuckPCalcDrawOffset Minigun2UT_FlakCannon UT_Eightball bHideWeaponNewVelYbMoveProjectilesbHighDetailModeExpType actualDamageProjectileSpeed Handedness DefaultFOVAimSpot SelectedItemSpriteSmokePuff DesiredFOV InvisibletrailNewLocZ aimerror WhiteColorDamageScalingRollMagSoundDampening Momentum ExploSoundLastUpdateTimeSetPos DrawIconNewVelZCarried bLockedOnPulse WeaponLight bCarriedItemRocketShieldSpriteBallExplosion WaterRingRifleMinigun FreeMoves bWeaponUp CurrentMoveDirClick AnimFrameUWindowPulldownMenuItem LastPainTime enemyDist enemyDirtargYawErrbIsBossAngle chalnge1sPickupsUWindowFramedWindow bMegaSpeedNDamage bWeaponStayBeepbSetUp Crosshair6Skins ArmorAmount PointRegion BestArmorTrackedbBotSpecialMoveSmokeLocationDVectorSmokeRotation NumPointsSmokeflak AltAccuracy ClipCountrealLoc SeekLockShellsMI_ArmorHealMax GenPickSndinv2RedSkin MyEffectshot1 Explode1RandRot bExplodedbExplosionEffect AnimTime GrenadeFloor bCanHitOwner bHitWater SmokeRateNumExtraGrenades InitialDirGeneric MoveAmount NumPuffsSilver WarlordHead Hidraul2load1 AmbientSoundpdownRiPick RiflePickupNumFire RifleRoundM DampenerM ChunkHitOldGuiderRotationGuidedRotation DeltaYaw DeltaPitchYawDiff PitchDiff Selection Location RandSpinSkaarjAltProjectileSpeedUMenuModMenuItem Initialized WeaponClass MenuItemJumpZ GroundSpeed bIsPlayerFatness HurtRadiusFire3bIsPawn TeamTexturesPlayOwnedSoundbBounceInstFogbOnlyOwnerSeeTeam WeaponString DamageRadiusdistTeamFireTexturesAutoMag HitNormal StatusDoll StatusBelt HomeBase bProjTargetEffects ChallengeHUD DamageTypebBlockPlayers bBlockActorsF PlasmaSphere NetPriority FireAnims BecomePickupbHiddentempClearDEWPitchRingExplosionUDamageUT_SpriteSmokePuffHealthRoll HealthPackMedBoxtSbChangeWeaponGStaticSaveConfig EightballReSpawnDynamicLoadObject FlagBase HealthVialScaleNewRotYaw ThighPadsiNewZone ShockProjRPockPBolt WarShell FlakAmmo MiniammoZUnrealCTFScoreboard GoldColor BulletBox ReturnValue AssaultHUDItemArmor2CockingLowDetailTexture ShockCoreY RocketPackCBX ScriptText PurpleColor StatusScale RifleShellRazor2 WeaponPickup StartErrorDoubleSwitchPriorityRange UT_WallHit ChunkTrailChallengeCTFHUD BladeHopper BlastMarkUT_ShieldBeltEffectUT_RingExplosion5UT_RingExplosion3UT_HeavyWallHitEffectUT_LightWallHitEffect UT_GrenadeUT_FlameExplosionUT_RingExplosionBioAmmoScorch StarterBolt TinyRedFontShockrifleWave ShockBeam RocketTrail RocketMk2RedFlag bPointing BeamSize PlasmaCapGuidedWarshellEClip TakenSoundCTFReplicationInfoChallengeDominationHUD EnergyImpact BoltScorchPickupMessagePlusA FireAdjustDirectionalBlast UT_ShellCasebNovice bQuickFire bNoviceModeMyGameJpflagRmyFlag HudElements1 TutIconBlinkbHideAllWeapons bHideStatus BaseColor HUDColorHitPosHitTime StatScale ChestAmount ThighAmountH1H2 DamageTime bChestArmor bShieldbelt bThighArmor bJumpBoots bHasDoll BotOwnerTPOwnerDoll DollBelt AffectorbCanClientFire bForceAlt UseAutoMMuz1Muz2Muz3Muz4Muz5MagPick AutoHandAutoMLAutoMRE_ShotmuzzEF3Muzzy2 bIsSlave bFirstFire bBringingUp bBringUp RealOffset realhandImpPick ImpactHandm UseHammer AmmocountAmmoLed AmmoCountBar FlakAmmoLEDLEDFont LEDFont2Muz9 MuzzFlash3Muzzy PulseGunRTapTimeshock MuzzleFlash2muzzsr3Muzzy3OwnerLocation StillTime StillStartPreviousWeaponflakm Flak2Pick FlakHand GuidedShell bGuiding FlakAmmoMinvis2M flakslugm CannonTimerGuider ClientBuffer ServerUpdate bDestroyed RealLocation RealVelocityCurrentVelocityGuideRotationOldRoll SmoothRoll OldVelocity SpriteFrame WallEffectAccumulatedDamage LastHitTime DamagedActor ParentBolt OldError NewError AimRotation AimStartdAdjustMyBot PulseExp bHitPawn UTRocketMaster UTGrenade6ZoomWallMutatorWeapon LevelInfo GameInfo ZoneInfoHUD SavedMoveNavigationPointPlayerReplicationInfoStatLogGameReplicationInfo SpawnNotifyAmmo InventoryDecalsCanvasFontLevelActorScriptedTextureLodMeshPlayerCount WetTexture FireTextureSoundRoleClassPackage TextBufferObjectEnum FunctionStateStruct UnrealShareUnrealI StrPropertyStructPropertyClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty ByteProperty AmmoType StartTrace MutateStringWeaponPriority ArmorDamagePendingWeaponStartLocationCopy PawnOwner DrawOffsetSender bUseAltMode bCheckeddesire AlreadyHas NewLocationPickupMessageClass ERenderStyle Acceleration VelocitybUpdatePositionM HeadRegion bTeamGameOldFlashCount FlashCountCommandEnemy LastSeenTimeHasFlagProtectionType2bFoundGame TouchingbestAim bTossedOut bHeldItembActiveRegionHUDTypeInvCurrentNetSpeed OldWeapon instigatedBy Position HUDMutatorTeamNum UT_Jumpboots Instigator bSnipingnextNavigationPoint PlayerOwner TempActorSTClipYbCenterYPosXPosVictim aClassNameNextDamageMutatorweap NotifyActor EndTraceUTexValuebSuperRelevant bDeleteMe NextMutator bHurtEntry WorldLog LocalLog bLighting bEnviroMap NewStyle NewTextureTargetmyHUDZone HitActorNavigationPointList DrawColorNetModeVictims DamageName AmmoString TimeSeconds DamageAmount bDropDetailStartOwnerrating InstFlash ZoneVelocity AnimSequenceCurAbsLaser PickupClass NewPickupDeRipDeMiniSinflag sinflag2flagsSinHUDshotgunasriflecloak dualmagnumhvgun spidermines snipergun u4injectorch1_onpicsvamphudbhole2bhole1pulseexplode1JPlasmanewhandsinhelmi_ammo_magnum i_ammo_pulsei_ammo_rocketi_ammo_shotgun i_ammo_hvgun w_concussionshells1JImpactHammer1-1JImpactHammer3-1JImpactHammer4-1JImpactHammer2-1i_ctf_stflagHUDi_ctf_hcflagHUD sinmodels2 ammo10mm ammo50mmgrapplt shield_tech JsniperammoJtech1 pulseammo rocketammo Jsinshield SinGrapplecl thelauncherSinsndsTechssintexx DeathQuaddoubleonethirddamage ch1_zoom_onPlusepsp_a00psp_a01psp_a02psp_a03psp_a04psp_a05psp_a06psp_a07psp_a08psp_a09reganempahycon5 dbl_fire dquad_fire dquad_pain empathy_use regen_use shld_usenew3 DoubleDamageJcVoice sincocking shotloadreload1rlaunchfire2dmix2a health05vest1 rhelmet1 cloakoff u4activate shieldpkupempathyshield superfireloadup hvgunfirevampireattack fastgrapple splashshieldsplashshld_usevampire ImpactLabelMyRelic IdleTimeRHM PointCountNP LastChecked SpawnedRelic NavPoint RecurseCount LastRendered sinmodelsHLarge emp_quadHMedkitdd_quad flakpantammo357d_quad u4inject flakjackhmdm rlaunch_W regen_quad JU4Inject1Jhmdm1hmdm2sinweapsinar1war sinmagnumwmagnum sinshotg1 wshotgun sinsniprwsnipr sinheavywhgunsinrlwrl SlaveMagnumnumberofshotstrail2 ReplaceBio ReplaceShock ReplacePulse ReplaceRifleReplaceHealthReplaceRocket MinesEnabled TechClassMyTech NextRTechHUD bIsTechHUDUsethis TechWeapon OwnedTechdddqLiquidsliquid4 UsedAmmoReplacePickups ReplaceArmorUseHDUseAim ReplaceMelee ReplaceGun ReplaceFlakExRipExmini SpecialItemimapawnesvava1es1dd1dq1 bIsItemHUD NewXhairNewXsmspid HelmetAmountweap2Grap HUDOverRide OverRideHUD weakened Sin2utModelsinzoom SpeedScalePutawaypkup8pkup2pkup1nrgpkuppkup357pkup4 pkupshot rocketpkup concussionfireconpnu3 p_grapple p_splash laserbolt4 laserbolt1 laserbolt2 laserbolt3 laserbolt0 laserBeam ParentsinlBeam sFlagListx[}( ::$W8o=$:e> Y> Y5I> Y5Itâ> Y!ГГГ> YГГГГ> Y!xxxxxxГ5~S> Y!xxxxx5~S> Y!xxxxxtâX'X'X'X'X'X'X'X'X'X'X'X'tГГГГГГtГГГГГГ=$:etX'X'X'X'X'X'X'tX'> YX'tX'X'X'X'X'X'X'tX'> YX'tX'ttt^^^^ttԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXj\ԝXԝXj\5~S5~S5~S=$:e5~SWqc{~TsV]r\OPNh*E{*EbJ82:9( Xu6tГГГt& & ttt9( tt9( K K ԝXԝX9( K 9( ԝXԝXԝX9( 9( 9( 9( 9( 9( 9( 9( 9( 9( 9( t9( > Y> Y5I"I*c"I*c"I*c"I*c"I*cԝXГzh]Tech has worn off.qp` ] Sin Tech] Sin Tech7$?X$AU$A YnGF?- ::$2M!rYU!r!r!r!rѸBttt> Y> Y> Y> Y> Y> Y!r!r!r!r> Y!rѸBtttѸBtѸBt!rѸBtt!r!rѸBtt!r!r!rԝX> Y> YR@GtxxtxxxxѸBttXu6> Y> YttѸBttԝXL]!r!r> YГГ!rt!rt!rГГ& & ГԝX}MԝXԝXԝXԝXԝXttL]ԝXԝXԝXԝXttL]ԝXԝXԝXԝXԝXtt!r!r!rѸB!rѸB!r!rѸB!rѸB!rѸB!rѸBttX'!r!r!rԝXѸBt> Y!rP" GMAkimbo Magnums[ [ [ [ [ ioW q"0GHK$?f:) W?yOD$HCC$@O$>b$L?F$R^?c_hKJJ]! %o was capped in the ass by %k.U*EMP$?p$=^$Dn$)\=C$ ף Y!ГГГ> YГГ> Y!xxxxxxГ"I*c> Y> Y5I> Y5I9( 9( 9( 9( 9( 9( 9( > Y9( =$:ew4w4w4w49( w4w4w4w4nD ZNFiSJ\Q}W _T faeTU , z'U a/!8(%U  q N[MSYz"I*c=$:e"I*c> Y!ГГГ> YГГ> Y!xxxxxxГ"I*c> Y> Y5I> Y5IH g \RaqCEHVcRb N^  v"~x v ::$"25BjajajaԝXԝXԝXtԝXԝXԝXԝX25B25BԝXԝXԝX25B25B25B]$B"&t`uIu" oMEyzpoT ::$"'?d"|_?d"|?d"|?d"|ԝXԝXԝXtԝXԝXԝXԝXԝXt?d"|?d"|ԝXԝXԝX?d"|?d"|?d"|]$Bx"4!W^| ISgmM" gq oSfSeKNdA`S_PsIqO w ::$"KM^jajajaԝXԝXԝXtԝXԝXԝXԝX25B25BԝXԝXԝX25B25B25Bt> YtCttttttL]ttL]L]L]tԝXttԝXtԝXtԝXtttttttttԝXtttttX'tttL]tt]$Bm"&;EIOG436L[N2 YU&̻xxxxxxx- = SiN weapon= SiN WeaponB$7$uSX$U$oSP22 ?nOlC  \cgdvsV 1j,-'a @a?'B h>6OLxU *!-(a3 Xz (::$S K sIig F8K@BIwB*2Ba/!F+OF,/a8 e BB F&0 10xx>X vx?X px@?X C X t aX B  # OBB! q/!-'4  yv #cD ti.D  Nwi*N|v TossReliciQrw*#v D i=: y XQrOi!ILV[ZspMu]C@`dG A `qkLWdL j\jEUk K2`wGnXu6ԝXԝXԝXԝXt` ] Armored Vest] Armored VestB$Aw"dl"KaA"7$@ U$0AyecYaBK wbR1 fny|hlBtâ=$:etâ> Y!ГГГ> YГГГГ> Y!xxxxxxГtâZr!R/  ^@^bvf aeK8 oU8ks hcqK H UI Cx[B_w_fz@X`!Rv; _G__G1!t"!t"ڑttt1S_Sn$Cd$zD]$Bx"ȯW^} |g 9$ ף<S L@ t @"MoqA jiM2pd# 9( ttԝXtԝXГB ] Regeneration] Regeneration  "&vy@]Z yZHXJmi{ _ #S  HcHR2D"X~|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.Xڅ|.Xڅ|.Xڅ|.Xڈp|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڅ|.Xڅ|.Xڅ|.XڈvZ%g|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڅ|.Xڅ|.Xڅ|.Xڈ1q-|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڅ|.Xڅ|.Xڅ|.Xڈy}|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڅ|.Xڅ|.Xڅ|.Xڈ.W@|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڅ|.Xڅ|.Xڅ|.Xڈ^|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.Xڅ|.Xڅ|.Xڅ|.Xڈ5|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڅ|.Xڅ|.Xڅ|.XڈV|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڅ|.Xڅ|.Xڅ|.Xڈ~Y>|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȵ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȅ|.Xڈ*ȵ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.Xڅ|.Xڅ|.Xڅ|.Xڈ*ȅ|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.XڈlDž|.Xڈlǵ|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڅ|.Xڅ|.Xڅ|.XڈlDž|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڅ|.Xڅ|.Xڅ|.Xڈ|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8o|.Xڅ|.Xڅ|.Xڅ|.Xڈ8orUp { 6:EQ鶆txxxxxxxԝXtѸBԝXL]ԝXtѸBttԝXttԝXttttԝX}M}MԝXԝXԝXԝXԝXttL]ԝXԝXԝXԝXttttԝXtttt> Y> YԝXt@"Z" iQq" WEO$L?c _ h K o J]%o was hollowpointed by %kp$)\=^$X94<- ]Sniper Rifle!]Sin Sniper Rifle::) @Y<`(   N UWx}Q Y _ T z ^V@jt%xxKDU@VmQR u ~"gr@l uH eK2o)L#!g"(u",ff ]Standard Bullets] Bullets( X$AU$0Aom {E.zj"vvV#]S  ::$6{9xVrYEK bC&mIy rQ^@"L^ߞ_WxWxԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXB$33>E$@n$aDx"ISmY$?`M" 9$>X$pAU$pAOE@w 2;MZ1OѸBttttѸBѸB> YѸBѸB> Ytt> Y> Y> YԝXԝXԝXttԝX"/ԝXԝXԝXԝXttԝX"/ԝXԝXԝXԝXԝXtԝXtԝXtԝXtttԝXѸBtttԝXMZ1ѸBL]tttioq"<zyO$?_hKoJJ]%k's %w filled %o with holes.P$ @p$=^$ ף ch2$NWܴ tttt& & tttԝXtt& & tttԝXg ] Health +< & OVR2QOFxg"u" ]Sniper RoundsY$`@"&9$`@[AC C2SeeXu6ttԝXh]Regeneration has worn off.qp` ] Regeneration] RegenerationB$pBw"<7$? s@ $-(a>L?( L WQa)]$ ]---F]?]H?]?,F?]?,F]$] F]$ i F C[W T a( A@J+jqSn"-'-'r>6r*..%xw*.@@-.?Sq!N aN "Kyhg@uto2p9( ԝXԝXГB MEmpathy ShieldMEmpathy Shielda  "&vyXA^t @*Z}Jg|hG u@dZ#B sBn$zDFwtPeHvZtwU v dueKy d{@BW@JedQm}XLvNXn d@k k, )=f .  A/wf *(;k BQ^L,a"F2 p 59( Г&̻t&̻ԝXԝXГB ] Vampire Tech] Vampire Tech Y$)\?  " 9$)\?dJ Z E@ | Io@mZ|oa Y \ m_  i b=r*..'&q!-'-'b~w*.@-. !L> GMn o 6.:.% ?  `H @x WYXEp 2'OYUtѸB> YѸB> Ytt> Y> Y> YԝXԝXԝXttԝX"/ԝXԝXԝXԝXttԝX"/ԝXԝXԝXԝXԝXtԝXtttԝXѸBioq"UGHK$?f:)W?y?O$>c_K J J]21%o now resembles swiss cheese thanks to %k's %w.MP$?p$ #=^$o Y> Y> YMMMMГԝXГГГГГw]UnrealI.Skins.SilverwUnrealI.Skins.SilverwUnrealI.Skins.SilverwUnrealI.Skins.Silver}]UnrealI.Skins.Silver}UnrealI.Skins.Silver}UnrealI.Skins.Silver}UnrealI.Skins.Silver ]Biogenic Shield]Biogenic ShieldB$BY$ff?w"<l"P  "9$ff?J| a@Y#} hG`o["-'-'|>6r*..%xw*.@@-.?`q!N h!~hr Q#T2P9TJEBmkkPnR]22S_S&̻ԝXtѸBѸBѸBѸBѸBttѸBѸBԝXtԝXtѸB_G_GttԝXttttѸBԝXtԝXtt_GѸBtttԝXttttttX'ѸBiCq"A`dK$?vD$Ck$>C$AO$@?c _ h K J J]"!%o ate one of %k's Spider Mines.U*E//-~ ]Spider Mine Launcher]Spider Mine Launcher::)?33ӿ< E$? ` ( uSXPkV8=$:em`w2UZÁCxxxxxxxX'X'ѸBttѸBѸBѸBѸBtttM^tttL]tԝX> YXu6ѸBѸBttѸBtttѸBԝXtѸBѸBԝXttԝXtѸBѸBѸBѸBѸBѸBѸBtM^M^tѸBtԝXL]tttԝXtttttԝXM^M^M^M^M^M^iVq"2v]zqc _ KoJ]%o was pulsed by %k.P$@p$ #>^$ur*..'&q!-'-'q~w*.@-. !L> ^@p sX vh RQ D@RLM I N Uio@{iHU u lX5jhw.l*l~%h~,^~.l!wz ~ ~" r A!I2d <9( ԝXtt{#UԝXԝXԝX& & ԝXtГB ]Splash Shield]Splash ShieldY$?(a "&vk L&".,.,J%r f >*TME v -e -e'MdwM*MMa/!F@MM'%a@@' fl,prl r*M.haMh^C .hj>tr.N--jMo %**lal[w*@l.w*@l.lW'l l m!0^H 33>Nw*-m@@m@?@@a/!.-mmff>mH  o c+It-(0%.eU:.%v! diDlT0t!tS{Mt!t t%6{6 >76{6 ff&?GD,dGGaGDGD.t!tD  c P 1Q 33s?k./rk*q! tk ?,@k B 9k P k bQ }B  ;w.P *a??,(-'.P {kHCB a>?(:k%:k%-( q J!2!m !79( tX'tX'ѸBtX'ѸBtѸBtѸBtѸBtѸBtѸBtѸBtѸBtѸBtѸBtѸBѸBԝXГ ] Ammo Vortex] Ammo Vortex& l A5UOa  ! ?,_ծ333@6@F H ?&wO*O@OTGծ>>_ծL>L>F ծ>?H ?, rAa  KxPxwA wA wA*dA-Aa  @ B0A-76K6A R?ACa/!-a/!.-A, o.K?_dA+ ] .K`F_A-Aa/!Ra  Kx?,   Hh!z }.b}} w M b }M } C$tIbD?,((w9W b?'wh }Rw t W b5h w t w M  z U$U---:.%iU?UH?U?,i?U?,iU$U iU$ WfJ6Iq i.!tГГГГГГГГГГГГxxxxxL]L]xxxtxxxxxxxxxxxxxxxxxxxxxxxxxxxxtxxxtxxxxtxxxxxxxxu d w%$.@@a,>333>L=w.*).. K h [ j} I j Id Qm`E @  ~ VA+ -b()w*q!M o hh lS } r*..&-'-'a/!.- ff&??A ?,??@@q! yR!S@ ~ @V2#!w*q! G JX we WHr @sdegyr*..&-'-'a/!.- ff&??A ?,??@@a/!. ?.-!<aa.-!L>yq!a/!q!D \ j  ~Ce և `$`"9$?]fue @ &!-'a @a?' @J n "C  wkQ#0 w*jQ-b' dMt .#!w*q! x TA E K -(w*aL>(&a?( e KH*-(K jt `nh a( d oh5z:h$a$?.  ?r-b(p- pw* a!Mba! a!Fq!pqa M q S[ J@FPjX UO  S }% -b( mM v F @kMUk pp gi r-{ lkV d r j &x  ^H[ T(#!w*q!* }DJ/-'4 FT]M Fc K o M D@Gqi G @T n APcwz RJ:.%:.% ?  f =. x s H Gl"Gc| W p }f C RY3 n"NT SlvmM"9$?SD B!i QvlegW!C {B-  xcu:c$a$?. c DJ i 5I%:.%-(a>?( QP aa @^ F\g V G@uJ @A V s } 71(w*aL>(&a?(  k 3uu =5-W-W'-w*3-W(  I| cAzTOg g] Fw ~ NSf@@M C Mwax Y ) O[ m~ @Q d |:|$a$?. B wm 1LD::$-b w-b(mJ W}Zcq t NiH iK-W-W'Cw*Nt K -h -J -W(t K -h -J  d Baw*a vRQ{2p k 9( ԝXtt{#UԝXԝXԝXԝXԝXГ& & Г ] Fast Grapple] Fast Grapple Y$@(|Va7$"& 9$@v J` L^Ea `  &w*a* `  JbNJN @Yj m@k-(-(-(Ca !Ma!M?a$. ~ rL_ D -r*..+'&q!-'-'a/!.- ff&??A ?,??@@. !D umM7O_ @V .!-(a3 a\B|DT I @G o @S GD2  li IlRP.l wP*n-- -wP*?, R-rP*1PP rP*>IP%>IP?>?P?Prl*l>@II xI 0)g {n?$r.*q! y 9. I . bg Wy  w.I *a??,(-'a>L@(-( YJPm2!ZNN5YUѸBtttԝXtԝXtѸBԝX> Y> YԝXttԝXtѸBԝX> Y> YԝXttԝXtttԝXL]L]iOq" f:) A vBzBD$Ck$L>C$@O$L?c _ h KJ]"!%o was blown to bits by %k's %w.U*E-~ ]Rocket Launcher]Rocket LauncherB$A::)@ < E$ff&@Y$?`Y$̬?(7$? X$AU$Ao[hE6I[&\)tГГГГГГГГГГГГxxxxxL]L]xxxtxxxxxxxxxxxxxxxxxxxxxxxxxxxxtxxxtxxxxtxxxxxxxxuYkPB2#\xYUԝXttԝXttԝX___ԝX_______ԝX____ԝXtttԝXttԝXtt]&%Classification: Thermonuclear Device~f:) A0pWgygO$ # Y> Y> Y> Y> Y> Y!r!r!r!r> Y!rѸBtttѸBtѸBt!rѸBtt!r!rѸBtt!r!r!rԝX> Y> YR@GtxxtxxxxѸBttXu6> Y> YttѸBttԝXL]!r!r> YГГ!rt!rt_P֔ГГ& & ГԝX}MԝXԝXԝXԝXԝXttL]ԝXԝXԝXԝXttL]ԝXԝXԝXԝXԝXtt!r!r!rѸB!rѸB!r!rѸB!rѸB!rѸB!rѸBttX'!r!r!rԝXѸBt> Y!rWyDc _ h KJ J])(%o was filled with hot lead by %k's %w.^$ ף<- ] Test Magnum::)33S@@<`(  HlR6I`N/"tГГГГГГГГГГГГxxxxxL]L]xxxtxxxxxxxxxxxxxxxxxxxxxxxxxxxxtxxxtxxxxtxxxxxxxxuHNZ X)%N% ykH6Ibs UO4tГГГГГГГГГГГГxxxxxL]L]xxxtxxxxxxxxxxxxxxxxxxxxxxxxxxxxtxxxtxxxxtxxxxxxxxu\5UO&hw.*.\̾#"DC>Ch..ra  Q`?,P`a  Q`?,P`$$w w w*a/!P76Q6 ff&?)a/!?&/a/!S.-) ,.Q? Q!?a/!P76Q6 >)a/!?&/a/!S.-) ,.Q? Q!?( , .Q;EQ!?$a/!Pa/!Ra  Q`?,  Yd`r 26dO!T YUԝXttѸBѸB> YѸBѸB> YԝX}Mtt> Y> Y> YԝXԝXԝXttԝX"/ԝXԝXԝXԝXttԝX"/ԝXԝXԝXԝXԝXtԝXtԝXtԝXtttԝXѸBtttԝXtiBq" K$?f:)WEy?D$Ck$33>C$pAO$?c_h KJ]%o is a victim of %k's %w.MP$?p$L=^$;n$Y$L?`Y$?( 7$?mqt c$=x  X$AU$AoM"vT"eU ƒԝXԝXԝXn$D]$ B9$>X5` E  A a  !E ?,v6Z x wA *A TGծ>>vծ=L>Z ծ>?x ?,rr-- w*a  eg?,Pga  eg?,Pgoa  eg?,Pga  eg?,Pgw w w*L>v?,-a  @ B-76e6 ff&?Ca/!-a/!.-) ,.e? vo-76e6 >Ca/!-a/!.-) ,.e? v( , .e;Ev-a/!Ra  eg?, a  @ B G[ )Lw*aL>(a1-q!+7 <B W~ ki'&q!Mw.*.LW!>% hjz,2',2Hq!Kzw.*.&L??,?,zF %F ,!@F jq!K nd 2+1&w*  a?( U"o@c~2o;KHL#!g"2u"f ]Chaingun Bullets]Chaingun Ammo2> cp"`[l+>-(=w*%.ea!RL>=t:.%8:.%8 xG#vWVj V/r.*q!J%a!Tfff?L=q!l- -q!-B:.%k-B(:.%8a!Tfff?L=q! u!SdE IY@2C8L#!g"u" f ]You picked up spider mines.] Spider Mines  WO(QyqBAbk+6r.*%q!X- -q!-B:.%k-B(:.%8q! XX B{`uF MAvFH 3/1&w*  a?( WS NV3w*aL>(a'&_w*.@@-.?!rkar?,r?-:.%% !Oq -q!*qq:.%%kr.*.=A !Oa!Tfff?L=a OYOA}Y=Wr Cu? !Na!N?>Ua!RL>> h%M`H$a$C.a!l@L= naZ" `*-8`( R~ e \a33>( UA |6&A?wA 6P#6A  ?,d \M Z @i"Lw["qI,Rt="&S@bbTHZ!a!ľ?L=-B' KIgB;y]]726qtBSex+Yh_o}o}ԝXn$zD]$Bx"0uW_g Db}2B3L#!g" u"2f MShotgun Shells(f L2!w*  bfg *(S#VBHM&L j\& c ICK- 4a/!ZIw*%wr.}w*?z <  hq u ^D~b!yos @y Zn~uwV uL T![|n{hL s%Ha-q!*-'-'/-::$ w*a/!gw.*".a/!P:.%.U/:.%.J//-.A 8rYHFH$a$C.a!l@L= |y"U sr"C#NN}Px|oP2t£lMo o rw!|]p^l F ep^ go d s.FQgW { m!wLa u.-8u( pz FCvYn O @j_ S C% -( lp!t"UEb\7n$Dd$DuU_ D)!w*  zaId? @ q"NT Fjqq r* Gw.*.?,;@ dr ;?o; wK" s @hk) ki'&q!Mw.*.Lk!>% i{h}%}'&q!aw.*.Lh!?% OplTi> q!*' _ }QMvk`a!w*Usw.*.\L#CaCB.L$C.a!L333?>L= opRCJ_ [b$$a b bBw*q! R_T]B X\_ a 9 jcp}| ca!y?L= h ]tF-'C ..$=-]QDq!M a]uO!m j GYy2O$N5bg" u"dff  ] Rocket PackY$>(9$>|T#WBQHj\&e" XT$0$- @?q!*,-'' E%R4 P$C.a!d?= W> ף< {E2V5"Wg"(u"ff ] Plasma Cell] Plasma CellY$>(9$>g @nE< -e -e'bn}wn*fna/!F@nn@%a@@' FXGtF-'S ..$=-GQDq!M  ~UZ*%U%Ww.*.-33?"w.*v.  "w.*v?w.*v?@?8vff> M, 'Ma/!8'%M  O v " O a/!XO a iR| @wRa ]FsmchFa  ! ?, mծ333@6?ch?&wF*FMGծ>L>mծ=L>cի>h?, xM7 +wX*X[X ZZrX*a$.@. -'b.. O{eq!N  ]"LZY%or.*+a/!.- L%ew.*g.  g?L%g?g?LL&g?LQ.a/!pL%>eLA?g.?  K^ fP^  P^ 6^g6^r6^6S6o6Na ^-^' Bx B lFNgSC_`!` `!@ `!j `!ED=?B eB  it >YG}BB $} ^B-B- -]B-  gxg- -{g-  rr- -zr-  ?XX- -oX-  LYL- -gL-  MM- -dM-  ZZ- -AZ-  ku:r- -uu-  dd- -d-  YY- -sY-  LWW- -~W-  kfk- -Yk-  bb- -Wb-  -ee- -Ee-  xaGa- -aa-  ff- -vf-  - -t -   DA ^E*a/! w*x 6x.| x9. @FJaZz| x'wJ*Ja/!P.-'.-(''rJ*.-(CCa/!a XP|VwPr.P*gP--\ '-T--::$P) Dv ?96v #? SRb#fzAԝXԝX111]$Bx"`|$g\$HBe!!, ACr* w *.., ', q!-'-'k  -Aq!  {S^uUPS /P?%vSPPS6I{6I_{v?%LvIH >L @FH )\=aeL aaSL ?,H fS666666 BEe pBf 6f.n f9. @Fe aHan f'w.e *-'-( e `U =J.j 6j.Bj9. @Fw aU@Bj'w.w *-[ '-[ ( f \a>S= t|b`wt+ta/!Xt?%6Z Z t  l@ , &'@ a/!8'%@  P"R"C%|@G#1t~._  d Nw~*N|GTossRelic~Qrw*#G_   @   r* a/!M 6#?w.*QawpM?,. MM(#@A@A@AQwQ*8  '&q!N-'a/!a!y$r.::$.-?,..Z. -'k -  |A|\wAr.A*gA--[ '-|--::$A) D\ ?96\ #? c["AAFJ 6J.H J9. @F\ aODH J'w.\ *-'-(  {~_N~^ WDNC4W& WPN6Wla  ^ Wl  N?Wl W& iB, !=H .  A/wH *(;iB ]z,8-'R -'. RR6z 6V 6D . CRD'-z V D [a L !Rz%q! Tz |31wz 6I I z    @`P  $-]'^a/!Gr  Sin2ut.Magnum(a/!Gr  Sin2ut.Magnum(-z'a/!Gr  Sin2ut.SinShotgun(Z-o'Za/!Gr  Sin2ut.ChainGun(-g'a/!Gr  Sin2ut.TrueChainGun(-d'a/!Gr  Sin2ut.PlasmaRifle(o-A'oa/!Gr  Sin2ut.RocketLauncher(-u'a/!Gr  Sin2ut.RealSinSniper(&-u'&a/!Vr  Sin2ut.SniperAmmo(Va/!Vr (-E'a/!Gr (a/!Vr (.-a'a/!Gr (.a/!Vr (-z'a/!Vr  Sin2ut.SinShotgunAmmo(-o'a/!Vr  Sin2ut.MachineGunAmmo(A-]'Aa/!Vr  Sin2ut.MagClip(-g'a/!Vr  Sin2ut.ChainGunAmmo(-A'a/!Vr  Sin2ut.SinRocketPack(T-d'Ta/!Vr  Sin2ut.PlasmaAmmo(-s'a/!lr  Sin2ut.u4(-'a/!er  Sin2ut.SinHealth(Ma/!er  Sin2ut.SinHealth5(a/!er  Sin2ut.SinHealth50( -~'a/!lr  Sin2ut.SinArmor(@a/!lr  Sin2ut.SinPants(a/!lr  Sin2ut.Bioshield(a/!lr  Sin2ut.SinHelmet( w*a/!i { P a/!Or .  a/!Or .  $'  pO !8'b.. dnL^ 6n6LV^իO ?n?իO ?L?{-` wF*f # ?,(* F 33s?V?'F ^. C$tI^D0@((V?'9F*-`(x .R~ d V^5x ~ d 9nL cS!` a.baa ZK@y 6iZ6iK6i@P a C$tIyD?,N((ZyիS?K?իS?@?Z9P Z?'ZY aRT M Zy5Y T M ZK@ |ql #0tS.a  pNwS*N|l TossRelicSQrw*#l a   Dj5U:rj*^{u {@Ft.vwt*t\̾#C>C"D_u ծ6?,{6J6ua u^?,P^Swj wj wj*j+ @.u`jG{ DkA v/a0 ksrwk*e."kk~k-b'10 R#_4%'&q!aw.*.L-'_n%n, !@@n{%s  wZ!dJUO .  MO ??S= g PlEE -e -e'bl}wl*fla/!F@ll@%a@@' YQ [0.?>C?Q a| @a e Q   lkC, Ab.. m TXp 6m 6T6X. CspD'-xppջTT?,կT?,z,AXTff?al p i@|MP'%w@-C[d yWF<, Aa33s? , t!rkgb.. r V X O 6r 6V 6X . CPOD'-~w.ww*w\̾#C>C"DFar Oea/!m.- F* U ,['U a/!8'%U  k tllFQ!tST MQ!Q Q%6T 6 >ql,dqqaqlqlQ!tl b_~q 6_ YxSN/a0 N wN *x."N wx*hxa/!z0 xxfFja "jAj-f ::$a(0 ja10::$a?' `aF^2I@6`wGnԝXԝXt ]Armored Pants]Armored Pantsl"2 ]@ sRi:XsRPws*9sa/!8ss f {>)imq>?]b"sl*BS]s  fYn w*hSA}h,hp0h 6n=,6n$6n$YaA Ah n  e zY ^Y .  p\.,d rY *.& c yUX7jhw.U*c Uz%hz,^z.U!ws z z" [Av/a0 srw*f."@-f '10 i Q@!1K 33>Nw*-@@@@@?@@a/!.-@@ff>i @K  iEc>Yk {HlHH!tSy MH!H H%6y 6 ff&?rH,drrarHrHH!tH bKE ;a!|/a/!{ -(_:b% Ka Hvv:b& Ka QK K b:b.{ ]K  [ U r*..'&q!N-'-'. Ur!*!.Mk M-6?%!-'r !-( cX#v Wv(63e Бj\j\{9xV&ojlGSzD{>?j `cTi2Y" `wGnԝXԝXt ]Helmet]Helmet  bTZmJ%T%.? ZIAj;v/a0 IsrwI*V.tIIjI-O'10 vA~WJ::$ga Jwg*gUkA |T-'F -'. FF6N 6M 6| . CFD'-N M | [a L !FT%q! a_m Z cf%=w.*}.  }?,2.-m &.?8}>==}?m %.?8}>.?  [ B^%w{*E {  pJwW*s W  pwE * rs *{[ ,{,{,w*$B[ W{XZA n|9'&F-'t w.*.\̾#"DC>C.Lb@.. CtD'-]U C a  !t]?,"tt6]6U 6C a B !ta!L>L=|$a$C.q!N s,Eorssows*Xsa/!K wsss,sa/!Tsa/!e's ek e2GbXu6ԝXtt{#UԝXԝXԝXtttt& & -%nttttttttԝXtt{#UԝXԝXԝXԝXԝXԝXԝXГԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXttttГГh]U4 has worn off.qp` -U4-U4B$B w"<7$?s K  & h$@@|RV#0tE .o  tNwE *N|VTossRelicE Qrw*#Vo  wntS6T a G a A n  `| n  k-Y' rA *nnsin2ut.degeneration-W' r| *nnsin2ut.AimHelper-]' rT *Znsin2ut.Magnum4-v' rG *Nnsingrapple.c_grapplelauncher WA]!GE 2HG+.-8G( o hi!l.bll a eU lel C$tIUD?,((9y U?'\ lRUG y U5\ UG a e  =` }>G::$G ?,6#? ari *i a k?o?6-::$ak(  --k)\=k ף<k>` a ` $ak(  WY B&H%wQ*q Q  pJwd*c d  pwq * rc *dY ,d%dRQ!dw*$BY QdtpL iiI#>8*OEl,Lw!V%E o zu!n c.bcc hk ws cwc C$tIsD?,((h9J s?'hB cRm ^ J s5B m ^ hk w dD ndl!O P 7wD O * RaO wR*RR {D R-'R$ [xp'&F-'^ w.*.\̾#"DC>C.Lb@.. C^D'-Xr A a  !^X?,"^^6X6r 6A a B !^a!L>L=x$a$C.q! SFbr*..'&-'-'b \.V.V b@VV CbD'-@ u Na  !b@ ?,"bb6@ 6u 6NXa _ !bXxFq!  BO =.w*QC%aw*OwO*Oa/!K wOOaOOb y{ @LwL*La/!F~ { ,/a8 c BL { &0 10 a p L  # ~ LL!  qz[ r2/ K > Y9( =$:ew4w4w4w49( w4 Ke=r.K*.Ka VK-Y(|.Kw|*r| V-Y'||^-Y.Kca VKK  dsX tm5I5I5I=$:e=$:e=$:e5I=$:eyiR =@IwI*Ia/!F@ R ,/a8 k BI R &0 10 a p I  # @ II! |L] #0tB.r  vNwB*N|] TossRelicBQrw*#] r   T Mmwj41 K > Y9( =$:ew4w4w4w49( w4ttttt=$:ew4w4w4 c!i\5~!i--J -J'|a  "@|L>|$?  Vw n.US6}U,Up0Uw `aAB?,? A?? (, 6G=,6G$6G$6G$6G$6G=,w a`B`AU G  yP @FwF*Fa/!Fp P ,/a8 o BF P &0 10 a p F  # p FF!  h"Ej {Y K > Y9( =$:ew4w4w4w49( w4yR @DwD*Da/!Ff R ,/a8 K BD R &0 10 a m D  # f DD!  L!LJ }; K > Y9( =$:ew4w4w4w49( w4 EG  } 33s?C./rC*q! p9C GC b} Ip w.G*-'.G{CCpa??,( a??,( :C%:C%-( }D rBa D  E a+D  VE j y` @AwA*Aa/!FC ` ,/a8 a BA ` &0 10 a d A  # C AA! ]EH185/a0 P0/rPE0P10*  K!oX Ba= K > Y9( =$:ew4w4w4w49( w4a}g5/a0 \0/r\}0\10* yY @}w}*}a/!Fi Y ,/a8 ^ B} Y &0 10 a C }  # i }}! |zw #1tV.J  p NwV*N|w TossRelicVQrw*#w J   r^ FnR K > Y9( =$:ew4w4w4w49( w4KKl p!tSxMp!p p&bp!tK{p!?K, p!OK,p!EK,p!`K,K,K&K&  PAY3;|.$r|*q!z :|%U|a/!?r|*).|?,|$ KP9Ku>a/!.\  w*UKu>9'& _JT2I4q;ГГ ] Invisibilityw"xsK_ ,S=/_ a/!@_ a/!e(;_  hyN($aa!j yb @www*wa/!Fd b ,/a8 R Bw b &0 10 a v w  # d ww! |uQ #^ t@.F  pNw@*N|Q TossRelic@Qrw*#Q F   sv| Ns K > Y9( =$:ew4w4w4w49( w4vR , K'R a/!8'%R  |V{ #2tf.G  pNwf*N|{ TossRelicfQrw*#{ G  {S , ?'S a/!8'%S  y] @nwn*na/!F{ ] ,/a8 f Bn ] &0 10 a t n  # { nn!  tc~ S; Y9( =$:ew4w4w4w49( w4 e@~E'NrO*a L` OOO` *`  kP{; "{?,-'k{ _w*D{?%{;{-(k{{?&   ya @pwp*pa/!FV a ,/a8 y Bp a &0 10 a p p  # V pp!  i _zW}n9 K ttttt=$:ew4w4w4> Y9( =$:ew4w4w4w49( w4h Wq,rq r*J .saJ s^S .sj>tr.N--jJ o %**qaq[w*@q.w*@q.qW'h q Qc$#V%/r@*a-wf*f $c r@.@Pr[*[-r[*w[@PL >[*L N@PwN*Na/!8[NPNNK MK ,N*w[*c.@ccc:c?,`cc?,cc[c?,#wf*f $c  h\L2O::$fr=*=%-=a/!w.==a!n6#? G ~6Pi i 9Z?\?&^P^|j cmD?, j P\lm%6^.m6^m6^~~~~j?@\6^D?6^j?~?&ja+^::$s::$ r*Ma/!w.*r..*o\::$EP EqE%::$a!t::$ qoQq q>9?,d6?, zD @F-C(6  --J'v!A? v R$$R-v -[ -v tR?RH?R?,t?R?,tR$R tR$ S]ej2]cSeeԝXttԝXttԝXttԝXxxxxxxxf|DT#0t[.I  C Nw[*N|TTossRelic[Qrw*#TI  NZ%'%@r.*%G.  hGK h?o:L>.a/!p%>^h?%,h?h? L>>[6Gh&>h? w.*'.- %>h?T6G?,%L>Aff&?K  }D$ &D---eD?DH?D?,e?D?,eD$D eD$ |I$: %/r~*a-we*e $I r~.~PrT*T-rT*wT~PA >T*A J~PwJ*Ja/!8TJPJJs Ms ,J*wT*Z.~III:I?,`ZI?,ZITZ?,#we*e $I  r]~7W 6W %a+W o$Ba'(( [iP$*fD[P---]P?PH?P?,]?P?,]P$P ]P$ l {x ^H33s?n./rn*q! tn ?,@n u9n xn bHVu 6w.x*a?(-'.x{nHCu~a>?(~:n%:n%-(  Zt$iq$N w } t P-t$at$/a8 X D 'rX  K rrrK rN 333?gD?t?&33?rw Y D?t?&33?r} t?g,?Y ,t ?t?g, ?Y ,t aUK '10 bnJ. }NB/a6 \?n /\  }?%\a/!PW \ \  \\+ K.W ;E}!$a$.@p \  ?\ \ p 10  H"u H7"-u --h --(-(-w.*%-u :.%8 -h :.%8   ~!L"di$d!j~GE96HC \Xr*WJ::$za Jwz*zUkX l AV !@M 33s?~./r~*q! t~ ?,@~ L9~ V ~ bM FL ;w.V *a??,(-'.V {~HCLa>?(:~%:~%-( FO$L/r*a-wL*L $O +r.|rF*F-rF*wF|v >F*v w|ww*Kwa/!@wa/!ewa/!TFw|wwIyI,w*+wF*C.OOO:O?,`CO?,COFCJwL*L $O  FAS_$sa    - wA*R:A R,Qu.  wu*-'a?'uqwu*Zua/!K wuuauu" cf,=/fa/!@fa/!T';f Jp[tgzpzzF a p a^ a+p |^ m gdh2p b&̻tttt> YԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXtԝXԝXԝXԝX]"~iK$ff?WyJ] %o was punched to death by %k.- = Bare hands]Fists::)33s@̿ff<(l:\puSl:\m:\0ui~[G2P4C!g?~b?a  \Vh ZV-'.VS^.V]w*@.Vw*@.V-r.V*.VJ-- .V- /vr*.Vb !z.Vo%**a @S.V ^bz9j b F+9t-(0%.eU:.%v! d@{ir*..g&q!-'-'a/!.- ff&??A ?,??@@Ja/!. !{q!gga/!q!D  nZ 6*a$? ?\B?k?,#a Z r?,Pra Z r?,Pa oN&!Z n 7wo Z * UaZ wU*UU {oU-'U .oU XoU HoU$oa/!U;.oUq!+ X{zi GzRR.z wR*n-- -wR*?, R-rR*1RR rR*>GR%>GR?>?R?Rrz*z>@GG u LwH,-(u w B#AVDaA_ A'wD* wDID- rD$D-D-1r.D*.DXAs::$br*?=D6 DA?AwD6 DA?ADQsGa>)a/!R Q= B6 DA?A::$a AP_ w]*]]a]* ss::$ w*] D A??A*,r]*]a 2 A]&]rAQ  `KI-^(KQwK*KPQKKOOKO KQLKK K KK }Pa I62:%-,fH.wH*pHH _DH::$ _,-' -r H?- w*HrH*H?%g!L @33?!L> @h-w*- rH*$}a ew*Q-b-b(m Ia s}a wH*H?_  x"SVGaSI S'wG* wGIG- rG$G-G-1r.G*.GXSs::$br*?=G6 DS?SwG6 DS?SGG sGa>)a/!R Q= B6 DS?S::$a SPI w[*[[a[* ss::$ w*] D S??S*,r[*[a 2 S[&[rSG  zz ru Ba z  i a+z  Vi n m_ZwB#^on 7w_ o* Jao\wJ*JJ {_J-'J ._J X_J H_J$_a/!J;._Jq!+_q!*_*_J n kB5D7]a  ! ?,Dծ333@6@ n ?&w]*]@]TGծ>>DծL>L> ծ>?n ?, rBa  NQ PQ wB wB wB*dB-Ba  @ B0B-76N6B R?BCa/!-a/!.-B, o.N?DdB+ ] .N`FDB-Ba/!Ra  NQ ?,  n K>5 ea  ! ?,Uծ333@6@L ] ?&we*e@eTGծ>>UծL>L>L ծ>?] ?,-r>a  zHPHa  zH?,PHw> w> w>*>->a  @ BQ>-76z6> R?>Ca/!-a/!.->, o.z?U>+ ] .z`FU>->a/!Ra  zH?,   wCY*-]'\a w\*\\ {C\-'\ .C\ XC\ HC4-v'ja 4wj*jj {Cj-'j .Cj XCj HC-Y'dC  `|wd*dda `wd*dd-'dd {Cd/-W'cC  k9wc*cca kwc*cc-'cc {Cc/w* YC H T X \Z'&'$@@.vw.*.La!ff>L=b.. s E @ T 6s 6E 6@ . !A wCF~=&a  xvZT p%0.-Nr.*.-ur0*v%h0a/!pv&>h7-Nh0a!z0a!v0a!x&0L?v&>hn-N0 #v&h-N20 0 ?v%L=b80 0 >hX60 60 ?,vA?>hvA> EDEk 6vF?EQttԝXttttѸBԝXt> YԝXttԝXtt> Y> Y> Y> YxxxxxxxxxxxxxxԝXtѸBԝXL]ԝXԝXtԝXѸBttѸBԝXL]ԝXԝXtL]L]ԝXԝXttԝXttttԝX}M}MԝXԝXԝXԝXԝXttL]ԝXԝXԝXԝXԝX> YR@G> Yttt> YR@G> YttttԝXtttt> Y> Yt> Y> YԝXtѸBL]tttԝXttGSHS-::) @YE$333@Y$333?q!hQ 2\GBѸBttѸBѸBtttt?Q?QԝX> YԝXԝXԝXttԝXt> Y-%ntt_ԝXttѸBԝXԝX_ttԝXtttѸBL]tttttttttttttttttԝXttԝXԝXԝXԝX__ttԝXԝXtttѸBԝXԝXԝXtԝXL]tttP"ze-(p S5$TK7s.Fws*ss-A(Aws*ss-A'-'J5?5H?5?,@J?5?,@J-5$(5$5 J-(b-A(--v-A'-'5- -A(J5?5H?5?,J?5?,J5$5 J5$ iAe#WIuÑ> YR~R~xxxtxxxxxxtt> Ytt> Y> YR~R~R~R~R~R~R~R~> Yt> YtX't!r> YtX't!rt!rttt> YR@GR~R~R~R~R~R~R~R~R~R~> YR~R~R~R~t!r!r1In$"Dd$D]$BW`} | 9$ ף<f<|(7ay a<'w7* w7I7- r7$7-7-1r.7*.7Xs::$brT*?q =76 D?<wT7T6 D?<q T7EsGa>)Ta/!R Q= BT6 D?<7-.7-w * a^r * - a ?,<^A a/!S a a ?,<^ a ?,<w *::$a Py w^*^^a^* kk::$ wT*T] DT <?T?<T*3n, r * - a  կa?,<0  a/!S a a  կa?,<0 a կa?,<Qw * a *r^*^a ? a<^nn&^[<E  gUAe+]::$9w.*w..*=-X %.*aa/!y.-( .6a/!y..-'kE#a EE#P#Pa+PP# ::$ ::$ -^Ix6= 6yi6= 6yjiiiixxxxM66Ix;x%8M% M@ M@6IxyyM% M M6Ix6Iiy= F::$@?%@ULUI @@UB?. ;rQ*Q~9Q9Qqw9*99F9~9999U9 9a+ILUI^69 69  LUI ||x #0t\ .N  m Nw\ *N|x TossRelic\ Qrw*#x N  v!TA(bTRbL=bL=A,% sw* ::$/a/!r.*a+/ /Ra #<  R#?vy.<wy*Yr*ry-mT?,=mT?,=`O``mO!``mO?`OO?ZY?%YTy-&yL>YyY&? @? 6&?,x6&>,6&?::$& ի47:x`&& իo:x`&::$6 ?%&&իRI9x`&u 6V6[կ?6?,Db$&# Au&&# A V[D/P&u6/D?6/`Y@?x{6/6 {  {G{6/6  6/6   w*/P  /  /a+/X/ a+/R  V[D-66?666-6666a  R6V6[6DV[DVVT jMQ o ::$"4N*FvKRt=t> YtCttttttL]ttL]L]L]tԝXttԝXtԝXtԝXtttttttttԝXtttttX'tttL]tt"&lgA'^ gR^ L=^ L=zAz,z%zF sw* ::$/a/!r.*a+1 1Ra #< Z R#?vh.<wh*Yr*rh-g?,=g?,=ZPZZP!ZZP?ZPP?Z_?%_gh-&hL>_h_.? @? 6.?,x6.>,6.?::$. ի47:mZ.. իo:mZ.::$6 ?%..իRI9mZ.[ 6'r6'yկ?6'?,vb$.# A[..# A ryv1P.[61D?61Z_@?mK616 K  KGK616  616   w*1P  1  1a+1X1 a+1R  ryv-m6'6'?6'6'6'-L6'6'6'6'a  R6'r6'y6'vryv|rg mR[e b.. dil C 6d6i6l . C$tICD((_ C?,9F.RRv_ C/a8 (/D :(:$:(:$/(  dfff?(( .( i?%( (( կ?(  i( (( կ?(  i10 w"~A)I!w*::$/a/!r.*a+8 8\a #<  \#?$[.w[*r*rrd[-a~?,=a~?,=fdffadffadfdd?u?%u~f[[-&[L>u[fu%? @? 6%?,x6%>6%?6::$% ի47:Ef%o% իo:Ef%::$6 ?%%%իRI9Ef%d 6|6Jկ?6?,W[b$%# Ad%%# A |JW8P%d68D?68fu@?EY686 oY  YGJY686  o686  w*8P  8  8a+88 a+8\  |JW{-66?666-6666a  \6|6J6W7|JWV|~ dN [_SW a  N W $HC?N b?a _^IU- ^ *  ?kO[ a ::$"4TqV?d"|t> YtZÁttttttL]ttL]L]L]tԝXttԝXtԝXtԝXtttttttttԝXtttttX'tttL]ttmY$pBpk YfSv2Z P - -'/a8 -e [ w-@- [ R ?@@@R c?R -e <r-.-s DcZ - ի?--@լcB s@c w-.-l DcZ - ի?--@իcB @c 6- ?,d10-(  H$Qnj$a g J g$### $$Ma  իL?g իJ $$$$ $- ($-($- ($ 33?$a((($o$$- '$ 9. ?#\C$ q!z!da fx 5h|  Da  !| ?,@6{ j wD*DTGծ>>@ծL>L>{ ծ>?j ?,&r - w*a  N]P]#a N]P]w  w  w *eL>@?, - a  @ BZ -76N6  ff&? Ca/!-a/!.- ) ,.N? @# -76N6  > Ca/!-a/!.- ) ,.N? @T ( , .N;E@ - a/!Ra  N]?,  a  @ B  uY61.,-c $::$[Y-c '~--\ -p-Ta {ff>ff&?$$a(((?H$$'6-#6 #- '6 ,o$ qV 6PZ[V Ya  !V M?, Y?Y$a g$3/rj*a-wV*V $ }rj.j|rG*G-rG*wGj|n >G*n lj|wl*Kla/!@la/!ela/!nGl|llLyL,l*+wG*a.j:?, a?,aGawy*a.jp:?,a?,aaGrapple: Ready(}ry*a.jD:?,a?,aaGrapple: Out(wV*V $ ~hXZ~.~N  pom- o,D?o@rN*o,w* @1w* @rooOa  @~bL>WwN*o,d,,w* @pw* @o,do,dOa  @~bL>W EW , !0W a/!8'%W a?' [z29Ehf D 6^^ W .EQtttttѸBԝXt> YԝXttԝXtt> Y> Yxxxxxxxxxxxxx> Y> YxxxxxxxxԝXtѸBԝXL]ԝXѸBttѸBԝXL]ԝXԝXttԝXttttԝX}M}MԝXԝXԝXԝXԝXttL]ԝXԝXԝXԝXttttԝXtttt> Y> YԝXtO$q= ?Kop$G=^$B`e<- ]54Beta Sniper! New Technology to crash your Computer!]Beta Sniper Rifle::) @Yffk]b2$_5(Uptttt& & tttԝXtt& & tttԝX ] Health +B$A<     T5g7&hw.*.\̾#"DC>Ch..ra  _E?,PEa  _E?,PE$$w w w*a/!P76_6 ff&?)a/!?&/a/!S.-) , ._? m!?a/!P76_6 >)a/!?&/a/!S.-) ,._? m!?( , ._;Em!?$a/!Pa/!Ra  _E?,  cw5v &hw.*.\̾#"DC>Ch..ra  iw?,Pwa  iw?,Pw$$w w w*a/!P76i6 ff&?)a/!?&/a/!S.-) , .i? z!?a/!P76i6 >)a/!?&/a/!S.-) ,.i? z!?( ,.i;Ez!?$a/!Pa/!Ra  iw?,  _hPZ_._\  pmm- m,D?m@r\*m,w* @1w* @rmmOa  @_bL>Ww\*m,d,,w* @pw* @m,dm,dOa  @_bL>W bz19p C$o.wo*oo-':?H??,:??,:-$$ :?,H??,@:??,`:6$6=,6$:oo/apppXSD:.SD?, :?, D:-(---:?H??,:??,:$ :$ qa cGaKC!c?{a ?, Va a a x  `%^%N%M*;rw;*E;-l;a/!J-I '-;a/!^r?;-p '-x '-r; `-X 'J?;-;a/!iX?;--X 'J?;`;[N[N,dr;;0 -X.?-q(:wX*QXUX-q':d.:wd*QdUd-q' -q$*?,*@4aQCCCC-I 6$*U,-X J #<J?b(J*4aQCBCCB-p r ף<r?b(r*B4aQCBCBCBA-x *C4aQCBCCCB r--N% N,INI?&;*6N6NO:6,d:6,db(b%?@I6C?,?@IJa N?,N?,@BABNq--*?E?,@*?,?,EB*E8,2Y?w?Yb'b(wb(b%YL4a CBCCCB ,2Y?w?Yb'b(wb(b%Y s%D*?,DE?,? --*??,E?,@ *?,?,E*E4a CB@CCB --I  s,`D*?,DE?,? oI}3 tI xc e%r%S%`*4rw4*E4-l4a/!J-R'-4a/!^g?4-D '-x '-r4 `-T 'f?4-4a/!ij?4--T 'f?4e4[S[S,dr440 -|.?-`(:w|*Z|_|-`':}.:w}*Z}_}-`' -`$+?,+@4aZCCCC-R6$+_,-T f #<f?b(f+4aZCBCCB-D g ף<g?b(g+B4aZCBCBCBA-x +C4aZCBCCCB r--S% S,[S[?&;+6S6SO:6,d:6,db(b%?@[6C?,?@[Ja S?,S?,@BABSq--+?H?,@+?,?,HB+H8,2\?f?\b'b(fb(b%\L4a CBCCCB ,2\?f?\b'b(fb(b%\ s%D+?,DH?,? --+??,H?,@ +?,?,H+H4a CB@CCB --R s,eD+?,DH?,? r , 'r a/!8'%r  }C%'&q!aw.*.L-'Cc%c, !fff?c{%s  xx y%D%W%t*3rw3*E3-l3a/!J-b '-3a/!^^?3-U '-k '-r3 `-b'S?3-3a/!iQ?3--b'S?3y3[W[W,dr330 -B. ?-a(:wB*mBqB-a':X.:wX*mXqX-a' -a $, ?, ,@   4amCCCC -b  6 $ , q,-bS #<S? b(S , 4amCBCCB-U ^ ף<^? b(^ ,B 4amCBCBCBA-k   ,C 4amCBCCCB  r--W% W,qWq?& ;,6W6WO:6,d:6,d  b(b%?@q6 C?,?@q Ja W?,W?,@BABW q--,? V ?,@, ?,?,VB ,V8,2j?o?j b'b(ob(b%jL  4a CBCCCB ,2j?o?j b'b( ob(b% j  s %D,?,DV?,?  --,? ?,V ?,@ , ?,?,V ,V 4a CB@CCB --b    s ,yD,?,DV?,?  xT U %L%X%I*6rw6*E6-l6a/!J-j'-6a/!^I?6-t '-o '-r6 `-]'F?6-6a/!iv?6--]'F?6U 6[X[X,dr660 -M. ?-F(:wM*wMyM-F':G.:wG*wGyG-F' -F $) ?, )@   4awCCCC -j 6 $ ) y,-]F #<F? b(F ) 4awCBCCB-t I ף<I? b(I )B 4awCBCBCBA-o   )C 4awCBCCCB  r--X% X,OXO?& ;)6X6XO:6,d:6,d  b(b%?@O6 C?,?@O Ja X?,X?,@BABX q--)? C ?,@) ?,?,CB )C8,2x?Z?x b'b(Zb(b%xL  4a CBCCCB ,2x?Z?x b'b( Zb(b% x  s %D)?,DC?,?  --)? ?,C ?,@ ) ?,?,C )C 4a CB@CCB --j   s ,U D)?,DC?,? PnF'a  X\ E%\Z'&'$@@.vw.*.La!fff?L=b.. @ q g \ 6@ 6q 6g . !@  Ys ;,G s :s ?&.sinsnipr E  iO ?uv Y?$r.*q! R9. O . bv uR w.O *a??,(-'a>L@(-( Vl6=UKC!c?lu ?, Ma u a Z#sS@`2r9n1ԝXԝX y v" y a/!Ny a { ,['{ a/!8'%{  I} [*?*C?} aA @a e }  Zd (Q .  o.-fQ ?Xl̽.-@  Z X ;$.FX ?,6-'Aw!*!-' N-(?,dX ?&w!*!-(!-(66.Botpack.PulseGunL ,w!*!-(!-'66  k zl NkP iK-T-T'Cw*Nl d -j -P -T(k l d -j -P  bo , 1'o a/!8'%o  q F} L`Ea }  &w*a*q }  iM, #=n .  A/wn *(;iM  @t67.,-] $::$[t-] '~--[ -p-|a {ff>ff&?$$a(((?v$$'6-#6 #- '6 ,o$  TKi %(rKu* uK eWd 4pC.  hw.*C?X@n  TqI -  q *  A` #;g|` usegrappleyH~ gwy*Xwy*yzgyGw*#` ~  jdd -dr'*-8r( Ylu JM {n?$r.*q! _ 9. u . bM m_  w.u *a??,(-'a>L@(-( L#[L@`2D_p\1ԝXԝX9$?CR x w&P R .R  JPtCM- 4a/!Zlw*%wr.}w*?s <  Ld"Jy"G L^B$E$n$zDx"ImY$ C9$L>rIw2H*"!rG]Akimbo MagnumiK$?yDO$=b$?F$?hJJ])(%o was filled with hot lead by %k's %w.^$ ף<- MAkimbo Magnums::)33S@@([m$ h[m-- ^g"C  a>a `hT(,..' l//============================================================================= // SinWeapons. Sin weapons, what else? //============================================================================= class SinWeapons expands TournamentWeapon; simulated function PostRender( canvas Canvas ) { local ChallengeHUD MyHUD; local float Scale; local sin2utdialogclientwindow sm; Super.PostRender(Canvas); bOwnsCrossHair = bLockedOn; if ( bOwnsCrossHair ) { // if locked on, draw special crosshair Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 4 * Scale, 0.5 * Canvas.ClipY - 4 * Scale ); // Canvas.SetPos(0.5 * Canvas.ClipX - 8, 0.5 * Canvas.ClipY - 8 ); Canvas.Style = ERenderStyle.STY_Translucent; //If (sm.newx.bchecked == true) Canvas.DrawIcon(Texture'SinHUD.Ch1_On', Scale); Canvas.DrawIcon(Texture'SinHUD.Ch1_On', Scale); Canvas.Style = ERenderStyle.STY_Translucent; } } aA?a !a%!Ma&> PHnD$  RA##!:.%q!F z tmCk-(-(-(Ca !Ma!M>a$. U#iQp>6qW +-(a.? Y YZ 6# Tu .7$-(a>L?(T s@vmD F` RJ:.%:.% ?  zV/g-'4 Nm?@-(-(-(a$. P# 6a( ~kD  //============================================================================= // SinFlaggy. //============================================================================= class SinFlaggy expands FlagBase; var() byte Team; var() Sound TakenSound; function PostBeginPlay() { local CTFFlag myFlag; Super.PostBeginPlay(); LoopAnim('newflag'); if ( !Level.Game.IsA('SinCTFGame') ) return; bHidden = false; if ( Team == 0 ) { Skin=texture'SinHUD.flags.sinflag2'; myFlag = Spawn(class'rsinflag'); } else if ( Team == 1 ) Skin=texture'SinHUD.flags.sinflag'; myFlag = Spawn(class'bsinflag'); myFlag.HomeBase = self; myFlag.Team = Team; sinctfrep(Level.Game.GameReplicationInfo).sFlagList[Team] = myFlag; } function PlayAlarm() { SetTimer(5.0, false); AmbientSound = TakenSound; } function Timer() { AmbientSound = None; } 4S[//============================================================================= // SinShotgun. //============================================================================= class SinShotgun expands SinWeapons; var int NumFire; function float SuggestAttackStyle() { local float EnemyDist; EnemyDist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); if ( (Pawn(Owner).Enemy != none) && (EnemyDist < 600) ) return 2; else return 0; } function float SuggestDefenseStyle() { return -2.0; } function float RateSelf( out int bUseAltMode ) { local Pawn P; local float EnemyDist; if ( AmmoType.AmmoAmount <=0 ) return -2; bUseAltMode = 0; AIRating *= FMin(Pawn(Owner).DamageScaling, 1.5); return AIRating; } /////////////////////////////////////////////////////// state NormalFire { ignores Fire, AltFire, AnimEnd; /* function Fire(float F) { } function AltFire(float F) { } */ Begin: FlashCount++; FinishAnim(); Finish(); SetTimer(0.5,True); } function Timer() { local actor targ; local float bestAim, bestDist; local vector FireDir; bestAim = 0.85; if ( Pawn(Owner) == None ) { GotoState(''); return; } FireDir = vector(Pawn(Owner).ViewRotation); targ = Pawn(Owner).PickTarget(bestAim, bestDist, FireDir, Owner.Location); if ( Pawn(targ) != None ) { SetTimer(1 + 4 * FRand(), false); bPointing = true; } else { SetTimer(0.4 + 3.2 * FRand(), false); bPointing = false; } } function PlayAltFiring() { bMuzzleFlash++; Owner.PlaySound(FireSound, SLOT_None, 255*Pawn(Owner).SoundDampening); PlayAnim('Fire', 0.85,0.05); Owner.PlaySound(CockingSound, SLOT_None, 255*Pawn(Owner).SoundDampening); } function PlayFiring() { bMuzzleFlash++; Owner.PlaySound(FireSound, SLOT_None, 255*Pawn(Owner).SoundDampening); PlayAnim('Fire', 0.85,0.05); Owner.PlaySound(CockingSound, SLOT_None, 255*Pawn(Owner).SoundDampening); } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190)); if ( PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV ) bMuzzleFlash++; } if (Other == Level) { Spawn(class'UT_HeavyWallHitEffect',,, HitLocation+HitNormal*8,rotator(HitNormal)); Spawn(class'pock',,,HitLocation+HitNormal*8, rotator(HitNormal)); } else if ( (Other != self) && (Other != Owner) && (Other != None) ) { // Headshot damage to top 35% of body if ( Other.IsA('Pawn') && (HitLocation.Z - Other.Location.Z > 0.65 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.skill > 1)) && (!Other.IsA('ScriptedPawn') || !ScriptedPawn(Other).bIsBoss) ) Other.TakeDamage(13, Pawn(Owner), HitLocation, 3000 * X, 'shot'); // Legshot damage to bottom 48% of body if ( Other.IsA('Pawn') && (HitLocation.Z - Other.Location.Z < 0.48 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.skill > 1)) && (!Other.IsA('ScriptedPawn') || !ScriptedPawn(Other).bIsBoss) ) Other.TakeDamage(8, Pawn(Owner), HitLocation, 3000 * X, 'shot'); // Normal damage to the rest else Other.TakeDamage(11, Pawn(Owner), HitLocation, 3000.0*X, 'shot'); if ( !Other.IsA('Pawn') && !Other.IsA('Carcass') ) spawn(class'SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function Finish() { //bMuzzleFlash = 0; if ( ((Pawn(Owner).bFire!=0) || (Pawn(Owner).bAltFire!=0)) && (FRand() < 0.6) ) Timer(); Super.Finish(); } function SpawnShell() { local UT_Shellcase s; local vector realLoc, X, Y, Z; GetAxes(AdjustedAim,X,Y,Z); s = Spawn(class'UT_ShellCase',, '', Owner.Location + CalcDrawOffset() + 10 * X + (2.8 * FireOffset.Y+1.0) * Y - Z * 1); //s = Spawn(class'UT_ShellCase',, '', Owner.Location + CalcDrawOffset() + 30 * X + (2.8 * FireOffset.Y+5.0) * Y - Z * 1); if ( s != None ) { s.Eject(((FRand()*0.3+0.2)*X + (FRand()*0.1+0.2)*Y + (FRand()*0.3) * Z)*160); // s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.5)*Y + (FRand()*0.3+1.0) * Z)*160); } } /////////////////////////////////////////////////////////// function PlayIdleAnim() { } function AltFire( float Value ) { local int numberofshots; if (AmmoType.Ammoamount>0) { if (AmmoType.UseAmmo(1)) { GotoState('NormalFire'); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); bPointing=True; ClientAltFire(Value); for(numberofshots = 0; numberofshots < 10; numberofshots++) TraceFire(3.0); PlayFiring(); SpawnShell(); } } } function Fire( float Value ) { local int numberofshots; if (AmmoType.Ammoamount>0) { if (AmmoType.UseAmmo(1)) { GotoState('NormalFire'); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); bPointing=True; ClientFire(Value); for(numberofshots = 0; numberofshots < 10; numberofshots++) TraceFire(0.9); PlayFiring(); SpawnShell(); } } } function BeginState() { if (Pawn(Owner).bFire!=0) Fire(0.0); bPointing = false; SetTimer(0.4 + 1.6 * FRand(), false); Super.BeginState(); } function EndState() { SetTimer(0.0, false); Super.EndState(); } simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * 0.4 ); } simulated function PlaySelect() { bForceFire = false; bForceAltFire = false; bCanClientFire = false; Owner.PlaySound(SelectSound, SLOT_Misc, Pawn(Owner).SoundDampening); } Dm\*\)0a.D  hkaCs-X '-w.=*.=*[wO*OaOO-wQ*QaQQ[w=*::$k.=  wk*k*kq!l Zj2,aa?' pv'` TF# }$  Bo"/E=-{'=w* \-t (w*r  q w*r  [Nw*r  `w*r  bw* q Cw*a/!i { P q'W pHUu$a$C.a!Y?L=$a$C. b t' JA)//============================================================================= // ShieldTech. //============================================================================= class ShieldTech expands SinTechs; #exec MESH IMPORT MESH=shield_quad ANIVFILE=MODELS\shield_quad_a.3d DATAFILE=MODELS\shield_quad_d.3d X=0 Y=0 Z=0 #exec MESH ORIGIN MESH=shield_quad X=0 Y=50 Z=0 #exec MESH SEQUENCE MESH=shield_quad SEQ=All STARTFRAME=0 NUMFRAMES=1 #exec MESH SEQUENCE MESH=shield_quad SEQ=SHIELD STARTFRAME=0 NUMFRAMES=1 #exec TEXTURE IMPORT NAME=Jtech1 FILE=MODELS\tech.PCX GROUP=Skins FLAGS=2 // Skin #exec MESHMAP NEW MESHMAP=shield_quad MESH=shield_quad #exec MESHMAP SCALE MESHMAP=shield_quad X=0.1 Y=0.1 Z=0.2 #exec MESHMAP SETTEXTURE MESHMAP=shield_quad NUM=1 TEXTURE=Jtech1 function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Pawn(Owner).ReducedDamagePct = Pawn(Owner).default.ReducedDamagePct; } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { if (Pawn(Owner) == None) { Super.BecomePickup(); } } function ArmorImpactEffect(vector HitLocation) { /*if ( Owner.IsA('PlayerPawn') ) { PlayerPawn(Owner).ClientFlash(-0.05,vect(400,400,400)); }*/ Owner.PlaySound(TechSound, SLOT_None, 2.7*Pawn(Owner).SoundDampening); } // // Absorb damage. // function int ArmorAbsorbDamage(int Damage, name DamageType, vector HitLocation) { ArmorImpactEffect(HitLocation); return 0.34 * Damage; } // // Return armor value. // function int ArmorPriority(name DamageType) { return 1; // very low absorption priority (only if no other armor left } function BeginState() { bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(1.0,True); } } state DeActivated { Begin: } singular function UsedUp() { if ( Owner != None ) { if ( Owner.bIsPawn ) { if ( !Pawn(Owner).bIsPlayer || (Pawn(Owner).PlayerReplicationInfo.HasFlag == None) ) { Owner.AmbientGlow = Owner.Default.AmbientGlow; Owner.LightType = LT_None; } PlaySound(DeActivateSound,,4.0); Pawn(Owner).ReducedDamagePct = Pawn(Owner).default.ReducedDamagePct; } bActive = false; if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogItemDeactivate(Self, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogItemDeactivate(Self, Pawn(Owner)); } Destroy(); } V2z//============================================================================= // SinMutator. //============================================================================= class SinMutator expands Mutator; var config bool Magnumenabled, Shotgunenabled, AssaultEnabled, ChainEnabled, PlasmaEnabled, RocketEnabled, RifleEnabled, MinesEnabled, HealthEnabled, PickupsEnabled, ArmorEnabled, HealthDrop, EasyAim, MeleeEnabled, DeRip, DeMini, NewXhair, Grapple, HUDOverRide; var Inventory SpecialItem; var ItemHUD NextRTechHUD; var PlayerPawn PlayerOwner; var bool bIsItemHUD; var float LastChecked, LastRendered; var() color RedColor, GreenColor; var() name WeaponName, AmmoName; var() string WeaponString, AmmoString; var C_GrappleLauncher cl; replication { reliable if(role==role_authority) cl; } function C_GrappleLauncher GetGrappleLauncher(actor Other) { local C_GrappleLauncher thelauncher; foreach AllActors(class'C_GrappleLauncher',thelauncher) { if(thelauncher.owner==Other) return thelauncher; } return None; } function Mutate(string MutateString, PlayerPawn Sender) { if(MutateString~="usegrapple") { //find the grapplelauncher cl=GetGrappleLauncher(Sender); //Sender.ClientMessage("I'm going to try to shoot the hook for " $ Sender $ " with " $ cl); //shoot it if(cl!=none) { if (cl.grapple!=none) cl.ReleaseHook(); else cl.FireHook(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { bSuperRelevant = 1; // Replace Weapons if (MagnumEnabled == true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.enforcer' ) //#2 { ReplaceWith(Other, "Sin2ut.Magnum"); return False; } if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.doubleenforcer' ) //#2 { ReplaceWith(Other, "Sin2ut.Magnum"); return False; } } if (ShotgunEnabled == true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.ut_biorifle' ) //#3 { ReplaceWith(Other, "Sin2ut.SinShotgun"); return False; } } if (AssaultEnabled == true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.ShockRifle' ) //#4 { ReplaceWith(Other, "Sin2ut.ChainGun"); return False; } } if (ChainEnabled == true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.PulseGun' ) //#5 { ReplaceWith(Other, "Sin2ut.TrueChainGun"); return False; } } if (PlasmaEnabled == true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.ut_flakcannon' ) //#8 { ReplaceWith(Other, "Sin2ut.PlasmaRifle"); return False; } } if (RocketEnabled == true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.ut_eightball' ) //#9 { ReplaceWith(Other, "Sin2ut.RocketLauncher"); return False; } } if (RifleEnabled == true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.SniperRifle' ) //#10 { ReplaceWith(Other, "Sin2ut.RealSinSniper"); return False; } } // Replace Ammo if (RifleEnabled == true) { if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.Bulletbox' ) //#10 { ReplaceWith(Other, "Sin2ut.SniperAmmo"); return False; } } if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.Rifleshell' ) { return False; //Causing problems } if (DeRip==true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.ripper' ) return false; if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.BladeHopper' ) return false; } if (DeMini==true) { if ( Other.IsA('TournamentWeapon') && Other.class==class'Botpack.minigun2' ) return false; if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.miniammo' ) return false; } if (ShotgunEnabled == true) { if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.bioammo' ) //#3 { ReplaceWith(Other, "Sin2ut.SinShotgunAmmo"); return False; } } if (AssaultEnabled == true) { if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.ShockCore' )//#4 { ReplaceWith(Other, "Sin2ut.MachineGunAmmo"); return False; } } if (MagnumEnabled == true) { if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.eclip' )//#2 { ReplaceWith(Other, "Sin2ut.MagClip"); return False; } } if (ChainEnabled == true) { if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.Pammo' )//#5 { ReplaceWith(Other, "Sin2ut.ChainGunAmmo"); return False; } } if (RocketEnabled == true) { if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.RocketPack' )//#9 { ReplaceWith(Other, "Sin2ut.SinRocketPack"); return False; } } if (PlasmaEnabled == true) { if ( Other.IsA('TournamentAmmo') && Other.class==class'Botpack.Flakammo' )//#8 { ReplaceWith(Other, "Sin2ut.PlasmaAmmo"); return False; } } // Replace Pickups if (PickupsEnabled == true) { //Causing GPFs /*if ( Other.IsA('TournamentPickup') && Other.class==class'Botpack.ut_invisibility' ) { ReplaceWith(Other, "Sin2ut.Sin_invisibility"); return False; }*/ if ( Other.IsA('TournamentPickup') && Other.class==class'Botpack.ut_jumpboots' ) { ReplaceWith(Other, "Sin2ut.u4"); return False; } } // Replace Health if (HealthEnabled == true) { if ( Other.IsA('TournamentHealth') && Other.class==class'Botpack.MedBox' ) { ReplaceWith(Other, "Sin2ut.SinHealth"); return False; } if ( Other.IsA('TournamentHealth') && Other.class==class'Botpack.HealthVial' ) { ReplaceWith(Other, "Sin2ut.SinHealth5"); return False; } if ( Other.IsA('TournamentHealth') && Other.class==class'Botpack.HealthPack' ) { ReplaceWith(Other, "Sin2ut.SinHealth50"); return False; } } //Replace Armors if (ArmorEnabled == true) { if ( Other.IsA('TournamentPickup') && Other.class==class'Botpack.armor2' ) { ReplaceWith(Other, "Sin2ut.SinArmor"); return False; } if ( Other.IsA('TournamentPickup') && Other.class==class'Botpack.thighpads' ) { ReplaceWith(Other, "Sin2ut.SinPants"); return False; } if ( Other.IsA('TournamentPickup') && Other.class==class'Botpack.ut_shieldbelt' ) { ReplaceWith(Other, "Sin2ut.Bioshield"); return False; } if ( Other.IsA('TournamentPickup') && Other.class==class'Botpack.udamage' ) { ReplaceWith(Other, "Sin2ut.SinHelmet"); return False; } /*if ( Level.Game != None && Level.Game.HUDType==class'Botpack.DeathmatchPlus') Level.Game.HUDType=class'Sin2ut.Sin2utHUD'; else if ( Level.Game != None && Level.Game.HUDType==class'Botpack.ChallengeCTFHUD') Level.Game.HUDType=class'Sin2ut.SinChallengeCTFHUD'; else if ( Level.Game != None && Level.Game.HUDType==class'Botpack.AssaultHUD') Level.Game.HUDType=class'Sin2ut.SinAssaultHUD'; else if ( Level.Game != None && Level.Game.HUDType==class'Botpack.ChallengeDominationHUD') Level.Game.HUDType=class'Sin2ut.SinChallengeDominationHUD'; else if ( Level.Game != None) Level.Game.HUDType=class'Sin2ut.Sin2utHUD';*/ if ( Level.Game != None && Level.Game.IsA('CTFGame') ) { Level.Game.GameReplicationInfoClass=Class'sin2ut.sinctfrep'; Level.Game.ScoreBoardType=Class'sin2ut.SinCTFScoreboard'; /* if ( Other.IsA('FlagBase') ) { FlagBase(Other).TakenSound=Sound'Botpack.CTF.flagtaken'; } */ if ( Other.IsA('CTFFlag') && Other.class==class'Botpack.CTFFlag' ) { CTFFlag(Other).Skin=Texture'SinHUD.flags.Sinflag'; } if ( Other.IsA('CTFFlag') && Other.class==class'Botpack.RedFlag' ) { CTFFlag(Other).Skin=Texture'Botpack.Skins.JpflagR'; } } } bSuperRelevant = 0; return true; } function GiveInventory( pawn PlayerPawn ) { local Inventory Inv; local Inventory Inv2; local Weapon Weap; local weapon weap2; weap = Spawn(class'Magnum'); weap2 = Spawn(class'c_GrappleLauncher'); Inv = PlayerPawn.FindInventoryType(class'Degeneration'); Inv2 = PlayerPawn.FindInventoryType(class'AimHelper'); if (HealthDrop == true && Inv==none) GiveItem(PlayerPawn, "sin2ut.degeneration"); if (EasyAim == true && Inv2==none) GiveItem(PlayerPawn, "sin2ut.AimHelper"); if (MagnumEnabled == true && weap==none) GiveWeapon(PlayerPawn, "sin2ut.Magnum"); if (Grapple == true && weap2==none) GiveMinorWeapon(PlayerPawn, "singrapple.c_grapplelauncher"); } function GiveItem(Pawn PlayerPawn, string aClassName ) { local class PickupClass; local Pickup NewPickup; PickupClass = class(DynamicLoadObject(aClassName, class'Class')); if( PlayerPawn.FindInventoryType(PickupClass) != None ) return; newPickup = Spawn(PickupClass); if( newPickup != None ) { newPickup.RespawnTime = 0.0; newPickup.GiveTo(PlayerPawn); newPickup.bHeldItem = true; newPickup.AmbientGlow = 0; } } function GiveWeapon(Pawn PlayerPawn, string aClassName ) { local class WeaponClass; local Weapon NewWeapon; WeaponClass = class(DynamicLoadObject(aClassName, class'Class')); if( PlayerPawn.FindInventoryType(WeaponClass) != None ) return; newWeapon = Spawn(WeaponClass); if( newWeapon != None ) { newWeapon.RespawnTime = 0.0; newWeapon.GiveTo(PlayerPawn); newWeapon.bHeldItem = true; newWeapon.GiveAmmo(PlayerPawn); newWeapon.SetSwitchPriority(PlayerPawn); newWeapon.WeaponSet(PlayerPawn); newWeapon.AmbientGlow = 0; if ( PlayerPawn.IsA('PlayerPawn') ) newWeapon.SetHand(PlayerPawn(PlayerPawn).Handedness); else newWeapon.GotoState('Idle'); PlayerPawn.Weapon.GotoState('DownWeapon'); PlayerPawn.PendingWeapon = None; PlayerPawn.Weapon = newWeapon; } } function GiveMinorWeapon(Pawn PlayerPawn, string aClassName ) { local class WeaponClass; local Weapon NewWeapon; WeaponClass = class(DynamicLoadObject(aClassName, class'Class')); if( PlayerPawn.FindInventoryType(WeaponClass) != None ) return; newWeapon = Spawn(WeaponClass); if( newWeapon != None ) { newWeapon.RespawnTime = 0.0; newWeapon.GiveTo(PlayerPawn); newWeapon.bHeldItem = true; newWeapon.GiveAmmo(PlayerPawn); newWeapon.SetSwitchPriority(PlayerPawn); newWeapon.WeaponSet(PlayerPawn); newWeapon.AmbientGlow = 0; if ( PlayerPawn.IsA('PlayerPawn') ) newWeapon.SetHand(PlayerPawn(PlayerPawn).Handedness); else newWeapon.GotoState('Idle'); // PlayerPawn.Weapon.GotoState('DownWeapon'); // PlayerPawn.PendingWeapon = None; // PlayerPawn.Weapon = newWeapon; } } function ModifyPlayer(Pawn Other) { // called by Gameinfo.RestartPlayer() local Inventory Inv; local Inventory Inv2; local Weapon Weap; local weapon weap2; if (MagnumEnabled == true) { weap = Spawn(class'Magnum'); if( weap != None ) { weap.RespawnTime = 0.0; weap.GiveTo(Other); weap.bHeldItem = true; weap.GiveAmmo(Other); weap.SetSwitchPriority(Other); weap.WeaponSet(Other); } } if (Grapple == true) { weap2 = Spawn(class'c_GrappleLauncher'); if( weap2 != None ) { weap2.RespawnTime = 0.0; weap2.GiveTo(Other); weap2.bHeldItem = true; weap2.GiveAmmo(Other); weap2.SetSwitchPriority(Other); weap2.WeaponSet(Other); } } if (HealthDrop == true) { Inv = Other.FindInventoryType(class'Degeneration'); if ( Inv != None ) Inv.Charge = 9999999; else { inv = Spawn(class'Degeneration'); if( inv != None ) { inv.charge = 9999999; inv.bHeldItem = true; inv.RespawnTime = 0.0; inv.GiveTo(Other); inv.Activate(); } } } if (EasyAim == true) { Inv2 = Other.FindInventoryType(class'AimHelper'); if ( Inv2 != None ) Inv2.Charge = 9999999; else { inv2 = Spawn(class'AimHelper'); if( inv2 != None ) { inv2.charge = 9999999; inv2.bHeldItem = true; inv2.RespawnTime = 0.0; inv2.GiveTo(Other); inv2.Activate(); } } } if ( NextMutator != None ) NextMutator.ModifyPlayer(Other); } event PreBeginPlay() { if (MeleeEnabled==true) { if ( Level.Game != None ) Level.Game.DefaultWeapon=class'Sin2ut.ConcussionGun'; } if (HUDOverRide==false) { if ( Level.Game != None && Level.Game.HUDType==class'Botpack.DeathmatchPlus') Level.Game.HUDType=class'Sin2ut.Sin2utHUD'; else if ( Level.Game != None && Level.Game.HUDType==class'Botpack.ChallengeCTFHUD') Level.Game.HUDType=class'Sin2ut.SinChallengeCTFHUD'; else if ( Level.Game != None && Level.Game.HUDType==class'Botpack.AssaultHUD') Level.Game.HUDType=class'Sin2ut.SinAssaultHUD'; else if ( Level.Game != None && Level.Game.HUDType==class'Botpack.ChallengeDominationHUD') Level.Game.HUDType=class'Sin2ut.SinChallengeDominationHUD'; else if ( Level.Game != None) Level.Game.HUDType=class'Sin2ut.Sin2utHUD'; } if ( Level.Game != None && Level.Game.IsA('CTFGame') ) { Level.Game.GameReplicationInfoClass=Class'sin2ut.sinctfrep'; Level.Game.ScoreBoardType=Class'sin2ut.SinCTFScoreboard'; } } event PlayerLogin(playerpawn other) { //AddDefaultInventory(other); GiveInventory(other); } simulated function PostRender(canvas C) { local float Scale; local Inventory inv; local int i; if ( PlayerOwner == None ) { Destroy(); if ( NextRTechHUD != None ) NextRTechHUD.PostRender( C ); return; } if ( PlayerOwner == ChallengeHUD(PlayerOwner.MyHUD).PawnOwner ) { if ( (SpecialItem == None) || SpecialItem.bDeleteMe || (SpecialItem.Owner == None) || (SpecialItem.Owner != PlayerOwner) ) { if ( Level.TimeSeconds - LastChecked > 0.3 ) { SpecialItem = None; LastChecked = Level.TimeSeconds; inv = PlayerOwner.Inventory; While (inv != None ) { if ( inv.IsA('BioShield') || inv.IsA('u4') || inv.IsA('UT_Invisibility')) { SpecialItem = inv; break; } inv = inv.inventory; i++; if ( i > 200 ) inv = none; } } } if ( SpecialItem != None ) { Scale = ChallengeHUD(PlayerOwner.MyHUD).Scale; //C.DrawColor = ChallengeHUD(PlayerOwner.MyHUD).FavoriteHUDColor; C.DrawColor = C.DrawColor; C.SetPos(C.ClipX - 32 * Scale, C.ClipY - 192 * Scale); C.DrawIcon(SpecialItem.Icon, Scale); } if ( cl.Grapple != None ) { Scale = ChallengeHUD(PlayerOwner.MyHUD).Scale; //C.DrawColor = ChallengeHUD(PlayerOwner.MyHUD).FavoriteHUDColor; C.DrawColor = GreenColor; C.SetPos(C.ClipX - 16 * Scale, C.ClipY - 128 * Scale); C.DrawText("Grapple: Ready", false); } if ( cl.Grapple == None ) { Scale = ChallengeHUD(PlayerOwner.MyHUD).Scale; //C.DrawColor = ChallengeHUD(PlayerOwner.MyHUD).FavoriteHUDColor; C.DrawColor = RedColor; C.SetPos(C.ClipX - 16 * Scale, C.ClipY - 128 * Scale); C.DrawText("Grapple: Out", false); } /* if ( cl.grapple != None ) { Scale = ChallengeHUD(PlayerOwner.MyHUD).Scale; //C.DrawColor = ChallengeHUD(PlayerOwner.MyHUD).FavoriteHUDColor; C.DrawColor = C.drawcolor; C.SetPos(C.ClipX - 96 * Scale, C.ClipY - 234 * Scale); C.DrawIcon(cl.Icon, Scale * 2); } */ } //425 if ( NextRTechHUD != None ) //425 NextRTechHUD.PostRender( C ); } // Fixed version of the Mutator function simulated function RegisteraHUDMutator() { local PlayerPawn P; ForEach AllActors(class'PlayerPawn', P) if ( P.myHUD != None ) { NextRTechHUD = ItemHUD(P.myHud.HUDMutator); P.myHUD.HUDMutator = Self; PlayerOwner = P; bIsItemHUD = True; } } /*function AddDefaultInventory( pawn PlayerPawn ) { local Impacthammer w; local Bot B; if ( PlayerPawn.IsA('Spectator')) return; // Spawn Sin Weapons+Items if (HealthDrop == true) GiveItem(PlayerPawn, "sin2ut.degeneration"); if (EasyAim == true) GiveItem(PlayerPawn, "sin2ut.AimHelper"); if (MagnumEnabled == true) GiveWeapon(PlayerPawn, "sin2ut.Magnum"); w.default.Autoswitchpriority = 0; w.Autoswitchpriority = 0; }*/ fr } }%=$.@@-(a!>L=w.*)..-' z|\N:}$.@@-(sw.*)..-' @ADY  vABd  f //============================================================================= // AimHelper. //============================================================================= class AimHelper expands TournamentPickup; function tick (float deltatime) { local actor Other; local vector HitLocation, HitNormal, X, Y, Z, StartTrace, EndTrace; if (Owner.IsA('Playerpawn') && Owner!=none) { StartTrace = Owner.Location; StartTrace.Z += Pawn(Owner).BaseEyeHeight; EndTrace = StartTrace + vector(Pawn(Owner).ViewRotation) * 10000.0; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if (Other!=none) { if (Other.IsA('Pawn')) Pawn(Owner).Weapon.bLockedOn=true; else Pawn(Owner).Weapon.bLockedon=false; } else if (Other==none)Pawn(Owner).Weapon.bLockedon=false; } else if (!Owner.IsA('PlayerPawn')) destroy(); } J@cY 5a(c }u -}.2  A@HC?}1Sin2UT Setup}0&}$f.2  A BHC?f1Grappling Hookf0%f$f- -vg.2  ApBHC?g1Concussion Gung0%g$g- -{B.2  ABHC?B1MagnumsB0%B$B- -]r.2  ABHC?r1Shotgunr0%r$r- -zX.2  ABHC?X1Assault RifleX0%X$X- -oL.2  A CHC?L1ChaingunL0%L$L- -gM.2  A CHC?M1Plasma RifleM0%M$M- -dZ.2  A4CHC?Z1Rocket LauncherZ0%Z$Z- -Au.2  AHCHC?u1Sniper Rifleu0%u$u- -ud.2  A\CHC?d1Health itemsd0%d$d- -Y.2  ApCHC?Y1Inventory itemsY0%Y$Y- -sW.2  ACHC?W1ArmorsW0%W$W- -~k.2  ACHC?k1Health Drop after 100k0%k$k- -Yb.2  ACHC?b1Enhanced Targetingb0%b$b- -We.2  ACHC?e1Remove Ripperse0%e$e- -Ea.2  ACHC?a1Remove Minigunsa0%a$a- -a w//============================================================================= // Sin2UTDialogClientWindow. //============================================================================= class Sin2UTDialogClientWindow expands UWindowDialogClientWindow; var UWindowLabelControl ImpactLabel; var UWindowCheckBox ReplaceMelee, ReplaceGun,ReplaceBio,ReplaceShock,ReplacePulse,ReplaceFlak,ReplaceRifle,ReplaceRocket,ReplaceHealth,ReplacePickups,ReplaceArmor,UseHD,UseAim,ExRip,Exmini,NewX,Grap,OverRideHUD; function Created() { Super.Created(); ImpactLabel = UWindowLabelControl(CreateControl(class'UWindowLabelControl', 10, 5, 200, 1)); ImpactLabel.SetText("Sin2UT Setup"); ImpactLabel.SetFont(F_Bold); ImpactLabel.Align = TA_Center; Grap = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 40, 200, 1)); Grap.SetText("Grappling Hook"); Grap.SetFont(F_Normal); Grap.Align = TA_Left; Grap.bChecked = class'Sin2ut.SinMutator'.Default.Grapple; ReplaceMelee = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 60, 200, 1)); ReplaceMelee.SetText("Concussion Gun"); ReplaceMelee.SetFont(F_Normal); ReplaceMelee.Align = TA_Left; ReplaceMelee.bChecked = class'Sin2ut.SinMutator'.Default.MeleeEnabled; ReplaceGun = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 80, 200, 1)); ReplaceGun.SetText("Magnums"); ReplaceGun.SetFont(F_Normal); ReplaceGun.Align = TA_Left; ReplaceGun.bChecked = class'Sin2ut.SinMutator'.Default.MagnumEnabled; ReplaceBio = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 100, 200, 1)); ReplaceBio.SetText("Shotgun"); ReplaceBio.SetFont(F_Normal); ReplaceBio.Align = TA_Left; ReplaceBio.bChecked = class'Sin2ut.SinMutator'.Default.ShotgunEnabled; ReplaceShock = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 120, 200, 1)); ReplaceShock.SetText("Assault Rifle"); ReplaceShock.SetFont(F_Normal); ReplaceShock.Align = TA_Left; ReplaceShock.bChecked = class'Sin2ut.SinMutator'.Default.AssaultEnabled; ReplacePulse = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 140, 200, 1)); ReplacePulse.SetText("Chaingun"); ReplacePulse.SetFont(F_Normal); ReplacePulse.Align = TA_Left; ReplacePulse.bChecked = class'Sin2ut.SinMutator'.Default.ChainEnabled; ReplaceFlak = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 160, 200, 1)); ReplaceFlak.SetText("Plasma Rifle"); Replaceflak.SetFont(F_Normal); ReplaceFlak.Align = TA_Left; ReplaceFlak.bChecked = class'Sin2ut.SinMutator'.Default.PlasmaEnabled; ReplaceRocket = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 180, 200, 1)); ReplaceRocket.SetText("Rocket Launcher"); ReplaceRocket.SetFont(F_Normal); ReplaceRocket.Align = TA_Left; ReplaceRocket.bChecked = class'Sin2ut.SinMutator'.Default.RocketEnabled; ReplaceRifle = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 200, 200, 1)); ReplaceRifle.SetText("Sniper Rifle"); ReplaceRifle.SetFont(F_Normal); ReplaceRifle.Align = TA_Left; ReplaceRifle.bChecked = class'Sin2ut.SinMutator'.Default.RifleEnabled; ReplaceHealth = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 220, 200, 1)); ReplaceHealth.SetText("Health items"); ReplaceHealth.SetFont(F_Normal); ReplaceHealth.Align = TA_Left; ReplaceHealth.bChecked = class'Sin2ut.SinMutator'.Default.HealthEnabled; ReplacePickups = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 240, 200, 1)); ReplacePickups.SetText("Inventory items"); ReplacePickups.SetFont(F_Normal); ReplacePickups.Align = TA_Left; ReplacePickups.bChecked = class'Sin2ut.SinMutator'.Default.PickupsEnabled; ReplaceArmor = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 260, 200, 1)); ReplaceArmor.SetText("Armors"); ReplaceArmor.SetFont(F_Normal); ReplaceArmor.Align = TA_Left; ReplaceArmor.bChecked = class'Sin2ut.SinMutator'.Default.ArmorEnabled; UseHD = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 280, 200, 1)); UseHD.SetText("Health Drop after 100"); UseHD.SetFont(F_Normal); UseHD.Align = TA_Left; UseHD.bChecked = class'Sin2ut.SinMutator'.Default.HealthDrop; UseAim = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 300, 200, 1)); UseAim.SetText("Enhanced Targeting"); UseAim.SetFont(F_Normal); UseAim.Align = TA_Left; UseAim.bChecked = class'Sin2ut.SinMutator'.Default.EasyAim; /*NewX = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 300, 200, 1)); NewX.SetText("New Targeting Crosshair"); NewX.SetFont(F_Normal); NewX.Align = TA_Left; NewX.bChecked = class'Sin2ut.SinMutator'.Default.NewXHair;*/ ExRip = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 340, 200, 1)); ExRip.SetText("Remove Rippers"); ExRip.SetFont(F_Normal); ExRip.Align = TA_Left; ExRip.bChecked = class'Sin2ut.SinMutator'.Default.DeRip; ExMini = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 360, 200, 1)); ExMini.SetText("Remove Miniguns"); ExMini.SetFont(F_Normal); ExMini.Align = TA_Left; ExMini.bChecked = class'Sin2ut.SinMutator'.Default.DeMini; /*OverrideHUD = UWindowCheckBox(CreateControl(class'UWindowCheckBox', 10, 380, 200, 1)); OverrideHUD.SetText("Disable New HUD"); OverrideHUD.SetFont(F_Normal); OverrideHUD.Align = TA_Left; OverrideHUD.bChecked = class'Sin2ut.SinMutator'.Default.HUDOverRide; */ } //when a control changes, Notify is called with the changed control function Notify(UWindowDialogControl C, byte E) { switch(E) { case DE_Change: switch(C) { case ReplaceGun: if(ReplaceGun.bChecked) { } class'Sin2ut.SinMutator'.Default.MagnumEnabled = ReplaceGun.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplaceMelee: if(ReplaceMelee.bChecked) { } class'Sin2ut.SinMutator'.Default.MeleeEnabled = ReplaceMelee.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplaceBio: if(ReplaceBio.bChecked) { } class'Sin2ut.SinMutator'.Default.ShotgunEnabled = ReplaceBio.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplaceShock: if(ReplaceShock.bChecked) { } class'Sin2ut.SinMutator'.Default.AssaultEnabled = ReplaceShock.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplacePulse: if(ReplacePulse.bChecked) { } class'Sin2ut.SinMutator'.Default.ChainEnabled = ReplacePulse.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplaceFlak: if(ReplaceFlak.bChecked) { } class'Sin2ut.SinMutator'.Default.PlasmaEnabled = ReplaceFlak.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplaceRocket: if(ReplaceROcket.bChecked) { } class'Sin2ut.SinMutator'.Default.RocketEnabled = ReplaceRocket.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplaceRifle: if(ReplaceBio.bChecked) { } class'Sin2ut.SinMutator'.Default.RifleEnabled = ReplaceRifle.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplaceHealth: if(ReplaceHealth.bChecked) { } class'Sin2ut.SinMutator'.Default.HealthEnabled = ReplaceHealth.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplacePickups: if(ReplacePickups.bChecked) { } class'Sin2ut.SinMutator'.Default.PickupsEnabled = ReplacePickups.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ReplaceArmor: if(ReplaceArmor.bChecked) { } class'Sin2ut.SinMutator'.Default.ArmorEnabled = ReplaceArmor.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case UseHD: if(UseHD.bChecked) { } class'Sin2ut.SinMutator'.Default.HealthDrop = UseHD.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case UseAim: if(UseAim.bChecked) { } class'Sin2ut.SinMutator'.Default.EasyAim = UseAim.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; /* case NewX: if(NewX.bChecked) { } class'Sin2ut.SinMutator'.Default.NewXhair = NewX.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break;*/ case ExRip: if(ExRip.bChecked) { } class'Sin2ut.SinMutator'.Default.DeRip = ExRip.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case ExMini: if(ExMini.bChecked) { } class'Sin2ut.SinMutator'.Default.DeMini = ExMini.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case Grap: if(Grap.bChecked) { } class'Sin2ut.SinMutator'.Default.Grapple = Grap.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; case OverRideHUD: if(OverRideHUD.bChecked) { } class'Sin2ut.SinMutator'.Default.HUDOverRide = OverRideHUD.bChecked; class'Sin2ut.SinMutator'.static.StaticSaveConfig(); break; } } } Y//============================================================================= // GrapAmmo. //============================================================================= class GrapAmmo expands TournamentAmmo; qL -(a zK/-'4 sM !Vr.* hN &!-'a @a?' }j=<E PrAra\w*-.- r.*$a @-(w*Dw*I.\w*I.a " U//============================================================================= // FastTech. //============================================================================= class FastTech expands SinTechs; function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { if (Pawn(Owner) == None) Super.BecomePickup(); } function BeginState() { bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(1.0,True); } function int ArmorAbsorbDamage(int Damage, name DamageType, vector HitLocation) { If (Damagetype=='fell')return 0; else return damage; } // // Return armor value. // function int ArmorPriority(name DamageType) { return 1000; // very low absorption priority (only if no other armor left } } state DeActivated { Begin: } singular function UsedUp() { if ( Owner != None ) { if ( Owner.bIsPawn ) { if ( !Pawn(Owner).bIsPlayer || (Pawn(Owner).PlayerReplicationInfo.HasFlag == None) ) { Owner.AmbientGlow = Owner.Default.AmbientGlow; Owner.LightType = LT_None; } PlaySound(DeActivateSound,,4.0); } bActive = false; if ( Owner.Inventory != None ) { Owner.Inventory.ChangedWeapon(); } if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogItemDeactivate(Self, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogItemDeactivate(Self, Pawn(Owner)); } Destroy(); } Bu} vR$  }E@' ::$ S s^ %1.@/r.*  2 Ba* W  Va 91w#*r# #%  s} sa' CC//============================================================================= // SinTechs. //============================================================================= class SinTechs expands TournamentPickup; var SinTechs SpawnedRelic; var float idletime; var Sintechmutator MyTech; var() sound TechSound; function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return false; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.SetDefaultDisplayProperties(); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { if ( Role == ROLE_SimulatedProxy ) CheckForHUDMutator(); } function BeginState() { local Inventory S; bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(1.0,True); IdleTime = 0; } } state DeActivated { Begin: } simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( Level.NetMode == NM_DedicatedServer ) return; CheckForHUDMutator(); } simulated function CheckForHUDMutator() { local TechHUD M; local TechHUD RHM; local PlayerPawn P; ForEach AllActors(class'PlayerPawn', P) if ( P.myHUD != None ) { // check if it already has a HUD Mutator M = TechHUD(P.myHud.HUDMutator); while ( M != None ) { if ( M.IsA('TechHUD') ) return; M = M.NextRTechHUD; } RHM = Spawn(class'TechHUD'); RHM.RegisteraHUDMutator(); if ( RHM.bIsTechHUD ) { if ( Role == ROLE_SimulatedProxy ) SetTimer(0.0, false); return; } else RHM.Destroy(); } if ( Role == ROLE_SimulatedProxy ) SetTimer(1.0, true); } function DropInventory() { local SinTechs Dropped; local vector X,Y,Z; Dropped = Spawn(Class); Owner.GetAxes(Owner.Rotation,X,Y,Z); Dropped.mytech = mytech; mytech.SpawnedRelic = Dropped; Dropped.SetLocation( Owner.Location + 0.8 * Owner.CollisionRadius * X + -0.5 * Owner.CollisionRadius * Y ); Dropped.RemoteRole = ROLE_SimulatedProxy; Dropped.Mesh = PickupViewMesh; Dropped.DrawScale = PickupViewScale; Dropped.bOnlyOwnerSee = false; Dropped.bHidden = false; Dropped.bCarriedItem = false; Dropped.NetPriority = 1.4; Dropped.SetCollision( False, False, False ); Dropped.SetPhysics(PHYS_Falling); Dropped.bCollideWorld = True; Dropped.Velocity = Vector(Pawn(Owner).ViewRotation) * 500 + vect(0,0,220); Dropped.GotoState('PickUp', 'Dropped'); // Remove from player's inventory. Destroy(); } function Destroyed() { if ( (MyTech != None) && (MyTech.SpawnedRelic == self) ) MyTech.SpawnRelic(0); Super.Destroyed(); } auto state Pickup { function BeginState() { Super.BeginState(); IdleTime = 0; SetOwner(None); } function Touch( actor Other ) { if ( ValidTouch(Other) ) { bHeldItem = True; Instigator = Pawn(Other); CheckForHUDMutator(); BecomeItem(); Pawn(Other).AddInventory( Self ); if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, Pawn(Other)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, Pawn(Other)); if (bActivatable && Pawn(Other).SelectedItem==None) Pawn(Other).SelectedItem=Self; if (bActivatable && bAutoActivate && Pawn(Other).bAutoActivate) Self.Activate(); if ( PickupMessageClass == None ) Pawn(Other).ClientMessage(PickupMessage, 'Pickup'); else Pawn(Other).ReceiveLocalizedMessage( PickupMessageClass, 0, None, None, Self.Class ); PlaySound (PickupSound,,2.0); PickupFunction(Pawn(Other)); } } simulated function Landed(Vector HitNormal) { local rotator newRot; newRot = Rotation; newRot.pitch = 0; SetRotation(newRot); SetPhysics(PHYS_Rotating); IdleTime = 0; SetCollision( True, False, False ); } } event float BotDesireability( pawn Bot ) { local Inventory Inv; // If we already have a tech, we don't want another one. for( Inv=Bot.Inventory; Inv!=None; Inv=Inv.Inventory ) if ( Inv.IsA('SinTechs') ) return -1; return MaxDesireability; } c//============================================================================= // ChaingunAmmo. //============================================================================= class ChaingunAmmo expands TournamentAmmo; }}S=] b@}HA6.:.% ? H UF_xon>$a w]8 bmb< iYD1S hZ 0:@-'a @.@ba?' hCH`8u$a $C.$a $C.a!a?L= qjhIA$a$C.a!@L= sQb W$ \r%nH$a$C.a!@L= i|K$a jz B aRJ:.%:.% ? B  iy} h x 8I%:.%-(a>?(h  | ~ a(|  DA+-(=w*%.eb:.%8:.%8 CBT q!*'  Eca!y?L= ]X//============================================================================= // TrueChainGun. Yeah, this is the real thing.... almost. //============================================================================= class TrueChainGun expands ChainGun; var int NumFire; function float RateSelf( out int bUseAltMode ) { local float dist; if ( AmmoType.AmmoAmount <=0 ) return -2; /*if ( Pawn(Owner).Enemy == None ) { bUseAltMode = 0; return AIRating; }*/ if ( Pawn(Owner).Enemy != None ) { dist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); if ( dist < 500 && Self.Ammotype.Ammoamount>=50 && !Bot(Owner).bnovice) { bUseAltMode = 1; return (AIRating * FMin(Pawn(Owner).DamageScaling, 1.5) + FMin(0.0001 * dist, 0.3)); } else if ( dist > 500) { bUseAltMode = 0; return (AIRating * FMin(Pawn(Owner).DamageScaling, 1.5) + FMin(0.0001 * dist, 0.3)); } } AIRating *= FMin(Pawn(Owner).DamageScaling, 1.5); return AIRating; } function float SuggestAttackStyle() { return 2; } function float SuggestDefenseStyle() { return -2; } /////////////////////////////////////////////////////// state NormalFire { function Fire(float F) { } function AltFire(float F) { } Begin: FlashCount++; FinishAnim(); Finish(); } function Timer() { local actor targ; local float bestAim, bestDist; local vector FireDir; bestAim = 0.93; if ( Pawn(Owner) == None ) { GotoState(''); return; } FireDir = vector(Pawn(Owner).ViewRotation); targ = Pawn(Owner).PickTarget(bestAim, bestDist, FireDir, Owner.Location); if ( Pawn(targ) != None ) { SetTimer(1 + 4 * FRand(), false); bPointing = true; } else { SetTimer(0.4 + 3.2 * FRand(), false); bPointing = false; } } function PlayAltFiring() { bMuzzleFlash++; Owner.PlaySound(Sound'Sinsnds.hvgunfire.superfire', SLOT_None, 255*Pawn(Owner).SoundDampening); Owner.PlaySound(Sound'Sinsnds.hvgunfire.loadup', SLOT_None, 255*Pawn(Owner).SoundDampening); PlayAnim('Fire2', 0.5,0.05); } function PlayFailed() { Owner.PlaySound(Misc1sound, SLOT_None, 255*Pawn(Owner).SoundDampening); PlayAnim('Fire', 4.5,0.05); } function PlayFiring() { bMuzzleFlash++; Owner.PlaySound(FireSound, SLOT_None, 255*Pawn(Owner).SoundDampening); PlayAnim('Fire', 4.5,0.05); } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190)); if ( PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV ) bMuzzleFlash++; } if (Other == Level) { Spawn(class'UT_HeavyWallHitEffect',,, HitLocation+HitNormal*8,rotator(HitNormal)); Spawn(class'pock',,,HitLocation+HitNormal*8, rotator(HitNormal)); } else if ( (Other != self) && (Other != Owner) && (Other != None) ) { if ( Other.IsA('Pawn') && (HitLocation.Z - Other.Location.Z > 0.65 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.skill > 1)) && (!Other.IsA('ScriptedPawn') || !ScriptedPawn(Other).bIsBoss) ) Other.TakeDamage(32, Pawn(Owner), HitLocation, 3000 * X, 'shot'); if ( Other.IsA('Pawn') && (HitLocation.Z - Other.Location.Z < 0.48 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.skill > 1)) && (!Other.IsA('ScriptedPawn') || !ScriptedPawn(Other).bIsBoss) ) Other.TakeDamage(24, Pawn(Owner), HitLocation, 3000 * X, 'shot'); else Other.TakeDamage(28, Pawn(Owner), HitLocation, 3000.0*X, 'shot'); if ( !Other.IsA('Pawn') && !Other.IsA('Carcass') ) spawn(class'SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function Finish() { //bMuzzleFlash = 0; if ( ((Pawn(Owner).bFire!=0) || (Pawn(Owner).bAltFire!=0)) && (FRand() < 0.6) ) Timer(); Super.Finish(); } function Fire( float Value ) { if (Ammotype.Ammoamount>0) { if (AmmoType.UseAmmo(1)) { GotoState('NormalFire'); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); ClientFire(Value); TraceFire(1.5); PlayFiring(); } } } function AltFire( float Value ) { local int numberofshots; if (Ammotype.Ammoamount>=50) { if (AmmoType.UseAmmo(50)) { PlayAltFiring(); GotoState('HellFire'); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime * 1.5, ShakeMag * 4, ShakeVert * 2); ClientAltFire(Value); for(numberofshots = 0; numberofshots < 30; numberofshots++) TraceFire(5.75); } } else { PlayFailed(); GotoState('HellFire'); } } state HellFire { function Fire(float F) { } function AltFire(float F) { } Begin: FlashCount++; FinishAnim(); Finish(); } function BeginState() { if (Pawn(Owner).bFire!=0) Fire(0.0); bPointing = false; SetTimer(0.4 + 1.6 * FRand(), false); Super.BeginState(); } function EndState() { SetTimer(0.0, false); Super.EndState(); } /////////////////////////////////////////////////////// function PlayIdleAnim() { PlayAnim('Still',1.0, 0.05); } state Idle { function AnimEnd() { PlayIdleAnim(); } function bool PutDown() { GotoState('DownWeapon'); return True; } Begin: bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo if ( Pawn(Owner).bFire!=0 ) Global.Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) Global.AltFire(0.0); } Fv@DS}Oxg}IU2T=You picked up ammo for the grapple. It doesn't use ammo! Ha!QcU//============================================================================= // SinSniper. //============================================================================= class SinSniper expands SniperRifle; var state currentstate; var() config int NormalDamage; var() config int DecapDamage; var config bool weakened; function AltFire( float Value ) { ClientAltFire(Value); Owner.PlaySound(CockingSound, SLOT_None,0.5*Pawn(Owner).SoundDampening); } simulated function PlayFiring() { local int r; PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0); PlayAnim(FireAnims[Rand(5)],0.150 + 0.175 * FireAdjust, 0.05); if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) ) bMuzzleFlash++; } state NormalFire { function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: FlashCount++; } function Timer() { local actor targ; local float bestAim, bestDist; local vector FireDir; local Pawn P; bestAim = 0.95; P = Pawn(Owner); if ( P == None ) { GotoState(''); return; } if ( VSize(P.Location - OwnerLocation) < 6 ) StillTime += FMin(2.0, Level.TimeSeconds - StillStart); else StillTime = 0; StillStart = Level.TimeSeconds; OwnerLocation = P.Location; FireDir = vector(P.ViewRotation); targ = P.PickTarget(bestAim, bestDist, FireDir, Owner.Location); if ( Pawn(targ) != None ) { SetTimer(1 + 4 * FRand(), false); bPointing = true; Pawn(targ).WarnTarget(P, 200, FireDir); } else { SetTimer(0.4 + 1.6 * FRand(), false); if ( (P.bFire == 0) && (P.bAltFire == 0) ) bPointing = false; } } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local UT_Shellcase s; local Sinmutator SM; s = Spawn(class'UT_ShellCase',, '', Owner.Location + CalcDrawOffset() + 30 * X + (2.8 * FireOffset.Y+5.0) * Y - Z * 1); if ( s != None ) { s.DrawScale = 2.0; s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160); } if (Other == Level) Spawn(class'UT_HeavyWallHitEffect',,, HitLocation+HitNormal, Rotator(HitNormal)); else if ( (Other != self) && (Other != Owner) && (Other != None) ) { if ( Other.bIsPawn )Other.PlaySound(Sound 'ChunkHit',, 4.0,,100); if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z > 0.62 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) ) Other.TakeDamage(DecapDamage, Pawn(Owner), HitLocation, 35000 * X, AltDamageType); else Other.TakeDamage(NormalDamage, Pawn(Owner), HitLocation, 30000.0*X, MyDamageType); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function Finish() { if ( (Pawn(Owner).bFire!=0) && (FRand() < 0.6) ) Timer(); Super.Finish(); } function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; local actor Other; local Pawn PawnOwner; PawnOwner = Pawn(Owner); Owner.MakeNoise(PawnOwner.SoundDampening); GetAxes(PawnOwner.ViewRotation,X,Y,Z); StartTrace = Owner.Location + PawnOwner.Eyeheight * Z; AdjustedAim = PawnOwner.AdjustAim(1000000, StartTrace, 2*AimError, False, False); X = vector(AdjustedAim); EndTrace = StartTrace + 10000 * X; Other = PawnOwner.TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, X,Y,Z); } state Idle { function Fire( float Value ) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.UseAmmo(1)) { GotoState('NormalFire'); bCanClientFire = true; bPointing=True; if ( Owner.IsA('Bot') ) { // simulate bot using zoom if ( Bot(Owner).bSniping && (FRand() < 0.65) ) AimError = AimError/FClamp(StillTime, 1.0, 8.0); else if ( VSize(Owner.Location - OwnerLocation) < 6 ) AimError = AimError/FClamp(0.5 * StillTime, 1.0, 3.0); else StillTime = 0; } Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; ClientFire(Value); } } function BeginState() { bPointing = false; SetTimer(0.4 + 0.8 * FRand(), false); Super.BeginState(); } function EndState() { SetTimer(0.0, false); Super.EndState(); } Begin: bPointing=False; if ( AmmoType.AmmoAmount<=0 ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo if ( Pawn(Owner).bFire!=0 ) Fire(0.0); Disable('AnimEnd'); PlayIdleAnim(); } simulated function PlaySelect() { bForceFire = false; bForceAltFire = false; bCanClientFire = false; if ( !IsAnimating() || (AnimSequence != 'Select') ) PlayAnim('Select',0.5,0.0); Owner.PlaySound(SelectSound, SLOT_Misc, Pawn(Owner).SoundDampening); } simulated function PostRender( canvas Canvas ) { local ChallengeHUD MyHUD; local float Scale; local sin2utDialogclientwindow sm; Super.PostRender(Canvas); bOwnsCrossHair = bLockedOn; if ( bOwnsCrossHair && pawn(Owner).bAltFire==0)//Currentstate != state'Zooming') { Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 4 * Scale, 0.5 * Canvas.ClipY - 4 * Scale ); Canvas.Style = ERenderStyle.STY_Translucent; Canvas.DrawIcon(Texture'SinHUD.Ch1_On', Scale); Canvas.Style = ERenderStyle.STY_Translucent; } } frc)\Ww*-.- r.*$a @..-(w*I.Ww*I.a "C xE>//============================================================================= // ChainGun. It's really the Assault Rifle though. //============================================================================= class ChainGun expands SinWeapons; var int clipcount; var int NumFire; function float RateSelf( out int bUseAltMode ) { if ( AmmoType.AmmoAmount <=0 ) return -2; bUseAltMode = 0; return AIRating; } function float SuggestAttackStyle() { return 1.0; } /////////////////////////////////////////////////////// state NormalFire { function Fire(float F) { } function AltFire(float F) { } Begin: FlashCount++; FinishAnim(); Finish(); } function Timer() { local actor targ; local float bestAim, bestDist; local vector FireDir; bestAim = 0.93; if ( Pawn(Owner) == None ) { GotoState(''); return; } FireDir = vector(Pawn(Owner).ViewRotation); targ = Pawn(Owner).PickTarget(bestAim, bestDist, FireDir, Owner.Location); if ( Pawn(targ) != None ) { SetTimer(1 + 4 * FRand(), false); bPointing = true; } else { SetTimer(0.4 + 3.2 * FRand(), false); bPointing = false; } } function PlayAltFiring() { bMuzzleFlash++; Owner.PlaySound(FireSound, SLOT_None, 255*Pawn(Owner).Sounddampening); PlayAnim('Fire', 3.7,0.05); } function PlayFiring() { bMuzzleFlash++; Owner.PlaySound(FireSound, SLOT_None, 255*Pawn(Owner).SoundDampening); PlayAnim('Fire', 3.7,0.05); } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190)); if ( PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV ) bMuzzleFlash++; } if (Other == Level) { Spawn(class'UT_HeavyWallHitEffect',,, HitLocation+HitNormal*8,rotator(HitNormal)); Spawn(class'pock',,,HitLocation+HitNormal*8, rotator(HitNormal)); } else if ( (Other != self) && (Other != Owner) && (Other != None) ) { if ( Other.IsA('Pawn') && (HitLocation.Z - Other.Location.Z > 0.65 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.skill > 1)) && (!Other.IsA('ScriptedPawn') || !ScriptedPawn(Other).bIsBoss) ) Other.TakeDamage(14, Pawn(Owner), HitLocation, 3000 * X, 'shot'); if ( Other.IsA('Pawn') && (HitLocation.Z - Other.Location.Z < 0.48 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.skill > 1)) && (!Other.IsA('ScriptedPawn') || !ScriptedPawn(Other).bIsBoss) ) Other.TakeDamage(8, Pawn(Owner), HitLocation, 3000 * X, 'shot'); else Other.TakeDamage(11, Pawn(Owner), HitLocation, 3000.0*X, 'shot'); if ( !Other.IsA('Pawn') && !Other.IsA('Carcass') ) spawn(class'SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function Finish() { //bMuzzleFlash = 0; if ( ((Pawn(Owner).bFire!=0) || (Pawn(Owner).bAltFire!=0)) && (FRand() < 0.6) ) Timer(); Super.Finish(); } function AltFire( float Value ) { if (AmmoType.UseAmmo(1)) { GotoState('NormalFire'); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); ClientAltFire(Value); TraceFire(0.25); PlayFiring(); } } function Fire( float Value ) { if (AmmoType.UseAmmo(1)) { GotoState('NormalFire'); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); ClientFire(Value); TraceFire(0.25); PlayFiring(); } } function BeginState() { if (Pawn(Owner).bFire!=0) Fire(0.0); bPointing = false; SetTimer(0.4 + 1.6 * FRand(), false); Super.BeginState(); } function EndState() { SetTimer(0.0, false); Super.EndState(); } /////////////////////////////////////////////////////// function PlayIdleAnim() { PlayAnim('Still',1.0, 0.05); } a//============================================================================= // SinRocketPack. //============================================================================= class SinRocketPack expands RocketPack; Q }U=: [r@ >w{*{3>{a/!G{*w*-.- r.*$a @.?-(!w*Djw*I.w*I.a "\UeT*a  a*aH$@ ]boVw{*{*{..Tw{*{ ^D{"w*Db RZ$//============================================================================= // DoubleDamageTech. //============================================================================= class DoubleDamageTech expands SinTechs; var tournamentweapon techweapon; function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Pawn(Owner).Damagescaling=1.0; } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { Pawn(Owner).DamageScaling = 2.0; if (Pawn(Owner) == None) { Super.BecomePickup(); } } function BeginState() { bActive = true; PlaySound(ActivateSound,,4.0); Pawn(Owner).DamageScaling = 2.0; SetTechWeapon(); SetTimer(1.0,True); } } state DeActivated { Begin: } singular function UsedUp() { if ( TechWeapon != None ) { TechWeapon.SetDefaultDisplayProperties(); if ( TechWeapon.IsA('TournamentWeapon') ) TechWeapon.Affector = None; } if ( Owner != None ) { if ( Owner.bIsPawn ) { if ( !Pawn(Owner).bIsPlayer || (Pawn(Owner).PlayerReplicationInfo.HasFlag == None) ) { Owner.AmbientGlow = Owner.Default.AmbientGlow; Owner.LightType = LT_None; } PlaySound(DeActivateSound,,4.0); Pawn(Owner).DamageScaling = 1.0; } bActive = false; if ( Owner.Inventory != None ) { Owner.Inventory.ChangedWeapon(); } if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogItemDeactivate(Self, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogItemDeactivate(Self, Pawn(Owner)); } Destroy(); } simulated function FireEffect() { SetLocation(Owner.Location); SetBase(Owner); PlaySound(TechSound, SLOT_Interact, 6); } function SetTechWeapon() { // Make old weapon normal again. if ( TechWeapon != None ) TechWeapon.Affector = None; TechWeapon = TournamentWeapon(Pawn(Owner).Weapon); if ( TechWeapon != None ) TechWeapon.Affector = self; } function ChangedWeapon() { if( Inventory != None ) Inventory.ChangedWeapon(); SetTechWeapon(); } iZf>8qd !-(a3 zc/=-'4 hhg 4!-'a @a?' se %ya.*.,$aH$,@.wr.* }b=< G//============================================================================= // RegenTech. //============================================================================= class RegenTech expands SinTechs; function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.SetDefaultDisplayProperties(); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { If (Pawn(Owner).Health <= 298) { Pawn(Owner).Health += 2; Owner.PlaySound(TechSound, SLOT_None, 2.7*Pawn(Owner).SoundDampening); } if (Pawn(Owner) == None) { Super.BecomePickup(); } } function BeginState() { local Inventory S; bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(1.0,True); } } state DeActivated { Begin: } iOq>8bqn +-(a.? zm/q-'4 so $.@.,. as$.%.R*!Yr.* hp 2@-'a @.@ba?' }l=<} rrE>wv*v3>va/!Gv*w*-.- r.*$a @.?-(!w*Djw*I.w*I.a "sU| *a  a*aH$@ tb Vwv*v*v..Twv*v uD "w*Db  f+//============================================================================= // DeathQuadTech. //============================================================================= class DeathQuadTech expands SinTechs; var TournamentWeapon TechWeapon; var() Sound Tech2; function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Pawn(Owner).Damagescaling=1.0; } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { Pawn(Owner).DamageScaling = 4.0; Pawn(Owner).Health-=2; Pawn(Owner).Playsound(Tech2, SLOT_None); If (Pawn(Owner).Health <= 0) Pawn(Owner).Died(None, 'Heldtoolong', Location); if (Pawn(Owner) == None) { Super.BecomePickup(); } } function BeginState() { bActive = true; PlaySound(ActivateSound,,4.0); Pawn(Owner).DamageScaling = 4.0; SetTechWeapon(); SetTimer(1.0,True); } } state DeActivated { Begin: } singular function UsedUp() { if ( TechWeapon != None ) { TechWeapon.SetDefaultDisplayProperties(); if ( TechWeapon.IsA('TournamentWeapon') ) TechWeapon.Affector = None; } if ( Owner != None ) { if ( Owner.bIsPawn ) { if ( !Pawn(Owner).bIsPlayer || (Pawn(Owner).PlayerReplicationInfo.HasFlag == None) ) { Owner.AmbientGlow = Owner.Default.AmbientGlow; Owner.LightType = LT_None; } PlaySound(DeActivateSound,,4.0); Pawn(Owner).DamageScaling = 1.0; } bActive = false; if ( Owner.Inventory != None ) { Owner.Inventory.ChangedWeapon(); } if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogItemDeactivate(Self, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogItemDeactivate(Self, Pawn(Owner)); } Destroy(); } /* function SetTechWeapon() { if ( !bActive ) return; if ( TechWeapon != None ) { TechWeapon.SetDefaultDisplayProperties(); if ( TechWeapon.IsA('TournamentWeapon') ) TournamentWeapon(TechWeapon).Affector = None; } TechWeapon = Pawn(Owner).Weapon; } */ simulated function FireEffect() { SetLocation(Owner.Location); SetBase(Owner); PlaySound(TechSound, SLOT_Interact, 6); } function SetTechWeapon() { // Make old weapon normal again. if ( TechWeapon != None ) TechWeapon.Affector = None; TechWeapon = TournamentWeapon(Pawn(Owner).Weapon); if ( TechWeapon != None ) TechWeapon.Affector = self; } function ChangedWeapon() { if( Inventory != None ) Inventory.ChangedWeapon(); SetTechWeapon(); } Jy *!-(a3 k x/-'4 f O| %!-'a @a?' C K=-. | //============================================================================= // Degeneration. //============================================================================= class Degeneration expands Regeneration; state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.SetDefaultDisplayProperties(); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { local inventory s; s = Pawn(Owner).FindInventoryType(class'Sin2ut.RegenTech'); If (Pawn(Owner).Health > 100 && s==none) Pawn(Owner).Health -=1; } function BeginState() { local Inventory S; bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(1.0,True); } } state DeActivated { Begin: } S //============================================================================= // Regeneration. //============================================================================= class Regeneration expands TournamentPickup; state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.SetDefaultDisplayProperties(); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { Charge -= 1; If (Pawn(Owner).Health <= 200); Pawn(Owner).Health += 2; if (Charge<-0) UsedUp(); } function BeginState() { local Inventory S; bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(1.0,True); } } state DeActivated { Begin: } rFDGLIH ;s4//============================================================================= // RocketLauncher. //============================================================================= class RocketLauncher expands SinWeapons; function float SuggestAttackStyle() { local float EnemyDist; EnemyDist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); If(!Bot(Owner).bnovice){ if ( EnemyDist < 600 ) return -0.6; else return -0.1; } else If(Bot(Owner).bnovice) return 2; } function float SuggestDefenseStyle() { return -5.0; } function Fire( float Value ) { local Vector Start, X,Y,Z; if (AmmoType.UseAmmo(1)) { CheckVisibility(); bPointing=True; Start = Owner.Location + CalcDrawOffset(); if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190)); PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); } Owner.MakeNoise(4 * Pawn(Owner).SoundDampening); AdjustedAim = pawn(owner).AdjustAim(AltProjectileSpeed, Start, AimError, True, bWarnTarget); GetAxes(AdjustedAim,X,Y,Z); Spawn(class'WeaponLight',,'',Start+X*20,rot(0,0,0)); Start = Start + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; Spawn( class 'SinRocket',, '', Start, AdjustedAim); PlayAnim( 'Fire1', 0.3, 0.05); ClientFire(Value); Owner.PlaySound(FireSound, SLOT_None,255*Pawn(Owner).SoundDampening); GoToState('NormalFire'); } } function AltFire( float Value ) { local Vector Start, X,Y,Z; if (AmmoType.UseAmmo(1)) { CheckVisibility(); bPointing=True; Start = Owner.Location + CalcDrawOffset(); if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190)); PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); } Owner.MakeNoise(4 * Pawn(Owner).SoundDampening); AdjustedAim = pawn(owner).AdjustAim(AltProjectileSpeed, Start, AimError, True, bWarnTarget); GetAxes(AdjustedAim,X,Y,Z); Spawn(class'WeaponLight',,'',Start+X*20,rot(0,0,0)); Start = Start + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; Spawn( class 'SinRocket',, '', Start, AdjustedAim); PlayAnim( 'Fire1', 0.3, 0.05); ClientAltFire(Value); Owner.PlaySound(FireSound, SLOT_None,255*Pawn(Owner).SoundDampening); GoToState('Altfiring'); } } //////////////////////////////////////////////////////////// state AltFiring { Begin: FinishAnim(); Owner.PlaySound(CockingSound, SLOT_None, 255*Pawn(Owner).SoundDampening); PlayAnim('Fire',1.0, 0.15); FinishAnim(); Finish(); } ///////////////////////////////////////////////////////////// state NormalFire { Begin: FinishAnim(); PlayAnim('Fire',1.0, 0.15); Owner.PlaySound(CockingSound, SLOT_None, 255*Pawn(Owner).SoundDampening); FinishAnim(); Finish(); } simulated function PlayIdleAnim() { if ( Mesh == PickupViewMesh ) return; else TweenAnim('Idle', 0.5); } state Idle { function AnimEnd() { PlayIdleAnim(); } function bool PutDown() { GotoState('DownWeapon'); return True; } Begin: bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo if ( Pawn(Owner).bFire!=0 ) Global.Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) Global.AltFire(0.0); } PMNQop+{2 -(=w*%.eb:.%8:.%8 My//============================================================================= // TechHUD. //============================================================================= class TechHUD expands Mutator; var Inventory MyRelic; var float LastChecked, LastRendered; var TechHUD NextRTechHUD; var PlayerPawn PlayerOwner;// Registers the current mutator on the client to receive PostRender calls. var bool bIsTechHUD; // Fixed version of the Mutator function simulated function RegisteraHUDMutator() { local PlayerPawn P; ForEach AllActors(class'PlayerPawn', P) if ( P.myHUD != None ) { NextRTechHUD = TechHUD(P.myHud.HUDMutator); P.myHUD.HUDMutator = Self; PlayerOwner = P; bIsTechHUD = True; } } simulated function PostRender(canvas C) { local float Scale; local Inventory inv; local int i; if ( PlayerOwner == None ) { Destroy(); if ( NextRTechHUD != None ) NextRTechHUD.PostRender( C ); return; } if ( PlayerOwner == ChallengeHUD(PlayerOwner.MyHUD).PawnOwner ) { if ( (MyRelic == None) || MyRelic.bDeleteMe || (MyRelic.Owner == None) || (MyRelic.Owner != PlayerOwner) ) { if ( Level.TimeSeconds - LastChecked > 0.3 ) { MyRelic = None; LastChecked = Level.TimeSeconds; inv = PlayerOwner.Inventory; While (inv != None ) { if ( inv.IsA('SinTechs') ) { MyRelic = inv; break; } inv = inv.inventory; i++; if ( i > 200 ) inv = none; } } } if ( MyRelic != None ) { Scale = ChallengeHUD(PlayerOwner.MyHUD).Scale; //C.DrawColor = ChallengeHUD(PlayerOwner.MyHUD).FavoriteHUDColor; C.DrawColor = C.default.drawcolor; //nodefault C.SetPos(C.ClipX - 96 * Scale, C.ClipY - 192 * Scale); C.DrawIcon(MyRelic.Icon, Scale * 2); } } if ( NextRTechHUD != None ) NextRTechHUD.PostRender( C ); } r%^u$a$C.a!Y?L=$a$C. Z//============================================================================= // SniperAmmo. //============================================================================= class SniperAmmo expands BulletBox; EZ( hY\(( E^) h]`) fEeH2 hdgH2 6*n//============================================================================= // ItemHUD. //============================================================================= class ItemHUD expands Mutator; var inventory Specialitem; var ItemHUD NextRTechHUD; var PlayerPawn PlayerOwner; var bool bIsTechHUD; var float LastChecked, LastRendered; simulated function PostRender(canvas C) { local float Scale; local Inventory inv; local int i; if ( PlayerOwner == None ) { Destroy(); if ( NextRTechHUD != None ) NextRTechHUD.PostRender( C ); return; } if ( PlayerOwner == ChallengeHUD(PlayerOwner.MyHUD).PawnOwner ) { if ( (SpecialItem == None) || SpecialItem.bDeleteMe || (SpecialItem.Owner == None) || (SpecialItem.Owner != PlayerOwner) ) { if ( Level.TimeSeconds - LastChecked > 0.3 ) { SpecialItem = None; LastChecked = Level.TimeSeconds; inv = PlayerOwner.Inventory; While (inv != None ) { if ( inv.IsA('BioShield') || inv.IsA('u4') || inv.IsA('SIN_Invisibility')) { SpecialItem = inv; break; } inv = inv.inventory; i++; if ( i > 200 ) inv = none; } } } if ( SpecialItem != None ) { Scale = ChallengeHUD(PlayerOwner.MyHUD).Scale; //C.DrawColor = ChallengeHUD(PlayerOwner.MyHUD).FavoriteHUDColor; C.DrawColor = C.drawcolor; C.SetPos(C.ClipX - 96 * Scale, C.ClipY - 192 * Scale); C.DrawIcon(SpecialItem.Icon, Scale); } } if ( NextRTechHUD != None ) //425 NextRTechHUD.PostRender( C ); } v HC//============================================================================= // ConcussionGun. //============================================================================= class ConcussionGun expands SinWeapons; var() localized string WeaponDescription; var() int damage; var vector HitLocation, HitNormal, EndTrace, X, Y, Z, Start, momentum; var actor Other; function float RateSelf( out int bUseAltMode ) { return -2; } function float SuggestAttackStyle() { return 5.0; } function float SuggestDefenseStyle() { return -10.0; } function Fire(float Value) { local Vector Start, X,Y,Z; bPointing=True; Start = Owner.Location + CalcDrawOffset(); bCanClientFire = true; Pawn(Owner).PlayRecoil(FiringSpeed); Start = Start + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = pawn(owner).AdjustAim(AltProjectileSpeed, Start, AimError, True, bWarnTarget); GetAxes(AdjustedAim,X,Y,Z); TraceAltFire(); Spawn( class 'ConcussionBolt',, '', Start, AdjustedAim); ClientAltFire(value); PlayFiring(); Gotostate('NormalFire'); } function AltFire(float Value) { local Vector Start, X,Y,Z; bPointing=True; Start = Owner.Location + CalcDrawOffset(); bCanClientFire = true; Pawn(Owner).PlayRecoil(FiringSpeed); Start = Start + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = pawn(owner).AdjustAim(AltProjectileSpeed, Start, AimError, True, bWarnTarget); GetAxes(AdjustedAim,X,Y,Z); TraceAltFire(); Spawn( class 'ConcussionBolt',, '', Start, AdjustedAim); ClientAltFire(value); PlayFiring(); Gotostate('NormalFire'); } function Playfiring() { PlaySound(FireSound, SLOT_Misc, 1.7*Pawn(Owner).SoundDampening,,,); PlayAnim( 'Fire', 1.0); } function Playaltfiring() { PlayFiring(); } state Idle { function AnimEnd() { PlayIdleAnim(); } function bool PutDown() { GotoState('DownWeapon'); return True; } Begin: bPointing=False; if ( Pawn(Owner).bFire!=0 ) Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) AltFire(0.0); Disable('AnimEnd'); PlayIdleAnim(); } 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, 700, 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 + (1500 - VSize(P.Location - Owner.Location)) * Y); //750 else P.Velocity = P.Speed * Normal(P.Velocity - (1500 - VSize(P.Location - Owner.Location)) * Y); //750 } } /*function ProcessAltTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, 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); } }*/ rs+Ut-(-:.%R:.%v! d:H//============================================================================= // Magnum. //============================================================================= class Magnum expands SinWeapons; var() int hitdamage; var float AltAccuracy; var Magnum SlaveMagnum; // The left (second) Magnum is a slave to the right. var bool bIsSlave; var bool bSetup; // used for setting display properties var bool bFirstFire, bBringingUp; var() localized string DoubleName; var() texture MuzzleFlashVariations[5]; var int DoubleSwitchPriority; replication { reliable if ( bNetOwner && (Role == ROLE_Authority) ) SlaveMagnum, bIsSlave, bBringingUp; } function Destroyed() { Super.Destroyed(); if ( SlaveMagnum != None ) SlaveMagnum.Destroy(); } simulated function AnimEnd() { if ( (Level.NetMode == NM_Client) && bBringingUp && (Mesh != PickupViewMesh) ) { bBringingUp = false; PlaySelect(); } else Super.AnimEnd(); } function bool WeaponSet(Pawn Other) { if ( bIsSlave ) return false; else Super.WeaponSet(Other); } function SetSwitchPriority(pawn Other) { local int i; local name temp, carried; if ( PlayerPawn(Other) != None ) { Super.SetSwitchPriority(Other); // also set double switch priority for ( i=0; i<20; i++) if ( PlayerPawn(Other).WeaponPriority[i] == 'doubleMagnum' ) { DoubleSwitchPriority = i; return; } } } // Return the switch priority of the weapon (normally AutoSwitchPriority, but may be // modified by environment (or by other factors for bots) function float SwitchPriority() { local float temp; local int bTemp; if ( bIsSlave ) return -10; if ( !Owner.IsA('PlayerPawn') ) return RateSelf(bTemp); else if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) { if ( Pawn(Owner).Weapon == self ) return -0.5; else return -1; } else if ( SlaveMagnum != None ) return DoubleSwitchPriority; else return AutoSwitchPriority; } function DropFrom(vector StartLocation) { if ( !SetLocation(StartLocation) ) return; if ( SlaveMagnum != None ) SlaveMagnum.Destroy(); AIRating = Default.AIRating; SlaveMagnum = None; Super.DropFrom(StartLocation); } function SetDisplayProperties(ERenderStyle NewStyle, texture NewTexture, bool bLighting, bool bEnviroMap ) { if ( !bSetup ) { bSetup = true; if ( SlaveMagnum != None ) SlaveMagnum.SetDisplayProperties(NewStyle, NewTexture, bLighting, bEnviromap); bSetup = false; } Super.SetDisplayProperties(NewStyle, NewTexture, bLighting, bEnviromap); } function SetDefaultDisplayProperties() { if ( !bSetup ) { bSetup = true; if ( SlaveMagnum != None ) SlaveMagnum.SetDefaultDisplayProperties(); bSetup = false; } Super.SetDefaultDisplayProperties(); } event float BotDesireability(Pawn Bot) { local Magnum AlreadyHas; local float desire; desire = MaxDesireability + Bot.AdjustDesireFor(self); AlreadyHas = Magnum(Bot.FindInventoryType(class)); if ( AlreadyHas != None ) { if ( (!bHeldItem || bTossedOut) && bWeaponStay ) return 0; if ( AlreadyHas.SlaveMagnum != None ) { if ( (RespawnTime < 10) && ( bHidden || (AlreadyHas.AmmoType == None) || (AlreadyHas.AmmoType.AmmoAmount < AlreadyHas.AmmoType.MaxAmmo)) ) return 0; if ( AlreadyHas.AmmoType == None ) return 0.25 * desire; if ( AlreadyHas.AmmoType.AmmoAmount > 0 ) return FMax( 0.25 * desire, AlreadyHas.AmmoType.MaxDesireability * FMin(1, 0.15 * AlreadyHas.AmmoType.MaxAmmo/AlreadyHas.AmmoType.AmmoAmount) ); } } if ( (Bot.Weapon == None) || (Bot.Weapon.AIRating <= 0.4) ) return 2*desire; return desire; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local UT_Shellcase s; local vector realLoc; realLoc = Owner.Location + CalcDrawOffset(); s = Spawn(class'UT_ShellCase',, '', realLoc + 20 * X + FireOffset.Y * Y + Z); if ( s != None ) s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.1+0.2)*Y + (FRand()*0.3+0.5) * Z)*160); //FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160) if (Other == Level) { if ( bIsSlave || (SlaveMagnum != None) ) { Spawn(class'UT_LightWallHitEffect',,, HitLocation+HitNormal*8,rotator(HitNormal)); Spawn(class'pock',,,HitLocation+HitNormal*8, rotator(HitNormal)); } else { Spawn(class'UT_LightWallHitEffect',,, HitLocation+HitNormal*8,rotator(HitNormal)); Spawn(class'pock',,,HitLocation+HitNormal*8, rotator(HitNormal)); } } else if ((Other != self) && (Other != Owner) && (Other != None) ) { if ( FRand() < 0.2 ) X *= 5; if ( Other.bIsPawn ) Other.PlaySound(Sound 'ChunkHit',, 4.0,,100); if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z > 0.65 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) ) Other.TakeDamage(24, Pawn(Owner), HitLocation, 3000 * X, AltDamageType); if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z < 0.48 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) ) Other.TakeDamage(8, Pawn(Owner), HitLocation, 3000 * X, AltDamageType); else Other.TakeDamage(12, Pawn(Owner), HitLocation, 3000.0*X, MyDamageType); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); else Other.PlaySound(Sound 'ChunkHit',, 4.0,,100); } } function bool HandlePickupQuery( inventory Item ) { local Pawn P; local Inventory Copy; if ( (Item.class == class) && (SlaveMagnum == None) ) { P = Pawn(Owner); // spawn a double Copy = Spawn(class, P); Copy.BecomeItem(); ItemName = DoubleName; SlaveMagnum = Magnum(Copy); SetTwoHands(); AIRating = 0.4; SlaveMagnum.SetUpSlave( Pawn(Owner).Weapon == self ); SlaveMagnum.SetDisplayProperties(Style, Texture, bUnlit, bMeshEnviromap); SetTwoHands(); P.ReceiveLocalizedMessage( class'PickupMessagePlus', 0, None, None, Self.Class ); Item.PlaySound(Item.PickupSound); if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Item, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Item, Pawn(Owner)); Item.SetRespawn(); return true; } return Super.HandlePickupQuery(Item); } function SetUpSlave(bool bBringUp) { bIsSlave = true; ItemName = DoubleName; GiveAmmo(Pawn(Owner)); AmbientGlow = 0; if ( bBringUp ) BringUp(); else GotoState('Idle2'); } function SetTwoHands() { if ( SlaveMagnum == None ) return; if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).Handedness == 2) ) { SetHand(2); return; } if ( Mesh == mesh'sinmagnum' ) SetHand(1); else SetHand(-1); } function setHand(float Hand) { local rotator newRot; if ( SlaveMagnum != None ) { if ( Hand == 0 ) Hand = -1; SlaveMagnum.SetHand(-1 * Hand); } bHideWeapon = false; Super.SetHand(Hand); if ( Hand == 1 ) Mesh = mesh'sinmagnum'; else Mesh = mesh'sinmagnum'; } function BringUp() { if (SlaveMagnum != none ) { SetTwoHands(); SlaveMagnum.BringUp(); } bBringingUp = true; Super.BringUp(); } function TraceFire( float Accuracy ) { local vector RealOffset; RealOffset = FireOffset; FireOffset *= 0.35; if ( (SlaveMagnum != None) || bIsSlave ) Accuracy = FClamp(3*Accuracy,0.75,3); else if ( Owner.IsA('Bot') && !Bot(Owner).bNovice ) Accuracy = FMax(Accuracy, 0.45); Super.TraceFire(Accuracy); FireOffset = RealOffset; } function Fire(float Value) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if ( AmmoType.UseAmmo(1) ) { GotoState('NormalFire'); bCanClientFire = true; bPointing=True; ClientFire(value); if ( SlaveMagnum != None ) Pawn(Owner).PlayRecoil(2 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.2); } } simulated function PlayFiring() { PlayOwnedSound(FireSound, SLOT_Misc, 255*Pawn(Owner).SoundDampening); bMuzzleFlash++; PlayAnim('Shoot',0.5 + 0.21 * FireAdjust, 0.02); //0.31, not 0.21 } simulated function PlayAltFiring() { PlayAnim('T1', 1.1, 0.05); bFirstFire = true; } simulated function PlayRepeatFiring() { if ( Affector != None ) Affector.FireEffect(); if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.2, vect(325, 225, 95)); PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); } bMuzzleFlash++; PlayOwnedSound(FireSound, SLOT_None, 255*Pawn(Owner).SoundDampening); PlayAnim('Shot2', 0.7 + 0.3 * FireAdjust, 0.05); } function AltFire( float Value ) { bPointing=True; bCanClientFire = true; AltAccuracy = 0.4; if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.AmmoAmount>0) { if ( SlaveMagnum != None ) Pawn(Owner).PlayRecoil(3 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); ClientAltFire(value); GotoState('AltFiring'); } } state Active { function bool PutDown() { if ( bWeaponUp || (AnimFrame < 0.75) ) GotoState('DownWeapon'); else bChangeWeapon = true; return True; } function BeginState() { bChangeWeapon = false; } function EndState() { Super.EndState(); bBringingUp = false; } Begin: FinishAnim(); if ( bChangeWeapon ) GotoState('DownWeapon'); bWeaponUp = True; bCanClientFire = true; if ( !bIsSlave && (Level.Netmode != NM_Standalone) && (Owner != None) && Owner.IsA('TournamentPlayer') && (PlayerPawn(Owner).Player != None) && !PlayerPawn(Owner).Player.IsA('ViewPort') ) { if ( Pawn(Owner).bFire != 0 ) TournamentPlayer(Owner).SendFire(self); else if ( Pawn(Owner).bAltFire != 0 ) TournamentPlayer(Owner).SendAltFire(self); else if ( !bChangeWeapon ) TournamentPlayer(Owner).UpdateRealWeapon(self); } Finish(); } State DownWeapon { ignores Fire, AltFire, Animend; function BeginState() { Super.BeginState(); if ( SlaveMagnum != none ) SlaveMagnum.GoToState('DownWeapon'); } } //////////////////////////////////////////////////////// state NormalFire { ignores Fire, AltFire, AnimEnd; function Timer() { if ( SlaveMagnum != none ) SlaveMagnum.Fire(0); } function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: FlashCount++; if ( SlaveMagnum != none ) SetTimer(0.20, false); FinishAnim(); if ( bIsSlave ) GotoState('Idle'); else Finish(); } state ClientFiring { simulated function bool ClientAltFire(float Value) { if ( bIsSlave ) Global.ClientAltFire(Value); return false; } simulated function Timer() { if ( (SlaveMagnum != none) && SlaveMagnum.ClientFire(0) ) return; SetTimer(0.5, false); } simulated function AnimEnd() { if ( (Pawn(Owner) == None) || (Ammotype.AmmoAmount <= 0) ) { PlayIdleAnim(); GotoState(''); } else if ( !bIsSlave && !bCanClientFire ) GotoState(''); else if ( bFirstFire || (Pawn(Owner).bAltFire != 0) ) { PlayRepeatFiring(); bFirstFire = false; } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayIdleAnim(); GotoState(''); } } simulated function BeginState() { Super.BeginState(); if ( SlaveMagnum != None ) SetTimer(0.2, false); else SetTimer(0.5, false); } simulated function EndState() { Super.EndState(); if ( SlaveMagnum != None ) SlaveMagnum.GotoState(''); } } state ClientAltFiring { simulated function bool ClientFire(float Value) { if ( bIsSlave ) Global.ClientFire(Value); return false; } simulated function Timer() { if ( (SlaveMagnum != none) && SlaveMagnum.ClientAltFire(0) ) return; SetTimer(0.5, false); } simulated function AnimEnd() { if ( Pawn(Owner) == None ) GotoState(''); else if ( Ammotype.AmmoAmount <= 0 ) { PlayAnim('T2', 0.9, 0.05); GotoState(''); } else if ( !bIsSlave && !bCanClientFire ) GotoState(''); else if ( bFirstFire || (Pawn(Owner).bAltFire != 0) ) { PlayRepeatFiring(); bFirstFire = false; } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayAnim('T2', 0.9, 0.05); GotoState(''); } } simulated function BeginState() { Super.BeginState(); if ( SlaveMagnum != None ) SetTimer(0.2, false); else SetTimer(0.5, false); } simulated function EndState() { Super.EndState(); if ( SlaveMagnum != None ) SlaveMagnum.GotoState(''); } } state AltFiring { ignores Fire, AltFire, AnimEnd; function Timer() { if ( SlaveMagnum != none ) SlaveMagnum.AltFire(0); } function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: if ( SlaveMagnum != none ) SetTimer(0.20, false); FinishAnim(); Repeater: if (AmmoType.UseAmmo(1)) { FlashCount++; if ( SlaveMagnum != None ) Pawn(Owner).PlayRecoil(3 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); TraceFire(AltAccuracy); PlayRepeatFiring(); FinishAnim(); } if ( AltAccuracy < 3 ) AltAccuracy += 0.5; if ( bIsSlave ) { if ( (Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0 ) Goto('Repeater'); } else if ( bChangeWeapon ) GotoState('DownWeapon'); else if ( (Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0 ) { if ( PlayerPawn(Owner) == None ) Pawn(Owner).bAltFire = int( FRand() < AltReFireRate ); Goto('Repeater'); } PlayAnim('T2', 0.9, 0.05); FinishAnim(); Finish(); } simulated event RenderOverlays(canvas Canvas) { local PlayerPawn PlayerOwner; local int realhand; if ( (bMuzzleFlash > 0) && !Level.bDropDetail ) MFTexture = MuzzleFlashVariations[Rand(5)]; PlayerOwner = PlayerPawn(Owner); if ( PlayerOwner != None ) { if ( PlayerOwner.DesiredFOV != PlayerOwner.DefaultFOV ) return; realhand = PlayerOwner.Handedness; if ( (Level.NetMode == NM_Client) && (realHand == 2) ) { bHideWeapon = true; return; } if ( !bHideWeapon ) { if ( Mesh == mesh'sinmagnum' ) PlayerOwner.Handedness = 1; else if ( bIsSlave || (SlaveMagnum != None) ) PlayerOwner.Handedness = -1; } } if ( (PlayerOwner == None) || (PlayerOwner.Handedness == 0) ) { /* if ( AnimSequence == 'Shot2' ) { FlashO = -2 * Default.FlashO; FlashY = Default.FlashY / -2.5; // * 2.5 } else {*/ FlashO = 1.9 * Default.FlashO; FlashY = Default.FlashY; // } } /*else if ( AnimSequence == 'Shot2' ) { FlashO = Default.FlashO * -2; //0.3 FlashY = Default.FlashY / -2.5; // *2.5 } else { FlashO = Default.FlashO; FlashY = Default.FlashY; }*/ if ( !bHideWeapon && ( (SlaveMagnum != None) || bIsSlave ) ) { if ( PlayerOwner == None ) bMuzzleFlash = 0; Super.RenderOverlays(Canvas); if ( SlaveMagnum != None ) { if ( SlaveMagnum.bBringingUp ) { SlaveMagnum.bBringingUp = false; SlaveMagnum.PlaySelect(); } SlaveMagnum.RenderOverlays(Canvas); } } else Super.RenderOverlays(Canvas); if ( PlayerOwner != None ) PlayerOwner.Handedness = realhand; } simulated function PlayIdleAnim() { if ( Mesh == PickupViewMesh ) return; if ( (FRand()>0.96) && (AnimSequence != 'Twiddle') ) PlayAnim('Twiddle',0.6,0.3); else LoopAnim('Sway',0.2, 0.3); } state Idle { function AnimEnd() { PlayIdleAnim(); } function bool PutDown() { GotoState('DownWeapon'); return True; } Begin: bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo LoopAnim('Sway',0.2, 0.1); if ( Pawn(Owner).bFire!=0 ) Global.Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) Global.AltFire(0.0); } State ClientActive { simulated function AnimEnd() { bBringingUp = false; if ( !bIsSlave ) { Super.AnimEnd(); if ( (SlaveMagnum != None) && !IsInState('ClientActive') ) { if ( (GetStateName() == 'None') || (GetStateName() == 'Magnum') ) SlaveMagnum.GotoState(''); else SlaveMagnum.GotoState(GetStateName()); } } } simulated function BeginState() { Super.BeginState(); bBringingUp = false; if ( SlaveMagnum != None ) SlaveMagnum.GotoState('ClientActive'); } } State ClientDown { simulated function AnimEnd() { if ( !bIsSlave ) Super.AnimEnd(); } simulated function EndState() { if ( SlaveMagnum != None ) SlaveMagnum.GotoState(''); } } // End Class //============================================================================= JhO #r !a&!+? z}Tw q!*' vHD% tuTQj q!*' L3 u%=q5a$?. a!? ] lsP//============================================================================= // SinChallengeDominationHUD. //============================================================================= class SinChallengeDominationHUD expands ChallengeDominationHUD; simulated function DrawStatus(Canvas Canvas) { local float StatScale, ChestAmount, ThighAmount, HelmetAmount, H1, H2, X, Y, DamageTime; Local int ArmorAmount,CurAbs,i; Local inventory Inv,BestArmor; local bool bChestArmor, bShieldbelt, bThighArmor, bJumpBoots, bHasDoll; local Bot BotOwner; local TournamentPlayer TPOwner; local texture Doll, DollBelt; ArmorAmount = 0; CurAbs = 0; i = 0; BestArmor=None; for( Inv=PawnOwner.Inventory; Inv!=None; Inv=Inv.Inventory ) { if (Inv.bIsAnArmor) { if ( Inv.IsA('UT_Shieldbelt') ) bShieldbelt = true; else if ( Inv.IsA('SinPants')) { ThighAmount += Inv.Charge; bThighArmor = true; bJumpBoots = true; } else if ( Inv.class==class'sin2ut.SinArmor') { bChestArmor = true; ChestAmount += Inv.Charge; } else if ( Inv.IsA('SinHelmet')) { HelmetAmount += Inv.Charge; } else { bChestArmor = true; ChestAmount += Inv.Charge; } ArmorAmount += Inv.Charge; } else { i++; if ( i > 100 ) break; // can occasionally get temporary loops in netplay } } if ( !bHideStatus ) { TPOwner = TournamentPlayer(PawnOwner); if ( Canvas.ClipX < 400 ) bHasDoll = false; else if ( TPOwner != None) { Doll = TPOwner.StatusDoll; DollBelt = TPOwner.StatusBelt; bHasDoll = true; } else { BotOwner = Bot(PawnOwner); if ( BotOwner != None ) { Doll = BotOwner.StatusDoll; DollBelt = BotOwner.StatusBelt; bHasDoll = true; } } if ( bHasDoll ) { Canvas.Style = ERenderStyle.STY_Translucent; StatScale = Scale * StatusScale; X = Canvas.ClipX - 128 * StatScale; Canvas.SetPos(X, 0); if (PawnOwner.DamageScaling > 2.0) Canvas.DrawColor = PurpleColor; else Canvas.DrawColor = HUDColor; Canvas.DrawTile(Doll, 128*StatScale, 256*StatScale, 0, 0, 128.0, 256.0); Canvas.DrawColor = HUDColor; if ( bShieldBelt ) { Canvas.DrawColor = BaseColor; Canvas.DrawColor.B = 0; Canvas.SetPos(X, 0); Canvas.DrawIcon(DollBelt, StatScale); } if ( bChestArmor ) { ChestAmount = FMin(0.01 * ChestAmount,1); Canvas.DrawColor = HUDColor * ChestAmount; Canvas.SetPos(X, 0); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 0, 128, 64); } if ( bThighArmor ) { ThighAmount = FMin(0.02 * ThighAmount,1); Canvas.DrawColor = HUDColor * ThighAmount; Canvas.SetPos(X, 64*StatScale); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 64, 128, 64); } if ( bJumpBoots ) { Canvas.DrawColor = HUDColor; Canvas.SetPos(X, 128*StatScale); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 128, 128, 64); } Canvas.Style = Style; if ( (PawnOwner == PlayerOwner) && Level.bHighDetailMode && !Level.bDropDetail ) { for ( i=0; i<4; i++ ) { DamageTime = Level.TimeSeconds - HitTime[i]; if ( DamageTime < 1 ) { Canvas.SetPos(X + HitPos[i].X * StatScale, HitPos[i].Y * StatScale); if ( (HUDColor.G > 100) || (HUDColor.B > 100) ) Canvas.DrawColor = RedColor; else Canvas.DrawColor = (WhiteColor - HudColor) * FMin(1, 2 * DamageTime); Canvas.DrawColor.R = 255 * FMin(1, 2 * DamageTime); Canvas.DrawTile(Texture'BotPack.HudElements1', StatScale * HitDamage[i] * 25, StatScale * HitDamage[i] * 64, 0, 64, 25.0, 64.0); } } } } } Canvas.DrawColor = HUDColor; if ( bHideStatus && bHideAllWeapons ) { X = 0.5 * Canvas.ClipX; Y = Canvas.ClipY - 64 * Scale; } else { X = Canvas.ClipX - 128 * StatScale - 140 * Scale; Y = 64 * Scale; } Canvas.SetPos(X,Y); if ( PawnOwner.Health < 50 ) { H1 = 1.5 * TutIconBlink; H2 = 1 - H1; Canvas.DrawColor = WhiteColor * H2 + (HUDColor - WhiteColor) * H1; } else Canvas.DrawColor = HUDColor; Canvas.DrawTile(Texture'BotPack.HudElements1', 128*Scale, 64*Scale, 128, 128, 128.0, 64.0); if ( PawnOwner.Health < 50 ) { H1 = 1.5 * TutIconBlink; H2 = 1 - H1; Canvas.DrawColor = Canvas.DrawColor * H2 + (WhiteColor - Canvas.DrawColor) * H1; } else Canvas.DrawColor = WhiteColor; DrawBigNum(Canvas, Max(0, PawnOwner.Health), X + 4 * Scale, Y + 16 * Scale, 1); Canvas.DrawColor = HUDColor; if ( bHideStatus && bHideAllWeapons ) { X = 0.5 * Canvas.ClipX - 128 * Scale; Y = Canvas.ClipY - 64 * Scale; } else { X = Canvas.ClipX - 128 * StatScale - 140 * Scale; Y = 0; } Canvas.SetPos(X, Y); Canvas.DrawTile(Texture'BotPack.HudElements1', 128*Scale, 64*Scale, 0, 192, 128.0, 64.0); if ( bHideStatus && bShieldBelt ) Canvas.DrawColor = GoldColor; else Canvas.DrawColor = WhiteColor; DrawBigNum(Canvas, Min(300,ArmorAmount), X + 4 * Scale, Y + 16 * Scale, 1); } r  @~D(  @Ad@ M#CZ  IBFp//============================================================================= // RealSinSniper. //============================================================================= class RealSinSniper expands SinSniper; var bool inzoom; function float SuggestAttackStyle() { return -0.5; } function float SuggestDefenseStyle() { return -2.5; } function float RateSelf( out int bUseAltMode ) { local float EnemyDist; if ( AmmoType.AmmoAmount <=0 ) return -2; bUseAltMode = 0; if ( (Bot(Owner) != None) && Bot(Owner).bSniping ) return AIRating + 1.15; if ( Pawn(Owner).Enemy != None ) { Enemydist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); if ( Pawn(Owner).Enemy != None && Enemydist > 1200 ) { if ( Pawn(Owner).Enemy != None && Enemydist > 2000 ) return (AIRating + 0.75); return (AIRating + FMin(0.0001 * Enemydist, 0.45)); } } return AIRating; } function setHand(float Hand) { Super.SetHand(Hand); if ( Hand == 1 ) Mesh = mesh(DynamicLoadObject("sinsnipr", class'Mesh')); else Mesh = mesh'sinsnipr'; } function AltFire( float Value ) { ClientAltFire(Value); Owner.PlaySound(CockingSound, SLOT_None,0.5*Pawn(Owner).SoundDampening); } simulated function PlayFiring() { local int r; PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0); bCanClientFire = false; //PlayAnim(FireAnims[Rand(5)],0.150 + 0.175 * FireAdjust, 0.05); //if (!Owner.IsA('Bot')) PlayAnim( 'Fire', 0.25, 0.05); //if (!Bot(Owner).bNovice) PlayAnim( 'Fire', 0.25, 0.05); //else if (Bot(Owner).bNovice) PlayAnim( 'Fire', 0.15, 0.05); if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) ) bMuzzleFlash++; bCanClientFire = true; } simulated function PlayBotFiring() { local int r; PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0); bCanClientFire = false; if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) ) bMuzzleFlash++; bCanClientFire = true; } function Timer() { local actor targ; local float bestAim, bestDist; local vector FireDir; local Pawn P; bestAim = 0.95; P = Pawn(Owner); if ( P == None ) { GotoState(''); return; } if ( VSize(P.Location - OwnerLocation) < 6 ) StillTime += FMin(2.0, Level.TimeSeconds - StillStart); else StillTime = 0; StillStart = Level.TimeSeconds; OwnerLocation = P.Location; FireDir = vector(P.ViewRotation); targ = P.PickTarget(bestAim, bestDist, FireDir, Owner.Location); if ( Pawn(targ) != None ) { SetTimer(1 + FRand(), false); //4 * FRand() bPointing = true; Pawn(targ).WarnTarget(P, 200, FireDir); } else { SetTimer(0.4 + 1.6 * FRand(), false); if ( (P.bFire == 0) && (P.bAltFire == 0) ) bPointing = false; } } state Zooming { simulated function Tick(float DeltaTime) { if ( Pawn(Owner).bAltFire == 0 ) { if ( (PlayerPawn(Owner) != None) && PlayerPawn(Owner).Player.IsA('ViewPort') ) PlayerPawn(Owner).StopZoom(); SetTimer(0.0,False); GoToState('Idle'); } } simulated function BeginState() { if ( Owner.IsA('PlayerPawn') ) { if ( PlayerPawn(Owner).Player.IsA('ViewPort') ) PlayerPawn(Owner).ToggleZoom(); SetTimer(0.05,True); } else { Pawn(Owner).bFire = 1; Pawn(Owner).bAltFire = 0; Global.Fire(0); } } } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local UT_Shellcase s; s = Spawn(class'UT_ShellCase',, '', Owner.Location + CalcDrawOffset() + 30 * X + (2.8 * FireOffset.Y+5.0) * Y - Z * 1); if ( s != None ) { s.DrawScale = 2.0; s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160); } if (Other == Level) { Spawn(class'UT_HeavyWallHitEffect',,, HitLocation+HitNormal, Rotator(HitNormal)); Spawn(class'pock',,,HitLocation+HitNormal*8, Rotator(HitNormal)); } else if ( (Other != self) && (Other != Owner) && (Other != None) ) { if ( Other.bIsPawn ) Other.PlaySound(Sound 'ChunkHit',, 4.0,,100); if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z > 0.62 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) ) Other.TakeDamage(DecapDamage, Pawn(Owner), HitLocation, 35000 * X, AltDamageType); else Other.TakeDamage(NormalDamage, Pawn(Owner), HitLocation, 30000.0*X, MyDamageType); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function Finish() { if ( (Pawn(Owner).bFire!=0) && (FRand() < 0.6) ) Timer(); Super.Finish(); } function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; local actor Other; local Pawn PawnOwner; PawnOwner = Pawn(Owner); Owner.MakeNoise(PawnOwner.SoundDampening); GetAxes(PawnOwner.ViewRotation,X,Y,Z); StartTrace = Owner.Location + PawnOwner.Eyeheight * Z; AdjustedAim = PawnOwner.AdjustAim(1000000, StartTrace, 2*AimError, False, False); X = vector(AdjustedAim); EndTrace = StartTrace + 10000 * X; Other = PawnOwner.TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, X,Y,Z); } function Fire( float Value ) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.Ammoamount >= 1) { bCanClientFire = true; bPointing=True; if ( Owner.IsA('Bot') ) { if ( Bot(Owner).bSniping && (FRand() < 0.65) ) AimError = AimError/FClamp(StillTime, 1.0, 8.0); else if ( VSize(Owner.Location - OwnerLocation) < 6 ) AimError = AimError/FClamp(0.5 * StillTime, 1.0, 3.0); else StillTime = 0; } if ( Owner.IsA('Bot') ) { Pawn(Owner).PlayRecoil(FiringSpeed); if (!Bot(Owner).bNovice) Tracefire(0.025); else if (Bot(Owner).bNovice) Tracefire(0.2); AimError = Default.AimError; ClientFire(Value); GotoState('NormalFire'); } else if ( !Owner.IsA('Bot') ) GotoState('PlayerFire'); /* Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; ClientFire(Value); */ } } state Idle { function Fire( float Value ) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.Ammoamount >= 1) { GotoState('NormalFire'); bCanClientFire = true; bPointing=True; if ( Owner.IsA('Bot') ) { // simulate bot using zoom if ( Bot(Owner).bSniping && (FRand() < 0.65) ) AimError = AimError/FClamp(StillTime, 1.0, 8.0); else if ( VSize(Owner.Location - OwnerLocation) < 6 ) AimError = AimError/FClamp(0.5 * StillTime, 1.0, 3.0); else StillTime = 0; } if ( Owner.IsA('Bot') ) { Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; ClientFire(Value); GotoState('NormalFire'); } else if ( !Owner.IsA('Bot') ) GotoState('PlayerFire'); /* Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; ClientFire(Value); */ } } function BeginState() { bPointing = false; SetTimer(0.4 + 0.8 * FRand(), false); Super.BeginState(); } function EndState() { SetTimer(0.0, false); Super.EndState(); } Begin: bPointing=False; if ( AmmoType.AmmoAmount<=0 ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo if ( Pawn(Owner).bFire!=0 ) Fire(0.0); Disable('AnimEnd'); PlayIdleAnim(); } simulated function PlaySelect() { bForceFire = false; bForceAltFire = false; bCanClientFire = false; if ( !IsAnimating() || (AnimSequence != 'Select') ) PlayAnim('Select',0.4,0.0); //0.5 Owner.PlaySound(SelectSound, SLOT_Misc, Pawn(Owner).SoundDampening); } simulated function PostRender( canvas Canvas ) { local ChallengeHUD MyHUD; local float Scale; local PlayerPawn P; P = PlayerPawn(Owner); if ( (P != None) && (P.DesiredFOV == P.DefaultFOV) ) { inzoom=false; } if ( (P != None) && (P.DesiredFOV != P.DefaultFOV) ) { inzoom=true; bOwnsCrossHair = true; Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 64 * Scale, 0.5 * Canvas.ClipY - 64 * Scale ); if ( Level.bHighDetailMode ) Canvas.Style = ERenderStyle.STY_Translucent; else Canvas.Style = ERenderStyle.STY_Translucent; Canvas.DrawIcon(Texture'ch1_zoom_on', Scale); } bOwnsCrossHair = false; if (inzoom==false) bOwnsCrossHair = bLockedOn; if (inzoom==true) bOwnsCrossHair = true; if ( bOwnsCrossHair && inzoom==false) { // if locked on, draw special crosshair Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 4 * Scale, 0.5 * Canvas.ClipY - 4 * Scale ); Canvas.Style = ERenderStyle.STY_Translucent; Canvas.DrawIcon(Texture'SinHUD.Ch1_On', Scale); Canvas.Style = ERenderStyle.STY_Translucent; } } state PlayerFire { //ignores Fire; /*function Fire(float F) { } function AltFire(float F) { }*/ function Tick( float DeltaTime ) { if( (pawn(Owner).bFire==0)) GoToState('ShootLoad'); } Function EndState() { Super.EndState(); OldFlashCount = FlashCount; } function BeginState() { } Begin: FlashCount++; } state ShootLoad { function Fire(float F) {} function AltFire(float F) {} function BeginState() { local Vector Start, X,Y,Z; local float value; if (AmmoType.UseAmmo(1)) { Owner.PlayOwnedSound(FireSound, SLOT_Misc, 3.0*Pawn(Owner).SoundDampening); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); PlayAnim( 'Fire', 0.9, 0.05); //PlayAnim( 'Fire', 0.325, 0.05); Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation,X,Y,Z); Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; ClientFire(Value); } } Begin: FinishAnim(); Finish(); } State DownWeapon { ignores Fire, AltFire; function bool PutDown() { Pawn(Owner).ClientPutDown(self, Pawn(Owner).PendingWeapon); return true; //just keep putting it down } function BeginState() { bChangeWeapon = false; bMuzzleFlash = 0; Pawn(Owner).ClientPutDown(self, Pawn(Owner).PendingWeapon); Owner.PlaySound(Misc1Sound, SLOT_Misc, Pawn(Owner).SoundDampening); } Begin: TweenDown(); FinishAnim(); //Sleep(1.0); Pawn(Owner).ChangedWeapon(); } simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * 0.4 ); else PlayAnim('Down', 0.22, 0.05); //0.33 } state NormalFire { function ForceFire() { bForceFire = true; } function ForceAltFire() { bForceAltFire = true; } function Fire(float F) { } function AltFire(float F) { } function AnimEnd() { Finish(); } Begin: Sleep(0.0); } c GM+a  f)VBa !a%!Ma&>Ta!IGa>L= H<OP//============================================================================= // SinAssaultHUD. //============================================================================= class SinAssaultHUD expands AssaultHUD; simulated function DrawStatus(Canvas Canvas) { local float StatScale, ChestAmount, ThighAmount, HelmetAmount, H1, H2, X, Y, DamageTime; Local int ArmorAmount,CurAbs,i; Local inventory Inv,BestArmor; local bool bChestArmor, bShieldbelt, bThighArmor, bJumpBoots, bHasDoll; local Bot BotOwner; local TournamentPlayer TPOwner; local texture Doll, DollBelt; ArmorAmount = 0; CurAbs = 0; i = 0; BestArmor=None; for( Inv=PawnOwner.Inventory; Inv!=None; Inv=Inv.Inventory ) { if (Inv.bIsAnArmor) { if ( Inv.IsA('UT_Shieldbelt') ) bShieldbelt = true; else if ( Inv.IsA('SinPants')) { ThighAmount += Inv.Charge; bThighArmor = true; bJumpBoots = true; } else if ( Inv.class==class'sin2ut.SinArmor') { bChestArmor = true; ChestAmount += Inv.Charge; } else if ( Inv.IsA('SinHelmet')) { HelmetAmount += Inv.Charge; } else { bChestArmor = true; ChestAmount += Inv.Charge; } ArmorAmount += Inv.Charge; } else { i++; if ( i > 100 ) break; // can occasionally get temporary loops in netplay } } if ( !bHideStatus ) { TPOwner = TournamentPlayer(PawnOwner); if ( Canvas.ClipX < 400 ) bHasDoll = false; else if ( TPOwner != None) { Doll = TPOwner.StatusDoll; DollBelt = TPOwner.StatusBelt; bHasDoll = true; } else { BotOwner = Bot(PawnOwner); if ( BotOwner != None ) { Doll = BotOwner.StatusDoll; DollBelt = BotOwner.StatusBelt; bHasDoll = true; } } if ( bHasDoll ) { Canvas.Style = ERenderStyle.STY_Translucent; StatScale = Scale * StatusScale; X = Canvas.ClipX - 128 * StatScale; Canvas.SetPos(X, 0); if (PawnOwner.DamageScaling > 2.0) Canvas.DrawColor = PurpleColor; else Canvas.DrawColor = HUDColor; Canvas.DrawTile(Doll, 128*StatScale, 256*StatScale, 0, 0, 128.0, 256.0); Canvas.DrawColor = HUDColor; if ( bShieldBelt ) { Canvas.DrawColor = BaseColor; Canvas.DrawColor.B = 0; Canvas.SetPos(X, 0); Canvas.DrawIcon(DollBelt, StatScale); } if ( bChestArmor ) { ChestAmount = FMin(0.01 * ChestAmount,1); Canvas.DrawColor = HUDColor * ChestAmount; Canvas.SetPos(X, 0); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 0, 128, 64); } if ( bThighArmor ) { ThighAmount = FMin(0.02 * ThighAmount,1); Canvas.DrawColor = HUDColor * ThighAmount; Canvas.SetPos(X, 64*StatScale); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 64, 128, 64); } if ( bJumpBoots ) { Canvas.DrawColor = HUDColor; Canvas.SetPos(X, 128*StatScale); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 128, 128, 64); } Canvas.Style = Style; if ( (PawnOwner == PlayerOwner) && Level.bHighDetailMode && !Level.bDropDetail ) { for ( i=0; i<4; i++ ) { DamageTime = Level.TimeSeconds - HitTime[i]; if ( DamageTime < 1 ) { Canvas.SetPos(X + HitPos[i].X * StatScale, HitPos[i].Y * StatScale); if ( (HUDColor.G > 100) || (HUDColor.B > 100) ) Canvas.DrawColor = RedColor; else Canvas.DrawColor = (WhiteColor - HudColor) * FMin(1, 2 * DamageTime); Canvas.DrawColor.R = 255 * FMin(1, 2 * DamageTime); Canvas.DrawTile(Texture'BotPack.HudElements1', StatScale * HitDamage[i] * 25, StatScale * HitDamage[i] * 64, 0, 64, 25.0, 64.0); } } } } } Canvas.DrawColor = HUDColor; if ( bHideStatus && bHideAllWeapons ) { X = 0.5 * Canvas.ClipX; Y = Canvas.ClipY - 64 * Scale; } else { X = Canvas.ClipX - 128 * StatScale - 140 * Scale; Y = 64 * Scale; } Canvas.SetPos(X,Y); if ( PawnOwner.Health < 50 ) { H1 = 1.5 * TutIconBlink; H2 = 1 - H1; Canvas.DrawColor = WhiteColor * H2 + (HUDColor - WhiteColor) * H1; } else Canvas.DrawColor = HUDColor; Canvas.DrawTile(Texture'BotPack.HudElements1', 128*Scale, 64*Scale, 128, 128, 128.0, 64.0); if ( PawnOwner.Health < 50 ) { H1 = 1.5 * TutIconBlink; H2 = 1 - H1; Canvas.DrawColor = Canvas.DrawColor * H2 + (WhiteColor - Canvas.DrawColor) * H1; } else Canvas.DrawColor = WhiteColor; DrawBigNum(Canvas, Max(0, PawnOwner.Health), X + 4 * Scale, Y + 16 * Scale, 1); Canvas.DrawColor = HUDColor; if ( bHideStatus && bHideAllWeapons ) { X = 0.5 * Canvas.ClipX - 128 * Scale; Y = Canvas.ClipY - 64 * Scale; } else { X = Canvas.ClipX - 128 * StatScale - 140 * Scale; Y = 0; } Canvas.SetPos(X, Y); Canvas.DrawTile(Texture'BotPack.HudElements1', 128*Scale, 64*Scale, 0, 192, 128.0, 64.0); if ( bHideStatus && bShieldBelt ) Canvas.DrawColor = GoldColor; else Canvas.DrawColor = WhiteColor; DrawBigNum(Canvas, Min(300,ArmorAmount), X + 4 * Scale, Y + 16 * Scale, 1); } LQ^ `aa!?>$a$C.a PdGC[ O N+ XYe+ PR`NS `a$a$C.a!?>a PSTUV WVMclass sin2uthud extends ChallengeHUD; simulated function DrawStatus(Canvas Canvas) { local float StatScale, ChestAmount, ThighAmount, HelmetAmount, H1, H2, X, Y, DamageTime; Local int ArmorAmount,CurAbs,i; Local inventory Inv,BestArmor; local bool bChestArmor, bShieldbelt, bThighArmor, bJumpBoots, bHasDoll; local Bot BotOwner; local TournamentPlayer TPOwner; local texture Doll, DollBelt; ArmorAmount = 0; CurAbs = 0; i = 0; BestArmor=None; for( Inv=PawnOwner.Inventory; Inv!=None; Inv=Inv.Inventory ) { if (Inv.bIsAnArmor) { if ( Inv.IsA('UT_Shieldbelt') ) bShieldbelt = true; else if ( Inv.IsA('SinPants')) { ThighAmount += Inv.Charge; bThighArmor = true; bJumpBoots = true; } else if ( Inv.class==class'sin2ut.SinArmor') { bChestArmor = true; ChestAmount += Inv.Charge; } else if ( Inv.IsA('SinHelmet')) { HelmetAmount += Inv.Charge; } else { bChestArmor = true; ChestAmount += Inv.Charge; } ArmorAmount += Inv.Charge; } else { i++; if ( i > 100 ) break; // can occasionally get temporary loops in netplay } } if ( !bHideStatus ) { TPOwner = TournamentPlayer(PawnOwner); if ( Canvas.ClipX < 400 ) bHasDoll = false; else if ( TPOwner != None) { Doll = TPOwner.StatusDoll; DollBelt = TPOwner.StatusBelt; bHasDoll = true; } else { BotOwner = Bot(PawnOwner); if ( BotOwner != None ) { Doll = BotOwner.StatusDoll; DollBelt = BotOwner.StatusBelt; bHasDoll = true; } } if ( bHasDoll ) { Canvas.Style = ERenderStyle.STY_Translucent; StatScale = Scale * StatusScale; X = Canvas.ClipX - 128 * StatScale; Canvas.SetPos(X, 0); if (PawnOwner.DamageScaling > 2.0) Canvas.DrawColor = PurpleColor; else Canvas.DrawColor = HUDColor; Canvas.DrawTile(Doll, 128*StatScale, 256*StatScale, 0, 0, 128.0, 256.0); Canvas.DrawColor = HUDColor; if ( bShieldBelt ) { Canvas.DrawColor = BaseColor; Canvas.DrawColor.B = 0; Canvas.SetPos(X, 0); Canvas.DrawIcon(DollBelt, StatScale); } if ( bChestArmor ) { ChestAmount = FMin(0.01 * ChestAmount,1); Canvas.DrawColor = HUDColor * ChestAmount; Canvas.SetPos(X, 0); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 0, 128, 64); } if ( bThighArmor ) { ThighAmount = FMin(0.02 * ThighAmount,1); Canvas.DrawColor = HUDColor * ThighAmount; Canvas.SetPos(X, 64*StatScale); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 64, 128, 64); } if ( bJumpBoots ) { Canvas.DrawColor = HUDColor; Canvas.SetPos(X, 128*StatScale); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 128, 128, 64); } Canvas.Style = Style; if ( (PawnOwner == PlayerOwner) && Level.bHighDetailMode && !Level.bDropDetail ) { for ( i=0; i<4; i++ ) { DamageTime = Level.TimeSeconds - HitTime[i]; if ( DamageTime < 1 ) { Canvas.SetPos(X + HitPos[i].X * StatScale, HitPos[i].Y * StatScale); if ( (HUDColor.G > 100) || (HUDColor.B > 100) ) Canvas.DrawColor = RedColor; else Canvas.DrawColor = (WhiteColor - HudColor) * FMin(1, 2 * DamageTime); Canvas.DrawColor.R = 255 * FMin(1, 2 * DamageTime); Canvas.DrawTile(Texture'Botpack.hudelements1', StatScale * HitDamage[i] * 25, StatScale * HitDamage[i] * 64, 0, 64, 25.0, 64.0); } } } } } Canvas.DrawColor = HUDColor; if ( bHideStatus && bHideAllWeapons ) { X = 0.5 * Canvas.ClipX; Y = Canvas.ClipY - 64 * Scale; } else { X = Canvas.ClipX - 128 * StatScale - 140 * Scale; Y = 64 * Scale; } Canvas.SetPos(X,Y); if ( PawnOwner.Health < 50 ) { H1 = 1.5 * TutIconBlink; H2 = 1 - H1; Canvas.DrawColor = WhiteColor * H2 + (HUDColor - WhiteColor) * H1; } else Canvas.DrawColor = HUDColor; Canvas.DrawTile(Texture'Botpack.hudelements1', 128*Scale, 64*Scale, 128, 128, 128.0, 64.0); if ( PawnOwner.Health < 50 ) { H1 = 1.5 * TutIconBlink; H2 = 1 - H1; Canvas.DrawColor = Canvas.DrawColor * H2 + (WhiteColor - Canvas.DrawColor) * H1; } else Canvas.DrawColor = WhiteColor; DrawBigNum(Canvas, Max(0, PawnOwner.Health), X + 4 * Scale, Y + 16 * Scale, 1); Canvas.DrawColor = HUDColor; if ( bHideStatus && bHideAllWeapons ) { X = 0.5 * Canvas.ClipX - 128 * Scale; Y = Canvas.ClipY - 64 * Scale; } else { X = Canvas.ClipX - 128 * StatScale - 140 * Scale; Y = 0; } Canvas.SetPos(X, Y); Canvas.DrawTile(Texture'Botpack.hudelements1', 128*Scale, 64*Scale, 0, 192, 128.0, 64.0); if ( bHideStatus && bShieldBelt ) Canvas.DrawColor = GoldColor; else Canvas.DrawColor = WhiteColor; DrawBigNum(Canvas, Min(300,ArmorAmount), X + 4 * Scale, Y + 16 * Scale, 1); } Z]@+  ^^+ -' WZ^P//============================================================================= // SinChallengeCTFHUD. //============================================================================= class SinChallengeCTFHUD expands ChallengeCTFHUD; simulated function DrawStatus(Canvas Canvas) { local float StatScale, ChestAmount, ThighAmount, HelmetAmount, H1, H2, X, Y, DamageTime; Local int ArmorAmount,CurAbs,i; Local inventory Inv,BestArmor; local bool bChestArmor, bShieldbelt, bThighArmor, bJumpBoots, bHasDoll; local Bot BotOwner; local TournamentPlayer TPOwner; local texture Doll, DollBelt; ArmorAmount = 0; CurAbs = 0; i = 0; BestArmor=None; for( Inv=PawnOwner.Inventory; Inv!=None; Inv=Inv.Inventory ) { if (Inv.bIsAnArmor) { if ( Inv.IsA('UT_Shieldbelt') ) bShieldbelt = true; else if ( Inv.IsA('SinPants')) { ThighAmount += Inv.Charge; bThighArmor = true; bJumpBoots = true; } else if ( Inv.class==class'sin2ut.SinArmor') { bChestArmor = true; ChestAmount += Inv.Charge; } else if ( Inv.IsA('SinHelmet')) { HelmetAmount += Inv.Charge; } else { bChestArmor = true; ChestAmount += Inv.Charge; } ArmorAmount += Inv.Charge; } else { i++; if ( i > 100 ) break; // can occasionally get temporary loops in netplay } } if ( !bHideStatus ) { TPOwner = TournamentPlayer(PawnOwner); if ( Canvas.ClipX < 400 ) bHasDoll = false; else if ( TPOwner != None) { Doll = TPOwner.StatusDoll; DollBelt = TPOwner.StatusBelt; bHasDoll = true; } else { BotOwner = Bot(PawnOwner); if ( BotOwner != None ) { Doll = BotOwner.StatusDoll; DollBelt = BotOwner.StatusBelt; bHasDoll = true; } } if ( bHasDoll ) { Canvas.Style = ERenderStyle.STY_Translucent; StatScale = Scale * StatusScale; X = Canvas.ClipX - 128 * StatScale; Canvas.SetPos(X, 0); if (PawnOwner.DamageScaling > 2.0) Canvas.DrawColor = PurpleColor; else Canvas.DrawColor = HUDColor; Canvas.DrawTile(Doll, 128*StatScale, 256*StatScale, 0, 0, 128.0, 256.0); Canvas.DrawColor = HUDColor; if ( bShieldBelt ) { Canvas.DrawColor = BaseColor; Canvas.DrawColor.B = 0; Canvas.SetPos(X, 0); Canvas.DrawIcon(DollBelt, StatScale); } if ( bChestArmor ) { ChestAmount = FMin(0.01 * ChestAmount,1); Canvas.DrawColor = HUDColor * ChestAmount; Canvas.SetPos(X, 0); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 0, 128, 64); } if ( bThighArmor ) { ThighAmount = FMin(0.02 * ThighAmount,1); Canvas.DrawColor = HUDColor * ThighAmount; Canvas.SetPos(X, 64*StatScale); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 64, 128, 64); } if ( bJumpBoots ) { Canvas.DrawColor = HUDColor; Canvas.SetPos(X, 128*StatScale); Canvas.DrawTile(Doll, 128*StatScale, 64*StatScale, 128, 128, 128, 64); } Canvas.Style = Style; if ( (PawnOwner == PlayerOwner) && Level.bHighDetailMode && !Level.bDropDetail ) { for ( i=0; i<4; i++ ) { DamageTime = Level.TimeSeconds - HitTime[i]; if ( DamageTime < 1 ) { Canvas.SetPos(X + HitPos[i].X * StatScale, HitPos[i].Y * StatScale); if ( (HUDColor.G > 100) || (HUDColor.B > 100) ) Canvas.DrawColor = RedColor; else Canvas.DrawColor = (WhiteColor - HudColor) * FMin(1, 2 * DamageTime); Canvas.DrawColor.R = 255 * FMin(1, 2 * DamageTime); Canvas.DrawTile(Texture'BotPack.HudElements1', StatScale * HitDamage[i] * 25, StatScale * HitDamage[i] * 64, 0, 64, 25.0, 64.0); } } } } } Canvas.DrawColor = HUDColor; if ( bHideStatus && bHideAllWeapons ) { X = 0.5 * Canvas.ClipX; Y = Canvas.ClipY - 64 * Scale; } else { X = Canvas.ClipX - 128 * StatScale - 140 * Scale; Y = 64 * Scale; } Canvas.SetPos(X,Y); if ( PawnOwner.Health < 50 ) { H1 = 1.5 * TutIconBlink; H2 = 1 - H1; Canvas.DrawColor = WhiteColor * H2 + (HUDColor - WhiteColor) * H1; } else Canvas.DrawColor = HUDColor; Canvas.DrawTile(Texture'BotPack.HudElements1', 128*Scale, 64*Scale, 128, 128, 128.0, 64.0); if ( PawnOwner.Health < 50 ) { H1 = 1.5 * TutIconBlink; H2 = 1 - H1; Canvas.DrawColor = Canvas.DrawColor * H2 + (WhiteColor - Canvas.DrawColor) * H1; } else Canvas.DrawColor = WhiteColor; DrawBigNum(Canvas, Max(0, PawnOwner.Health), X + 4 * Scale, Y + 16 * Scale, 1); Canvas.DrawColor = HUDColor; if ( bHideStatus && bHideAllWeapons ) { X = 0.5 * Canvas.ClipX - 128 * Scale; Y = Canvas.ClipY - 64 * Scale; } else { X = Canvas.ClipX - 128 * StatScale - 140 * Scale; Y = 0; } Canvas.SetPos(X, Y); Canvas.DrawTile(Texture'BotPack.HudElements1', 128*Scale, 64*Scale, 0, 192, 128.0, 64.0); if ( bHideStatus && bShieldBelt ) Canvas.DrawColor = GoldColor; else Canvas.DrawColor = WhiteColor; DrawBigNum(Canvas, Min(300,ArmorAmount), X + 4 * Scale, Y + 16 * Scale, 1); } K (`-($..a$.  _* -' iDy@}hf U!-'a @a?' X//============================================================================= // SinRocket. //============================================================================= class SinRocket expands RocketMk2; g//============================================================================= // MachineGunAmmo. //============================================================================= class MachineGunAmmo expands TournamentAmmo; XlVP%& ]//============================================================================= // SIN_Grenade. //============================================================================= class SIN_Grenade expands ut_grenade; w [^jd,@ @H//============================================================================= // SinTechMutator. //============================================================================= class SinTechMutator expands Mutator; var Inventory MyRelic; var float LastChecked, LastRendered; var TechHUD NextRTechHUD; var PlayerPawn PlayerOwner;// Registers the current mutator on the client to receive PostRender calls. var bool bIsTechHUD; var inventory Mytech; var class TechClass; var int NumPoints; var bool Initialized; var SinTechs SpawnedRelic; var int NavPoint; var pawn imapawn; var inventory va1,es1,dd1,dq1; var bool va; var bool es; var bool dd; var bool dq; function PostBeginPlay() { local NavigationPoint NP; if (Initialized) return; Initialized = True; // Calculate number of navigation points. for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if (NP.IsA('PathNode')) NumPoints++; } SpawnRelic(0); SetTimer(3.0, True); } function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. Selection = FRand(); if ( Selection < 0.25 ) Usethis = Class'Deathquadtech'; else if ( Selection < 0.5 ) Usethis = Class'RegenTech'; else if ( Selection < 0.75 ) Usethis = Class'DoubleDamageTech'; else Usethis = Class'ShieldTech'; SpawnedRelic = Spawn(Usethis, , , NP.Location); SpawnedRelic.Mytech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'sintechs')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } function Timer() { if ( (SpawnedRelic != None) && (SpawnedRelic.Owner == None) ) { SpawnedRelic.IdleTime += 5; if ( SpawnedRelic.IdleTime >= 30 ) { SpawnedRelic.IdleTime = 0; Spawn(class'ReSpawn', SpawnedRelic,, SpawnedRelic.Location, SpawnedRelic.Rotation); SpawnedRelic.Destroy(); } } } // Fixed version of the Mutator function simulated function RegisteraHUDMutator() { local PlayerPawn P; ForEach AllActors(class'PlayerPawn', P) if ( P.myHUD != None ) { NextRTechHUD = TechHUD(P.myHud.HUDMutator); P.myHUD.HUDMutator = Self; PlayerOwner = P; bIsTechHUD = True; } } simulated function PostRender(canvas C) { local float Scale; local Inventory inv; local int i; if ( PlayerOwner == None ) { Destroy(); if ( NextRTechHUD != None ) NextRTechHUD.PostRender( C ); return; } if ( PlayerOwner == ChallengeHUD(PlayerOwner.MyHUD).PawnOwner ) { if ( (MyRelic == None) || MyRelic.bDeleteMe || (MyRelic.Owner == None) || (MyRelic.Owner != PlayerOwner) ) { if ( Level.TimeSeconds - LastChecked > 0.3 ) { MyRelic = None; LastChecked = Level.TimeSeconds; inv = PlayerOwner.Inventory; While (inv != None ) { if ( inv.IsA('SinTechs') ) { MyRelic = inv; break; } inv = inv.inventory; i++; if ( i > 200 ) inv = none; } } } if ( MyRelic != None ) { Scale = ChallengeHUD(PlayerOwner.MyHUD).Scale; //C.DrawColor = ChallengeHUD(PlayerOwner.MyHUD).FavoriteHUDColor; C.default.DrawColor = C.drawcolor; C.SetPos(C.ClipX - 96 * Scale, C.ClipY - 192 * Scale); C.DrawIcon(MyRelic.Icon, Scale * 2); } } if ( NextRTechHUD != None ) NextRTechHUD.PostRender( C ); } function Sintechs GetTech(actor Other) { local sintechs st; foreach AllActors(class'Sin2ut.Sintechs',st) { if(st.Owner==Other) return st; } return None; } mzrsS>/$aH$,@. \sv 1r.*  uA\ tr:.%bw.* .a/!P.ta(q!+ zw/+-'4 qE # 9-(a.. [{@@Rz~y@@g//============================================================================= // SinShotgunAmmo. //============================================================================= class SinShotgunAmmo expands TournamentAmmo; |s aCS&la/!.XL#CCC.$a$,@.w*@=,w*Q | v_ w *r * B?, B?, Ba       a  paP eFw*3Fw*4]w*a   t \ Va/!J.a/!P.jaL='.$.$8 H mQx a#R,?7?   GPy,o>//============================================================================= // Bioshield. //============================================================================= class Bioshield expands ut_shieldbelt; var UT_ShieldBeltEffect MyEffect; var() string TeamFireTextureStrings[4]; var() string TeamTextureStrings[4]; var firetexture TeamFireTextures[4]; var texture TeamTextures[4]; var int TeamNum; function bool HandlePickupQuery( inventory Item ) { local inventory I; local Inventory s; local Inventory t; local Inventory u; if (item.class == class) { // remove other armors for ( I=Owner.Inventory; I!=None; I=I.Inventory ) if ( I.isa('SinArmor') && I != self) { // If (I.IsA('SinTechs')) return true; // else I.Destroy(); }} if ( Item.IsA('SIN_Invisibility') || Item.IsA('u4')) return true; return Super.HandlePickupQuery(Item); } function ArmorImpactEffect(vector HitLocation) { if ( Owner.IsA('PlayerPawn') ) { PlayerPawn(Owner).ClientFlash(-0.05,vect(400,400,400)); PlayerPawn(Owner).PlaySound(DeActivateSound, SLOT_None, 2.7*PlayerPawn(Owner).SoundDampening); } if ( MyEffect != None ) { //MyEffect.Texture = MyEffect.LowDetailTexture; MyEffect.ScaleGlow = 4.0; MyEffect.Fatness = 255; if ( MyEffect != None ) { MyEffect.Fatness = MyEffect.Default.Fatness; SetEffectTexture(); } } } function Timer() { local inventory I; if ( MyEffect != None ) { MyEffect.Fatness = MyEffect.Default.Fatness; SetEffectTexture(); } Charge--; If (Charge <=0) Destroy(); If (Owner!=none) { for ( I=Owner.Inventory; I!=None; I=I.Inventory ) if ( I.isa('SinArmor') && I != self) I.Destroy(); } } function Destroyed() { if ( Owner != None ) { Owner.SetDefaultDisplayProperties(); if( Owner.Inventory != None ) Owner.Inventory.SetOwnerDisplay(); } if ( MyEffect != None ) MyEffect.Destroy(); Super.Destroyed(); } function PickupFunction(Pawn Other) { local Inventory I; MyEffect = Spawn(class'UT_ShieldBeltEffect', Owner,,Owner.Location, Owner.Rotation); MyEffect.Mesh = Owner.Mesh; MyEffect.DrawScale = Owner.Drawscale; if ( Level.Game.bTeamGame && (Other.PlayerReplicationInfo != None) ) TeamNum = Other.PlayerReplicationInfo.Team; else TeamNum = 3; SetEffectTexture(); I = Pawn(Owner).FindInventoryType(class'UT_Invisibility'); if ( I != None ) MyEffect.bHidden = true; SetTimer(1.0,true); // remove other armors for ( I=Owner.Inventory; I!=None; I=I.Inventory ) if ( I.isa('Sinarmor') && I != self) { // If (I.IsA('SinTechs')) return; I.Destroy(); }} function SetEffectTexture() { if ( TeamNum != 3 ) MyEffect.ScaleGlow = 0.5; else MyEffect.ScaleGlow = 1.0; MyEffect.Texture = Texture'UnrealI.Skins.Silver'; MyEffect.LowDetailTexture = Texture'UnrealI.Skins.Silver'; /* if ( TeamFireTextures[TeamNum] == None ) TeamFireTextures[TeamNum] =FireTexture(DynamicLoadObject(TeamFireTextureStrings[TeamNum], class'Texture')); MyEffect.Texture = TeamFireTextures[TeamNum]; if ( TeamTextures[TeamNum] == None ) TeamTextures[TeamNum] = Texture(DynamicLoadObject(TeamTextureStrings[TeamNum], class'Texture')); MyEffect.LowDetailTexture = TeamTextures[TeamNum]; */ } function int ArmorAbsorbDamage(int Damage, name DamageType, vector HitLocation) { local int ArmorDamage; if ( DamageType != 'Drowned' ) ArmorImpactEffect(HitLocation); if( (DamageType!='None') && ((ProtectionType1==DamageType) || (ProtectionType2==DamageType)) ) return 1; if (DamageType=='Drowned') Return Damage; //ArmorDamage = (Damage * ArmorAbsorption) / 100; if (DamageType=='Shot') Return Damage/10; if (DamageType=='Decapitated') Return Damage/20; if (DamageType=='jolted') Return Damage/250; if (DamageType=='rocketdeath') Return Damage/2; else return damage/5; if (Damage<1) Damage=1; } f i@} Fx*//============================================================================= // Concussionbolt. //============================================================================= class Concussionbolt expands Projectile; var() float life; var() float divisor; auto state Flying { function PainRadius( float DamageAmount, float DamageRadius, name DamageName, float Momentum, vector HitLocation ) { local actor Victims; local float damageScale, dist; local vector dir; local vector X, Y, Z; local projectile P; if( bHurtEntry ) return; bHurtEntry = true; foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation ) { if( Victims != self ) { dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); } if (Victims==Pawn(Owner)) Victims.TakeDamage( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,(damageScale * Momentum/divisor * dir), DamageName); else if (Victims!=Pawn(Owner)) { Victims.TakeDamage( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,(damageScale * Momentum * dir), DamageName); Victims.Velocity.Z+=100; } //} } bHurtEntry = false; } simulated function ProcessTouch (Actor Other, Vector HitLocation) { local projectile P; local vector X, Y, Z; if (Other != instigator) //&& !Other.Isa('Projectile')) { Explode(HitLocation,Vect(0,0,0)); Other.Velocity.Z+=100; } /* if (Other != instigator && Other.Isa('Projectile')) { P.speed = VSize(P.Velocity); if ( P.Velocity Dot Y > 0 ) P.Velocity = P.Speed * Normal(P.Velocity + (1200 - VSize(P.Location - Owner.Location)) * Y); //750 }*/ } function BlowUp(vector HitLocation) { PainRadius(damage, 180, 'blown', MomentumTransfer, HitLocation); MakeNoise(1.0); PlaySound(ImpactSound); } simulated function Explode(vector HitLocation, vector HitNormal) { local RingExplosion s; BlowUp(HitLocation); s = spawn(class'RingExplosion',,'',HitLocation+HitNormal*10 ); s.drawscale = 0.5; s.RemoteRole = ROLE_None; Destroy(); } function Timer() { Explode(Location,vect(0,0,0)); //Destroy(); } function SetUp() { PlaySound(SpawnSound); Velocity = Vector(Rotation) * speed; } simulated function BeginState() { SetUp(); SetTimer(0.35,false); } Begin: // Sleep(0.35); //self destruct after 1/3 second(or so) //Explode(Location,vect(0,0,0)); // Destroy(); } XeV}}//============================================================================= // SinArmor. //============================================================================= class SinArmor expands TournamentPickup; function bool HandlePickupQuery( inventory Item ) { local Inventory s; s = Pawn(Owner).FindInventoryType(class'Sin2ut.Bioshield'); if ( s != None ) { return false; } else return Super.HandlePickupQuery(Item); } // // Absorb damage. // function int ArmorAbsorbDamage(int Damage, name DamageType, vector HitLocation) { local int ArmorDamage; if ( DamageType != 'Drowned' ) ArmorImpactEffect(HitLocation); if( (DamageType!='None') && ((ProtectionType1==DamageType) || (ProtectionType2==DamageType)) ) return 0; if ((HitLocation.Z - Owner.Location.Z >= 0.48 * Owner.CollisionHeight && HitLocation.Z - Owner.Location.Z <= 0.65 * Owner.CollisionHeight)) { ArmorDamage = (Damage * ArmorAbsorption) / 100; if( ArmorDamage >= Charge ) { ArmorDamage = Charge; Destroy(); } else Charge -= ArmorDamage; return (Damage - ArmorDamage); } else return Damage; if (DamageType=='Drowned') Return Damage; } TW^\@jakqBirS9-C'6a$?o$ gXud  P ef!ET o"wkT SlM"zo/T-'4 qp !-(a3 hsr : !-'a @a?' sM 0r.* }L=Dz jH//============================================================================= // EmpathyTech. //============================================================================= class EmpathyTech expands SinTechs; var pawn victim; function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.SetDefaultDisplayProperties(); } function Activate() { bActive = true; SetOwnerDisplay(); } function ArmorImpactEffect(vector HitLocation) { Owner.PlaySound(TechSound, SLOT_Interact, 6); } function int ArmorAbsorbDamage(int Damage, name DamageType, vector HitLocation) { ArmorImpactEffect(HitLocation); return Damage; } function Timer() { if (Pawn(Owner) == None) { Super.BecomePickup(); } } function BeginState() { local Inventory S; bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(0.5,True); } } state DeActivated { Begin: } iy{>6zy/ _-'4 qz !-(a3 h}| 1 '-'ba @a?' sx 'r.* }w=: 1T//============================================================================= // VampTech. //============================================================================= class VampTech expands SinTechs; var tournamentweapon techweapon; function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.SetDefaultDisplayProperties(); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { if (Pawn(Owner) == None) { Super.BecomePickup(); } } function BeginState() { local Inventory S; bActive = true; SetTechWeapon(); PlaySound(ActivateSound,,4.0); SetTimer(1.0,True); } } state DeActivated { Begin: } simulated function FireEffect() { SetLocation(Owner.Location); SetBase(Owner); PlaySound(TechSound, SLOT_Interact, 6); } function SetTechWeapon() { // Make old weapon normal again. if ( TechWeapon != None ) TechWeapon.Affector = None; TechWeapon = TournamentWeapon(Pawn(Owner).Weapon); if ( TechWeapon != None ) TechWeapon.Affector = self; } function ChangedWeapon() { if( Inventory != None ) Inventory.ChangedWeapon(); SetTechWeapon(); } ]MB u 2A.fMZ1O$=_hK oP$@p$Q8>^$X9<-::)L@ٿc$\B>h]//============================================================================= // Rippermk2. Scrapped. //============================================================================= class Rippermk2 expands ripper; fHRs%Ha-q!*-'-'/-::$ w*a/!gw.*".a/!P:.%.U/:.%.J//-.A 8Sl!T$0$- @?q!*,-'' GX[qBb  A-b  q]ka w*Usw.*.\L#CaCB.L$@.a!L333?>L= VH Dn\!> \"DSl) - 'w*D NOaw!*!a WeC NW2w*aL>(a'&_w*.@@-.?!|ka|?,|?-:.%% !Oq -q!*qq:.%%kr.*.=A !Oa!Tfff?L=a OC\ M`2!w*  L Y! $L -C( JgA#xWru*1wu*u%.ev.uT qfX" j@ |&..?q..?,z%r xtq2X$є;aG նmo wre] &Sin2UTc]Configure Sin2utrojY2Z7\Jo)g" u"@o ] Magnum Clip(X$AU$@~ x 81(~ w*aL>(&a?( Hg ]I92 j L \+0t-(0%.eU:.%v! d@`r*..&q!-'-'a/!.- ff&??A ?,??@@  K+m-(=w*%.eb:.%:.%v! o O -#o !w*q! J fd2 [1w*%Zq!F-q!fr.*Zq!:.%8:.%8Zq! kB *1&w*  a?( eiGO93$%q!9-q!Yr.*q!~:.%a!j:.%8q! gEJ4)Lw*aL>(a1-q!+7 <D Q"u( nk aNZp2pBhNWW"dB$pB<7$@@&Hkr~(  bZr <!j !Aa!bXX!Wa&!+= o!m yc dE A4  A2#!:.%q!F H@c 6.:.% ? H  x3w} =5-T-T'-w*3-T(  J Rj x 7j  r b B%$.@@-(a,>333>L=w.*)..-' z ^m'k-(-(-(Ca !Ma!M?a$. |@GCH*(H^!G' g F '#g !w*q!* Yq (!w*  [ I ([  e M!9LD::$-C w-C(mJe  m Dam w*a Kg+6r.*%q!X- -q!-C:.%k-C(:.%8q! t N ,(t w*aL>(&a?( aXjq r* Gw.*.?,;@ dr ;?o; l UQ$0 w*jQ-C'l  [|<Wr Cu? !Na!N?>Ua!RL>> uRV+=a ף<'-(Fw*%.ea!RL>=}:.%8:.%8 pm= T =p lUWT= q!*' QSZMKA~ p?r-C(p-~ pw* a!Mba! a!Fq!pqa F Y @+F -C()w*q!M yF Aw*q! c\ a(c v[!H[b a!ľ?L=-C' K=  Sg *ZL-(a..V..q M!n!kJ,UH Ka!d pA Y"e+K t-(-:.%R:.%v! dh!fTGV q!*' |S"Y//============================================================================= // MagClip. //============================================================================= class MagClip expands MachineGunAmmo; V^)//============================================================================= // SinHealth5. //============================================================================= class SinHealth5 expands HealthVial; auto state Pickup { function Touch( actor Other ) { local int HealMax; local Pawn P; local inventory s; if ( ValidTouch(Other) ) { P = Pawn(Other); s = P.FindInventoryType(class'Sin2ut.RegenTech'); HealMax = P.default.health; if (bSuperHeal) HealMax = Min(200, HealMax * 2.0); if (S == none && P.Health < HealMax && P.Health < 200) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax) P.Health = HealMax; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } else if (S != none && P.Health < HealMax + 100 && P.Health < 300) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax + 100) P.Health = HealMax + 100; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } } } } /* auto state Pickup { function Touch( actor Other ) { local int HealMax; local Pawn P; local inventory s; if ( ValidTouch(Other) ) { P = Pawn(Other); s = P.FindInventoryType(class'Sin2ut.RegenTech'); HealMax = P.default.health; if (bSuperHeal) HealMax = Min(200, HealMax * 2.0); if (S == none && P.Health < HealMax) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax) P.Health = HealMax; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } else if (S != none && P.Health < HealMax + 100) //else { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax + 100) P.Health = HealMax + 100; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } } } } */Qm`2l9 QOFg"@Q ]You got a rifle shell.] Rifle ShellY$?" &9$?]//============================================================================= // SniperShell. //============================================================================= class SniperShell expands SniperAmmo; kCg//============================================================================= // SpiderMineL. //============================================================================= class SpiderMineL expands TournamentWeapon; var spidy spid; function float SuggestAttackStyle() { return -0.15; } simulated event RenderTexture(ScriptedTexture Tex) { local Color C; local string Temp; if ( AmmoType != None ) Temp = String(AmmoType.AmmoAmount); while(Len(Temp) < 3) Temp = "0"$Temp; C.R = 255; C.G = 0; C.B = 0; Tex.DrawColoredText( 30, 10, Temp, Font'LEDFont2', C ); } function float RateSelf( out int bUseAltMode ) { local float EnemyDist, rating; local vector EnemyDir; if ( AmmoType.AmmoAmount <=0 ) return -2; if ( Pawn(Owner).Enemy == None ) { bUseAltMode = 0; return AIRating; } EnemyDir = Pawn(Owner).Enemy.Location - Owner.Location; EnemyDist = VSize(EnemyDir); rating = FClamp(AIRating - (EnemyDist - 450) * 0.001, 0.2, AIRating); if ( Pawn(Owner).Enemy.IsA('StationaryPawn') ) { bUseAltMode = 0; return AIRating + 0.3; } if ( EnemyDist > 900 ) { bUseAltMode = 0; if ( EnemyDist > 2000 ) { if ( EnemyDist > 3500 ) return 0.2; return (AIRating - 0.3); } if ( EnemyDir.Z < -0.5 * EnemyDist ) { bUseAltMode = 1; return (AIRating - 0.3); } } else if ( (EnemyDist < 750) && (Pawn(Owner).Enemy.Weapon != None) && Pawn(Owner).Enemy.Weapon.bMeleeWeapon ) { bUseAltMode = 0; return (AIRating + 0.3); } else if ( (EnemyDist < 340) || (EnemyDir.Z > 30) ) { bUseAltMode = 0; return (AIRating + 0.2); } else bUseAltMode = int( FRand() < 0.65 ); return rating; } simulated event RenderOverlays( canvas Canvas ) { Texture'FlakAmmoled'.NotifyActor = Self; Super.RenderOverlays(Canvas); Texture'FlakAmmoled'.NotifyActor = None; } // Fire chunks function Fire( float Value ) { local Vector Start, X,Y,Z; local Bot B; local Pawn P; if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.UseAmmo(1)) { bCanClientFire = true; bPointing=True; Start = Owner.Location + CalcDrawOffset(); B = Bot(Owner); P = Pawn(Owner); P.PlayRecoil(FiringSpeed); Owner.MakeNoise(2.0 * P.SoundDampening); AdjustedAim = P.AdjustAim(AltProjectileSpeed, Start, AimError, True, bWarnTarget); GetAxes(AdjustedAim,X,Y,Z); Spawn(class'WeaponLight',,'',Start+X*20,rot(0,0,0)); Start = Start + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; spid = Spawn(class'spidy',, '', Start, AdjustedAim); spid.setmaster(self); ClientFire(Value); GoToState('NormalFire'); } } simulated function PlayFiring() { PlayAnim( 'Fire', 0.9, 0.05); PlayOwnedSound(FireSound, SLOT_Misc,Pawn(Owner).SoundDampening*4.0); bMuzzleFlash++; } simulated function PlayAltFiring() { PlayOwnedSound(AltFireSound, SLOT_Misc,Pawn(Owner).SoundDampening*4.0); PlayAnim('AltFire', 1.3, 0.05); bMuzzleFlash++; } function AltFire( float Value ) { local Vector Start, X,Y,Z; if (spid!=none) spid.blowup(spid.Location); else if (spid==none) playsound(AltFireSound, SLOT_Misc,Pawn(Owner).SoundDampening*4.0); Pawn(Owner).PlayRecoil(FiringSpeed); bCanClientFire = true; Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation,X,Y,Z); GoToState('AltFiring'); } //////////////////////////////////////////////////////////// state AltFiring { function EndState() { Super.EndState(); OldFlashCount = FlashCount; } function AnimEnd() { if ( (AnimSequence != 'Loading') && (AmmoType.AmmoAmount > 0) ) PlayReloading(); else Finish(); } Begin: FlashCount++; } ///////////////////////////////////////////////////////////// simulated function PlayReloading() { PlayAnim('Loading',0.7, 0.05); Owner.PlayOwnedSound(CockingSound, SLOT_None,0.5*Pawn(Owner).SoundDampening); } simulated function PlayFastReloading() { PlayAnim('Loading',1.8, 0.05); Owner.PlayOwnedSound(CockingSound, SLOT_None,0.5*Pawn(Owner).SoundDampening); } state ClientReload { simulated function bool ClientFire(float Value) { bForceFire = bForceFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ); return bForceFire; } simulated function bool ClientAltFire(float Value) { bForceAltFire = bForceAltFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ); return bForceAltFire; } simulated function AnimEnd() { if ( bCanClientFire && (PlayerPawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ) { if ( bForceFire || (Pawn(Owner).bFire != 0) ) { Global.ClientFire(0); return; } else if ( bForceAltFire || (Pawn(Owner).bAltFire != 0) ) { Global.ClientAltFire(0); return; } } GotoState(''); Global.AnimEnd(); } simulated function EndState() { bForceFire = false; bForceAltFire = false; } simulated function BeginState() { bForceFire = false; bForceAltFire = false; } } state ClientFiring { simulated function AnimEnd() { if ( (Pawn(Owner) == None) || (Ammotype.AmmoAmount <= 0) ) { PlayIdleAnim(); GotoState(''); } else if ( !bCanClientFire ) GotoState(''); else { PlayFastReloading(); GotoState('ClientReload'); } } } state ClientAltFiring { simulated function AnimEnd() { if ( (Pawn(Owner) == None) || (Ammotype.AmmoAmount <= 0) ) { PlayIdleAnim(); GotoState(''); } else if ( !bCanClientFire ) GotoState(''); else { PlayReloading(); GotoState('ClientReload'); } } } state NormalFire { function EndState() { Super.EndState(); OldFlashCount = FlashCount; } function AnimEnd() { if ( (AnimSequence != 'Loading') && (AmmoType.AmmoAmount > 0) ) PlayFastReloading(); else Finish(); } Begin: FlashCount++; } /////////////////////////////////////////////////////////// simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * 0.4 ); else if ( AmmoType.AmmoAmount < 1 ) TweenAnim('Select', 0.5); else PlayAnim('Down',1.0, 0.05); } simulated function PlayIdleAnim() { } simulated function PlayPostSelect() { PlayAnim('Loading', 1.3, 0.05); Owner.PlayOwnedSound(Misc2Sound, SLOT_None,1.3*Pawn(Owner).SoundDampening); } NpU2oקNWW"2B$ B<7$@&\//============================================================================= // SinHealth50. //============================================================================= class SinHealth50 expands SinHealth; 9R//============================================================================= // DoubleMagnum. //============================================================================= class DoubleMagnum expands Magnum; simulated function PostRender( canvas Canvas ) { local ChallengeHUD MyHUD; local float Scale; local sin2utdialogclientwindow sm; Super.PostRender(Canvas); bOwnsCrossHair = bLockedOn; /* if ( bOwnsCrossHair ) { // if locked on, draw special crosshair Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 4 * Scale, 0.5 * Canvas.ClipY - 4 * Scale ); // Canvas.SetPos(0.5 * Canvas.ClipX - 8, 0.5 * Canvas.ClipY - 8 ); Canvas.Style = ERenderStyle.STY_Translucent; //If (sm.newx.bchecked == true) Canvas.DrawIcon(Texture'SinHUD.Ch1_On', Scale); Canvas.DrawIcon(Texture'SinHUD.Ch1_On', Scale); Canvas.Style = ERenderStyle.STY_Translucent; }*/ } tup\//============================================================================= // sinbolt. //============================================================================= class sinbolt expands starterbolt; Q//============================================================================= // Sin2UTMenuItem. //============================================================================= class Sin2UTMenuItem expands UMenuModMenuItem; function Setup() { MenuCaption="&SiN2UT"; MenuHelp="Configure SiN2UT"; } function Execute() { MenuItem.Owner.Root.CreateWindow(class'Sin2utFramedWindow',10, 10, 200, 200); } zn6y -%nF M]SinDMrMSin Deathmatch^ mM//============================================================================= // SinDM. //============================================================================= class SinDM expands DeathMatchPlus; /* var(DeathMessage) localized string OverPoweredMessage; var(GameInfo) localized string GameName; function PreCacheReferences() { //never called - here to force precaching of meshes spawn(class'TMale1'); spawn(class'TMale2'); spawn(class'TFemale1'); spawn(class'TFemale2'); spawn(class'ImpactHammer'); spawn(class'Translocator'); spawn(class'Sin2ut.Magnum'); spawn(class'Sin2ut.SinShotgun'); spawn(class'Sin2ut.Chaingun'); spawn(class'Sin2ut.TrueChainGun'); spawn(class'Ripper'); spawn(class'Minigun2'); spawn(class'Sin2ut.PlasmaRifle'); spawn(class'Sin2ut.RocketLauncher'); spawn(class'Sin2ut.SinSniper'); } static function string KillMessage( name damageType, pawn Other ) { local string message; if (damageType == 'Exploded') message = Default.ExplodeMessage; else if ( damageType == 'Eradicated' ) message = Default.ExplodeMessage; else if (damageType == 'Suicided') message = Default.SuicideMessage; else if ( damageType == 'Fell' ) message = Default.FallMessage; else if ( damageType == 'Drowned' ) message = Default.DrownedMessage; else if ( damageType == 'Burned' ) message = Default.BurnedMessage; else if ( damageType == 'Corroded' ) message = Default.CorrodedMessage; else if ( damageType == 'Mortared' ) message = Default.MortarMessage; else if ( damageType == 'OverPowered' ) message = Default.OverPoweredMessage; else message = Default.DeathVerb$Default.DeathTerm; return message; } function AddDefaultInventory( pawn PlayerPawn ) { local Weapon NewWeapon; local Bot B; if ( PlayerPawn.IsA('Spectator') || (bRequireReady && (CountDown > 0)) ) return; // Spawn Magnum GiveWeapon(PlayerPawn, "Sin2ut.Magnum"); GiveItem(PlayerPawn, "Sin2ut.Degeneration"); //Super. AddDefaultInventory(PlayerPawn); /* if ( bUseTranslocator && (!bRatedGame || bRatedTranslocator) ) { // Spawn Translocator. if( PlayerPawn.FindInventoryType(class'Translocator')==None ) { newWeapon = Spawn(class'Translocator'); if( newWeapon != None ) { newWeapon.Instigator = PlayerPawn; newWeapon.BecomeItem(); PlayerPawn.AddInventory(newWeapon); newWeapon.GiveAmmo(PlayerPawn); newWeapon.SetSwitchPriority(PlayerPawn); newWeapon.WeaponSet(PlayerPawn); } } } */ B = Bot(PlayerPawn); } function GiveWeapon(Pawn PlayerPawn, string aClassName ) { local class WeaponClass; local Weapon NewWeapon; WeaponClass = class(DynamicLoadObject(aClassName, class'Class')); if( PlayerPawn.FindInventoryType(WeaponClass) != None ) return; newWeapon = Spawn(WeaponClass); if( newWeapon != None ) { newWeapon.RespawnTime = 0.0; newWeapon.GiveTo(PlayerPawn); newWeapon.bHeldItem = true; newWeapon.GiveAmmo(PlayerPawn); newWeapon.SetSwitchPriority(PlayerPawn); newWeapon.WeaponSet(PlayerPawn); newWeapon.AmbientGlow = 0; if ( PlayerPawn.IsA('PlayerPawn') ) newWeapon.SetHand(PlayerPawn(PlayerPawn).Handedness); else newWeapon.GotoState('Idle'); PlayerPawn.Weapon.GotoState('DownWeapon'); PlayerPawn.PendingWeapon = None; PlayerPawn.Weapon = newWeapon; } } function GiveItem(Pawn PlayerPawn, string aClassName ) { local class PickupClass; local Pickup NewPickup; PickupClass = class(DynamicLoadObject(aClassName, class'Class')); if( PlayerPawn.FindInventoryType(PickupClass) != None ) return; newPickup = Spawn(PickupClass); if( newPickup != None ) { newPickup.RespawnTime = 0.0; newPickup.GiveTo(PlayerPawn); newPickup.bHeldItem = true; newPickup.AmbientGlow = 0; } } function AddDefaultPickup( pawn PlayerPawn ) { local Pickup newPickup; local class WeapClass; local Weapon Magreplace; local class WeapoClass; PlayerPawn.JumpZ = PlayerPawn.Default.JumpZ * PlayerJumpZScaling(); if( PlayerPawn.IsA('Spectator') ) return; // Give the health drop. WeapClass = class'sin2ut.Degeneration'; if( (WeapClass!=None) && (PlayerPawn.FindInventoryType(WeapClass)==None) ) { newPickup = Spawn(WeapClass); if( newPickup != None ) { newPickup.Instigator = PlayerPawn; newPickup.BecomeItem(); PlayerPawn.AddInventory(newPickup); } } // Spawn the magnum. weapoclass = class'sin2ut.magnum'; if( (weapoclass!=None) && (PlayerPawn.FindInventoryType(weapoclass)==None) ) { magreplace = Spawn(weapoclass); if( magreplace != None ) { magreplace.Instigator = PlayerPawn; magreplace.BecomeItem(); PlayerPawn.AddInventory(magreplace); } } BaseMutator.ModifyPlayer(PlayerPawn); } event prebeginplay() { DefaultWeapon=class'Translocator'; } */ V//============================================================================= // PlasmaAmmo. //============================================================================= class PlasmaAmmo expands PAmmo;  //============================================================================= // Sin2utFramedWindow. //============================================================================= class Sin2utFramedWindow expands UWindowFramedWindow; function BeginPlay() { Super.BeginPlay(); WindowTitle = "Sin2UT Configuration"; ClientClass = class'Sin2utDialogClientWindow'; bSizable = true; } function Created() { Super.Created(); SetSize(220,400); WinLeft = (Root.WinWidth - WinWidth) / 2; WinTop = (Root.WinHeight - WinHeight) / 2; } gm//============================================================================= // PlasmaGrenadeWave. //============================================================================= class PlasmaGrenadeWave expands ShockrifleWave; A)//============================================================================= // SinHealth. //============================================================================= class SinHealth expands MedBox; auto state Pickup { function Touch( actor Other ) { local int HealMax; local Pawn P; local inventory s; if ( ValidTouch(Other) ) { P = Pawn(Other); s = P.FindInventoryType(class'Sin2ut.RegenTech'); HealMax = P.default.health; if (bSuperHeal) HealMax = Min(200, HealMax * 2.0); if (S == none && P.Health < HealMax && P.Health < 200) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax) P.Health = HealMax; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } else if (S != none && P.Health < HealMax + 100 && P.Health < 300) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax + 100) P.Health = HealMax + 100; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } } } } /* state Pickup { function Touch( actor Other ) { local int HealMax; local Pawn P; local inventory s; if ( ValidTouch(Other) ) { P = Pawn(Other); s = P.FindInventoryType(class'Sin2ut.RegenTech'); HealMax = P.default.health; if (bSuperHeal) HealMax = Min(200, HealMax * 2.0); if (S == none && P.Health < HealMax) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax) P.Health = HealMax; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } else if (S != none && P.Health < HealMax + 100) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, P); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, P); P.Health += HealingAmount; if (P.Health > HealMax + 100) P.Health = HealMax + 100; PlayPickupMessage(P); PlaySound (PickupSound,,2.5); Other.MakeNoise(0.2); SetRespawn(); } } } } */ `  TBC) #(G Iy9#::$ ::$w.*w..*$$  _% c C.?,a!D?>-L> EbFbTEcaL?'4::$@G9a-$ G F-$D::$ ?? HJ % -T' KLMN^//============================================================================= // SinHUDMutator. //============================================================================= class SinHUDMutator expands Mutator; t R(//============================================================================= // PlasmaBall. //============================================================================= class PlasmaBall expands PlasmaSphere; var bool bExploded, bExplosionEffect, bHitPawn; var() texture ExpType; var() Sound EffectSound1; var() texture SpriteAnim[20]; var() int NumFrames; var Float AnimTime; simulated function PostBeginPlay() { Super.PostBeginPlay(); SetTimer(0.8, true); if ( Level.NetMode == NM_Client ) LifeSpan = 2.0; else Velocity = Speed * vector(Rotation); Velocity = Vector(Rotation) * Speed; Velocity.z += 200; if ( Level.bDropDetail ) LightType = LT_None; } simulated function Timer() { if ( Level.bDropDetail ) LightType = LT_None; if ( (Physics == PHYS_None) && (LifeSpan > 0.5) ) LifeSpan = 0.5; } simulated function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { bExploded = True; } function BlowUp(vector HitLocation) { HurtRadius(Damage,190.0, MyDamageType, MomentumTransfer, HitLocation ); PlaySound(EffectSound1,,7.0); Spawn(class'PlasmaGrenadeWave',,, HitLocation); } simulated function Explode(vector HitLocation, vector HitNormal) { if ( !bExplosionEffect ) { if ( Role == ROLE_Authority ) BlowUp(HitLocation); bExplosionEffect = true; if ( !Level.bHighDetailMode || bHitPawn || Level.bDropDetail ) { if ( bExploded ) { Destroy(); return; } else DrawScale = 0.45; } else DrawScale = 0.65; LightType = LT_Steady; LightRadius = 5; SetCollision(false,false,false); LifeSpan = 0.5; Texture = ExpType; DrawType = DT_SpriteAnimOnce; Style = STY_Translucent; if ( Region.Zone.bMoveProjectiles && (Region.Zone.ZoneVelocity != vect(0,0,0)) ) { bBounce = true; Velocity = Region.Zone.ZoneVelocity; } else SetPhysics(PHYS_None); } } simulated function ProcessTouch (Actor Other, vector HitLocation) { If ( Other!=Instigator && PlasmaSphere(Other)==None ) { if ( Other.bIsPawn ) { bHitPawn = true; bExploded = !Level.bHighDetailMode || Level.bDropDetail; } if ( Role == ROLE_Authority ) Other.TakeDamage( Damage, instigator, HitLocation, MomentumTransfer*Vector(Rotation), MyDamageType); Explode(HitLocation, vect(0,0,1)); } } auto State Flying { Begin: LifeSpan = 2.0; } simulated function Landed( vector HitNormal ) { Explode(Location,HitNormal); } eCeX @ bx%//============================================================================= // SinPlasmaBall. //============================================================================= class SinPlasmaBall expands PlasmaSphere; var bool bExploded, bExplosionEffect, bHitPawn; var() texture ExpType; var() Sound EffectSound1; var() texture SpriteAnim[20]; var() int NumFrames; var Float AnimTime; simulated function PostBeginPlay() { Super.PostBeginPlay(); SetTimer(0.8, true); if ( Level.NetMode == NM_Client ) LifeSpan = 2.0; else Velocity = Speed * vector(Rotation); if ( Level.bDropDetail ) LightType = LT_None; } simulated function Timer() { if ( Level.bDropDetail ) LightType = LT_None; if ( (Physics == PHYS_None) && (LifeSpan > 0.5) ) LifeSpan = 0.5; } simulated function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { bExploded = True; } function BlowUp(vector HitLocation) { HurtRadius(Damage,170.0, MyDamageType, MomentumTransfer, HitLocation ); PlaySound(EffectSound1,,7.0); Spawn(class'PlasmaGrenadeWave',,, HitLocation); } simulated function Explode(vector HitLocation, vector HitNormal) { if ( !bExplosionEffect ) { if ( Role == ROLE_Authority ) BlowUp(HitLocation); bExplosionEffect = true; if ( !Level.bHighDetailMode || bHitPawn || Level.bDropDetail ) { if ( bExploded ) { Destroy(); return; } else DrawScale = 0.45; } else DrawScale = 0.65; LightType = LT_Steady; LightRadius = 5; SetCollision(false,false,false); LifeSpan = 0.5; Texture = ExpType; DrawType = DT_SpriteAnimOnce; Style = STY_Translucent; if ( Region.Zone.bMoveProjectiles && (Region.Zone.ZoneVelocity != vect(0,0,0)) ) { bBounce = true; Velocity = Region.Zone.ZoneVelocity; } else SetPhysics(PHYS_None); } } simulated function ProcessTouch (Actor Other, vector HitLocation) { If ( Other!=Instigator && PlasmaSphere(Other)==None ) { if ( Other.bIsPawn ) { bHitPawn = true; bExploded = !Level.bHighDetailMode || Level.bDropDetail; } if ( Role == ROLE_Authority ) Other.TakeDamage( Damage, instigator, HitLocation, MomentumTransfer*Vector(Rotation), MyDamageType); Explode(HitLocation, vect(0,0,1)); } } auto State Flying { Begin: LifeSpan = 2.0; } U]V]|EaL?'4::$@G996?,-$ W "F-$D::$ ?? XZ + -|' [\]^K //============================================================================= // SIN_invisibility. //============================================================================= class SIN_invisibility expands UT_invisibility; function bool HandlePickupQuery( inventory Item ) { local Inventory s; local Inventory u; /* s = Pawn(Owner).FindInventoryType(class'Sin2ut.Bioshield'); u = Pawn(Owner).FindInventoryType(class'Sin2ut.u4'); if ( s != none || u != none) { return true; } else if ( u != None ) { return true; } */ if ( Item.IsA('BioShield') || Item.IsA('u4')) return false; else return Super.HandlePickupQuery(Item); } uj//============================================================================= // SinPants. //============================================================================= class SinPants expands SinArmor; function bool HandlePickupQuery( inventory Item ) { local Inventory s; s = Pawn(Owner).FindInventoryType(class'Sin2ut.Bioshield'); if ( s != None ) { return false; } else return Super.HandlePickupQuery(Item); } // // Absorb damage. // function int ArmorAbsorbDamage(int Damage, name DamageType, vector HitLocation) { local int ArmorDamage; if ( DamageType != 'Drowned' ) ArmorImpactEffect(HitLocation); if( (DamageType!='None') && ((ProtectionType1==DamageType) || (ProtectionType2==DamageType)) ) return 0; if ((HitLocation.Z - Owner.Location.Z < 0.48 * Owner.CollisionHeight)) { ArmorDamage = (Damage * ArmorAbsorption) / 100; if( ArmorDamage >= Charge ) { ArmorDamage = Charge; Destroy(); } else Charge -= ArmorDamage; return (Damage - ArmorDamage); } else return Damage; if (DamageType=='Drowned') Return Damage; } qCk @ il//============================================================================= // SinHelmet. //============================================================================= class SinHelmet expands SinArmor; function bool HandlePickupQuery( inventory Item ) { local Inventory s; s = Pawn(Owner).FindInventoryType(class'Sin2ut.Bioshield'); if ( s != None ) { return false; } else return Super.HandlePickupQuery(Item); } // // Absorb damage. // function int ArmorAbsorbDamage(int Damage, name DamageType, vector HitLocation) { local int ArmorDamage; if ( DamageType != 'Drowned' ) ArmorImpactEffect(HitLocation); if( (DamageType!='None') && ((ProtectionType1==DamageType) || (ProtectionType2==DamageType)) ) return 0; if ((HitLocation.Z - Owner.Location.Z > 0.65 * Owner.CollisionHeight)) { ArmorDamage = (Damage * ArmorAbsorption) / 100; if( ArmorDamage >= Charge ) { ArmorDamage = Charge; Destroy(); } else Charge -= ArmorDamage; return (Damage - ArmorDamage); } else return Damage; if (DamageType=='Drowned') Return Damage; } M)//============================================================================= // SinSpawnNotify. //============================================================================= class SinSpawnNotify expands SpawnNotify; //Called automatically anytime the class you specified in default properites // is spawned (also called if a subclass of that class is spawned). //Great way to catch things to modify or replace them - just make sure to use // if statements to avoid infinite recursion if you replace something by // spawning a new subclass. simulated event Actor SpawnNotification( Actor A ) { local Mutator tempActor; local bool bFound; if ( HUD(A).HUDMutator == none ) { //If there aren't any HUDMutators attached to the HUD, attach // your mutator. HUD(A).HUDMutator = spawn(class'Sin2ut.SinHUDMutator',A); } else { bFound = false; for (tempActor = HUD(A).HUDMutator; tempActor != None; tempActor = tempActor.NextMutator) { //make sure we don't add two of our mutator - can happen // on listen servers and single player games if (tempActor.class == class'Sin2ut.SinHUDMutator') { bFound = true; break; } } //If there is a HUDMutator attached to the HUD already, and // there are no instances of our mutator, call // AddMutator on that hud, passing it a newly spawned mutator // of your own. Note that the AddMutator function will // automatically seek the end of the mutator chain. (If the // one you try to add yourself to has a NextMutator, the // function call is passed to that mutator.) if (!bFound) HUD(A).HUDMutator.AddMutator(spawn(class'Sin2ut.SinHUDMutator',A)); } //Have to return the original actor (the HUD). If we had completely // replaced it we would return the replacement. return A; } /*defaultproperties { //This selects what class to intercept spawns for. ActorClass=class'Engine.HUD' }*/ ^ ox9//============================================================================= // u4. //============================================================================= class u4 expands TournamentPickup; var DeathMatchPlus MyGame; var float SpeedScale; function bool HandlePickupQuery( inventory Item ) { local Inventory s; local Inventory t; local Inventory u; /* s = Pawn(Owner).FindInventoryType(class'Sin2ut.Bioshield'); t = Pawn(Owner).FindInventoryType(class'Sin2ut.SIN_Invisibility'); if ( s != None || t != none) { return true; } else if ( t != None ) { return true; } */ if ( Item.IsA('BioShield') || Item.IsA('SIN_Invisibility')) return true; else return Super.HandlePickupQuery(Item); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.AmbientGlow = Owner.Default.AmbientGlow; Owner.LightEffect = Owner.default.LightEffect; Owner.LightBrightness = Owner.default.LightBrightness; Owner.LightHue = Owner.default.LightHue; Owner.LightRadius = Owner.default.LightRadius; Owner.LightSaturation = Owner.default.LightSaturation; Owner.LightType = Owner.default.LightType; Pawn(Owner).JumpZ = Pawn(Owner).Default.JumpZ * Level.Game.PlayerJumpZScaling(); Pawn(Owner).GroundSpeed = Pawn(Owner).Default.GroundSpeed * SpeedScale; } function Activate() { bActive = true; SetOwnerDisplay(); } /*function SetOwnerDisplay() { if ( !bActive ) return; /* if (MyGame.bJumpmatch) { Pawn(Owner).Groundspeed=Pawn(Owner).default.Groundspeed*1.75; Pawn(Owner).Jumpz = Pawn(Owner).default.Jumpz * 3.75; } else Pawn(Owner).Groundspeed=Pawn(Owner).default.Groundspeed*1.75; Pawn(Owner).Jumpz=Pawn(Owner).default.Jumpz*2;*/ }*/ function ChangedWeapon() { if ( !bActive ) return; if( Inventory != None ) Inventory.ChangedWeapon(); } function SetOwnerLighting() { if ( Owner.bIsPawn && Pawn(Owner).bIsPlayer && (Pawn(Owner).PlayerReplicationInfo.HasFlag != None) ) return; Owner.AmbientGlow = 254; Owner.LightEffect=LE_NonIncidence; Owner.LightBrightness=255; Owner.LightHue=58; Owner.LightRadius=6; Owner.LightSaturation=0; Owner.LightType=LT_Steady; } function Timer() { Charge-=1; Pawn(Owner).Groundspeed=Pawn(Owner).default.Groundspeed*1.75*SpeedScale; Pawn(Owner).Jumpz=Pawn(Owner).default.Jumpz*2; //} if (Charge<-0) UsedUp(); } function BeginState() { bActive = true; if ( Level.Game.IsA('DeathMatchPlus') && DeathMatchPlus(Level.Game).bMegaSpeed ) SpeedScale = 1.3; else SpeedScale = 1.0; PlaySound(ActivateSound,,4.0); SetOwnerLighting(); Pawn(Owner).Groundspeed=Pawn(Owner).default.Groundspeed*1.75*SpeedScale; Pawn(Owner).Jumpz=Pawn(Owner).default.Jumpz*2; SetTimer(1.0,True); } } state DeActivated { Begin: } singular function UsedUp() { if ( Owner != None ) { if ( Owner.bIsPawn ) { if ( !Pawn(Owner).bIsPlayer || (Pawn(Owner).PlayerReplicationInfo.HasFlag == None) ) { Owner.AmbientGlow = Owner.Default.AmbientGlow; Owner.LightType = LT_None; } PlaySound(DeActivateSound,,4.0); Pawn(Owner).JumpZ = Pawn(Owner).Default.JumpZ * Level.Game.PlayerJumpZScaling(); Pawn(Owner).GroundSpeed = Pawn(Owner).Default.GroundSpeed * SpeedScale; } bActive = false; if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogItemDeactivate(Self, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogItemDeactivate(Self, Pawn(Owner)); } Destroy(); } F a6 w^*^a4w * a h(//============================================================================= // Fists. //============================================================================= class Fists expands TournamentWeapon; var() int damage; function float SuggestAttackStyle() { return 15.0; } function Fire(float Value) { MeleeFire(85); Playfiring(); } function AltFire(float Value) { MeleeFire(85); Playaltfiring(); } function MeleeFire(int range) { local vector x, y, z, hitloc, momentum; local actor Other; GetAxes(PlayerPawn(Owner).ViewRotation, x, y, z); foreach RadiusActors(class'Actor', Other, range, Owner.Location) { if ((Other.Location - Owner.Location) Dot X > 0 && Other.IsA('Pawn')) { hitloc = Other.Location + (Other.Location - Owner.Location) * Other.CollisionRadius; Other.TakeDamage(Damage, Pawn(Owner), hitloc, 3000.0 * x, 'hit'); Owner.PlaySound(FireSound, SLOT_None,Pawn(Owner).SoundDampening*6.5); } momentum = (Other.Location - Owner.Location) * 750/Other.Mass; Other.Velocity += momentum; } } function Playfiring() { PlayAnim( 'Fire', 0.5); PlayOwnedSound(FireSound, SLOT_Misc, 1.7*Pawn(Owner).SoundDampening,,,); } function Playaltfiring() { PlayAnim( 'Fire', 0.5); PlayOwnedSound(AltFireSound, SLOT_Misc, 1.7*Pawn(Owner).SoundDampening,,,); } state Idle { function AnimEnd() { PlayIdleAnim(); } function bool PutDown() { GotoState('DownWeapon'); return True; } Begin: bPointing=False; if ( Pawn(Owner).bFire!=0 ) Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) AltFire(0.0); Disable('AnimEnd'); PlayIdleAnim(); } ^f//============================================================================= // BetaSniper. //============================================================================= class BetaSniper expands SinSniper; function AltFire( float Value ) { ClientAltFire(Value); Owner.PlaySound(CockingSound, SLOT_None,0.5*Pawn(Owner).SoundDampening); } simulated function PlayFiring() { local int r; PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0); bCanClientFire = false; PlayAnim(FireAnims[Rand(5)],0.150 + 0.175 * FireAdjust, 0.05); if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) ) bMuzzleFlash++; bCanClientFire = true; } function Timer() { local actor targ; local float bestAim, bestDist; local vector FireDir; local Pawn P; bestAim = 0.95; P = Pawn(Owner); if ( P == None ) { GotoState(''); return; } if ( VSize(P.Location - OwnerLocation) < 6 ) StillTime += FMin(2.0, Level.TimeSeconds - StillStart); else StillTime = 0; StillStart = Level.TimeSeconds; OwnerLocation = P.Location; FireDir = vector(P.ViewRotation); targ = P.PickTarget(bestAim, bestDist, FireDir, Owner.Location); if ( Pawn(targ) != None ) { SetTimer(1 + 4 * FRand(), false); bPointing = true; Pawn(targ).WarnTarget(P, 200, FireDir); } else { SetTimer(0.4 + 1.6 * FRand(), false); if ( (P.bFire == 0) && (P.bAltFire == 0) ) bPointing = false; } } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local UT_Shellcase s; s = Spawn(class'UT_ShellCase',, '', Owner.Location + CalcDrawOffset() + 30 * X + (2.8 * FireOffset.Y+5.0) * Y - Z * 1); if ( s != None ) { s.DrawScale = 2.0; s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160); } if (Other == Level) Spawn(class'UT_HeavyWallHitEffect',,, HitLocation+HitNormal, Rotator(HitNormal)); else if ( (Other != self) && (Other != Owner) && (Other != None) ) { if ( Other.bIsPawn ) Other.PlaySound(Sound 'ChunkHit',, 4.0,,100); if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z > 0.62 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) ) Other.TakeDamage(DecapDamage, Pawn(Owner), HitLocation, 35000 * X, AltDamageType); else Other.TakeDamage(NormalDamage, Pawn(Owner), HitLocation, 30000.0*X, MyDamageType); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function Finish() { if ( (Pawn(Owner).bFire!=0) && (FRand() < 0.6) ) Timer(); Super.Finish(); } function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; local actor Other; local Pawn PawnOwner; PawnOwner = Pawn(Owner); Owner.MakeNoise(PawnOwner.SoundDampening); GetAxes(PawnOwner.ViewRotation,X,Y,Z); StartTrace = Owner.Location + PawnOwner.Eyeheight * Z; AdjustedAim = PawnOwner.AdjustAim(1000000, StartTrace, 2*AimError, False, False); X = vector(AdjustedAim); EndTrace = StartTrace + 10000 * X; Other = PawnOwner.TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, X,Y,Z); } function Fire( float Value ) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.Ammoamount >= 1) { // GotoState('NormalFire'); bCanClientFire = true; bPointing=True; if ( Owner.IsA('Bot') ) { // simulate bot using zoom if ( Bot(Owner).bSniping && (FRand() < 0.65) ) AimError = AimError/FClamp(StillTime, 1.0, 8.0); else if ( VSize(Owner.Location - OwnerLocation) < 6 ) AimError = AimError/FClamp(0.5 * StillTime, 1.0, 3.0); else StillTime = 0; } GotoState('NormalFire'); /* Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; ClientFire(Value); */ } } state Idle { function Fire( float Value ) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.Ammoamount >= 1) { GotoState('NormalFire'); bCanClientFire = true; bPointing=True; if ( Owner.IsA('Bot') ) { // simulate bot using zoom if ( Bot(Owner).bSniping && (FRand() < 0.65) ) AimError = AimError/FClamp(StillTime, 1.0, 8.0); else if ( VSize(Owner.Location - OwnerLocation) < 6 ) AimError = AimError/FClamp(0.5 * StillTime, 1.0, 3.0); else StillTime = 0; } /* Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; ClientFire(Value); */ } } function BeginState() { bPointing = false; SetTimer(0.4 + 0.8 * FRand(), false); Super.BeginState(); } function EndState() { SetTimer(0.0, false); Super.EndState(); } Begin: bPointing=False; if ( AmmoType.AmmoAmount<=0 ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo if ( Pawn(Owner).bFire!=0 ) Fire(0.0); Disable('AnimEnd'); PlayIdleAnim(); } simulated function PlaySelect() { bForceFire = false; bForceAltFire = false; bCanClientFire = false; if ( !IsAnimating() || (AnimSequence != 'Select') ) PlayAnim('Select',0.5,0.0); Owner.PlaySound(SelectSound, SLOT_Misc, Pawn(Owner).SoundDampening); } simulated function PostRender( canvas Canvas ) { local ChallengeHUD MyHUD; local float Scale; local PlayerPawn P; P = PlayerPawn(Owner); if ( (P != None) && (P.DesiredFOV != P.DefaultFOV) ) { bOwnsCrossHair = true; Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 128 * Scale, 0.5 * Canvas.ClipY - 128 * Scale ); if ( Level.bHighDetailMode ) Canvas.Style = ERenderStyle.STY_Translucent; else Canvas.Style = ERenderStyle.STY_Translucent; //Canvas.DrawIcon(Texture'ch1_zoom_on', Scale); //Canvas.SetPos(0.5 * Canvas.ClipX + 32 * Scale, 0.5 * Canvas.ClipY + 48 * Scale); Canvas.DrawIcon(Texture'ch1_zoom_on', Scale * 2); Canvas.SetPos(0.5 * Canvas.ClipX + 64 * Scale, 0.5 * Canvas.ClipY + 96 * Scale); Canvas.DrawColor.R = 0; Canvas.DrawColor.G = 255; Canvas.DrawColor.B = 0; Scale = P.DefaultFOV/P.DesiredFOV; Canvas.DrawText("X"$int(Scale)$"."$int(10 * Scale - 10 * int(Scale))); } else bOwnsCrossHair = false; bOwnsCrossHair = bLockedOn; if ( bOwnsCrossHair ) { // if locked on, draw special crosshair Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 4 * Scale, 0.5 * Canvas.ClipY - 4 * Scale ); // Canvas.SetPos(0.5 * Canvas.ClipX - 8, 0.5 * Canvas.ClipY - 8 ); Canvas.Style = ERenderStyle.STY_Translucent; Canvas.DrawIcon(Texture'Crosshair6', Scale); Canvas.Style = ERenderStyle.STY_Translucent; } } /*function tick (float deltatime) { local actor Other; local vector HitLocation, HitNormal, X, Y, Z, StartTrace, EndTrace; local int delaytime; delaytime++; if ( delaytime == 3) { StartTrace = Owner.Location; StartTrace.Z += Pawn(Owner).BaseEyeHeight; EndTrace = StartTrace + vector(Pawn(Owner).ViewRotation) * 10000.0; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if ( (Pawn(Other) != None)) bLockedOn=true; else bLockedon=false; delaytime=0; } }*/ state NormalFire { //ignores Fire; /*function Fire(float F) { } function AltFire(float F) { }*/ function Tick( float DeltaTime ) { if( (pawn(Owner).bFire==0)) GoToState('ShootLoad'); } Function EndState() { Super.EndState(); OldFlashCount = FlashCount; } function BeginState() { } Begin: FlashCount++; /* if (AmmoType.UseAmmo(1)) { Owner.Playsound(FireSound,SLOT_Misc, Pawn(Owner).SoundDampening*4.0); GoToState('ShootLoad'); }*/ //else //GotoState('Idle'); This might do something } state ShootLoad { function Fire(float F) {} function AltFire(float F) {} function BeginState() { local Vector Start, X,Y,Z; local float value; if (AmmoType.UseAmmo(1)) { Owner.PlayOwnedSound(FireSound, SLOT_Misc, 3.0*Pawn(Owner).SoundDampening); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); PlayAnim( 'Fire', 0.325, 0.05); Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation,X,Y,Z); Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; //AdjustedAim = pawn(owner).AdjustAim(AltProjectileSpeed, Start, AimError, True, True); Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; ClientFire(Value); /*if (AmmoType.UseAmmo(1)) { PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*3.0); //bCanClientFire = false; PlayAnim(FireAnims[Rand(5)],0.150 + 0.175 * FireAdjust, 0.05); if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV) ) bMuzzleFlash++; Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation,X,Y,Z); Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = pawn(owner).AdjustAim(AltProjectileSpeed, Start, AimError, True, True); Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.0); AimError = Default.AimError; bCanClientFire = true;*/ } } Begin: FinishAnim(); Finish(); } State DownWeapon { ignores Fire, AltFire; function bool PutDown() { Pawn(Owner).ClientPutDown(self, Pawn(Owner).PendingWeapon); return true; //just keep putting it down } function BeginState() { bChangeWeapon = false; bMuzzleFlash = 0; Pawn(Owner).ClientPutDown(self, Pawn(Owner).PendingWeapon); } Begin: TweenDown(); FinishAnim(); Sleep(1.0); Pawn(Owner).ChangedWeapon(); } simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * 0.4 ); else PlayAnim('Down', 0.33, 0.05); } d//============================================================================= // SIN_GuidedMissile. //============================================================================= class SIN_GuidedMissile expands GuidedWarshell; var Pawn Guider; var rotator OldGuiderRotation, GuidedRotation; var float CurrentTimeStamp, LastUpdateTime,ClientBuffer,ServerUpdate; var bool bUpdatePosition; var bool bDestroyed; var rockettrail trail2; var SavedMove SavedMoves; var SavedMove FreeMoves; var vector RealLocation, RealVelocity; simulated function Timer() { local ut_SpriteSmokePuff b; local float SmokeRate; if ( (Role == ROLE_Authority) && (Level.TimeSeconds - ServerUpdate > 4) ) { Explode(Location,Vect(0,0,1)); return; } if ( Trail2 == None ) Trail2 = Spawn(class'RocketTrail',self); CannonTimer += SmokeRate; if ( CannonTimer > 0.6 ) { WarnCannons(); CannonTimer -= 0.6; } if ( Region.Zone.bWaterZone || (Level.NetMode == NM_DedicatedServer) ) { SetTimer(SmokeRate, false); Return; } if ( Level.bHighDetailMode ) { if ( Level.bDropDetail ) SmokeRate = 0.07; else SmokeRate = 0.02; } else { SmokeRate = 0.15; } b = Spawn(class'ut_SpriteSmokePuff'); b.RemoteRole = ROLE_None; SetTimer(SmokeRate, false); } simulated function Destroyed() { local WarheadLauncher W; bDestroyed = true; if ( (PlayerPawn(Guider) != None) ) PlayerPawn(Guider).ViewTarget = None; While ( FreeMoves != None ) { FreeMoves.Destroy(); FreeMoves = FreeMoves.NextMove; } While ( SavedMoves != None ) { SavedMoves.Destroy(); SavedMoves = SavedMoves.NextMove; } if ( (Guider != None) && (Level.NetMode != NM_Client) ) { W = WarheadLauncher(Guider.FindInventoryType(class'WarheadLauncher')); if ( W != None ) { W.GuidedShell = None; W.GotoState('Finishing'); } } Super.Destroyed(); } simulated function Tick(float DeltaTime) { local int DeltaYaw, DeltaPitch; local int YawDiff, PitchDiff; local SavedMove NewMove; if ( Level.NetMode == NM_Client ) { if ( (PlayerPawn(Instigator) != None) && (ViewPort(PlayerPawn(Instigator).Player) != None) ) { Guider = Instigator; if ( bDestroyed || (Instigator.health < 0) ) { PlayerPawn(Instigator).ViewTarget = None; Destroy(); if ( Instigator.Weapon.IsA('WarheadLauncher') ) WarheadLauncher(Instigator.Weapon).bGuiding = false; return; } PlayerPawn(Instigator).ViewTarget = self; if ( Instigator.Weapon.IsA('WarheadLauncher') ) { WarheadLauncher(Instigator.Weapon).GuidedShell = self; WarheadLauncher(Instigator.Weapon).bGuiding = true; } } else { if ( RealLocation != vect(0,0,0) ) { SetLocation(RealLocation); RealLocation = vect(0,0,0); } if ( RealVelocity != vect(0,0,0) ) { Velocity = RealVelocity; SetRotation(rotator(Velocity)); RealVelocity = vect(0,0,0); } return; } } else if ( (Level.NetMode != NM_Standalone) && (RemoteRole == ROLE_AutonomousProxy) ) return; // if server updated client position, client needs to replay moves after the update if ( bUpdatePosition ) ClientUpdatePosition(); DeltaYaw = (Guider.ViewRotation.Yaw & 65535) - (OldGuiderRotation.Yaw & 65535); DeltaPitch = (Guider.ViewRotation.Pitch & 65535) - (OldGuiderRotation.Pitch & 65535); if ( DeltaPitch < -32768 ) DeltaPitch += 65536; else if ( DeltaPitch > 32768 ) DeltaPitch -= 65536; if ( DeltaYaw < -32768 ) DeltaYaw += 65536; else if ( DeltaYaw > 32768 ) DeltaYaw -= 65536; YawDiff = (Rotation.Yaw & 65535) - (GuidedRotation.Yaw & 65535) - DeltaYaw; if ( DeltaYaw < 0 ) { if ( ((YawDiff > 0) && (YawDiff < 16384)) || (YawDiff < -49152) ) GuidedRotation.Yaw += DeltaYaw; } else if ( ((YawDiff < 0) && (YawDiff > -16384)) || (YawDiff > 49152) ) GuidedRotation.Yaw += DeltaYaw; GuidedRotation.Pitch += DeltaPitch; OldGuiderRotation = Guider.ViewRotation; if ( Role == ROLE_AutonomousProxy ) { // Send the move to the server // skip move if too soon if ( ClientBuffer < 0 ) { ClientBuffer += DeltaTime; MoveRocket(DeltaTime, Velocity, GuidedRotation); return; } else ClientBuffer = ClientBuffer + DeltaTime - 80.0/PlayerPawn(Instigator).Player.CurrentNetSpeed; // I'm a client, so I'll save my moves in case I need to replay them // Get a SavedMove actor to store the movement in. if ( SavedMoves == None ) { SavedMoves = GetFreeMove(); NewMove = SavedMoves; } else { NewMove = SavedMoves; while ( NewMove.NextMove != None ) NewMove = NewMove.NextMove; NewMove.NextMove = GetFreeMove(); NewMove = NewMove.NextMove; } NewMove.TimeStamp = Level.TimeSeconds; NewMove.Delta = DeltaTime; NewMove.Velocity = Velocity; NewMove.SetRotation(GuidedRotation); MoveRocket(DeltaTime, Velocity, GuidedRotation); ServerMove(Level.TimeSeconds, Location, NewMove.Rotation.Pitch, NewMove.Rotation.Yaw); return; } MoveRocket(DeltaTime, Velocity, GuidedRotation); } // Server sends ClientAdjustPosition to the client to adjust the warhead position on the client side when the error // is excessive simulated function ClientAdjustPosition ( float TimeStamp, float NewLocX, float NewLocY, float NewLocZ, float NewVelX, float NewVelY, float NewVelZ ) { local vector NewLocation; if ( CurrentTimeStamp > TimeStamp ) return; CurrentTimeStamp = TimeStamp; NewLocation.X = NewLocX; NewLocation.Y = NewLocY; NewLocation.Z = NewLocZ; Velocity.X = NewVelX; Velocity.Y = NewVelY; Velocity.Z = NewVelZ; SetLocation(NewLocation); bUpdatePosition = true; } // Client calls this to replay moves after getting its position updated by the server simulated function ClientUpdatePosition() { local SavedMove CurrentMove; local int realbRun, realbDuck; local bool bRealJump; bUpdatePosition = false; CurrentMove = SavedMoves; while ( CurrentMove != None ) { if ( CurrentMove.TimeStamp <= CurrentTimeStamp ) { SavedMoves = CurrentMove.NextMove; CurrentMove.NextMove = FreeMoves; FreeMoves = CurrentMove; FreeMoves.Clear(); CurrentMove = SavedMoves; } else { MoveRocket(CurrentMove.Delta, CurrentMove.Velocity, CurrentMove.Rotation); CurrentMove = CurrentMove.NextMove; } } } // server moves the rocket based on clients input, and compares the resultant location to the client's view of the location function ServerMove(float TimeStamp, vector ClientLoc, int Pitch, int Yaw) { local float ClientErr, DeltaTime; local vector LocDiff; if ( CurrentTimeStamp >= TimeStamp ) return; if ( CurrentTimeStamp > 0 ) DeltaTime = TimeStamp - CurrentTimeStamp; CurrentTimeStamp = TimeStamp; GuidedRotation.Pitch = Pitch; GuidedRotation.Yaw = Yaw; if ( DeltaTime > 0 ) MoveRocket(DeltaTime, Velocity, GuidedRotation); if ( Level.TimeSeconds - LastUpdateTime > 0.3 ) { ClientErr = 10000; } else if ( Level.TimeSeconds - LastUpdateTime > 0.07 ) { LocDiff = Location - ClientLoc; ClientErr = LocDiff Dot LocDiff; } // If client has accumulated a noticeable positional error, correct him. if ( ClientErr > 3 ) { LastUpdateTime = Level.TimeSeconds; ClientAdjustPosition(TimeStamp, Location.X, Location.Y, Location.Z, Velocity.X, Velocity.Y, Velocity.Z); } } simulated function MoveRocket(float DeltaTime, vector CurrentVelocity, rotator GuideRotation ) { local int OldRoll, RollMag; local rotator NewRot; local float SmoothRoll; local vector OldVelocity, X,Y,Z; if ( (Role == ROLE_Authority) && ( (Guider == None) || (Guider.Health <= 0) || (Guider.IsA('PlayerPawn') && (PlayerPawn(Guider).ViewTarget != self)) || Guider.IsInState('FeigningDeath')) ) { Explode(Location,Vect(0,0,1)); return; } ServerUpdate = Level.TimeSeconds; OldRoll = Rotation.Roll & 65535; OldVelocity = CurrentVelocity; Velocity = CurrentVelocity + Vector(GuideRotation) * 1500 * DeltaTime; Velocity = Normal(Velocity) * 550; NewRot = Rotator(Velocity); // Roll Warhead based on acceleration GetAxes(NewRot, X,Y,Z); RollMag = int(10 * (Y Dot (Velocity - OldVelocity))/DeltaTime); if ( RollMag > 0 ) NewRot.Roll = Min(12000, RollMag); else NewRot.Roll = Max(53535, 65536 + RollMag); //smoothly change rotation if (NewRot.Roll > 32768) { if (OldRoll < 32768) OldRoll += 65536; } else if (OldRoll > 32768) OldRoll -= 65536; SmoothRoll = FMin(1.0, 5.0 * deltaTime); NewRot.Roll = NewRot.Roll * SmoothRoll + OldRoll * (1 - SmoothRoll); SetRotation(NewRot); if ( (Level.NetMode != NM_Standalone) && ((Level.NetMode != NM_ListenServer) || (Instigator == None) || (Instigator.IsA('PlayerPawn') && (PlayerPawn(Instigator).Player != None) && (ViewPort(PlayerPawn(Instigator).Player) == None))) ) AutonomousPhysics(DeltaTime); if ( Role == ROLE_Authority ) { RealLocation = Location; RealVelocity = Velocity; } } simulated function PostRender( canvas Canvas ) { local float Dist; local Pawn P; local int XPos, YPos; local Vector X,Y,Z, Dir; GetAxes(Rotation, X,Y,Z); Canvas.Font = Font'TinyRedFont'; if ( Level.bHighDetailMode ) Canvas.Style = ERenderStyle.STY_Translucent; else Canvas.Style = ERenderStyle.STY_Normal; foreach visiblecollidingactors(class'Pawn', P, 2000,, true) { Dir = P.Location - Location; Dist = VSize(Dir); Dir = Dir/Dist; if ( (Dir Dot X) > 0.7 ) { XPos = 0.5 * Canvas.ClipX * (1 + 1.4 * (Dir Dot Y)); YPos = 0.5 * Canvas.ClipY * (1 - 1.4 * (Dir Dot Z)); Canvas.SetPos(XPos - 8, YPos - 8); Canvas.DrawIcon(texture'CrossHair6', 1.0); Canvas.SetPos(Xpos - 12, YPos + 8); Canvas.DrawText(Dist, true); } } } simulated function SavedMove GetFreeMove() { local SavedMove s; if ( FreeMoves == None ) return Spawn(class'SavedMove'); else { s = FreeMoves; FreeMoves = FreeMoves.NextMove; s.NextMove = None; return s; } } auto state Flying { function BeginState() { ServerUpdate = Level.TimeSeconds; GuidedRotation = Rotation; OldGuiderRotation = Rotation; Velocity = speed*vector(Rotation); Acceleration = vect(0,0,0); if ( (Level.NetMode != NM_Standalone) && (Role == ROLE_Authority) ) { if ( (PlayerPawn(Instigator) != None) && (ViewPort(PlayerPawn(Instigator).Player) != None) ) RemoteRole = ROLE_SimulatedProxy; else RemoteRole = ROLE_AutonomousProxy; } } } qYG//============================================================================= // Sinstarterbolt. //============================================================================= class Sinstarterbolt expands starterbolt; var float OldError, NewError, StartError, AimError; //used for bot aiming var rotator AimRotation; var float AnimTime; replication { // Things the server should send to the client. unreliable if( Role==ROLE_Authority ) AimError, NewError, AimRotation; } simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( instigator == None ) return; if ( Instigator.IsA('Bot') && Bot(Instigator).bNovice ) aimerror = 2200 + (3 - instigator.skill) * 300; else aimerror = 1000 + (3 - instigator.skill) * 400; if ( FRand() < 0.5 ) aimerror *= -1; } simulated function Tick(float DeltaTime) { local vector X,Y,Z, AimSpot, DrawOffset, AimStart; local int YawErr; local float dAdjust; local Bot MyBot; AnimTime += DeltaTime; if ( AnimTime > 0.05 ) { AnimTime -= 0.05; SpriteFrame++; if ( SpriteFrame == ArrayCount(SpriteAnim) ) SpriteFrame = 0; Skin = SpriteAnim[SpriteFrame]; } // orient with respect to instigator if ( Instigator != None ) { if ( (Level.NetMode == NM_Client) && (!Instigator.IsA('PlayerPawn') || (PlayerPawn(Instigator).Player == None)) ) { SetRotation(AimRotation); Instigator.ViewRotation = AimRotation; DrawOffset = ((0.01 * class'PulseGun'.Default.PlayerViewOffset) >> Rotation); DrawOffset += (Instigator.EyeHeight * vect(0,0,1)); } else { MyBot = Bot(instigator); if ( MyBot != None ) { if ( Instigator.Target == None ) Instigator.Target = Instigator.Enemy; if ( Instigator.Target == Instigator.Enemy ) { if (MyBot.bNovice ) dAdjust = DeltaTime * (4 + instigator.Skill) * 0.075; else dAdjust = DeltaTime * (4 + instigator.Skill) * 0.12; if ( OldError > NewError ) OldError = FMax(OldError - dAdjust, NewError); else OldError = FMin(OldError + dAdjust, NewError); if ( OldError == NewError ) NewError = FRand() - 0.5; if ( StartError > 0 ) StartError -= DeltaTime; else if ( MyBot.bNovice && (Level.TimeSeconds - MyBot.LastPainTime < 0.2) ) StartError = MyBot.LastPainTime; else StartError = 0; AimSpot = 1.25 * Instigator.Target.Velocity + 0.75 * Instigator.Velocity; if ( Abs(AimSpot.Z) < 120 ) AimSpot.Z *= 0.25; else AimSpot.Z *= 0.5; if ( Instigator.Target.Physics == PHYS_Falling ) AimSpot = Instigator.Target.Location - 0.0007 * AimError * OldError * AimSpot; else AimSpot = Instigator.Target.Location - 0.0005 * AimError * OldError * AimSpot; if ( (Instigator.Physics == PHYS_Falling) && (Instigator.Velocity.Z > 0) ) AimSpot = AimSpot - 0.0003 * AimError * OldError * AimSpot; AimStart = Instigator.Location + FireOffset.X * X + FireOffset.Y * Y + (1.2 * FireOffset.Z - 2) * Z; if ( FastTrace(AimSpot - vect(0,0,10), AimStart) ) AimSpot = AimSpot - vect(0,0,10); GetAxes(Instigator.Rotation,X,Y,Z); AimRotation = Rotator(AimSpot - AimStart); AimRotation.Yaw = AimRotation.Yaw + (OldError + StartError) * 0.75 * aimerror; YawErr = (AimRotation.Yaw - (Instigator.Rotation.Yaw & 65535)) & 65535; if ( (YawErr > 3000) && (YawErr < 62535) ) { if ( YawErr < 32768 ) AimRotation.Yaw = Instigator.Rotation.Yaw + 3000; else AimRotation.Yaw = Instigator.Rotation.Yaw - 3000; } } else if ( Instigator.Target != None ) AimRotation = Rotator(Instigator.Target.Location - Instigator.Location); else AimRotation = Instigator.ViewRotation; Instigator.ViewRotation = AimRotation; SetRotation(AimRotation); } else { AimRotation = Instigator.ViewRotation; SetRotation(AimRotation); } Drawoffset = Instigator.Weapon.CalcDrawOffset(); } GetAxes(Instigator.ViewRotation,X,Y,Z); if ( bCenter ) { FireOffset.Z = Default.FireOffset.Z * 1.5; FireOffset.Y = 0; } else { FireOffset.Z = Default.FireOffset.Z; if ( bRight ) FireOffset.Y = Default.FireOffset.Y; else FireOffset.Y = -1 * Default.FireOffset.Y; } SetLocation(Instigator.Location + DrawOffset + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z); } else GetAxes(Rotation,X,Y,Z); CheckBeam(X, DeltaTime); } SG//============================================================================= // starterbolt. //============================================================================= class Lighting extends plighing; var float OldError, NewError, StartError, AimError; //used for bot aiming var rotator AimRotation; var float AnimTime; replication { // Things the server should send to the client. unreliable if( Role==ROLE_Authority ) AimError, NewError, AimRotation; } simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( instigator == None ) return; if ( Instigator.IsA('Bot') && Bot(Instigator).bNovice ) aimerror = 2200 + (3 - instigator.skill) * 300; else aimerror = 1000 + (3 - instigator.skill) * 400; if ( FRand() < 0.5 ) aimerror *= -1; } simulated function Tick(float DeltaTime) { local vector X,Y,Z, AimSpot, DrawOffset, AimStart; local int YawErr; local float dAdjust; local Bot MyBot; AnimTime += DeltaTime; if ( AnimTime > 0.05 ) { AnimTime -= 0.05; SpriteFrame++; if ( SpriteFrame == ArrayCount(SpriteAnim) ) SpriteFrame = 0; Skin = SpriteAnim[SpriteFrame]; } // orient with respect to instigator if ( Instigator != None ) { if ( (Level.NetMode == NM_Client) && (!Instigator.IsA('PlayerPawn') || (PlayerPawn(Instigator).Player == None)) ) { SetRotation(AimRotation); Instigator.ViewRotation = AimRotation; DrawOffset = ((0.01 * class'sin2ut.Plasmarifle'.Default.PlayerViewOffset) >> Rotation); DrawOffset += (Instigator.EyeHeight * vect(0,0,1)); } else { MyBot = Bot(instigator); if ( MyBot != None ) { if ( Instigator.Target == None ) Instigator.Target = Instigator.Enemy; if ( Instigator.Target == Instigator.Enemy ) { if (MyBot.bNovice ) dAdjust = DeltaTime * (4 + instigator.Skill) * 0.075; else dAdjust = DeltaTime * (4 + instigator.Skill) * 0.12; if ( OldError > NewError ) OldError = FMax(OldError - dAdjust, NewError); else OldError = FMin(OldError + dAdjust, NewError); if ( OldError == NewError ) NewError = FRand() - 0.5; if ( StartError > 0 ) StartError -= DeltaTime; else if ( MyBot.bNovice && (Level.TimeSeconds - MyBot.LastPainTime < 0.2) ) StartError = MyBot.LastPainTime; else StartError = 0; AimSpot = 1.25 * Instigator.Target.Velocity + 0.75 * Instigator.Velocity; if ( Abs(AimSpot.Z) < 120 ) AimSpot.Z *= 0.25; else AimSpot.Z *= 0.5; if ( Instigator.Target.Physics == PHYS_Falling ) AimSpot = Instigator.Target.Location - 0.0007 * AimError * OldError * AimSpot; else AimSpot = Instigator.Target.Location - 0.0005 * AimError * OldError * AimSpot; if ( (Instigator.Physics == PHYS_Falling) && (Instigator.Velocity.Z > 0) ) AimSpot = AimSpot - 0.0003 * AimError * OldError * AimSpot; AimStart = Instigator.Location + FireOffset.X * X + FireOffset.Y * Y + (1.2 * FireOffset.Z - 2) * Z; if ( FastTrace(AimSpot - vect(0,0,10), AimStart) ) AimSpot = AimSpot - vect(0,0,10); GetAxes(Instigator.Rotation,X,Y,Z); AimRotation = Rotator(AimSpot - AimStart); AimRotation.Yaw = AimRotation.Yaw + (OldError + StartError) * 0.75 * aimerror; YawErr = (AimRotation.Yaw - (Instigator.Rotation.Yaw & 65535)) & 65535; if ( (YawErr > 3000) && (YawErr < 62535) ) { if ( YawErr < 32768 ) AimRotation.Yaw = Instigator.Rotation.Yaw + 3000; else AimRotation.Yaw = Instigator.Rotation.Yaw - 3000; } } else if ( Instigator.Target != None ) AimRotation = Rotator(Instigator.Target.Location - Instigator.Location); else AimRotation = Instigator.ViewRotation; Instigator.ViewRotation = AimRotation; SetRotation(AimRotation); } else { AimRotation = Instigator.ViewRotation; SetRotation(AimRotation); } Drawoffset = Instigator.Weapon.CalcDrawOffset(); } GetAxes(Instigator.ViewRotation,X,Y,Z); if ( bCenter ) { FireOffset.Z = Default.FireOffset.Z * 1.5; FireOffset.Y = 0; } else { FireOffset.Z = Default.FireOffset.Z; if ( bRight ) FireOffset.Y = Default.FireOffset.Y; else FireOffset.Y = -1 * Default.FireOffset.Y; } SetLocation(Instigator.Location + DrawOffset + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z); } else GetAxes(Rotation,X,Y,Z); runBeam(X, DeltaTime); } ZEr* ka/!.-m E?,?,mzD?,??m? 2Qu//============================================================================= class Plasmarifle expands PulseGun; var float Angle, Count; var sinbasebolt laserbeam; var() sound DownSound; var Weapon PreviousWeapon; simulated event RenderOverlays( canvas Canvas ) { Texture'Ammoled'.NotifyActor = Self; Super.RenderOverlays(Canvas); Texture'Ammoled'.NotifyActor = None; } simulated function Destroyed() { if ( laserBeam != None ) laserBeam.Destroy(); Super.Destroyed(); } simulated function AnimEnd() { if ( (Level.NetMode == NM_Client) && (Mesh != PickupViewMesh) ) { if ( AnimSequence == 'SpinDown' ) AnimSequence = 'Idle'; PlayIdleAnim(); } } // set which hand is holding weapon function setHand(float Hand) { if ( Hand == 2 ) { FireOffset.Y = 0; bHideWeapon = true; if ( laserBeam != None ) laserBeam.bCenter = true; return; } else bHideWeapon = false; PlayerViewOffset = Default.PlayerViewOffset * 100; if ( Hand == 1 ) { if ( laserBeam != None ) { laserBeam.bCenter = false; laserBeam.bRight = false; } FireOffset.Y = Default.FireOffset.Y; Mesh = mesh(DynamicLoadObject("Botpack.PulseGunL", class'Mesh')); } else { if ( laserBeam != None ) { laserBeam.bCenter = false; laserBeam.bRight = true; } FireOffset.Y = -1 * Default.FireOffset.Y; Mesh = mesh'PulseGunR'; } } // return delta to combat style function float SuggestAttackStyle() { local float EnemyDist; EnemyDist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); if ( EnemyDist < 1000 ) return 0.5; else return 0.1; } function float SuggestDefenseStyle() { return -2.0; } function float RateSelf( out int bUseAltMode ) { local float EnemyDist; if ( AmmoType.AmmoAmount <=0 ) return -2; if ( (Pawn(Owner).Enemy == None) || (Owner.IsA('Bot') && Bot(Owner).bQuickFire) ) { bUseAltMode = 0; return AIRating; } if ( Pawn(Owner).Enemy!=none ) { EnemyDist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); if ( EnemyDist > 500 ) { bUseAltMode = 0; } else if ( EnemyDist <= 500 && EnemyDist < 1100 ) { bUseAltMode = 1; } else if ( EnemyDist > 1100 ) { return -2; } if ( Pawn(Owner).Enemy.IsA('StationaryPawn') ) { bUseAltMode = 0; return (AIRating + 0.4); } else bUseAltMode = int( 500 > EnemyDist ); } AIRating *= FMin(Pawn(Owner).DamageScaling, 1.5); return AIRating; } simulated function PlayFiring() { FlashCount++; AmbientSound = FireSound; SoundVolume = Pawn(Owner).SoundDampening*255; PlayAnim( 'shootLOOP', 0.5 + 0.3 * FireAdjust, 0.0); bWarnTarget = (FRand() < 0.2); } simulated function PlayAltFiring() { AmbientSound = AltFireSound; if ( (AnimSequence == 'boltLoop') || (AnimSequence == 'boltStart') ) PlayAnim( 'boltloop'); else PlayAnim( 'boltstart' ); } function AltFire( float Value ) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.UseAmmo(1)) { GotoState('AltFiring'); bCanClientFire = true; bPointing=True; Pawn(Owner).PlayRecoil(FiringSpeed); ClientAltFire(value); if ( laserbeam == None ) { laserbeam = sinbasebolt(ProjectileFire(class'sinbasebolt', AltProjectileSpeed, bAltWarnTarget)); if ( FireOffset.Y == 0 ) laserbeam.bCenter = true; else if ( Mesh == mesh'PulseGunR' ) laserbeam.bRight = false; } } } simulated event RenderTexture(ScriptedTexture Tex) { local Color C; local string Temp; Temp = String(AmmoType.AmmoAmount); while(Len(Temp) < 3) Temp = "0"$Temp; Tex.DrawTile( 30, 100, (Min(AmmoType.AmmoAmount,AmmoType.Default.AmmoAmount)*196)/AmmoType.Default.AmmoAmount, 10, 0, 0, 1, 1, Texture'AmmoCountBar', False ); if(AmmoType.AmmoAmount < 10) { C.R = 255; C.G = 0; C.B = 0; } else { C.R = 0; C.G = 0; C.B = 255; } Tex.DrawColoredText( 56, 14, Temp, Font'LEDFont', C ); } /////////////////////////////////////////////////////// state NormalFire { ignores AnimEnd; function Projectile ProjectileFire(class ProjClass, float ProjSpeed, bool bWarn) { local Vector Start, X,Y,Z; if (AmmoType.Ammoamount <10) { ReturntopreviousWeapon(); //Goto last weapon used } Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation,X,Y,Z); Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = pawn(owner).AdjustAim(ProjSpeed, Start, AimError, True, bWarn); Start = Start - Sin(Angle)*Y*4 + (Cos(Angle)*4 - 10.78)*Z; Angle += 1.8; return Spawn(ProjClass,,, Start,AdjustedAim); } function Tick( float DeltaTime ) { if (Owner==None) GotoState('Pickup'); if (AmmoType.Ammoamount <=10) { ReturntopreviousWeapon(); //Goto last weapon used } } function BeginState() { Super.BeginState(); Angle = 0; AmbientGlow = 200; } function EndState() { PlaySpinDown(); AmbientSound = None; AmbientGlow = 0; OldFlashCount = FlashCount; Super.EndState(); } Begin: if (AmmoType.Ammoamount <=10) { ReturntopreviousWeapon(); //Goto last weapon used } Sleep(0.95); Finish(); } simulated function PlaySpinDown() { if ( (Mesh != PickupViewMesh) && (Owner != None) ) { PlayAnim('Spindown', 1.0, 0.0); Owner.PlayOwnedSound(DownSound, SLOT_None,1.0*Pawn(Owner).SoundDampening); } } state ClientFiring { simulated function Tick( float DeltaTime ) { if ( (Pawn(Owner) != None) && (Pawn(Owner).bFire != 0) ) { if (AmmoType.Ammoamount <=10) { ReturntopreviousWeapon(); //Goto last weapon used } AmbientSound = FireSound; } else AmbientSound = None; } simulated function AnimEnd() { if ( (AmmoType != None) && (AmmoType.AmmoAmount <= 0) ) { PlaySpinDown(); GotoState(''); } else if ( !bCanClientFire ) GotoState(''); else if ( Pawn(Owner) == None ) { PlaySpinDown(); GotoState(''); } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else if ( Pawn(Owner).bAltFire != 0 ) Global.ClientAltFire(0); else { PlaySpinDown(); GotoState(''); } } } /////////////////////////////////////////////////////////////// state ClientAltFiring { simulated function AnimEnd() { if ( AmmoType.AmmoAmount <= 0 ) { PlayIdleAnim(); GotoState(''); } else if ( !bCanClientFire ) GotoState(''); else if ( Pawn(Owner) == None ) { PlayIdleAnim(); GotoState(''); } else if ( Pawn(Owner).bAltFire != 0 ) LoopAnim('boltLoop'); else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayIdleAnim(); GotoState(''); } } } state AltFiring { ignores AnimEnd; function Tick(float DeltaTime) { local Pawn P; P = Pawn(Owner); if ( P == None ) { GotoState('Pickup'); return; } if ( (P.bAltFire == 0) || (P.IsA('Bot') && ((P.Enemy == None) || (Level.TimeSeconds - Bot(P).LastSeenTime > 5))) ) { P.bAltFire = 0; Finish(); return; } Count += Deltatime; if ( Count > 0.24 ) { if ( Owner.IsA('PlayerPawn') ) PlayerPawn(Owner).ClientInstantFlash( InstFlash,InstFog); if ( Affector != None ) Affector.FireEffect(); Count -= 0.24; if ( !AmmoType.UseAmmo(1) ) Finish(); } } function EndState() { AmbientGlow = 0; AmbientSound = None; if ( laserBeam != None ) { laserBeam.Destroy(); laserBeam = None; } Super.EndState(); } Begin: AmbientGlow = 200; FinishAnim(); LoopAnim( 'boltloop'); } state Idle { Begin: bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo if ( Pawn(Owner).bFire!=0 ) Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) AltFire(0.0); Disable('AnimEnd'); PlayIdleAnim(); } /////////////////////////////////////////////////////////// simulated function PlayIdleAnim() { if ( Mesh == PickupViewMesh ) return; if ( (AnimSequence == 'boltLoop') || (AnimSequence == 'boltStart') ) PlayAnim('boltEnd'); else if ( AnimSequence != 'SpinDown' ) TweenAnim('Idle', 0.1); } simulated function TweenDown() { if ( IsAnimating() && (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * 0.4 ); else TweenAnim('Down', 0.26); } function Fire( float Value ) { if (AmmoType.Ammoamount <=10) { ReturntopreviousWeapon(); //Goto last weapon used } if ( (AmmoType == None) && (AmmoName != None) ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.Ammoamount >=10) { if ( AmmoType.UseAmmo(10) ) { GotoState('NormalFire'); bPointing=True; bCanClientFire = true; ClientFire(Value); ProjectileFire(ProjectileClass, ProjectileSpeed, bWarnTarget); } } else { ReturntopreviousWeapon(); //Goto last weapon used GotoState('NormalFire'); } } function ReturnToPreviousWeapon() { if ( (PreviousWeapon == None) || ((PreviousWeapon.AmmoType != None) && (PreviousWeapon.AmmoType.AmmoAmount <=0)) ) Pawn(Owner).SwitchToBestWeapon(); else { Pawn(Owner).PendingWeapon = PreviousWeapon; PutDown(); } } function RaiseUp(Weapon OldWeapon) { if ( OldWeapon == self ) PreviousWeapon = None; else PreviousWeapon = OldWeapon; Super.BringUp(); } simulated function PostRender( canvas Canvas ) { local ChallengeHUD MyHUD; local float Scale; local sin2utdialogclientwindow sm; Super.PostRender(Canvas); bOwnsCrossHair = bLockedOn; if ( bOwnsCrossHair ) { // if locked on, draw special crosshair Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 4 * Scale, 0.5 * Canvas.ClipY - 4 * Scale ); // Canvas.SetPos(0.5 * Canvas.ClipX - 8, 0.5 * Canvas.ClipY - 8 ); Canvas.Style = ERenderStyle.STY_Translucent; //If (sm.newx.bchecked == true) Canvas.DrawIcon(Texture'SinHUD.Ch1_On', Scale); Canvas.DrawIcon(Texture'SinHUD.Ch1_On', Scale); Canvas.Style = ERenderStyle.STY_Translucent; } } e 7Sin2UT Configuration D-' nuX \CC ?, ?, 3vD//============================================================================= // plighing. //============================================================================= class PLighing expands Projectile; var() texture SpriteAnim[5]; var int SpriteFrame; var plighing laserBeam; var plasmaCap WallEffect; var int Position; var vector FireOffset; var float BeamSize; var bool bRight, bCenter; var float AccumulatedDamage, LastHitTime; var Actor DamagedActor; replication { // Things the server should send to the client. unreliable if( Role==ROLE_Authority ) bRight, bCenter; } simulated function Destroyed() { Super.Destroyed(); if ( laserBeam != None ) laserBeam.Destroy(); if ( WallEffect != None ) WallEffect.Destroy(); } simulated function runBeam(vector X, float DeltaTime) { local actor HitActor; local vector HitLocation, HitNormal; // check to see if hits something, else spawn or orient child HitActor = Trace(HitLocation, HitNormal, Location + BeamSize * X, Location, true); if ( (HitActor != None) && (HitActor != Instigator) && (HitActor.bProjTarget || (HitActor == Level) || (HitActor.bBlockActors && HitActor.bBlockPlayers)) && ((Pawn(HitActor) == None) || Pawn(HitActor).AdjustHitLocation(HitLocation, Velocity)) ) { if ( Level.Netmode != NM_Client ) { if ( DamagedActor == None ) { AccumulatedDamage = FMin(0.5 * (Level.TimeSeconds - LastHitTime), 0.1); HitActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } else if ( DamagedActor != HitActor ) { DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } LastHitTime = Level.TimeSeconds; DamagedActor = HitActor; AccumulatedDamage += DeltaTime; if ( AccumulatedDamage > 0.22 ) { if ( DamagedActor.IsA('Carcass') && (FRand() < 0.09) ) AccumulatedDamage = 35/damage; DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } } if ( HitActor.bIsPawn && Pawn(HitActor).bIsPlayer ) { if ( WallEffect != None ) WallEffect.Destroy(); } else if ( (WallEffect == None) || WallEffect.bDeleteMe ) WallEffect = Spawn(class'PlasmaHit',,, HitLocation - 5 * X); else if ( !WallEffect.IsA('PlasmaHit') ) { WallEffect.Destroy(); WallEffect = Spawn(class'PlasmaHit',,, HitLocation - 5 * X); } else WallEffect.SetLocation(HitLocation - 5 * X); if ( (WallEffect != None) && (Level.NetMode != NM_DedicatedServer) ) Spawn(ExplosionDecal,,,HitLocation,rotator(HitNormal)); if ( laserBeam != None ) { AccumulatedDamage += laserBeam.AccumulatedDamage; laserBeam.Destroy(); laserBeam = None; } return; } else if ( (Level.Netmode != NM_Client) && (DamagedActor != None) ) { DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator, DamagedActor.Location - X * 1.2 * DamagedActor.CollisionRadius, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; DamagedActor = None; } if ( Position >= 9 ) { if ( (WallEffect == None) || WallEffect.bDeleteMe ) WallEffect = Spawn(class'PlasmaCap',,, Location + (BeamSize - 4) * X); else if ( WallEffect.IsA('PlasmaHit') ) { WallEffect.Destroy(); WallEffect = Spawn(class'PlasmaCap',,, Location + (BeamSize - 4) * X); } else WallEffect.SetLocation(Location + (BeamSize - 4) * X); } else { if ( WallEffect != None ) { WallEffect.Destroy(); WallEffect = None; } if ( laserBeam == None ) { laserBeam = Spawn(class'sin2ut.plighing',,, Location + BeamSize * X); laserBeam.Position = Position + 1; } else laserBeam.sinBeam(self, X, DeltaTime); } } simulated function sinBeam(plighing Parentsin, vector Dir, float DeltaTime) { local actor HitActor; local vector HitLocation, HitNormal; SpriteFrame = Parentsin.SpriteFrame; Skin = SpriteAnim[SpriteFrame]; SetLocation(Parentsin.Location + BeamSize * Dir); SetRotation(Parentsin.Rotation); runBeam(Dir, DeltaTime); } $S|//============================================================================= //SinBaseBolt. //============================================================================= class SinBaseBolt extends pbolt; var float OldError, NewError, StartError, AimError; //used for bot aiming var rotator AimRotation; var float AnimTime; var subsinbolt lBeam; replication { // Things the server should send to the client. unreliable if( Role==ROLE_Authority ) AimError, NewError, AimRotation; } simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( instigator == None ) return; if ( Instigator.IsA('Bot') && Bot(Instigator).bNovice ) aimerror = 2200 + (3 - instigator.skill) * 300; else aimerror = 1000 + (3 - instigator.skill) * 400; if ( FRand() < 0.5 ) aimerror *= -1; } simulated function Tick(float DeltaTime) { local vector X,Y,Z, AimSpot, DrawOffset, AimStart; local int YawErr; local float dAdjust; local Bot MyBot; // orient with respect to instigator if ( Instigator != None ) { if ( (Level.NetMode == NM_Client) && (!Instigator.IsA('PlayerPawn') || (PlayerPawn(Instigator).Player == None)) ) { SetRotation(AimRotation); Instigator.ViewRotation = AimRotation; DrawOffset = ((0.01 * class'PulseGun'.Default.PlayerViewOffset) >> Rotation); DrawOffset += (Instigator.EyeHeight * vect(0,0,1)); } else { MyBot = Bot(instigator); if ( MyBot != None ) { if ( Instigator.Target == None ) Instigator.Target = Instigator.Enemy; if ( Instigator.Target == Instigator.Enemy ) { if (MyBot.bNovice ) dAdjust = DeltaTime * (4 + instigator.Skill) * 0.075; else dAdjust = DeltaTime * (4 + instigator.Skill) * 0.12; if ( OldError > NewError ) OldError = FMax(OldError - dAdjust, NewError); else OldError = FMin(OldError + dAdjust, NewError); if ( OldError == NewError ) NewError = FRand() - 0.5; if ( StartError > 0 ) StartError -= DeltaTime; else if ( MyBot.bNovice && (Level.TimeSeconds - MyBot.LastPainTime < 0.2) ) StartError = MyBot.LastPainTime; else StartError = 0; AimSpot = 1.25 * Instigator.Target.Velocity + 0.75 * Instigator.Velocity; if ( Abs(AimSpot.Z) < 120 ) AimSpot.Z *= 0.25; else AimSpot.Z *= 0.5; if ( Instigator.Target.Physics == PHYS_Falling ) AimSpot = Instigator.Target.Location - 0.0007 * AimError * OldError * AimSpot; else AimSpot = Instigator.Target.Location - 0.0005 * AimError * OldError * AimSpot; if ( (Instigator.Physics == PHYS_Falling) && (Instigator.Velocity.Z > 0) ) AimSpot = AimSpot - 0.0003 * AimError * OldError * AimSpot; AimStart = Instigator.Location + FireOffset.X * X + FireOffset.Y * Y + (1.2 * FireOffset.Z - 2) * Z; if ( FastTrace(AimSpot - vect(0,0,10), AimStart) ) AimSpot = AimSpot - vect(0,0,10); GetAxes(Instigator.Rotation,X,Y,Z); AimRotation = Rotator(AimSpot - AimStart); AimRotation.Yaw = AimRotation.Yaw + (OldError + StartError) * 0.75 * aimerror; YawErr = (AimRotation.Yaw - (Instigator.Rotation.Yaw & 65535)) & 65535; if ( (YawErr > 3000) && (YawErr < 62535) ) { if ( YawErr < 32768 ) AimRotation.Yaw = Instigator.Rotation.Yaw + 3000; else AimRotation.Yaw = Instigator.Rotation.Yaw - 3000; } } else if ( Instigator.Target != None ) AimRotation = Rotator(Instigator.Target.Location - Instigator.Location); else AimRotation = Instigator.ViewRotation; Instigator.ViewRotation = AimRotation; SetRotation(AimRotation); } else { AimRotation = Instigator.ViewRotation; SetRotation(AimRotation); } Drawoffset = Instigator.Weapon.CalcDrawOffset(); } GetAxes(Instigator.ViewRotation,X,Y,Z); if ( bCenter ) { FireOffset.Z = Default.FireOffset.Z * 1.5; FireOffset.Y = 0; } else { FireOffset.Z = Default.FireOffset.Z; if ( bRight ) FireOffset.Y = Default.FireOffset.Y; else FireOffset.Y = -1 * Default.FireOffset.Y; } SetLocation(Instigator.Location + DrawOffset + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z); } else GetAxes(Rotation,X,Y,Z); CheckBeam(X, DeltaTime); } simulated function Destroyed() { Super.Destroyed(); if (lBeam!=None) lBeam.Destroy(); } simulated function CheckBeam(vector X, float DeltaTime) { local actor HitActor; local vector HitLocation, HitNormal; HitActor = Trace(HitLocation, HitNormal, Location + BeamSize * X, Location, true); if ( (HitActor != None) && (HitActor != Instigator) && (HitActor.bProjTarget || (HitActor == Level) || (HitActor.bBlockActors && HitActor.bBlockPlayers)) && ((Pawn(HitActor) == None) || Pawn(HitActor).AdjustHitLocation(HitLocation, Velocity)) ) { if ( Level.Netmode != NM_Client ) { if ( DamagedActor == None ) { AccumulatedDamage = FMin(0.5 * (Level.TimeSeconds - LastHitTime), 0.1); HitActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } else if ( DamagedActor != HitActor ) { DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } LastHitTime = Level.TimeSeconds; DamagedActor = HitActor; AccumulatedDamage += DeltaTime; if ( AccumulatedDamage > 0.22 ) { if ( DamagedActor.IsA('Carcass') && (FRand() < 0.09) ) AccumulatedDamage = 35/damage; DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } } /* if ( HitActor.bIsPawn && Pawn(HitActor).bIsPlayer ) { if ( WallEffect != None ) WallEffect.Destroy(); } else if ( (WallEffect == None) || WallEffect.bDeleteMe ) WallEffect = Spawn(class'PlasmaHit',,, HitLocation - 5 * X); else if ( !WallEffect.IsA('PlasmaHit') ) { WallEffect.Destroy(); WallEffect = Spawn(class'PlasmaHit',,, HitLocation - 5 * X); } else WallEffect.SetLocation(HitLocation - 5 * X);*/ // if ( (WallEffect != None) && if (Level.NetMode != NM_DedicatedServer) Spawn(ExplosionDecal,,,HitLocation,rotator(HitNormal)); if ( lBeam != None ) { AccumulatedDamage += lBeam.AccumulatedDamage; lBeam.Destroy(); lBeam = None; } return; } else if ( (Level.Netmode != NM_Client) && (DamagedActor != None) ) { DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator, DamagedActor.Location - X * 1.2 * DamagedActor.CollisionRadius, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; DamagedActor = None; } if ( Position < 7 ) { if ( lBeam == None ) { lBeam = Spawn(class'subsinbolt',,, Location + BeamSize * X); lBeam.Position = Position + 1; } else lBeam.UpdateBeam(self, X, DeltaTime); } } simulated function UpdateBeam(PBolt ParentBolt, vector Dir, float DeltaTime) { local actor HitActor; local vector HitLocation, HitNormal; SetLocation(ParentBolt.Location + BeamSize * Dir); SetRotation(ParentBolt.Rotation); CheckBeam(Dir, DeltaTime); } ]//============================================================================= // TestMagnum. //============================================================================= class TestMagnum expands Magnum; var() int hitdamage; var float AltAccuracy; var Magnum SlaveMagnum; // The left (second) Magnum is a slave to the right. var bool bIsSlave; var bool bSetup; // used for setting display properties var bool bFirstFire, bBringingUp; var() localized string DoubleName; var() texture MuzzleFlashVariations[5]; var int DoubleSwitchPriority; replication { reliable if ( bNetOwner && (Role == ROLE_Authority) ) SlaveMagnum, bIsSlave, bBringingUp; } function Destroyed() { Super.Destroyed(); if ( SlaveMagnum != None ) SlaveMagnum.Destroy(); } simulated function AnimEnd() { if ( (Level.NetMode == NM_Client) && bBringingUp && (Mesh != PickupViewMesh) ) { bBringingUp = false; PlaySelect(); } else Super.AnimEnd(); } function bool WeaponSet(Pawn Other) { if ( bIsSlave ) return false; else Super.WeaponSet(Other); } function SetSwitchPriority(pawn Other) { local int i; local name temp, carried; if ( PlayerPawn(Other) != None ) { Super.SetSwitchPriority(Other); // also set double switch priority for ( i=0; i<20; i++) if ( PlayerPawn(Other).WeaponPriority[i] == 'doubleMagnum' ) { DoubleSwitchPriority = i; return; } } } // Return the switch priority of the weapon (normally AutoSwitchPriority, but may be // modified by environment (or by other factors for bots) function float SwitchPriority() { local float temp; local int bTemp; if ( bIsSlave ) return -10; if ( !Owner.IsA('PlayerPawn') ) return RateSelf(bTemp); else if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) { if ( Pawn(Owner).Weapon == self ) return -0.5; else return -1; } else if ( SlaveMagnum != None ) return DoubleSwitchPriority; else return AutoSwitchPriority; } function DropFrom(vector StartLocation) { if ( !SetLocation(StartLocation) ) return; if ( SlaveMagnum != None ) SlaveMagnum.Destroy(); AIRating = Default.AIRating; SlaveMagnum = None; Super.DropFrom(StartLocation); } function SetDisplayProperties(ERenderStyle NewStyle, texture NewTexture, bool bLighting, bool bEnviroMap ) { if ( !bSetup ) { bSetup = true; if ( SlaveMagnum != None ) SlaveMagnum.SetDisplayProperties(NewStyle, NewTexture, bLighting, bEnviromap); bSetup = false; } Super.SetDisplayProperties(NewStyle, NewTexture, bLighting, bEnviromap); } function SetDefaultDisplayProperties() { if ( !bSetup ) { bSetup = true; if ( SlaveMagnum != None ) SlaveMagnum.SetDefaultDisplayProperties(); bSetup = false; } Super.SetDefaultDisplayProperties(); } event float BotDesireability(Pawn Bot) { local Magnum AlreadyHas; local float desire; desire = MaxDesireability + Bot.AdjustDesireFor(self); AlreadyHas = Magnum(Bot.FindInventoryType(class)); if ( AlreadyHas != None ) { if ( (!bHeldItem || bTossedOut) && bWeaponStay ) return 0; if ( AlreadyHas.SlaveMagnum != None ) { if ( (RespawnTime < 10) && ( bHidden || (AlreadyHas.AmmoType == None) || (AlreadyHas.AmmoType.AmmoAmount < AlreadyHas.AmmoType.MaxAmmo)) ) return 0; if ( AlreadyHas.AmmoType == None ) return 0.25 * desire; if ( AlreadyHas.AmmoType.AmmoAmount > 0 ) return FMax( 0.25 * desire, AlreadyHas.AmmoType.MaxDesireability * FMin(1, 0.15 * AlreadyHas.AmmoType.MaxAmmo/AlreadyHas.AmmoType.AmmoAmount) ); } } if ( (Bot.Weapon == None) || (Bot.Weapon.AIRating <= 0.4) ) return 2*desire; return desire; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local UT_Shellcase s; local vector realLoc; realLoc = Owner.Location + CalcDrawOffset(); s = Spawn(class'UT_ShellCase',, '', realLoc + 20 * X + FireOffset.Y * Y + Z); if ( s != None ) s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160); if (Other == Level) { if ( bIsSlave || (SlaveMagnum != None) ) Spawn(class'UT_LightWallHitEffect',,, HitLocation+HitNormal, Rotator(HitNormal)); else Spawn(class'UT_WallHit',,, HitLocation+HitNormal, Rotator(HitNormal)); } else if ((Other != self) && (Other != Owner) && (Other != None) ) { if ( FRand() < 0.2 ) X *= 5; if ( Other.bIsPawn ) Other.PlaySound(Sound 'ChunkHit',, 4.0,,100); if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z > 0.65 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) ) Other.TakeDamage(24, Pawn(Owner), HitLocation, 3000 * X, AltDamageType); if ( Other.bIsPawn && (HitLocation.Z - Other.Location.Z < 0.48 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.IsA('Bot') && !Bot(Instigator).bNovice)) ) Other.TakeDamage(8, Pawn(Owner), HitLocation, 3000 * X, AltDamageType); else Other.TakeDamage(12, Pawn(Owner), HitLocation, 3000.0*X, MyDamageType); if ( !Other.bIsPawn && !Other.IsA('Carcass') ) spawn(class'UT_SpriteSmokePuff',,,HitLocation+HitNormal*9); else Other.PlaySound(Sound 'ChunkHit',, 4.0,,100); } } function bool HandlePickupQuery( inventory Item ) { local Pawn P; local Inventory Copy; if ( (Item.class == class) && (SlaveMagnum == None) ) { P = Pawn(Owner); // spawn a double Copy = Spawn(class, P); Copy.BecomeItem(); ItemName = DoubleName; SlaveMagnum = Magnum(Copy); SetTwoHands(); AIRating = 0.4; SlaveMagnum.SetUpSlave( Pawn(Owner).Weapon == self ); SlaveMagnum.SetDisplayProperties(Style, Texture, bUnlit, bMeshEnviromap); SetTwoHands(); P.ReceiveLocalizedMessage( class'PickupMessagePlus', 0, None, None, Self.Class ); Item.PlaySound(Item.PickupSound); if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Item, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Item, Pawn(Owner)); Item.SetRespawn(); return true; } return Super.HandlePickupQuery(Item); } function SetUpSlave(bool bBringUp) { bIsSlave = true; ItemName = DoubleName; GiveAmmo(Pawn(Owner)); AmbientGlow = 0; if ( bBringUp ) BringUp(); else GotoState('Idle2'); } function SetTwoHands() { if ( SlaveMagnum == None ) return; if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).Handedness == 2) ) { SetHand(2); return; } if ( Mesh == mesh'AutoML' ) SetHand(1); else SetHand(-1); } function setHand(float Hand) { local rotator newRot; if ( Hand == 2 ) { bHideWeapon = true; Super.SetHand(Hand); return; } if ( SlaveMagnum != None ) { if ( Hand == 0 ) Hand = -1; SlaveMagnum.SetHand(-1 * Hand); } bHideWeapon = false; Super.SetHand(Hand); if ( Hand == 1 ) Mesh = mesh'AutoML'; else Mesh = mesh'AutoMR'; } function BringUp() { if (SlaveMagnum != none ) { SetTwoHands(); SlaveMagnum.BringUp(); } bBringingUp = true; Super.BringUp(); } function TraceFire( float Accuracy ) { local vector RealOffset; RealOffset = FireOffset; FireOffset *= 0.35; if ( (SlaveMagnum != None) || bIsSlave ) Accuracy = FClamp(3*Accuracy,0.75,3); else if ( Owner.IsA('Bot') && !Bot(Owner).bNovice ) Accuracy = FMax(Accuracy, 0.45); Super.TraceFire(Accuracy); FireOffset = RealOffset; } function Fire(float Value) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if ( AmmoType.UseAmmo(1) ) { GotoState('NormalFire'); bCanClientFire = true; bPointing=True; ClientFire(value); if ( SlaveMagnum != None ) Pawn(Owner).PlayRecoil(2 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.2); } } simulated function PlayFiring() { PlayOwnedSound(FireSound, SLOT_None,2.0*Pawn(Owner).SoundDampening); bMuzzleFlash++; PlayAnim('Shoot',0.5 + 0.21 * FireAdjust, 0.02); //0.31, not 0.21 } simulated function PlayAltFiring() { PlayAnim('T1', 1.1, 0.05); bFirstFire = true; } simulated function PlayRepeatFiring() { if ( Affector != None ) Affector.FireEffect(); if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.2, vect(325, 225, 95)); PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); } bMuzzleFlash++; PlayOwnedSound(FireSound, SLOT_None,2.0*Pawn(Owner).SoundDampening); PlayAnim('Shot2', 0.7 + 0.3 * FireAdjust, 0.05); } function AltFire( float Value ) { bPointing=True; bCanClientFire = true; AltAccuracy = 0.4; if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.AmmoAmount>0) { if ( SlaveMagnum != None ) Pawn(Owner).PlayRecoil(3 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); ClientAltFire(value); GotoState('AltFiring'); } } state Active { function bool PutDown() { if ( bWeaponUp || (AnimFrame < 0.75) ) GotoState('DownWeapon'); else bChangeWeapon = true; return True; } function BeginState() { bChangeWeapon = false; } function EndState() { Super.EndState(); bBringingUp = false; } Begin: FinishAnim(); if ( bChangeWeapon ) GotoState('DownWeapon'); bWeaponUp = True; bCanClientFire = true; if ( !bIsSlave && (Level.Netmode != NM_Standalone) && (Owner != None) && Owner.IsA('TournamentPlayer') && (PlayerPawn(Owner).Player != None) && !PlayerPawn(Owner).Player.IsA('ViewPort') ) { if ( Pawn(Owner).bFire != 0 ) TournamentPlayer(Owner).SendFire(self); else if ( Pawn(Owner).bAltFire != 0 ) TournamentPlayer(Owner).SendAltFire(self); else if ( !bChangeWeapon ) TournamentPlayer(Owner).UpdateRealWeapon(self); } Finish(); } State DownWeapon { ignores Fire, AltFire, Animend; function BeginState() { Super.BeginState(); if ( SlaveMagnum != none ) SlaveMagnum.GoToState('DownWeapon'); } } //////////////////////////////////////////////////////// state NormalFire { ignores Fire, AltFire, AnimEnd; function Timer() { if ( SlaveMagnum != none ) SlaveMagnum.Fire(0); } function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: FlashCount++; if ( SlaveMagnum != none ) SetTimer(0.20, false); FinishAnim(); if ( bIsSlave ) GotoState('Idle'); else Finish(); } state ClientFiring { simulated function bool ClientAltFire(float Value) { if ( bIsSlave ) Global.ClientAltFire(Value); return false; } simulated function Timer() { if ( (SlaveMagnum != none) && SlaveMagnum.ClientFire(0) ) return; SetTimer(0.5, false); } simulated function AnimEnd() { if ( (Pawn(Owner) == None) || (Ammotype.AmmoAmount <= 0) ) { PlayIdleAnim(); GotoState(''); } else if ( !bIsSlave && !bCanClientFire ) GotoState(''); else if ( bFirstFire || (Pawn(Owner).bAltFire != 0) ) { PlayRepeatFiring(); bFirstFire = false; } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayIdleAnim(); GotoState(''); } } simulated function BeginState() { Super.BeginState(); if ( SlaveMagnum != None ) SetTimer(0.2, false); else SetTimer(0.5, false); } simulated function EndState() { Super.EndState(); if ( SlaveMagnum != None ) SlaveMagnum.GotoState(''); } } state ClientAltFiring { simulated function bool ClientFire(float Value) { if ( bIsSlave ) Global.ClientFire(Value); return false; } simulated function Timer() { if ( (SlaveMagnum != none) && SlaveMagnum.ClientAltFire(0) ) return; SetTimer(0.5, false); } simulated function AnimEnd() { if ( Pawn(Owner) == None ) GotoState(''); else if ( Ammotype.AmmoAmount <= 0 ) { PlayAnim('T2', 0.9, 0.05); GotoState(''); } else if ( !bIsSlave && !bCanClientFire ) GotoState(''); else if ( bFirstFire || (Pawn(Owner).bAltFire != 0) ) { PlayRepeatFiring(); bFirstFire = false; } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayAnim('T2', 0.9, 0.05); GotoState(''); } } simulated function BeginState() { Super.BeginState(); if ( SlaveMagnum != None ) SetTimer(0.2, false); else SetTimer(0.5, false); } simulated function EndState() { Super.EndState(); if ( SlaveMagnum != None ) SlaveMagnum.GotoState(''); } } state AltFiring { ignores Fire, AltFire, AnimEnd; function Timer() { if ( SlaveMagnum != none ) SlaveMagnum.AltFire(0); } function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: if ( SlaveMagnum != none ) SetTimer(0.20, false); FinishAnim(); Repeater: if (AmmoType.UseAmmo(1)) { FlashCount++; if ( SlaveMagnum != None ) Pawn(Owner).PlayRecoil(3 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); TraceFire(AltAccuracy); PlayRepeatFiring(); FinishAnim(); } if ( AltAccuracy < 3 ) AltAccuracy += 0.5; if ( bIsSlave ) { if ( (Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0 ) Goto('Repeater'); } else if ( bChangeWeapon ) GotoState('DownWeapon'); else if ( (Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0 ) { if ( PlayerPawn(Owner) == None ) Pawn(Owner).bAltFire = int( FRand() < AltReFireRate ); Goto('Repeater'); } PlayAnim('T2', 0.9, 0.05); FinishAnim(); Finish(); } simulated event RenderOverlays(canvas Canvas) { local PlayerPawn PlayerOwner; local int realhand; if ( (bMuzzleFlash > 0) && !Level.bDropDetail ) MFTexture = MuzzleFlashVariations[Rand(5)]; PlayerOwner = PlayerPawn(Owner); if ( PlayerOwner != None ) { if ( PlayerOwner.DesiredFOV != PlayerOwner.DefaultFOV ) return; realhand = PlayerOwner.Handedness; if ( (Level.NetMode == NM_Client) && (realHand == 2) ) { bHideWeapon = true; return; } if ( !bHideWeapon ) { if ( Mesh == mesh'AutoML' ) PlayerOwner.Handedness = 1; else if ( bIsSlave || (SlaveMagnum != None) ) PlayerOwner.Handedness = -1; } } if ( (PlayerOwner == None) || (PlayerOwner.Handedness == 0) ) { if ( AnimSequence == 'Shot2' ) { FlashO = -2 * Default.FlashO; FlashY = Default.FlashY * 2.5; } else { FlashO = 1.9 * Default.FlashO; FlashY = Default.FlashY; } } else if ( AnimSequence == 'Shot2' ) { FlashO = Default.FlashO * 0.3; FlashY = Default.FlashY * 2.5; } else { FlashO = Default.FlashO; FlashY = Default.FlashY; } if ( !bHideWeapon && ( (SlaveMagnum != None) || bIsSlave ) ) { if ( PlayerOwner == None ) bMuzzleFlash = 0; Super.RenderOverlays(Canvas); if ( SlaveMagnum != None ) { if ( SlaveMagnum.bBringingUp ) { SlaveMagnum.bBringingUp = false; SlaveMagnum.PlaySelect(); } SlaveMagnum.RenderOverlays(Canvas); } } else Super.RenderOverlays(Canvas); if ( PlayerOwner != None ) PlayerOwner.Handedness = realhand; } simulated function PlayIdleAnim() { if ( Mesh == PickupViewMesh ) return; if ( (FRand()>0.96) && (AnimSequence != 'Twiddle') ) PlayAnim('Twiddle',0.6,0.3); else LoopAnim('Sway',0.2, 0.3); } state Idle { function AnimEnd() { PlayIdleAnim(); } function Timer() { Checkforlock(); } function bool PutDown() { GotoState('DownWeapon'); return True; } Begin: SetTimer(0.02,true); bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo LoopAnim('Sway',0.2, 0.1); if ( Pawn(Owner).bFire!=0 ) Global.Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) Global.AltFire(0.0); } State ClientActive { simulated function AnimEnd() { bBringingUp = false; if ( !bIsSlave ) { Super.AnimEnd(); if ( (SlaveMagnum != None) && !IsInState('ClientActive') ) { if ( (GetStateName() == 'None') || (GetStateName() == 'Magnum') ) SlaveMagnum.GotoState(''); else SlaveMagnum.GotoState(GetStateName()); } } } simulated function BeginState() { Super.BeginState(); bBringingUp = false; if ( SlaveMagnum != None ) SlaveMagnum.GotoState('ClientActive'); } } State ClientDown { simulated function AnimEnd() { if ( !bIsSlave ) Super.AnimEnd(); } simulated function EndState() { if ( SlaveMagnum != None ) SlaveMagnum.GotoState(''); } } function CheckforLock() { local actor Other; local vector HitLocation, HitNormal, X, Y, Z, StartTrace, EndTrace; StartTrace = Owner.Location; StartTrace.Z += Pawn(Owner).BaseEyeHeight; EndTrace = StartTrace + vector(Pawn(Owner).ViewRotation) * 10000.0; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if ( (Pawn(Other) != None)) bLockedOn=true; else bLockedon=false; } simulated function PostRender( canvas Canvas ) { local ChallengeHUD MyHUD; local float Scale; Super.PostRender(Canvas); bOwnsCrossHair = bLockedOn; if ( bOwnsCrossHair ) { // if locked on, draw special crosshair Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 4 * Scale, 0.5 * Canvas.ClipY - 4 * Scale ); // Canvas.SetPos(0.5 * Canvas.ClipX - 8, 0.5 * Canvas.ClipY - 8 ); Canvas.Style = ERenderStyle.STY_Translucent; Canvas.DrawIcon(Texture'Crosshair6', Scale); Canvas.Style = ERenderStyle.STY_Translucent; } } function tick (float deltatime) { local actor Other; local vector HitLocation, HitNormal, X, Y, Z, StartTrace, EndTrace; StartTrace = Owner.Location; StartTrace.Z += Pawn(Owner).BaseEyeHeight; EndTrace = StartTrace + vector(Pawn(Owner).ViewRotation) * 10000.0; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if ( (Pawn(Other) != None)) bLockedOn=true; else bLockedon=false; } // End Class //============================================================================= \) &SiN2UT Configure SiN2UT  suj<  t A AHCHC ho%} Ba!fff?L=$.@ wHp B$.@a!ff?L= H vu5$*-w!*!a!* ^|N     {=6.!_%a4 za5Da!_333?L='$?. }]Da!_ff?L='$?. ~H_( AI--/-w.*%- B @D[I--/-w.*%- EC -w.*%f-:.%8 -:.%8 q!8 F -(-( G -(-( JdViZ6r.*%q!XK-q!X]q!_ ILG Z6r.*%q!XK-q!Xaq!_ KO     N6.!_%]4 M&zBa !a%!Ma&>xf&a&!M?xa!I?L= P0!  Qs4ODa!_ff?L=' $ff?.  7M//============================================================================= // SpiderMine. //============================================================================= class SpiderMine expands Projectile; var chunktrail trail; var vector initialDir; simulated function PostBeginPlay() { Super.PostBeginPlay(); Velocity = Vector(Rotation) * Speed; initialDir = Velocity; Velocity.z += 100; initialDir = Velocity; } function ProcessTouch (Actor Other, vector HitLocation) { if ( Other != instigator ) Explode(HitLocation,Normal(HitLocation-Other.Location)); } simulated function Landed( vector HitNormal ) { local DirectionalBlast D; if ( Level.NetMode != NM_DedicatedServer ) { D = Spawn(class'Botpack.DirectionalBlast',self); if ( D != None ) D.DirectionalAttach(initialDir, HitNormal); } //SetPhysics(Phys_None); Speed=0; } simulated function HitWall (vector HitNormal, actor Wall) { local DirectionalBlast D; if ( Level.NetMode != NM_DedicatedServer ) { D = Spawn(class'Botpack.DirectionalBlast',self); if ( D != None ) D.DirectionalAttach(initialDir, HitNormal); } //SetPhysics(Phys_None); Speed=0; } simulated function Timer() { Explode(Location,vect(0,0,10)); } function Explode(vector HitLocation, vector HitNormal) { local vector start; HurtRadius(damage, 150, 'Explosion', MomentumTransfer, HitLocation); start = Location + 10 * HitNormal; Spawn( class'ut_FlameExplosion',,,Start); Destroy(); } function Explosion() { local vector start; local vector hitlocation; local vector hitnormal; HurtRadius(damage, 150, 'Explosion', MomentumTransfer, HitLocation); start = Location + 10 * HitNormal; Spawn( class'ut_FlameExplosion',,,Start); Destroy(); } mE 3@9k6?,dk zj 66# A X (Z*$ l rT$ _//============================================================================= // SpiderAmmo. //============================================================================= class SpiderAmmo expands TournamentAmmo; ^//============================================================================= // SinHealth100. //============================================================================= class SinHealth100 expands SinHealth; \A^Uw.*:.%G, A\* 6h0//============================================================================= // SinAim. //============================================================================= class SinAim expands Regeneration; var() bool bOwnsCrosshair; // this weapon is responsible for drawing its own crosshair (in its postrender function) var bool bLockedOn; var() vector FireOffset; // Offset from drawing location for projectile/trace start var Rotator AdjustedAim; var float AimError; // Aim Error for bots (note this value doubled if instant hit weapon) simulated function PostRender( canvas Canvas ) { local ChallengeHUD MyHUD; local float Scale; PostRender(Canvas); bOwnsCrossHair = bLockedOn; if ( bOwnsCrossHair ) { // if locked on, draw special crosshair Scale = Canvas.ClipX/640; Canvas.SetPos(0.5 * Canvas.ClipX - 4 * Scale, 0.5 * Canvas.ClipY - 4 * Scale ); // Canvas.SetPos(0.5 * Canvas.ClipX - 8, 0.5 * Canvas.ClipY - 8 ); Canvas.Style = ERenderStyle.STY_Translucent; Canvas.DrawIcon(Texture'Crosshair6', Scale); Canvas.Style = ERenderStyle.STY_Translucent; } } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.SetDefaultDisplayProperties(); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; local actor Other; local Pawn PawnOwner; PawnOwner = Pawn(Owner); StartTrace = Owner.Location; StartTrace.Z += Pawn(Owner).BaseEyeHeight; EndTrace = StartTrace + vector(Pawn(Owner).ViewRotation) * 10000.0; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if ( (Pawn(Other) != None)) bLockedOn=true; else bLockedon=false; } function BeginState() { local Inventory S; bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(0.075,True); } } state DeActivated { Begin: } function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z; local actor Other; local Pawn PawnOwner; PawnOwner = Pawn(Owner); Owner.MakeNoise(PawnOwner.SoundDampening); GetAxes(PawnOwner.ViewRotation,X,Y,Z); StartTrace = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = PawnOwner.AdjustAim(1000000, StartTrace, 2*AimError, False, False); EndTrace = StartTrace + Accuracy * (FRand() - 0.5 )* Y * 1000 + Accuracy * (FRand() - 0.5 ) * Z * 1000; X = vector(AdjustedAim); EndTrace += (10000 * X); Other = PawnOwner.TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, X,Y,Z); } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { //Spawn appropriate effects at hit location, any weapon lights, and damage hit actor } J_ +!-(a3 k ^/2;-'4 f jb O!-'a @a=' C k=WX tyf5p$  ghijk ApA/r*q!z-, A now RP//============================================================================= // UseRegen. //============================================================================= class UseRegen expands SinTechMutator; function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.RegenTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'regentech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } v//============================================================================= // UseDD. //============================================================================= class UseDD expands SinTechMutator; function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.DoubleDamageTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'DoubleDamageTech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } /*function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { local inventory dd; dd = Instigatedby.FindInventoryType(class'Sin2ut.Doubledamagetech'); if(dd != none) { InstigatedBy.PlaySound(sound'dbl_fire'); } if ( NextDamageMutator != None ) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); }*/ &=v//============================================================================= // UseDQ. //============================================================================= class UseDQ expands SinTechMutator; function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.DeathquadTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'deathquadtech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } /*function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { local inventory dq; dq = Instigatedby.FindInventoryType(class'Sin2ut.Deathquadtech'); if(dq != none) { InstigatedBy.PlaySound(sound'dquad_fire'); } if ( NextDamageMutator != None ) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); } */T//============================================================================= // UseShield. //============================================================================= class UseShield expands SinTechMutator; function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.shieldTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'shieldtech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } vw}] "/r.*q!J%a!Tfff?L=q!l- -q!-C:.%k-C(:.%8a!Tfff?L=q! z{}~@ A ()class ChaingunBeta expands Truechaingun;S Q S2S  :~ ?/ L G OE  b F I Pd   CZ`^w w*a!W?'[$?. L B@N E @P [@R S@I*//============================================================================= // UseEmpathy. //============================================================================= class UseEmpathy expands SinTechMutator; var Sintechs OwnedTech; function PostBeginPlay() { local NavigationPoint NP; if (Initialized) return; Initialized = True; Level.Game.RegisterDamageMutator( Self ); // Calculate number of navigation points. for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if (NP.IsA('PathNode')) NumPoints++; } SpawnRelic(0); SetTimer(3.0, True); } function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { local Inventory t; local inventory c; If (Victim!=none) t = Victim.FindInventoryType(class'Sin2ut.Empathytech'); If (InstigatedBy!=none) c = InstigatedBy.FindInventoryType(class'Sin2ut.Vamptech'); if ( t != None && c == none) { InstigatedBy.Health -= ActualDamage/2; If (InstigatedBy.Health <= 0) InstigatedBy.Died(Victim, 'Vengeance', Location); /* If (InstigatedBy.Health > ActualDamage/2) InstigatedBy.Health -= ActualDamage/2; else if (InstigatedBy.Health < ActualDamage/2) InstigatedBy.Health = 1; */ } if ( NextDamageMutator != None ) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); } function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.EmpathyTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; OwnedTech=Sintechs(Sender.FindInventoryType(class'EmpathyTech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } V W Y @ OJH::$ wB!W!+  CH @6!j !Aa!j>a!A T_ $-(a>L?(T Vf .1&w*  a?( De *'8aa?.D (L ` & b _ b & a d T&,..' c B':-($.. ^ 1(VBa !a%!Ma&>Ta!I>L= D h I02 gEz)//============================================================================= // UseVamp. //============================================================================= class UseVamp expands SinTechMutator; //var bool Initialized; function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.VampTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'VampTech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } function PostBeginPlay() { local NavigationPoint NP; if (Initialized) return; Initialized = True; Level.Game.RegisterDamageMutator( Self ); // Calculate number of navigation points. for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if (NP.IsA('PathNode')) NumPoints++; } SpawnRelic(0); SetTimer(3.0, True); } function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { local Inventory t; local Inventory c; If (InstigatedBy!=none) t = InstigatedBy.FindInventoryType(class'Sin2ut.VampTech'); If (Victim!=none) c = Victim.FindInventoryType(class'Sin2ut.Empathytech'); if ( t != None && c == none) { // if (InstigatedBy.IsA('Bot') || InstigatedBy.IsA('PlayerPawn')) // { InstigatedBy.Health += ActualDamage/2; if (InstigatedBy.Health > 199) InstigatedBy.Health = 199; //} } if ( NextDamageMutator != None ) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); } n ^r w*-.- r.*$a @..V..q-(Vw*I.w*I.a "m n p f@@,T//============================================================================= // AmmoTech. //============================================================================= class AmmoTech expands SinTechs; var ammo UsedAmmo; function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); SetTimer(1.0,True); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); Owner.SetDefaultDisplayProperties(); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { UsedAmmo=Pawn(Owner).Weapon.Ammotype; If (Pawn(Owner).Weapon.Ammotype.AmmoAmount < Pawn(Owner).Weapon.Ammotype.Maxammo) { If (Pawn(Owner).Weapon==class'Sin2ut.Magnum') UsedAmmo.Ammoamount +=3; //Magnum If (Pawn(Owner).Weapon==class'Sin2ut.Sinshotgun') UsedAmmo.Ammoamount +=2; //Shotgun If (Pawn(Owner).Weapon==class'Sin2ut.chainGun') UsedAmmo.Ammoamount +=3; //Assault Rifle If (Pawn(Owner).Weapon==class'Sin2ut.TrueChaingun') UsedAmmo.Ammoamount +=3; //Chaingun If (Pawn(Owner).Weapon==class'Botpack.Ripper') UsedAmmo.Ammoamount +=2; //Ripper If (Pawn(Owner).Weapon==class'Botpack.Minigun') UsedAmmo.Ammoamount +=2; //Minigun If (Pawn(Owner).Weapon==class'Sin2ut.Plasmarifle') UsedAmmo.Ammoamount +=2; //Plasma Rifle If (Pawn(Owner).Weapon==class'Sin2ut.RocketLauncher') UsedAmmo.Ammoamount +=1; //Rocket Launcher If (Pawn(Owner).Weapon==class'Sin2ut.SinSniper') UsedAmmo.Ammoamount +=1; //Sniper If (Pawn(Owner).Weapon==class'Botpack.Warheadlauncher') UsedAmmo.Ammoamount +=0; //Redeemer else UsedAmmo.Ammoamount +=1; } if (Pawn(Owner) == None) { Super.BecomePickup(); } } function BeginState() { local Inventory S; SetTimer(1.0,True); bActive = true; PlaySound(ActivateSound,,4.0); } } state DeActivated { Begin: } N([)//============================================================================= // Splashtech. //============================================================================= class Splashtech expands SinTechs; #exec MESH IMPORT MESH=shield_quad ANIVFILE=MODELS\shield_quad_a.3d DATAFILE=MODELS\shield_quad_d.3d X=0 Y=0 Z=0 #exec MESH ORIGIN MESH=shield_quad X=0 Y=50 Z=0 #exec MESH SEQUENCE MESH=shield_quad SEQ=All STARTFRAME=0 NUMFRAMES=1 #exec MESH SEQUENCE MESH=shield_quad SEQ=SHIELD STARTFRAME=0 NUMFRAMES=1 #exec TEXTURE IMPORT NAME=Jtech1 FILE=MODELS\tech.PCX GROUP=Skins FLAGS=2 // Skin #exec MESHMAP NEW MESHMAP=shield_quad MESH=shield_quad #exec MESHMAP SCALE MESHMAP=shield_quad X=0.1 Y=0.1 Z=0.2 #exec MESHMAP SETTEXTURE MESHMAP=shield_quad NUM=1 TEXTURE=Jtech1 function bool HandlePickupQuery( inventory Item ) { if ( Item.IsA('SinTechs') ) return True; else return Super.HandlePickupQuery( Item ); } state Activated { function endstate() { local Inventory S; bActive = false; PlaySound(DeActivateSound); } function Activate() { bActive = true; SetOwnerDisplay(); } function Timer() { if (Pawn(Owner) == None) { Super.BecomePickup(); } } function ArmorImpactEffect(vector HitLocation) { /*if ( Owner.IsA('PlayerPawn') ) { PlayerPawn(Owner).ClientFlash(-0.05,vect(400,400,400)); }*/ Owner.PlaySound(TechSound, SLOT_None, 2.7*Pawn(Owner).SoundDampening); } // // Absorb damage. // function int ArmorAbsorbDamage(int Damage, name DamageType, vector HitLocation) { ArmorImpactEffect(HitLocation); If (Damagetype=='RocketDeath' || Damagetype=='Pulsed' || Damagetype=='RipperAltDeath' || Damagetype=='RedeemerDeath')return 0.1 * Damage; else return damage; } // // Return armor value. // function int ArmorPriority(name DamageType) { return 1000; // very high absorption priority } function BeginState() { bActive = true; PlaySound(ActivateSound,,4.0); SetTimer(1.0,True); } } state DeActivated { Begin: } singular function UsedUp() { if ( Owner != None ) { if ( Owner.bIsPawn ) { if ( !Pawn(Owner).bIsPlayer || (Pawn(Owner).PlayerReplicationInfo.HasFlag == None) ) { Owner.AmbientGlow = Owner.Default.AmbientGlow; Owner.LightType = LT_None; } PlaySound(DeActivateSound,,4.0); } bActive = false; if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogItemDeactivate(Self, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogItemDeactivate(Self, Pawn(Owner)); } Destroy(); } qu # -(a zt /*d-'4 sv 0r.* w y S=/$aH$,@. la} VPe ~ h| U!-'a @a?' }b=]" @!rcQ50w*-.- r.*$a @-(w*I.0w*I.a "i\H!>GqE! !-(a3 zD!/ g-'4 sF! 'pE.X..r. E,r. dE,r. OE,-r. ME,\r. E,r. E,r. ZE,r. ZE&r. EE&Gr. E%XE&nr.* hG!I! BY!a?'-'a @ }C!=K V//============================================================================= // UseSplash. //============================================================================= class UseSplash expands SinTechMutator; function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.splashTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'splashtech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } gW//============================================================================= // UseVortex. //============================================================================= class UseVortex expands SinTechMutator; function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.AmmoTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'Sin2ut.Ammotech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } cN!J,U% P!Q!S!\ @U!V!X!~@SD $ -( O TD %SP$@.a!d?= W> ף< W u -'Ua/!m.- qff?`q?a @Q..?q..?,a?' S [ A1#S !w*q! D _!' Ul"//============================================================================= // Spidy. //============================================================================= class Spidy expands Projectile; var bool bCanHitOwner, bHitWater; var float Count, SmokeRate; var int NumExtraGrenades; var SpiderMineL master; simulated function SetMaster(SpiderMineL w) { master=w; Instigator=Pawn(w.Owner); } simulated function PostBeginPlay() { local vector X,Y,Z; local rotator RandRot; Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) PlayAnim('WingIn'); if ( Role == ROLE_Authority ) { GetAxes(Instigator.ViewRotation,X,Y,Z); Velocity = X * (Instigator.Velocity Dot X)*0.4 + Vector(Rotation) * (Speed + FRand() * 100); Velocity.z += 200; MaxSpeed = 1000; RandSpin(10000); bCanHitOwner = False; if (Instigator.HeadRegion.Zone.bWaterZone) { bHitWater = True; Disable('Tick'); Velocity=0.6*Velocity; } } } simulated function BeginPlay() { SetTimer(1.0, true); } simulated function ZoneChange( Zoneinfo NewZone ) { local waterring w; if (!NewZone.bWaterZone || bHitWater) Return; bHitWater = True; w = Spawn(class'WaterRing',,,,rot(16384,0,0)); w.DrawScale = 0.2; w.RemoteRole = ROLE_None; Velocity=0.6*Velocity; } simulated function Timer() { If (Master==none) BlowUp(Self.Location); } simulated function Landed( vector HitNormal ) { local vector X; X = vector(Rotation); Velocity.X=200; } simulated function ProcessTouch( actor Other, vector HitLocation ) { if ( (Other!=instigator) || bCanHitOwner ) BlowUp(HitLocation); } simulated function HitWall( vector HitNormal, actor Wall ) { bCanHitOwner = True; speed = 0; Velocity.X = speed; PlaySound(ImpactSound, SLOT_Misc, 1.5 ); SetPhysics(PHYS_None); } /////////////////////////////////////////////////////// function BlowUp(vector HitLocation) { local SpriteBallExplosion s; s = spawn(class'SpriteBallExplosion',,,HitLocation); s.RemoteRole = ROLE_None; HurtRadius(damage, 200, MyDamageType, MomentumTransfer, HitLocation); MakeNoise(1.0); Destroy(); }  [e. a?' x @crP *[   s QBa !a%!Ma&>Oa&!I> f%18a!?$?.  B  ek!D2j!gɕL//============================================================================= // SinShield. Meant for compatibility purposes with v 2.01 maps //============================================================================= class SinShield expands UT_ShieldBelt; _lM//============================================================================= // Razor3. //============================================================================= class Razor3 expands Razor2; hJ//============================================================================= // ShockRif2. Scrapped. //============================================================================= class ShockRif2 expands ShockRifle; var() int HitDamage; var Projectile Tracked; var bool bBotSpecialMove; var float TapTime; function AltFire( float Value ) { local actor HitActor; local vector HitLocation, HitNormal, Start; if ( Owner == None ) return; if ( Owner.IsA('Bot') ) //make sure won't blow self up { Start = Owner.Location + CalcDrawOffset() + FireOffset.Z * vect(0,0,1); if ( Pawn(Owner).Enemy != None ) HitActor = Trace(HitLocation, HitNormal, Start + 250 * Normal(Pawn(Owner).Enemy.Location - Start), Start, false, vect(12,12,12)); else HitActor = self; if ( HitActor != None ) { Global.Fire(Value); return; } } if ( AmmoType.UseAmmo(1) ) { GotoState('AltFiring'); bCanClientFire = true; if ( Owner.IsA('Bot') ) { if ( Owner.IsInState('TacticalMove') && (Owner.Target == Pawn(Owner).Enemy) && (Owner.Physics == PHYS_Walking) && !Bot(Owner).bNovice && (FRand() * 6 < Pawn(Owner).Skill) ) Pawn(Owner).SpecialFire(); } Pawn(Owner).PlayRecoil(FiringSpeed); bPointing=True; ProjectileFire(AltProjectileClass, AltProjectileSpeed, bAltWarnTarget); ClientAltFire(value); } } 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; EndTrace = StartTrace + Accuracy * (FRand() - 0.5 )* Y * 1000 + Accuracy * (FRand() - 0.5 ) * Z * 1000 ; if ( bBotSpecialMove && (Tracked != None) && (((Owner.Acceleration == vect(0,0,0)) && (VSize(Owner.Velocity) < 40)) || (Normal(Owner.Velocity) Dot Normal(Tracked.Velocity) > 0.95)) ) EndTrace += 10000 * Normal(Tracked.Location - StartTrace); else { AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False); EndTrace += (10000 * vector(AdjustedAim)); } Tracked = None; bBotSpecialMove = false; Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); } function float RateSelf( out int bUseAltMode ) { local Pawn P; local bool bNovice; if ( AmmoType.AmmoAmount <=0 ) return -2; P = Pawn(Owner); bNovice = ( (Bot(Owner) == None) || Bot(Owner).bNovice ); if ( P.Enemy == None ) bUseAltMode = 0; else if ( P.Enemy.IsA('StationaryPawn') ) { bUseAltMode = 1; return (AIRating + 0.4); } else if ( !bNovice && (P.IsInState('Hunting') || P.IsInState('StakeOut') || P.IsInState('RangedAttack') || (Level.TimeSeconds - P.LastSeenTime > 0.8)) ) { bUseAltMode = 1; return (AIRating + 0.3); } else if ( !bNovice && (P.Acceleration == vect(0,0,0)) ) bUseAltMode = 1; else if ( !bNovice && (VSize(P.Enemy.Location - P.Location) > 1200) ) { bUseAltMode = 0; return (AIRating + 0.05 + FMin(0.00009 * VSize(P.Enemy.Location - P.Location), 0.3)); } else if ( P.Enemy.Location.Z > P.Location.Z + 200 ) { bUseAltMode = int( FRand() < 0.6 ); return (AIRating + 0.15); } else bUseAltMode = int( FRand() < 0.4 ); return AIRating; } function Timer() { local actor targ; local float bestAim, bestDist; local vector FireDir; local Pawn P; bestAim = 0.95; P = Pawn(Owner); if ( P == None ) { GotoState(''); return; } FireDir = vector(P.ViewRotation); targ = P.PickTarget(bestAim, bestDist, FireDir, Owner.Location); if ( Pawn(targ) != None ) { bPointing = true; Pawn(targ).WarnTarget(P, 300, FireDir); SetTimer(1 + 4 * FRand(), false); } else { SetTimer(0.5 + 2 * FRand(), false); if ( (P.bFire == 0) && (P.bAltFire == 0) ) bPointing = false; } } function Finish() { if ( (Pawn(Owner).bFire!=0) && (FRand() < 0.6) ) Timer(); if ( !bChangeWeapon && (Tracked != None) && !Tracked.bDeleteMe && (Owner != None) && (Owner.IsA('Bot')) && (Pawn(Owner).Enemy != None) && (FRand() < 0.3 + 0.35 * Pawn(Owner).skill) && (AmmoType.AmmoAmount > 0) ) { if ( (Owner.Acceleration == vect(0,0,0)) || (Abs(Normal(Owner.Velocity) dot Normal(Tracked.Velocity)) > 0.95) ) { bBotSpecialMove = true; GotoState('ComboMove'); return; } } bBotSpecialMove = false; Tracked = None; Super.Finish(); } /////////////////////////////////////////////////////// simulated function PlayFiring() { PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*4.0); LoopAnim('Fire1', 0.7 + 0.7 * FireAdjust,0.05); } function Projectile ProjectileFire(class ProjClass, float ProjSpeed, bool bWarn) { local Vector Start, X,Y,Z; local PlayerPawn PlayerOwner; Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation,X,Y,Z); Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = pawn(owner).AdjustAim(ProjSpeed, Start, AimError, True, bWarn); PlayerOwner = PlayerPawn(Owner); if ( PlayerOwner != None ) PlayerOwner.ClientInstantFlash( -0.4, vect(450, 190, 650)); Tracked = Spawn(ProjClass,,, Start,AdjustedAim); if ( Level.Game.IsA('DeathMatchPlus') && DeathmatchPlus(Level.Game).bNoviceMode ) Tracked = None; //no combo move } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local int i; local PlayerPawn PlayerOwner; if (Other==None) { HitNormal = -X; HitLocation = Owner.Location + X*10000.0; } PlayerOwner = PlayerPawn(Owner); if ( PlayerOwner != None ) PlayerOwner.ClientInstantFlash( -0.4, vect(450, 190, 650)); SpawnEffect(HitLocation, Owner.Location + CalcDrawOffset() + (FireOffset.X + 20) * X + FireOffset.Y * Y + FireOffset.Z * Z); /*if ( ShockProj(Other)!=None ) { AmmoType.UseAmmo(2); ShockProj(Other).SuperExplosion(); } else*/ Spawn(class'ut_RingExplosion5',,, HitLocation+HitNormal*8,rotator(HitNormal)); if ( (Other != self) && (Other != Owner) && (Other != None) ) Other.TakeDamage(HitDamage, Pawn(Owner), HitLocation, 60000.0*X, MyDamageType); } function SpawnEffect(vector HitLocation, vector SmokeLocation) { local ShockBeam Smoke,shock; local Vector DVector; local int NumPoints; local rotator SmokeRotation; DVector = HitLocation - SmokeLocation; NumPoints = VSize(DVector)/135.0; if ( NumPoints < 1 ) return; SmokeRotation = rotator(DVector); SmokeRotation.roll = Rand(65535); Smoke = Spawn(class'ShockBeam',,,SmokeLocation,SmokeRotation); Smoke.MoveAmount = DVector/NumPoints; Smoke.NumPuffs = NumPoints - 1; } simulated function PlayAltFiring() { PlayOwnedSound(AltFireSound, SLOT_None,Pawn(Owner).SoundDampening*4.0); LoopAnim('Fire2',0.57 + 0.57 * FireAdjust,0.05); } simulated function PlayIdleAnim() { if ( Mesh != PickupViewMesh ) LoopAnim('Still',0.04,0.3); } state Idle { function BeginState() { bPointing = false; SetTimer(0.5 + 2 * FRand(), false); Super.BeginState(); if (Pawn(Owner).bFire!=0) Fire(0.0); if (Pawn(Owner).bAltFire!=0) AltFire(0.0); } function EndState() { SetTimer(0.0, false); Super.EndState(); } } state ComboMove { function Fire(float F); function AltFire(float F); function Tick(float DeltaTime) { if ( (Owner == None) || (Pawn(Owner).Enemy == None) ) { Tracked = None; bBotSpecialMove = false; Finish(); return; } /* if ( (Tracked == None) || Tracked.bDeleteMe || (((Tracked.Location - Owner.Location) dot (Tracked.Location - Pawn(Owner).Enemy.Location)) >= 0) || (VSize(Tracked.Location - Pawn(Owner).Enemy.Location) < 100) ) Global.Fire(0);*/ } Begin: Sleep(7.0); Tracked = None; bBotSpecialMove = false; Global.Fire(0); } state ClientFiring { simulated function bool ClientFire(float Value) { if ( Level.TimeSeconds - TapTime < 0.2 ) return false; bForceFire = bForceFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ); return bForceFire; } simulated function bool ClientAltFire(float Value) { if ( Level.TimeSeconds - TapTime < 0.2 ) return false; bForceAltFire = bForceAltFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ); return bForceAltFire; } simulated function AnimEnd() { local bool bForce, bForceAlt; bForce = bForceFire; bForceAlt = bForceAltFire; bForceFire = false; bForceAltFire = false; if ( bCanClientFire && (PlayerPawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ) { if ( bForce || (Pawn(Owner).bFire != 0) ) { Global.ClientFire(0); return; } else if ( bForceAlt || (Pawn(Owner).bAltFire != 0) ) { Global.ClientAltFire(0); return; } } Super.AnimEnd(); } simulated function EndState() { bForceFire = false; bForceAltFire = false; } simulated function BeginState() { TapTime = Level.TimeSeconds; bForceFire = false; bForceAltFire = false; } } 0 ~R.:.% ? ;- wF*F- w*a/!w.*&>33>.%; #, F 33s?-`'q!c -`(F*   s!%I$.@a!L333?333?L= O`Er* ka/!.-x E?,?,xzD?,??x? tN sHaI$.@a!a??L=  y! #!wa!y #=> z!}!+y }l-(a??,(E:.%j:.% |! Ia( {!C"c+4a@F*-`(8 $ @"  !B"  A"D"A?=r*r.*F*-`(   F"6+ j!S L>(--/-w.*%- G" E"I">&!j!S L>(--/-w.*%- J" g _$-(-(  K" eo$&S -(-( On//============================================================================= // Shock2Proj. //============================================================================= class Shock2Proj expands ShockProj; var() Sound ExploSound; simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( Level.bDropDetail ) LightType = LT_None; } function SuperExplosion() { /*HurtRadius(Damage*3, 250, MyDamageType, MomentumTransfer*2, Location ); Spawn(Class'ut_ComboRing',,'',Location, Instigator.ViewRotation); PlaySound(ExploSound,,20.0,,2000,0.6); Destroy(); */ } auto state Flying { function ProcessTouch (Actor Other, vector HitLocation) { If ( (Other!=Instigator) && (!Other.IsA('Projectile') || (Other.CollisionRadius > 0)) ) Explode(HitLocation,Normal(HitLocation-Other.Location)); } function BeginState() { Velocity = vector(Rotation) * speed; } } function Explode(vector HitLocation,vector HitNormal) { PlaySound(ImpactSound, SLOT_Misc, 0.5,,, 0.5+FRand()); HurtRadius(Damage, 55, MyDamageType, MomentumTransfer, Location ); if (Damage > 35) Spawn(class'ut_RingExplosion3',,, HitLocation+HitNormal*8,rotator(HitNormal)); else Spawn(class'ut_RingExplosion',,, HitLocation+HitNormal*8,rotator(Velocity)); Destroy(); } TN"E " -$  O"aZ  l #o9 oBL2T"{VCpvU-<V"W"DLQ[Q-.- w.* $$ =,$:$$$ g!H88a!?$?.  H\ `/?-'4 ~^"DS ~U?*a  a*aH$@ _"bIqVwb*b*b..Twb*b `"DUD"w*Db nc"S%aH$@ T //============================================================================= // Shadowbolt. //============================================================================= class Shadowbolt expands Concussionbolt; auto state Flying { simulated function ProcessTouch (Actor Other, Vector HitLocation) { if (Other != instigator) Destroy(); } function SetUp() { // PlaySound(SpawnSound); Velocity = Vector(Rotation) * speed; } simulated function BeginState() { SetUp(); } Begin: Sleep(0.4); //self destruct after 1.0 seconds Destroy(); } ~\\9 gf" \ iN//============================================================================= // UseFast. //============================================================================= class UseFast expands SinTechMutator; function SpawnRelic(int RecurseCount) { local int PointCount; local NavigationPoint NP; local SinTechs Touching; local SinTechs p; local class Usethis; local float Selection; NavPoint = Rand(NumPoints); for (NP = Level.NavigationPointList; NP != None; NP = NP.NextNavigationPoint) { if ( NP.IsA('PathNode') ) { if (PointCount == NavPoint) { // check that there are no other relics here if ( RecurseCount < 3 ) ForEach VisibleCollidingActors(class'SinTechs', Touching, 40, NP.Location) { SpawnRelic(RecurseCount + 1); return; } // Spawn it here. SpawnedRelic = Spawn(class'Sin2ut.FastTech', , , NP.Location); SpawnedRelic.MyTech = Self; return; } PointCount++; } } } function Mutate(string MutateString, PlayerPawn Sender) { local inventory Inv; local string command; local Sintechs OwnedTech; OwnedTech=Sintechs(Sender.FindInventoryType(class'FastTech')); if(OwnedTech != none) { if (MutateString~="TossRelic") { OwnedTech.DropInventory(); } } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } j"k"m"V@[//============================================================================= // Sinbullethole. //============================================================================= class Sinbullethole expands Scorch; `//============================================================================= // sinriflehole. //============================================================================= class sinriflehole expands Sinbullethole; ]s"t"[ !{8//============================================================================= // SubSinBolt. //============================================================================= class SubSinBolt expands PBolt; var float OldError, NewError, StartError, AimError; //used for bot aiming var rotator AimRotation; var float AnimTime; var subsinbolt lBeam; replication { unreliable if( Role==ROLE_Authority ) AimError, NewError, AimRotation; } simulated function Destroyed() { Super.Destroyed(); if (lBeam!=None) lBeam.Destroy(); } simulated function CheckBeam(vector X, float DeltaTime) { local actor HitActor; local vector HitLocation, HitNormal; HitActor = Trace(HitLocation, HitNormal, Location + BeamSize * X, Location, true); if ( (HitActor != None) && (HitActor != Instigator) && (HitActor.bProjTarget || (HitActor == Level) || (HitActor.bBlockActors && HitActor.bBlockPlayers)) && ((Pawn(HitActor) == None) || Pawn(HitActor).AdjustHitLocation(HitLocation, Velocity)) ) { if ( Level.Netmode != NM_Client ) { if ( DamagedActor == None ) { AccumulatedDamage = FMin(0.5 * (Level.TimeSeconds - LastHitTime), 0.1); HitActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } else if ( DamagedActor != HitActor ) { DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } LastHitTime = Level.TimeSeconds; DamagedActor = HitActor; AccumulatedDamage += DeltaTime; if ( AccumulatedDamage > 0.22 ) { if ( DamagedActor.IsA('Carcass') && (FRand() < 0.09) ) AccumulatedDamage = 35/damage; DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator,HitLocation, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; } } /* if ( HitActor.bIsPawn && Pawn(HitActor).bIsPlayer ) { if ( WallEffect != None ) WallEffect.Destroy(); } else if ( (WallEffect == None) || WallEffect.bDeleteMe ) WallEffect = Spawn(class'PlasmaHit',,, HitLocation - 5 * X); else if ( !WallEffect.IsA('PlasmaHit') ) { WallEffect.Destroy(); WallEffect = Spawn(class'PlasmaHit',,, HitLocation - 5 * X); } else WallEffect.SetLocation(HitLocation - 5 * X); */ // if ( (WallEffect != None) && if (Level.NetMode != NM_DedicatedServer) Spawn(ExplosionDecal,,,HitLocation,rotator(HitNormal)); if ( lBeam != None ) { AccumulatedDamage += lBeam.AccumulatedDamage; lBeam.Destroy(); lBeam = None; } return; } else if ( (Level.Netmode != NM_Client) && (DamagedActor != None) ) { DamagedActor.TakeDamage(damage * AccumulatedDamage, instigator, DamagedActor.Location - X * 1.2 * DamagedActor.CollisionRadius, (MomentumTransfer * X * AccumulatedDamage), MyDamageType); AccumulatedDamage = 0; DamagedActor = None; } if ( Position < 5 ) { if ( lBeam == None ) { lBeam = Spawn(class'subsinbolt',,, Location + BeamSize * X); lBeam.Position = Position + 1; } else lBeam.UpdateBeam(self, X, DeltaTime); } } simulated function UpdateBeam(PBolt ParentBolt, vector Dir, float DeltaTime) { local actor HitActor; local vector HitLocation, HitNormal; SetLocation(ParentBolt.Location + BeamSize * Dir); SetRotation(ParentBolt.Rotation); CheckBeam(Dir, DeltaTime); } fE)r* ka/!.-E E?,?,EzD?,??E? Qaw[*[a z"{"}"~" "@# A# ]|"aw]*]a D#E#Q $$ H#kJ#V5 K#C//============================================================================= // NoProjectileZone. //============================================================================= class NoProjectileZone expands ZoneInfo; event ActorEntered( actor Other ) { if ( Other.IsA('projectile') ) Other.Destroy(); } B@BO#{6N# 'HHHHAGPQ{V//============================================================================= // SinCTFGame. //============================================================================= class SinCTFGame expands CTFGame; j I%:.%-(a>?( n//============================================================================= // SinCTFScoreboard. //============================================================================= class SinCTFScoreboard expands UnrealCTFScoreboard; ] R//============================================================================= // rsinflag. //============================================================================= class rsinflag expands CTFFlag; R//============================================================================= // bsinflag. //============================================================================= class bsinflag expands CTFFlag; H//============================================================================= // sinctfrep. //============================================================================= class sinctfrep expands CTFReplicationInfo; var CTFFlag sFlagList[4]; replication { reliable if ( Role == ROLE_Authority ) sFlagList; } U_#a@(L  W# )c * mr//============================================================================= // GrappleOff. //============================================================================= class GrappleOff expands ZoneInfo; event ActorEntered( actor Other ) { if ( Other.IsA('grapple') ) Other.Destroy(); }mmlcmrlA lPmlllozZlRl`lql^s)lzlSllwl{lt lGzbzol]wT lTll^ lXl|l}zlnwQ{b lrz_lX}gmTwRlQlf{U mh{r mts\mV{m wflE {u|Q |Kqv xl|d}G wk mRlWwlm[wr|~ {n z^{V~nle}wzRzZ{lg~p{OzGlvlzsE}W ~Rlcwiy^lVwfmb~M{q zL|b lZzFzG{]~zlUzD{umz|` ~Xzcwo ~]mG{KqZ ~kly lyzAmu}xzM{fzKl_ qd {w{Uqw mUyWl"lB |J|S|flSm[ ~}I qO {p l@ lYly~pll{nlx|i mR q |XlOr+lC ld}m[ mQq z} lT zszflS q |z {e {j {f |M "vzqrlJzPld{9mVmR "xM"lf {k|a ~p {C{Dm[ |^ zq~gwezlqlV{^{Y{X{p~Wzlmlemf |c{] {BqEq| xfl[ zYzh"e@~\ {Pz Nq~N |h lF {g {\ wl |^ zE s] mgq,~m{] lX z&lT rdmVj7L }H r*rdljzs\mwlJ zrG|C{I yy|AqdlM wer{W lS qA}kr>qlr+{gl] |veo{l|yP }C lfq` qrr>{K qHq%|p{R yWzDl^ lC qDee"rqR qh"sqI~uqhT|S |} w:"tq{7"u~_ mS l~z_mR }ur+mqrMz"rzrNqwd {h}}|E zZ}8WlV eHq$ws {@zKwj qZ|a~Mq${[{m mF"ewhy]zo qDzo zp y|"x_r8zeKwQmAeVmjz{zR}zrqw]rcqaqEl"qv{t lD lA jjrNzp zq eSmf qxjw "Z ~Mli l~mP l@ l| zgQ x|z}q|q/q5qQ}ll@ qSqVq q |xeJ ~v~f~Y~k|r |v |w {hq~|El\lPl_ eSeUrChZCmmjhehjkmim[ jNe\l\eFqejei{pqefzfNrqmBlJ lX rrdlT l} lnrsln qpUlg le lD r0C"Ap lI ek lim[ jH "GA eB qUlv m[ q "llW eI"O{qgeeN"O}quq$rGm_"O|"PpqVqguq "PqeRq eTqa"\e`"O~lJ "Oz"~ q,e^en{gM mu{gN e[|t"neXlO zrleYqrqh"PXjpqUjk"O~`"eq["ml[ eDq6q qNq j@jq|g"jq q "fPjgK edpP|vxO"Fjgy{ zomalE z}{[|rmqazh ja q;jt|pqX|W {W{UqHq!yB{FqT,qEq0Elc q[l la rCq qaaq qEq qq q|xG|`|` q q xQqTqmeOma"lUeWlN "ceHqrrs"fr*qUeFq3jkoe`dWeadYm{ e_"iecjfqL"GAjG qq#qB~-q q"l@qR eJq;"olL |8gqa|e qElSlF qvqTa|bqaq6enraCqI"PZelqeZqW ej"Gd q`qiqQaK qiqZ|a {d l` js zztk "G^lQ lZ qTl] e]"GBjj l~ qq"G\qdq;a[qa~lI qoqYqkqqqU^q_jn qa$lX li eK"GEjx q06ll q jj qZq%qHqZl\ lD lE ziq qVAqVlB qgF xzr+qqmV q qqL|{YlA xvqqqAqqq q ecmB "@b"Gdq%jOR |~jX qq!l^qmAqm lu eiekqTSqT q qTQepqa^q e^ qaf|9U jIq lY q!qkl| eKlnq0aqL eM"l qCwf qiqa m~ z[xiqHjr q%j_lame|q|Vv ~sh zJ}@ wUlH lC "GD{z {\"GC~q~q\qejcjOjrjfm{jdeK eG w jzqnqAj7C |qqn"x`q j7D qsjtq5qh"HqreqU qaLqeklP rzqj}" j7F xFmB ~ih jgsjH egqulU q_"xqU_jvjwq\lbl[ |g "ew"exms "hvcjknq lG qTS"eA"eD"eB"eC|} |f{d{\zFjjjm?jW"PWl{ jiq5qaIjyldj oj Lemz[ jJe]jm"GLjC"Pf{gJ j|"pqeTaZjejz"ey"XjB{gO jFmr"sqqA"]"^"_"`"a"bqaA"d"ejlqgG j~"PgjE}hqZjDve|9b "fL"E"Fjkj{"kjnj "PYqBz'ZjC||"5ums "rvqAvH jlmm zax{mq6lji"5tmS jfk jieGeI}$y j8$s cMVYF$fdoJoYh` hf` ul` Bk` O N \s$Ji?~sd`B O P[Y ]ln  kaMxkn  Ffn  SbY `Mnq |MK`MZMhhn  wZo DMR,:`? ZWMgwuz$DDzHVdVQg dMg r?f@PY Nlq  \fq  ihq  vkq  CUSPOg ^NElEY |TEJx$XZkgrhg@H`Nlg\JOjMExKR HdU  UfgbJq pIr~AMLT$TZ d  nnM{@MIBMW:OemD sG_ @=ON<r\IN j?s x;F E=rSO$a afY  BID NM\IIj8MxhY  F?A R7s _2M lkY  ylY  EN$[QTC lMy y&M F2y S?w `?mNC {ZU  HOUBo dBgry@MC Nn [i Ai>+jrUlY  cZgpbm  ~$Y  J[m  Wu  ci 1prai -o%`\-Y  j6~w,gEKO  S N`i/%nC~ S #p`=7P+Y  GJyTUG b:q pJ~lm  L `Yfm  gNtNBhm  P!o ]HU  k] xtEKSWya,o o#`}yK`Y=q g Hup`Ckm  QF^slEzwH"HVB|d[`rV @`yNK$h\MDHRo `vnL|]JIXL  faysB\ AGNhh \Tn jLx7FLTh b%G  pHY  }B$jJutEJ B LONn ]Rk?} {g HY  ULb rpJ ~"rKLYyLgY  uLBMn PL^o lB{LI!gW\ eLsKQ  AgNY  \IX if{ vbE=ySY  aKK nMq {Y  IZVfq  dh{ qQH @hq  MW ZYgv$|uG`  q?R  ~YKG Yjf Y  t"{@L  NOH ZKP  gkq  t{  AG Mk{ ZidY  wM$SDc WOq cY qYh Mq Zl{ hlq  wMH DAyQj_Qq moG {z HrUWq c:yqI OKHmZ{$W GY^8L lAn xL FQm Rny`J ngL {@yHNDVTDeu  tYAko  OMK \~  i{uQb  Dy}QNx  `q mMm {g IWn V@dTx  rn G M~ ZUm gMDt {Cho  QOK ^~  kPm wMEY  SL `iN mL zK$zGYAC OC [g gku  tMx  AOb  Nan [TiOm wY  ES$eRswk  EcY  QY  ^N kFb xN DN QMb  ^`n klo  ykC Fu  RY  _fo  le y@$dGOw$j kh$wUnL LIw [R$[hOHCCjQj :{Aq uY  Cd  Pfz ]QO  llr  yY$sEK x#U  EN Qnq ^u  lQG yo@Fj *T~ ~ U  Khr  Xhp  dWqpU  HJUB cqMG o Lc [o$~hks  ffp  sh @U  NyZN hfr  uyS  A@M8[q ig  wGCQK QOG ^Is kT xZfE,U  kk] xIvE[U  SM  `] mlp  zMGOO  U{blz qE`  @ls  LMYygMHuW CQ  P@]~kO yky F\ T!U  ahs  nQH{@L Ikp  WbMdhx  rkx  h LU  [fy hAL v@D{ Rq _,Em@r}  @] Mq  Zm gkr  uF$`Afx  ag  n@zMHs VL  coq o@}IM Kq YMO  fhz shy B[MPq ^b lMzkz HP@W@q eMslx  @ly MD[fs  _@lm zb HY Vb cYp$q qSbOphu  ~ Ku  XMe sy@q N^ \~h vt Clt  PIS ]h| jSf$Hxd @Nw  Mjp YQFeb s A%x NhF [| h{ u;tBe v`q Ep S?Z _Onq |=`JF Xr eMFrK @r M$N Zk\  haq ukyCB Q&q _ mV z G@$] T qy  ~WL Kc ZL gN vhWD=R [z  gg t+O@hY N[L  \YiT$fwq ]m k]$H wm f| MkX[c  sb  @YL Mw$L[OFg bL  u q B n P <R ^ f\  j Q w kt  D m Q Pq _ h\  m .h z @ H b  V fc lu  r I$U cMT q b ?k p Z| /xJ k| X 6n  f ] s a$G@ $OG o$qU b F nn T l| b *@ p P ~ u  K IjX r B _ O q \ L j lOy K$QG EMX  e p r It ~ Iu  K fu  X Y e %k  s Y @ ob M Y  [ ah lN x @n F Uk  T G` a ht  m l\  z +N G "V  U ft  b %w o 7Z | z  K L X @e Tw  s h  L  M <`Z ku  h Xiu I$j^ f OH S>+W  EwB ,Ny !VG +w] ltT  ~H $jF 5cp !XS $Hk J] s %EP !Y  U kJa 'P  p f} %m K M Y O f Ms Wm A Wi  O a \ yi A w h D b  R ] _ b  l By Cm G  :U IO L  ] y j ~w kKE ^RT n f LIt L  B LN y \ P i  3v |i h w m E RL S b a L  o UW | c  I J V A c n p P~~ qE L m Y FFg v  m xKz C$xI f 8A nb y kH G >G T  'b m I Q>W J U M b ? 3o fv  b ?@ o m | Cq J ? >X H1V M G oyT hw  b Jn  o y  | K H  *U d FC rB om t nq B M P Us  ] Gj x G F IT n b ~ p I} kI K Q W & 'd a K q X pN f xI t  A @ h M h [ yi kv  w K D &jQ %Y _ P m 6yz Uy H y U P b a o :n  } p J P Y P f ?s n r M@ L  N  3[ '  N K Z Wb g f/%u Pb Z q h @b v ID K R K _ Im o  { lv  H N U |A c @p fw   ~L >BZ A h o u uy C I P @m ] Cb k My XG S=7_ hv  V K c nm q =K  iQ L =n  Y If [ t "M A m N Ry\ M j P w la D P Q  (^ N$iF h o m } \h K Iu Y c  f y s J @ MM Ab [ W i Iv P D eYQ (_ o  G CT Uj  W K d Vq q  T IqS xH b kw  o A | yI ~ W lw  d &s q nm  q M og [ ^ g qY t pa A A N b [ sM i q v th D b  R zE _  >l 3Gj K q g~ ML K Z b  g i  t ?A \ Q nb ^ N l Vm z Y  H Am T +a b %q o N } iJ vL  X B d Gr y@ m N Yy\ o~j wg x MD m R  (` MH v  V /G c O q A ~ IK d ^BY UT [ K h Vu "| K a W oMd xr m @ NfN xJt a3C {L  v yh C {$xQ LOI ih X y  f on r m @ y N M[ LA i yv mmD P q ~ ~ %b K K Y Bf jst -Mg ~u ~L  C |IO JK ] yP i A v $a C ,Y  P f 1\ }i M ZY  Z h f b t yK B |O :K ] pO j N w A D yQ A _ G-l iKY  ed Ym$G I E$_ P YB$h o ]$~W LC9U @$bN R$_ p ZK ~ _  K {X DA h Tt o C PpP b @ b N y^ A l `y A G m T bA b Mn y| d-J GPw n E &b S ya n o ] } +] J A W +d ] O [\ Ml V z Yn I n  W V c z p k[ } J & #X J { t$iH $] q A ~ *n J  3X yK d%Y nY~ yL f_ Z n  g h^ t jnB xp $A N y Z b  g [t Vb  D jA Q _] iMm| h i T%w ] \ &z  i m v n D kiR v { 6iH yW p] e Pn r x@ D]  /a A P C  ] }j l] z \/G A v n B CA P A  \ jA i hv -F tJs P } yI l^ W m e `s ?S A {h P J ^ y$hk K S W$_` M &TCM %XP A h E$tt g EHh FtKp FZx{ ,7s v8j i|+b sHM bU ZFw Ifv} lls id>,_ ByK +AAD |jE bko VZ I^Ap pFq e  Nw f >,E |eq p,8V C-N |#q{ GJl |jv AG` G_Tg i,E{ @ |? `N~ G!iL !nu |#qc G5LT Ar` MR d]_ g EH| [LD kvP |9F V GkMU 4,7b k lLY ~'e S[L `^$rg i`Yf >+yip>,dl*P nHze  YBc Xi["ArDi !Vvi4>,Lk lLxE}D kAv$bll3N`i$^AZS_Asr~_eDaMZhC B{k_f,[Ee$@ `|#q`tWQWG-hH+Uo F!X@ I SX BAkip>,ll3Xo ^!XKnNc^qnO  b}y|_ [$s[ eANXgOy}v|#qs m$_d \CC nAFy|G j$sCy|v J$sr G deMrLIy|UHDQ X$sU gCHy|K|#qG $sxlJk ABuT$Ww ,LNNJZy|d|#q` |$sQ6,8D|#q|C,8my|e ~$sa I~VTk;Njy|x z$_th ,NS"$oa ILE PEZU$roSj$ya|#qZZEK$tP $oD 3~Hs[$t{l F yo I$[h0JeC (phGd-X~2Er_wl ^ ~V$OT Sfc,MI?[dVhKz[BE 3hRGz-Yj F+wF@4^} 6M[NihXiKQu H1\2Vs M IIq@}IOqMVs @2rLsZUn ^5cTn F5nw YueD yZ^F>S GZvQEk$aGQ$Yhp F${AeP|?|]L IANi|#qwNADhQ$H lTAut[XiMAFA[[GI>b?[$D `Pgd QNKf5V Y 6Io6_x$x W]hiOm,Ax_z,yED$Xeb$z}5X wcM5X OchigNz,Pp ^$O|cRKqx]]}%zx]_p,7|Msx]@x]]FF>zm yx F;Qq eB6RgS$my rv8fd,7^[LUdEa ;rfk NfX,8~q LOvi,EE 6IJ i;SdpN I>~ #H|d-Dd+qYM e\L$sAx3tJCVgLy$L}w$I[$-H^CEuT9zYr 4wsf  jPvf FFD?UA5TK Iz FmmUY BiC>,Pq 9|L  u /BT4 :qLBkD%y[M^Xlz/%Df  imHu *}D%gv4JLr 4^[V[YtF*KBIaXMf  eLq}f  [f  gf  t @ os]PA mHpyb iA FHMRA `4r 4J*lr 4FvX|r F%JF\pI\  y\  EFD%Qf  vFd%Cf  hf  tI4q @K qx ~c4 *Ku|ur 4CqU4dtif  Xq (dL  Lz/%Ys +~h 7i}p=8`prSX{4`kf  KNWqL  ehL  rq } mM E:ks lr 4l|vf  h}C=8uCrSmCU;@CbX{CD6SCr 4e$If  ni>,zq" 1f#L  Wz"/%dh" 8I&L  As" lN}=8zr 4Rrf  Di6>,Pq, 9|-L  uz,/%Bs, |gh, Lc}6=8o6rSg6U;z6bXu6D6M6r 4q+CJ 1t8L  ek /%rf  8W;L  OC =8\r 4G TL  [L  hSr 4^ uPSf  acy  mc~  y TF UT ~  b f  or 4~4|f  z Q G P T @ anY n+W{ A Rhf  ^z4Dk%ooV  ^Qr 4ekx  Pf  \EhYA EhQ[A oE{]A Xhd_A Bf  NHf  Z"Q fEsdA Ph\fA zB4yF| Q LB4SCXlf  k+zwr 4Tq7E!PT%|!Pn a!H!m!mT%N!ms!sf  R!%B^!r\  `!T l!H4~Pz!Px"` W"D%c"pf  H"d%T"|f  y"Z%E"~f  j"]v"J D"k4|Q"c FAM#f  N#FcZ#R4ZP}#yW$pe$FC-U$n B$  P$p$~N$q \$Nqj$m [$b i$Yw$s E$M S$qr 4aM`$A%x  _% ^$k%E4iPO% Yx%x  Q% _#]%MI  @%pML%pYZ%Uh%h 7v%r 4cm%/r 4rP%V!B%r 4hc%oN K%[Md%X%f  }%s4KHI%u  T&f  a&u  m&S>z&f x&f  F&s +R&y }& AmJ&K w&z/%C&q ?h&`m g&}u&c C&l R&K a&wo& }&r 4rJ&L |&f  J& SoW&y F& FS&L  Y& acf&  I&C H&f  T&f  a& Qcm&kf  P&|g]&r 4z>k&f  e'|Y r'@4C+'yY B' Q P'Ub ]'r 4Hk'UY  s'Um @'Uq N'f  \' Oh' zv' yD'x  S' R_'m m'Y {'b  I'x  V'c b'rIq'{  z'd%G'|  l'g y'n F')n T'T w$cb'py E'f  R'z/%^'q 1C'L  t'h 8A'L  y's +F'}p=8q'o4Si'yf  |'i>,H'z/%t'q 1Y'L  J'h ,B( DC(HA(A _(j ^+wk(@Qb(A s(f  ( +\K(f  g(o  3s(d-f( %gS(k Cz(G-}((Wj(gcA(D *d(.L A(l O(.K ^(  l(Np$~y(H*w(1A U( `a(f  A(N N(~  [(c ^?h(7A5g(y  \(H^Dh( 3Gl(f  s(8f  @(j 7 (M(8K u(V  A(r ^%QN(A\  _(z ^mmk(PX(G*,f(HER(FA p(g E 3|(Y* 3o([ * (b(9f  J(e VV(m a3l(Kg_(t  >F(ajoD(l Q>s([fq(u+mW(pSD(S !c(lST%D(Vf  i(QM-u(~ Xrb(F X :T(y /N(c *}(vH4g(=7[(m R(  r`(. R(0(_(0d%G(0+zl(dT%f(ef  K(`L  W(f d( f  r(r 4d(_r 4i)c(Q`sL)lr 4h)r 4Ngg)NU$~u*or 4gs*KR  Z*r 4]f*;z C*;X  P*;U  ]*f i*r 4gw*r 4\^*n~z*yr 4xMx*r 4ap*4r 4J Q+f  [+r 4xh+Nr 4L)`+f l+ IC-z+  cg+ %gJ+q+GA+w  O+Eh[+ TC+ $W+V  {+jH+yV+s d+u  r+Xn  ~+r 4iK+r 4](t+CCQ+r 4C&T+W,Gg,w  u,E}A, T~, $R,V  v,jC,yQ,s _,u  m, r 4V y,|n  O,r 4u\,CCQ,r 4wT,r 4X)K,r 4C:c, ?aFf-0r 4s(l-^r 4r_-Ir 4pQ.Nr 4dGA0Tr 4^Ge0TEgC1r 4Aj14eHk24u`s2?r 4AES2Mr 4^|T3r 4ir4 \@[6 uN[6f  i6f  u6%KB6HLM6  AY6N@Z6 'Z6 BA6aMC6]MP6_,]6 PI6A Y6f  f6 Qr6A C6f  P6T\6 )p6 )Y6d-B6Yo6G-H6Yu6?N6 'M6 Bt6v6u6 sNR6x4X`6ECx6*P{6 /I6 7x6 0o6@4j_6p4iI7 %A^r7K P7j4s0\7J 1O7L  @7k /%M7f  8r7L  j7C =8w7Mo75}7MZ7yh7n v7q D7m R7b  `7 A?m7q l7m z7b H7K V7[4[b74A}7|4A~7~4_8Y ^8}l8S  {8}FG8 Y M8 }[8 S  j8Y v8}D8S  S8Y _8}m8S  |8u43H8S  ({8dM c87 p8L DM8x  j8b Dv8x  T8 Zc`8gC8Y Q8g^8Y l8gy8Y G8gT8Y b8A o8m4T*{8Y O8}]8S  l8 gx8 Y F8 PR8 HLb8T :n8V Ch8^*Sk8L ~8A [8b g8!A E8T9Q8#f  J8 AV8^cW8D z8'A W8z4E*c8{f  h9rxu9Y m9}{9S  J9gV9Y d94_q9I4f)P9tf  v9q (B94L  j9z/%w9s +\9S>G98y E9.f  R9f  _9V%k9<u  P9<f  ]9h 7i9}d=8`9drsX9\f  K9im>,W9qC 1C9DL  t9zC/%A9sC f9hC 8e9HL  ]9}m=8j9X4ab9J4bC:0'e:MA L:Y X:}f:S  u:LgA:LY O:Y \:}j:S  y:gE:Y S:S #`:f  C:T%XP:  |h:S  3d:D EW:^A t:v4w"@:cf  w:t  C: e'P: 1w: ^h:P F:0%CS:dV: Mu:D$[C:D4W^:f  u:q A:bA O:~  [:t4Xh:Q4V@:Ef  V; Gab; G%SC;f V;NEgd;Y  K;aX; GHTg; G8{;G+,s;{ k_<{ *J<GcSt< ~G<x  d< ~p<x  N< ~AJZ<K d< (jp<A Z<f  g< (ks<A ^<f  k< ( )w< ( 6`<T4yV<t O<E5^< aS<+A q<  )}< L f<L$ct<MW<U  e<Yr< Ql@<0HDl<q p<K ~< /%K<D%p<f  U<U;a<bX\<D6t<S2j<y \<y4_ i<y H<~\*UOr=>y@=>n  N= ([=yC=f  Q=V%]=u  B=f  O=L4N[=i={$|w={4as= TT=T4yh=a=V4]~=W4][=L  x=S4SD= _.W=  "E=i g=S4}u=