*E @<@Y׿+6W NoneEngineCoreSystemTriggerLogEventString GetTimeStamp InternalTimeColorClientMessage InventoryTexture GameInfo PlayerPawnPaletteUBitsUClampVBitsVClampUSizeVSize TakeDamageWeaponPriorityWeapon ZoneInfoPawn MaxColorMipZerobMaskedDisplay BeginStateTimerMoverPostBeginPlay Advanced Movement PlayerMoveFireTouchTickCollisionRadiusCollisionHeight ProcessMoveAltFireStatLog LevelInfoEventPickupDiedConsoleCommandPaths PrunedPaths MuzzleFlashupstreamPathsOpenAnimEnd RemoteRole ParseOption IsRelevantBumpbCollideActorsSurfacebHiddenReceiveLocalizedMessage SoundVolumeChangedWeaponPlayerWalking EndEvent Lighting LogPickupBroadcastMessageCloseClientUpdatePositionReplicateMove EndStateDying BeginEvent PlayerTickHandlePickupQuery PreBeginPlayMenubStaticPlayTeleportEffect ProjectilePutDown TeleporterLanded ChangeTeam ZoneLightFindInventoryType TeamMessageSayBegin HandleDoor DecorationGameReplicationInfoFindTriggerActorBroadcastLocalizedMessage SetPauseMessage PlayWaiting KilledBy Destroyed WeaponAIInterpolationPointFilter UnTrigger DrawTypeTyping LogGameEndTweenToFighter ServerMoveDoCloseDoOpen MusicEventRenderOverlays SpecialEventDropDecoration GetItemName BeginPlayStopLog bDirectionalUpdateRotation PlayDuck BecomePickup WeaponChange ZoneChange KeyEvent DownWeapon ClientTravelFinishedOpeningFinishedClosingBrush Collision NetPrioritySwitchToBestWeaponWaitingReverbSuicide ActivateSpecialHandlingTeamSay TestInfo LogSuicide LevelSummary SelectNextSoundAI AddInventoryUserAllFClientVoiceMessage HidePlayerNavigationPointMenuingCarcassDrowned PlayGutHitTweenToWaitingCalcBehindView ReduceDamageSubTestOptionalOutAllowsBroadcast bBlockActors PostRender BecomeItem SpawnCopy WarpZoneInfoTauntbBlockPlayersCounter PatrolPoint DamageTypeSoundsGestureKilledPlayBeepSound WarnTargetbCollideWorld MoverSounds PlayRunningTweenToRunningPlayModifySound LifeSpan ShakeView ScoreKillbNetTemporaryBecomeViewTargetTakeHitbAlwaysRelevantAttachBringUpArmorPriorityClientReStartSetDefaultDisplayPropertiesGibbedLogTypingEvent ViewFlashSetDisplayPropertiesActivateTranslatorUnTouch ChangeNameSetHand PlaySwimmingHitWallMutatedDefaultWeapondropped PlayInAirAmmo Spectator PlayerStartIdle2ShouldRespawnClientReplicateSkinsMessagingSpectator PreRender CheatFlying SetRespawnDodge PlayFiring TriggerLightSetSwitchPriority LiftCenter PlayDyingRecommendWeapon SetMultiSkinNetUpdateFrequency SleepingHandleTriggerDoorClientPutDownEffectsClientSetMusicSetOwnerDisplay LiftExitMutatorTeamMessageSetWeaponStay Animation KillMessage ServerTravelTriggerToggleTriggerControl TriggerPoundPlayerSwimmingSpawnGibbedCarcassBumpOpenTimedFinish StartLog FindGoodView DeathMessageDriversdamageAttitudeTo FlushLogSendVoiceMessageEndZoomKeyTypeGetLogFileNameLogPlayerConnectConsole GameEnded WeaponSetSwitchPriorityTakeFallingDamageTravelPostAcceptAddAmmoCrushed AdjustAim bProjTarget PlayChattingPlayerCalcViewCompressAccelFell ActorEnteredMutate StartWalk ViewShakeIdle SightRadiusSetMesh NextItem TestStaticTestGiveTo PlayLandedPhysicsEncroachingOn SwitchWeapon ViewClass FireWeaponAdjustHitLocationGetServerPortVectorInitPlayerReplicationInfobStasisAudio bNoDelete SetGameSpeedUpdateEyeHeightInterpolateEndSetProgressTimeSetProgressMessageClearProgressMessagesRotator Viewport BaseChange SettingsFalling locationidBotDesireabilityHUD!MutatorBroadcastLocalizedMessage PreventDeathHandleEndGameMutatorBroadcastMessage ModifyLoginScale TraceFirebFixedRotationDirLightBrightness LightColorTransientSoundVolumeTestStructBools SoundRadius PlayTurningbGameRelevant FinishNotifyMakeGroupStop NetworkingTestNullContextServerFeignDeath BumpButtonLogItemDeactivate bHiddenEdLogServerInfo PlayWalkingServerReStartGameLogStandardInfo GrabOptionInitforChunkUpLogNameChangeLogItemActivateLogTeamChangeDead GetIntOptionCheckIPPolicyPlayHitLogMapParameters LogTeamKillLogKill JumpOffPawnDeleteInventory TossWeaponTweenToSwimmingClientSetLocation AddVelocityLogGameParameters DrawScalePlaySelectSoundRestartPlayerPlayEnterSound PlayRecoil StopWaitingLogPlayerInfoFeigningDeathCheckVisibilitystomped ValidTouchPrioritizeArmorPlayerTimeout SpawnCarcass GetKeyValueFly ShowMenuMakeGroupReturn PlayCrawlingCheckWaterJumpSetMovementPhysicsLogPlayerDisconnectAddDefaultInventoryFindPlayerStartCdTrackClientWeaponEventViewPlayerNumPlayHeadDeathSelectServerSetHandedness PlayTakeHit TraceShot CanSpectateChangeCrosshair ChangeHudCombatbCollideWhenPlacingProcessMenuUpdateProcessMenuKey Suicided DropFrom ExitMenuMenuProcessInput PlayIdleAnimCheckTouchListPickupFunctionUseAmmo bMovable AdminLoginPickupMessage ProcessTouchMaxDesireabilityForceGenerateAccept Ambushpoint RoundRobin AdminLogoutHandleWalkingClientPlaySound ThrowWeapon LinkToSkybox Activated LensFlare CallForHelp DispatcherServerReStartPlayer OwnerJumped GetHumanName RateSelf StopFiring ModifyPlayer GiveAmmoProjectileFire FragmentStartTimeDemo StopTimeDemoMutatorTakeDamageOrders PlayHeadHit PlayGutDeathPrintActionMessageMassLanding CalcVelocity AlwaysKeepQuality GenerateMyDefaultWeaponServerNeverSwitchOnPickup AddMutator ActorLeaving IK_UnknownABInfo IK_UnknownB4 IK_UnknownB3 IK_Unknown8D IK_UnknownB6 IK_UnknownB7bEdShouldSnapObject IK_UnknownACPostNetBeginPlayAttachToSurfaceGlobal IK_UnknownC5 IK_UnknownB8 IK_Equals IK_UnknownB2 EncroachedByHeadZoneChange InitialStateFootZoneChange IK_UnknownAA IK_UnknownA9 IK_UnknownA8 IK_UnknownA7 IK_UnknownA6 IK_UnknownA5 IK_Slash IK_Period IK_UnknownB9ScriptedTextureActor IK_Unknown9B IK_UnknownAE IK_UnknownC2 IK_UnknownADRenderIteratorIK_Joy1 IK_Minus PainTimer IK_Unknown9C IK_Comma StatLogFile IK_UnknownB5 IK_Unknown98 IK_Unknown97 IK_Unknown96 IK_Unknown95 IK_Unknown94 IK_Unknown93 IK_Unknown92IK_ScrollLock IK_NumLock IK_Unknown8F IK_Unknown8EIK_F23 IK_Unknown8A IK_Unknown8C IK_Unknown8B AccelRate IK_RControl IK_UnknownA4 IK_LControlClientGameEnded IK_UnknownB1ProcessKeyEventPreSetMovementPrintTimeDemoResult IK_RShift IK_TildeRiseIK_F17 IK_UnknownC1* IK_UnknownB0 IK_LShift IK_UnknownC3 IK_UnknownC4 IK_Unknown9FDrawLevelAction AddString SaveTimeDemo IK_UnknownC6 IK_UnknownC7 IK_Unknown9E IK_Unknown9D CheckBobIK_F1 IK_GreySlashPlayPostSelect IK_UnknownAF IK_Semicolon PlayerSpeech LongFall IK_NumPad9HandleRestartGameServerChangeSkin IK_Unknown99 NormalFire FeignDeath StartZoomIK_Joy4 StopZoomIK_Joy7IK_Joy5IK_Joy2 IK_Joy14IK_RightBracket IK_Joy11IK_JoyU IK_UnknownEB IK_BackslashIK_ZIK_Y IK_Unknown5BIK_WIK_VIK_XIK_TIK_SIK_UIK_QIK_PIK_RIK_NIK_MIK_OIK_KIK_JIK_LIK_HIK_GIK_IIK_EIK_DIK_FIK_BIK_AIK_C IK_Unknown3F IK_Unknown3E IK_Unknown40 IK_Unknown3C ForceAddBot RespawnTime PickupQuery DrawText StartPlayerBroadcastRegularDeathMessageProcessServerTravel HomeBaseGetNetworkNumberInitGameReplicationInfoParseKillMessage InitLogging DrawTilePlayerKillMessageDiscardInventorybTravelbRotatingPickupPlayerJumpZScalingPlaySpawnEffectGetAddressURLEndGameCreatureKillMessage bNetOptional SendPlayer DelayedWarp RestartGame DispatchGainResetDelayNormalTrigger SetEndCamsDisplayMessagesProcessMenuEscape AtCapacityCheckReplacement DrawColor GetStringClientReceiveTestQLocalizedMessage RecurseTest OtherStatic BlockAll InputNumber ExitAllMenusTestOptionalOuttemp TestSwitchClientInitialize MenuTick MaxCarcassesArmorAbsorbDamage LogPings bEnabled AnimSequence ProcessLeftProcessSelectionAddFliesAndRatsCheckZoneCarcasses ProcessYesArmorImpactEffectCheckTouching ProcessNo ProcessRightEvents ClientFire SaveConfigs TextSizeLogoutIK_1 ForceFireIK_F20IK_F21IK_F18 ForceAltFireIK_F19GetShortAbsoluteTimeGetAbsoluteTimeClientAltFirePlayAltFiringProcessTraceHitIK_F22Team GameNameIK_F24 DetachDecal AttachDecalStandOpenTimed IK_Unknown89 IK_Unknown88BotVoiceMessage DecapitatedHandleHelpMessageFromTriggerOpenTimedClientSetRotation ClientDying VisibilityTimeDemoRenderUnknown explodedAdjustDesireFor TimeDemoCalcshot gibbedBy UnderLiftIK_F15IK_F16IK_F14 PlayBigDeathTweenToWalkingPlayLeftDeathPlayRightDeathIK_F13 PlayLeftHitIK_F12 PlayRightHitIK_F11TweenToFallingStylePreClientTravelIK_F10PlayWeaponSwitchIK_F9 AmbientGlowGaspGrabDecorationIK_F8DrawSingleViewDrawConsoleViewRepReceiveLocalizedMessageRepClientVoiceMessageRepTeamMessageRepClientMessage PlayDeathHitIK_F6FellOutOfWorldIK_F7IK_F4IK_F5TypeIK_F3ExplodeAttitudeToPlayerClearMessagesIK_F2 IK_GreyMinusIK_NumPadPeriod IK_SeparatorClientAdjustPositionGetBeaconText PlaySelect TweenDownWalk IK_GreyPlus SetFOVAngle IK_GreyStar ClientShakeTravelPreAccept IK_Unknown3B IK_Unknown3D IK_Unknown9ARaiseUp IK_NumPad7 PreTeleport IK_NumPad8SwimAnimUpdateActiveJump ServerTaunt AltFiringGrab IK_NumPad6 RestartLevel IK_NumPad2SetDesiredFOV IK_NumPad3 LightTypePossess IK_NumPad4 IK_NumPad5 IK_NumPad0 IK_NumPad1 IK_Unknown5F PrevItemDoJump IK_Unknown5EChangeAlwaysMouseLookChangeSnapViewChangeStairLook IK_Unknown5DSetNameChangeDodgeClickTime IK_OEMClearIK_PA1 IK_NoNameIK_ZoomIK_Play IK_ErEof IK_ExSel IK_CrSelLightSaturation LightRadiusIK_Attn IK_UnknownF5 IK_Unknown5CUK_Unknown10FIK_Unknown10E PlayRisingPlayFeignDeathIK_MouseWheelDown PlayDodgeIK_MouseWheelUp IK_UnknownF4IK_JoyVServerUpdateWeapons IK_UnknownEAServerSetWeaponPriority IK_MouseW IK_MouseZ IK_MouseY IK_MouseXIK_JoyRIK_JoyZIK_JoyYUpdateWeaponPrioritiesIK_JoyX IK_UnknownDF RotationRateIK_SingleQuote ShowPathServerSetSloMoUpdateSensitivity UpdateBob BehindView IK_UnknownDAIK_CtrlIK_LeftBracket IK_UnknownD9 IK_UnknownD8 IK_Joy16ServerAddBots ShowLoadMenu IK_Joy15 ShowScores IK_Joy13 IK_Joy12 ViewPlayerChangeSetHandIK_Joy9IK_Joy8 IK_Joy10IK_Joy6ChangeAutoAim IST_None IST_Press IST_Hold IST_Release IST_AxisIK_Joy3IK_None IK_LeftMouseIK_RightMouse IK_CancelIK_MiddleMouse IK_Unknown05 IK_Unknown06 IK_Unknown07 IK_BackspaceIK_Tab IK_Unknown0A IK_Unknown0B IK_Unknown0C IK_Enter IK_Unknown0E IK_Unknown0F IK_ShiftIK_UpIK_Alt IK_Pause IK_CapsLock IK_Unknown15 IK_Unknown16 IK_Unknown17 IK_Unknown18 IK_Unknown19 IK_Unknown1A IK_Escape IK_Unknown1C IK_Unknown1D IK_Unknown1E IK_Unknown1F IK_Space IK_PageUp IK_PageDownIK_EndIK_HomeIK_LeftIK_0 IK_RightIK_Down IK_Select IK_Print IK_Execute IK_PrintScrn IK_Insert IK_DeleteIK_HelpIK_5ProcessMenuInputIK_2IK_3IK_4IK_6IK_7IK_8IK_9 IK_Unknown3A+ ItemName-Z ClipMarkerMutatorLightScout SkyZoneInfo PathNodeTriggerMarkerInventorySpot Triggers SavedMove ButtonMarkerWarpZoneMarkerReplicationInfoPlayerReplicationInfo InternetInfo SpawnNotify KeypointDecalBitmap BrightnessCanvasCacheSizeMegsPlayer UseSoundNotifyLevelChangeConnectFailure VideoChangeRoleErrorTitle HearNoiseSpawnAutoExpiredEnemyNotVisible SeePlayerEndedRotationMayFall SpeechTimer LostChild KillCreditDetachNameCamera GainedChild LocalizeSpawned bWorldLog TO_SteyrAugs_p85s_PSG1s_HKSR9s_Ak47s_FAMASs_M3s_MAC10 s_Mossbergs_MP5NWarheadLauncher UT_EightballUT_FlakCannon Minigun2s_Glockripper s_DEagle SniperRifle PulseGun UT_BioRifleDoubleEnforcer ShockRifleSuperShockRifle Enforcer ImpactHammers_GrenadeConc s_Grenade s_GrenadeFBs_Knife ChainSawGetCacheEntry ActorBuffer ActorNode MaxItemsMoveCacheEntryRegisterMessageMutatorRegisterHUDMutator GetNGSecret SetNGSecretbAlwaysMouseLookWorldStatsURL DesiredFOV DefaultFOV UseCharge TweenToStill TweenSelectVisibleGroups TranslocatorTriggerTurnsOn bFirstHitBorderFlying FlashScaleSpriteProjForwardPlayVictoryDance AdminNamePlayOutOfWaterCSG_Deintersect ngSecretSetCSG_Intersect LifetimeConfiguredInternetSpeedME_CrushWhenEncroach BT_PawnBumpConfiguredLanSpeedMoverGlideType GetNextMap CrosshairMapsUseM_DeactivatedSwitchLevelMessage LargeFont ROLE_None DT_SpritebSinglePlayerOddsOfAppearingLT_None MTRAN_FadeClientHearSound bDifficulty0AlterDestinationDemoPlaySound DT_Terraform STY_None SpecialCostSTY_ModulatedbOnlyOwnerSee SLOT_Misc SLOT_NoneSetInitialStateLE_None LE_FireWaverTRAVEL_AbsoluteTRAVEL_RelativeTRAVEL_PartialLT_TexturePaletteLoop PHYS_FlyingPHYS_RotatingLT_TexturePaletteOncePHYS_Projectile LE_Shock PHYS_Rolling LE_SlowWaveDesiredRotation BuoyancyPHYS_Interpolating DODGE_Done DODGE_Active DODGE_BackDODGE_Forward DODGE_Right DODGE_Left DODGE_NonebJustTeleported LightConebBouncebRotateToDesiredPHYS_MovingBrushVolumeBrightness PlayerInput IK_JoyPovUpIK_JoyPovDownIK_JoyPovLeftIK_JoyPovRight LightPeriod PHYS_SpiderLE_NonIncidence PHYS_Trailer LightEffect LE_Unused LE_Rotor LE_CylinderLE_Interference LE_ShellLE_OmniBumpMap LE_SpotlightLE_WarpSleep LE_Disco SetCollisionLE_StaticSpot LE_CloudCastSetCollisionSize LE_FastWaveMoveLE_WateryShimmer SetLocationLE_Searchlight SetRotationLE_TorchWaver MoveSmoothAutonomousPhysicsPHYS_SwimmingSetBase PHYS_Falling SetOwner PlayAnimLT_SubtlePulse LoopAnim TweenAnim IsAnimating GetAnimGroup FinishAnimHasAnimFinishInterpolation SetPhysicsLT_BackdropLight LT_Blink PHYS_Walking LT_Strobe LT_Flicker UnPossess LT_PulseTrace PHYS_None LT_SteadyAcceptInventoryExtent FastTrace PostTeleportLogin InitGame BlockPlayerDestroy SetTimerbReplicateInstigatorMTRAN_SlowFade PlaySoundMTRAN_FastFade MTRAN_SegueMTRAN_InstantPlayOwnedSoundGetSoundDuration MakeNoise MTRAN_NonePlayerCanSeeMebIsPawnSLOT_Interface GetMapName SLOT_Talk SLOT_Pain SLOT_Ambient GetNextSkinSLOT_InteractBlockMonstersDemoRecSpectator GetURLMap GetNextInt bHighDetailGetNextIntDesc AllActors bIsItemGoal DetailChange ChildActors BasedActorsTouchingActors TraceActors SoundPitch bIsKillGoal bCanTeleport RadiusActorsVisibleActorsVisibleCollidingActors PreLoginROLE_DumbProxy LocalMessageShowUpgradeMenu bIsMoverMapListRenderTexture HurtRadius WalkTexture ScaledSprite ScoreBoard ScaleGlow GameEnding PostLogin SpotlightTestObjFatnessROLE_SimulatedProxySTY_TranslucentReplaceTexture STY_Masked bIsPlayerDrawColoredText STY_Normal VoicePack WayBeacon ZoneTriggerLogGameSpecialLODSet PostTouchDT_SpriteAnimOnce bCanJump LODSET_SkinDT_VerticalSpriteDT_RopeSprite LODSET_WorldDT_Mesh DT_Brush LODSET_NoneUpdatebUnlitDT_None bNetSpecial bNoSmoothTEXF_P8bNet bViewTarget TEXF_RGB32 bDifficulty3AvgPhysicsTimeMipMult bDifficulty2 bDifficulty1 Friction DesiredSpeedMaxDesiredSpeedUpdateTactics GroundSpeed WaterSpeed AirSpeedROLE_AutonomousProxyJumpZMaxStepHeight AirControlROLE_AuthoritySettingsMenuTypeSpawnNotificationLogGameSpecial2 Location AmbientSound SpecularHearingThresholdDiffuse PointRegion TEXF_RGB64 TEXF_DXT1 AnimFrame TEXF_RGB24LODBiasAdmin Mortared OrthoZoom FovAngleCriticalEvent DeActivated Corroded Eradicated DrawRectHealthLocationStrings DrawIcon DrawPatternSetClip SetOriginDrawTextClippedDrawTileClippedATTITUDE_FearATTITUDE_HateATTITUDE_FrenzyATTITUDE_ThreatenATTITUDE_IgnoreATTITUDE_FriendlyATTITUDE_FollowSetPos DrawPortal BRAINS_NONEBRAINS_REPTILEBRAINS_MAMMAL BRAINS_HUMAN IntelligenceBreatheDuckingZoneTerminalVelocityBigFont noise1timeZoneGroundFrictionZoneFluidFrictionMedFont noise2time SmallFontClear TimeDemo MenuTyping EndMenuing KeyMenuingOpenLog CloseLog SetMsgTick SetMsgPlayer GetMsgTick SetMsgText GetMsgText GetMsgTypeViewUp TeamTalk ViewDown IK_UnknownF2 IK_UnknownF1 IK_UnknownF3 FramesText SecondsText CombatStyle IK_UnknownF0TalkMaxTextSoundDampeningDamageScalingfpsText SetMsgTypeAvgTextPlayerReStartState MenuName NameArticle GetMsgPlayer LastSecTextPrecachingMessagePausedMessagePlayerReplicationInfoClassConnectingMessageMoveTo Watermark GetChecksum MoveToward FileFlush StrafeToFileLog StrafeFacingTurnTo TurnTowardLineOfSightToCanSee FindPathToGetBeaconAddressLoadingMessageAltNameFindPathTowardTriggerTurnsOffFindRandomDest ClearPaths EAdjustJumppointReachableactorReachablePickWallAdjustFindStairRotationWaitForLandingFindBestInventoryPathLogSpecialEventGetMapFileNameAddPawn RemovePawn PickTargetExecuteWorldLogBatcherSuggestDefenseStyleBrowseRelativeLocalURLExecuteLocalLogBatcherPickAnyTargetExecuteSilentLogBatcher NameColorMessageNoAmmo LocalLogDirAltRefireRate WorldLogDir SpecialFireCheckFutureSight AIRatingTeamBroadcast RefireRateSendGlobalMessageWorldStandardMaxTargetRange LogVersionInventoryCapsStringSendTeamMessage SpeedOfSoundNeverSwitchOnPickup M_Selected M_ActivatedIcon ShortNameThirdPersonScale FearThisSpot ServerName GetRatingPickupViewScale BobDampingPlayerViewScalePlayerViewOffset ItemArticle PlayerPathPlayAmbientSoundEffectAutoSwitchPriorityPlaySoundEffectKillInstigatorPlayersPlaySoundEffectScreenFlashScaleOtherTriggerTurnsOff NumToCountOtherTriggerTurnsOnOtherTriggerToggles FovModifierbInitiallyActive TT_ShootTT_AnyProximityTT_ClassProximityTT_PawnProximityTT_PlayerProximity RateModifierPlayReceivedMessageGameSpeedModifier WhiteColorHUDConfigWindowTypeMultiDecalLevel DrawMenuSetFontBrightness NoString YesStringEnabledString CenterStringDisabledString GetMultiSkinSetSkinElement SetKeyframe bDecorative bCoopStartbSinglePlayerStartDDAACCAAPlayMovingAttackPlayWaitingAmbushEEDDAABBTestContinueDoUntilTweenToPatrolStopTestContinueForEachPlayThreateningPlayPatrolStopTestContinueWhilesxxpppbTrue1ShowMiniScoresbTrue2 BT_AnyBump CountMessageSetDodgeClickTime GetOffset GetFontSizeBT_PlayerBumpDrawCrossHair SnapView SetFriction RememberSpotME_IgnoreWhenEncroach LEVACT_None CopyMessage ScoreEvent bChaseCamAddBotPlayerWaitingPlayerSpectating ActivateItem LeftString PlayDive InvalidState MutatorClass MaxPlayers IPBanned IPPoliciesWrongPasswordMaxedOutMessage NeedPasswordNameChangedMessageFailedTeamMessageEnteredMessagePlayTakeHitSoundDeathMessageClassFailedSpawnMessage LeftMessageFailedPlaceMessageGameOptionsMenuTypeMultiplayerUMenuTypeGameUMenuType skinnedFragRulesMenuType BotMenuType shaketime SetViewFlash GameSpeed bPauseablebRestartLevel AttitudeTo aimerrorNM_ListenServerNM_DedicatedServer AdjustToss NM_ClientLEVACT_PrecachingLEVACT_ConnectingLEVACT_SavingLEVACT_LoadingSummonDefaultTexture TimeDilation KillPawnsWarpUnWarp ZoneActorsMaxLightingPolyCount SetJumpZMaxLightCountMinLightCountMinLightingPolyCount CutoffHz MasterGainSloMo TexVPanSpeed TexUPanSpeedSetSensitivitySetBobGodAllAmmo InvisibleDownSpecialDamageBurnedShowInventoryGhostORDERStrLenFighter DrawActorDrawClippedActor AmphibiousDodgeClickTimeME_ReturnWhenEncroach ReplaceWithConBackground TimeDemoFontFrameRateTextMinTextSavingMessageSetProgressColorAddBots ReplaceTextRegisterDamageMutator PrevWeapon LinkSkelAnimMoveAutonomous SwitchLevelSwitchCoopLevelUsedUpCSG_AddCheckValidSkinPackage ResetGameGetPlayerChecksum MOTDLine2 MOTDLine1 HasOption GetGMTRef InitialCheck Transition LogMutator shakemag shakevert InvertMouse SplashJump BatchLocal MyAutoAim HandednessSuggestAttackStyle FlashLengthProjectileSpeedAltProjectileSpeedbKeyboardLook CauseEventWorldBatcherParamsWorldBatcherURLLocalStatsURL bCanThrowLocalBatcherURLDecoderRingURLGameCreatorURL GameCreator LogInfoURL SetAutoAimbToggleSteadyFlashInventoryGroupDamageInstigatorDisplayMessagebStopCountDownCompleteMessagebHighDetailModeKillAllFOV SetSpeedFrag RightString ToggleZoom LocalTravel AllowChunkbMaxMouseSmoothing GetWeaponInterpolateTo bNoFlashCreateReplacement bMessageBeepDrop FollowHolder FormatFloatActivateInventoryItemSetMaxMouseSmoothing MaxDist2DPauseSetMouseSmoothThreshold describeSpecKickTestContinueForAAMouseSensitivityKickBan TestLimitorTestX QuickLoadSTestMouseSmoothThreshold QuickSave MoveTime GetColorAssembleStringxnum NextWeaponMV_MoveByTimeMoverEncroachType bChangesYaw ActivateHint TempScale PostScale ExtraCost CheatView CSG_SubtractInventoryCapsFloatLocalStandard PlayerFlyingDrawStatusIconAt bLocalLogServerLogName PlayersOnlybCanViewOthersAutoAimMaxTimeMarginMaxSpectatorsSpeechDropInventoryQuickSaveStringNoPauseMessage ViewingFrom OwnCamera FailedViewNM_Standalone bNoCheating bAmbientGlowCalcDrawOffsetbEndPointOnlyShowSpecialMenubMoveProjectiles SinglePlayerAmbientSaturationSShot ZoneGravityResetKeyboard UpdateURL LogGameStartAlwaysMouseLookClientAdjustGlowGetDefaultURL ViewSelfGetEntryLevelGetPlayerNetworkAddressCopyToClipboardPasteFromClipboardPing MuzzleScale SelectionClientInstantFlash FunctionKey RandSpin GetFreeMove bFirstFrameClientChangeTeam MaxSpeed StairLookProfilebAffectAllPlayersRenderComplexMessage ClearMessageHUDLocalizedMessage MenuInitNumKeys PlayerList ClientFlash ActorClass HelpMessageClientReliablePlaySound GetLocalURLbCanChangeSkin CSG_Active StayOpenTime GetRulesMV_GlideByTimeGetInfoME_StopWhenEncroach MainScaleDefaultPlayerState StatLogClass Difficulty PlayerWakingDefaultPlayerNameWidthConstState TextBuffer Function SubsystemLevelPlaneMusicAudioSubsystemRot DescriptionAuthor PrimitiveNetConnectionEnumBobHeightClientClassExitInputGuid PropertyDieSwitch realbDuck bRealJump realbRunMapName CurrentMoveOldLocDirNewLocYPrefixCarriedNewVelZNewLocZAdjPColNewVelY maxPitchViewYawNewVelX newAccelnewFOVNewLocX OldTimeDeltabForceAltFirebFired TotalTime OldDodgeMove SoundPlayer OldbDuck NewbDuckOldbRun CurrentSkin OldBobTimeNewbPressedJumpOldBase NameEndingOutTeleporter bSaveDefaultNewMove NewOptionSpawnRotationOldMoveTargetWeaponViewOffset LastMove aMenuClass NetMoveDelta SpawnOwner ViewPitchTargetViewRotationTargetEyeHeightngWorldSecret BuildAccel DeltaRotLocDiffProgressTimeOutAccel OldAccel OldTimeStamp clientErr AccelNorm InTeleporterCurrentTimeStamp Loudness DeltaTimeViewOther newPhysicsMinRate ClientRoll TweenTime DodgeMove SavedMoves realWeapon bAltFiredaExtra3 bForceFireaLookUpfogNewbJumpStatusaMouseY bNoOverrideASound SmoothMouseYBorrowedMouseXIP Sequence bInterruptbVolumeControl ZoomLevel bUpdating ClientLoc bFixedCamera NewOwnerNewbRunNewBase DeltaSecondsInAccel bJustFired bIsTyping bNoVoices TimeStamp SkinName SkinDescDelta BaseClassNumNewBlockPlayersResultEntry CommandLinebDelayedCommandOption bShowMenubWokeUpSpeed2D bShowScores MatchTagSkin4OldTeamSkin3Skin2 bIsTurning EventTypeSkin1bClientDemoNetFuncHitLocHitNormaClassNewSongVolumeshake InstantFogSlot bIsCrouching bShakeDir NewSectionbLookUpStairsConstantGlowFog bNetFeel NewCdTrackbNetSee NewValue ScoringTypePackageNewTransition TravelType ViewTargetMisc2 bNetOwnerLandBobbLoopLastPlaySoundURLDodgeClickTimerusealt NewTimerRateTagMultiply_FloatColorSpawnLocationdepth newHeadZone StepLocation DemoViewYaw ClassNameDemoViewPitch MeshName SpawnTag RelatedPRI_2PKiller PhysAlphanode NetDriver SmoothTime FOVScale MouseScale AbsSmoothX AbsSmoothY MouseTime SpawnClassbound bTraceActors EDodgeDir WeaponName actualDamage TraceStartshooterbActorShadows VolumeFogMesh BestTargetClientUpdateTime bLeadTargetProgressMessage damageScale projSpeedProgressColorPTarget TraceEnd MomentumIndex goalscale FullNameRollMag NewWeaponLastUpdateTime TimeMargin bUpAndOutServerTimeStamp Callsign HitLocationDamage bSaveJumpbTypingTransientSoundRadius MultiSkins FreeMoves PendingMovebForcePhysicsUpdate bCarriedItemNewZone HitNormalEventInstigatorbNeverSwitchOnPickupaExtra0bHitSlopedWallspot DesiredDist WallOutDist bAlwaysTick cameraLoc cameraRottriesbesttrynewdist startYaw S_CameraadjZmaxZ PlaybackGRI bOwnerNoSee bShadowCastVisibilityHeightVisibilityRadius ECsgOperaExtra1aExtra2 prevGroupaExtra4 TraceDirrealHitUnusedLightMesh PostPivot bFoundWeaponPrevaUp BrushColor bColoredEMoverEncroachTypeaStrafeaTurn aForward StartTrace nextGroupEMoverGlideTypeRateaBaseZ bCanStrafebUpdatingDisplayaMouseX bFixedStart MutateStringaBaseYbCanDoSpecialbCanFlyaBaseXBorrowedMouseY bDrowningMouseZeroTime SpecialMenu SmoothMouseXEncroachDamagebTriggerOnceOnlybSlavebUseTriggeredbDamageTriggeredDelayedCommandStruct bFromWallaPawnbAutoActivatebPausebStopAtLedges Follower ReturnGroup DelayTime bMeshCurvy OpeningSound OpenedSound ClosingSoundbCheatsEnabledbNeverAutoSwitchKeyPos bJumpStatusBasePosOldPos OldPrePivot SavedPosInvItemOldRot SavedRot bIsFemale bIsHumanTriggerActor2bJustAltFired bOpening bDelaying bClientPause bPlayerOnlyRecommendedTrigger SimOldPosSimOldRotPitch SimOldRotYawSimOldRotRollSimInterpolate RealPosition RealRotation ClientUpdatebMeshEnviroMap bRandomFrame NewRotation bReadyToPlaybTwo bZoomingDP2Dist1 bMouseZeroed NewLocation NewKeyNumDefaultSkinNamebIsMultiSkinnedNewWeaponClassbRisingSprite ERenderStyle bCenterView bTempEditor bReducedVis LastItem NewHeight bMemorized bSelected Acceleration Velocity ColLocation NewRadius ParametersNewBlockActorsModel OldLocationIdAFont S_Keypoint bPressedJump NewColActors S_InterpB RenderDevice OtherPawn PainTime SightCounterbSkipNextPath HeadRegionSeconds bInvertMouse SpecialTag GameClass bTeamGame RenderBaseOptionsRenderInterfaceCommandRenderIteratorClass SecondCount Language Direction UpdateTimerbAnimTransition MinHitWall NewVelocity AdminEmailColors Cylinder EInputAction MOTDLine4 ETravelType PRIArrayFragAcc PlayerNameOldNameEnemy LastSeenTimebClientDemoRecordingTeamIDScorefirstHasFlag PacketLossbIsABotbFeigningDeath bIsSpectatorbWaitingPlayerbFoundEndPlayerLocation StartTimeTimeAccMinDistContextbWorld bEdgeRight MessageTypeWait bEdgeLeft bEdgeBack bEdgeForward bWasRight bWasLeft bWasBack bWasForwardbItems bSnapToLevel CarcassTypePRI shaketimerbAdmin RecipientNext CollisionTag JumpSound InstantFlashWalkBobbSimulatedPawn verttimer maxshake SongSectionGameSongbDemoRecordingbQuietDesiredFlashFogDeleted AbsoluteTimeGMTRef Touching LatentActor LatentFloat LatentInt LatentByteNetworkNumber SpecialIDConstantGlowScaleSpecialParam2DesiredFlashScale bNetHearbestAim AttachTagRegion KillerIDHUDTypeKillerWeaponNameVictimWeaponName InstigatorTargetScoringInstigatorStringmyHUD FlashFog bNetRelevantZoneRendMap AnimRate MinWeightbPredictRespawnsArg2Arg3Arg4 TimerCounterMisc1 TimerRateReasonbExtra3 AppliedBob ShowFlagsbobtime bNetInitialNewDestinationspeed NewTarget NewFocus FilenameSimAnim bClearPaths HitSound2 nextPawnZoneTag OldAnimRate ZoneVelocity Passwordnoise2loudnessStart noise1otherLoc NumCarcassesbIgnoreHiddenFloorEIntelligence checkNorm SpecialPause EntrySoundrating EntryActor ExitActorSubtract_ColorColor checkpointSpree WallNormal AnimMinRate bGravityZone bPainZone bDestructive bNoInventory splashSizebBounceVelocityOwnerAmbientBrightness AmbientHuesplash FogColor FogDistanceEnvironmentMap AnimLast newFootZoneViewFog ENetRole bReverbZonebRaytraceReverb StepNormal PendingTouchMultiply_ColorFloat EPhysics bSimFall bClientAnimLensFlareOffsetLensFlareScalebBeepSeen NoiseMaker PhysRate RelatedPRI_1bTrailerPrePivot TempSkyZone OtherSideURLThisTag bNoTeleFrag iWarpZone WarpCoordsOtherSideActorOtherSideLevel DestinationsnumDestinations bAlreadyDeadVelOptionalObject nextPickbTrailerSameRotation NewClasssmooth TimeSecondsYearMonthDay DayOfWeekHourMinuteSecond MillisecondIdealPlayerCountRecommendedEnemiesRecommendedTeammatesLevelEnterText LocalizedPkgPauserSummary bLonePlayer bBegunPlay bPlayersOnly DodgeDir bDropDetailbAggressiveLOD bStartup bHumansOnly DamageAmount bAllowFOVPlayerDoppler ScreenshotHubStackLevel ELevelAction DamageRadius DamageName bWarnTargetcarcVictims LevelActionbNeverPrecache ENetModebCoronabInterpolating bLensFlare VolumeRadiusNetMode ComputerNameEngineVersionMinNetVersionDefaultGameTypeNavigationPointList PawnListNextURL bNextItemsNextSwitchCountdown AIProfile AvgAITimebCheckWalkSurfacesCameraLocation bForceStasis ItemGoals KillGoals SecretGoals ViewDist bNoMonstersbMuteSpectatorsCameraRotation ViewActorbCoopWeaponMode bLowGoredist bVeryLowGore bDeathMatch bGameEnded bOverTimebAlternateModevertmag LightPhasegoalFogDefaultPlayerClassDefaultWeaponposNumSpectatorsAdminPassword GamePasswordScoreBoardType GameMenuType HitActorT2T1 ELightEffect LightHue NewTexture MapListType MapPrefix BeaconNameSpecialDamageStringlookDir SentText NewStyle bEnviroMap bLightingMultlandVolS_Pawn Palette3 bJustLanded impactVel bBehindView ELightType bNotForward CurrentID bIsWalkingEMusicTransitionDMMessageClass MyAnimGroup BaseMutatorDamageMutatorWaterZoneType ESoundSlotGameReplicationInfoClass OldDodge LocalLog WorldLog OldRotationAnimGroupName bBatchLocal bLoggingGameLocalLogFileNameWorldLogFileName currentRot DemoBuild DemoHasTutsbIsSecretGoal bTimerLoopbDynamicLight ResultSet bHurtEntry NextMutator NextDescEnabledMutatorsbLightChangedbTicked bAssimilated FirstHit bDeleteMebSuperRelevant bAnimByOwner bAnimNotifyPairKeyValuePlaybackActorInKey bAnimLoopInOptLeftOptMClassbAnimFinished LocalPlayer Palette1Address FailCode InPasswordS_ActorLastMatchingPolicyPolicyMaskbAcceptAddressbAcceptPolicy FontColor ParseString CurrentValuePortal StartSpot NewPlayer TestPlayer PawnLinkInNameInSkinInFace InChecksumInTeam bWarpingTextTexExiting bMessageVL WeapClassUL incomingNameDestTelaPlayer foundStartU KillerWeapon OtherWeaponbSpecialDamageYLXL KillerName VictimName LocalTimeJunk3Junk2ViewerCsgOperJunk1injured EndTrace EventName EventActorSourceTexture NotifyActor CompFormat CompMipsweapMips bNameChange Accumulator MaxFrameRate MinFrameRate PrimeCurrent PrimeCount IncomingbOutbSound AnimCurrent AnimNext broadcasterELODSet bHasCompNextDamageMutatorbRealtimeChanged bParametric bRealtimebHighTextureQuality EBumpType aClassNamebHighColorQualitybResultbX7bX6VictimbComplexString bIsSpecial bIsUniquebIsConsoleMessage bFadeMessage bOffsetYPosbReducedSpeed ChildMessage bFromBottombX5XPosYPosbCenterdotpMessageStringbX4 bCanWalkbX3 bCanSwim HitVec2DClipYHitVec BumpTypeMapNumbCanOpenDoors CurrentMapRegFont OwnerHUDKeyNum PrevKeyNumbFalse1 bLOSflagbFalse2bBool1bBool2BrushRaytraceKeyWorldRaytraceKey OtherTimeMyArrayv1v2 TestRepStrPieStrLotusbDynamicLightMoverb1b2b3STbX2 bMirroredo TempActorbPortaltooo bAvoidLedges bResourcebHighShadowDetail bHunting bGouraud bSpecialLit SavedTriggerPlayerBumpEvent BumpEvent bJumpOffPawn bHighLedgebDirtyShadows bCloudWavy bNoMergeTC PlayerOwner LeftListbShootSpecialLeaderDamageThresholdnumTriggerEvents ClosedSoundbLowShadowDetail messageIndex bWaterWavy S_Pickup ownerTeamtaken bSmallWavy bBigWavyVisNoReachPathsvisitedWeightbestPathWeightnextNavigationPoint nextOrdered prevOrdered startPath previousPathcostMoveAmbientSound bEndPointKeyRot bSpecialCost bOneWayPathbNeverUseStrafingBaseRotiSpec ReachFlags DistanceSeekerSourceLiftTagMyLift LiftTriggerLastTriggerTime MaxZDiffAdd TriggerActor LiftOffsetdist2dmarkedWarpZone markedItem S_Player TeamNumber myMarker WaitingPawn bAutoVPan S_TeleportProductRequiredbChangesVelocity bParticles bReversesX bReversesY bReversesZTargetVelocity LastFiredoldYawmagoldDir survivecount bSnipingS_Flag S_Patrol Nextpatrol pausetime PatrolAnim PatrolSound numAnims AnimCountNextPatrolPointEffectWhenDestroyed bPushablebOnlyTriggerablebSplash bBobbing bWasCarried PushSound numLandings contents content2 content3 EndPushSoundbPushSoundPlayingbOneDP1newVel HitNormall decorMass2 tempClassDist2 FragType FragSkinDSize NumFragsToucher OldKeyNumoldZ S_CorpsebPlayerCarcassfliesratsbReducedHeight PrePivotbSlidingCarcassCumulativeDamageBugsSkin bAutoUPan bTwoSided EDrawTypebFakeBackdropbSeen bModulate bSemisolid ParentMenuTeamNum MenuLengthbConfigChangedbExitAllMenusNewSkin MenuListSkinNo FaceNamebEdSnap SkinActor bHighlighted MenuTitle bEdLocked bCountJumps bEnvironment bNotSolid bTransparent bInvisible HitSoundFootstepSound MacroTextureDetailTextureBumpMapFormat InputStringETextureFormat IDC_WAIT IDC_SIZEWEKeyNo IDC_SIZENWSEbAdvancedTacticsLastRenderedTime IDC_SIZENS IDC_SIZENESW DecalDirbBright IDC_SIZEALL ActionNumHudModehand MainMenuTypeTraceDistance Rotation MainMenu HUDMutator LocationName RelatedPRI EndOfLife bDrawing numLinesStringMessage StringFont NextLocation PositionM1M2 IDC_ARROW decorMassStartXStartYSelectedCursorCriticalString instigatedByPNamePZoneAdd_ColorColor S_Trigger ETriggerType SpeechTime OldWeapon FootRegionLink bEndOfPath TriggerTypeNewItemClassProximityTypeRepeatTriggerTimeReTriggerDelay TriggerTimeAimSpotCurrentNetSpeed DesiredClass MoveTimer bWasActiveScreenFlashFog bKeepTiming S_Counter S_Ambient bShowMessagebClassicDeathMessages OriginalNumWindowsMouseY S_Dispatcher OutEvents OutDelaysWindowsMouseX bSilence bOnceOnly DestinationS_SpecialEvent bBroadcastbPlayerViewRot MoveTarget FaceTarget MeleeRangeInvFocusRemainingTime ElapsedTime S_InventoryRemainingMinute SumFrags bActivatablebDisplayableInvbActive bSleepTouch bHeldItem bTossedOut AlertnessbInstantRespawnbSuspendPrecachingbShowWindowsMouse StimulusPeripheralVisionbWindowsMouseAvailablePlayerLastTouched LastSeenPosPlayerViewMeshASpotLastSeeingPosPickupViewMesh SurfListThirdPersonMesh MOTDLine3 StatusIconProtectionType1ProtectionType2ChargeArmorAbsorption bIsAnArmorAbsorptionPriority NextArmorvfExecbSteadyFlash3rdGameEndedCommentsvfOutbMuzzleFlashParticles bNoSpeakbSteadyToggle FlashCountOldFlashCountMuzzleFlashStyleMuzzleFlashMeshMuzzleFlashScaleMuzzleFlashTexture PickupSoundActivateSoundDeActivateSound RespawnSoundbroadcasttype TeamName PlayerID ExtraTagPickupMessageClassItemMessageClassDeathsBot AlreadyHasdesire bCheckedCurrentTickRate bUseAltModeSender DrawOffset WeaponBob PawnOwner ClientCycles GameCycles TickCyclesRenderCopyNetworkDevice AudioDeviceGameRenderDeviceStartLocationPendingWeapon TalkTexture PlayerZone MessageID FirstArmorReducedAmount ArmorDamage InsertAfterbHint S_WeaponLocalBatcherParams AmmoName ReloadCountPickupAmmoCount AmmoType bPointing bInstantHitbAltInstantHitbAltWarnTarget bWeaponUpbChangeWeapon bLockedOnbSplashDamagebGlobalbRecommendSplashDamagebRecommendAltSplashDamage bWeaponStaybOwnsCrosshair bHideWeapon bMeleeWeapon bRapidFire bSpecialIcon FiringSpeed FireOffsetProjectileClassAltProjectileClass MyDamageTypeAltDamageTypeCurrent ViewRotation SelectedItem OtherTag LightingTag FireSound AltFireSound CockingSound SelectSound Misc1Sound Misc2Sound Misc3SoundNetTag EventString AdjustedAimbSetFlashTimebDrawMuzzleFlash bMuzzleFlash FlashTimeBaseEyeHeightFlashYFlashOFlashC bestDistFlashS MFTexture MuzzleFlare FlareOffset bPlayerOwner projStartFireDir ChecksumOldAmmobTempbSwitch bHaveAmmo Recommended oldRating oldFiringoldMode SpecialParam ProjClassbWarn AccuracyStandingCount NumCopiesbCanHaveMultipleCopies bCanActivateExpireMessage MiscNumberAmount VictimIDS_Ammo AmmoAmountMaxAmmo ParentAmmoUsedInWeaponSlotPAmmo AmountNeeded AmmoToAdd KilledIDMomentumTransfer SpawnSound ImpactSound MiscSound ExploWallOutExplosionDecal TestLocationXLevel spinRate FragmentsnumFragmentTypesanActorExplosionSizeArg1DamS_Light ChangeTime bInitiallyOn bDelayFullOn RemainOnTimeInitialBrightness poundTimeiLeaf ZoneNumber TweenRate DamageEffect EffectSound1 EffectSound2 ConsoleBackShadowvtblOut MaxBorder MaxLines MaxHistory TextMsgSize HistoryTop HistoryBot HistoryCur TypedStrHistory ScrollbackTopLine TextLinesMsgTime MsgTickTimeMsgTextMsgType MsgPlayerMsgTick BorderSize ConsoleLines BorderLines BorderPixels ConsolePos ConsoleDestFrameXFrameY bSinglePath bNoStuff bNoDrawWorld bTimeDemobStartTimeDemobRestartTimeDemobSaveTimeDemoToFile ExtraTimeLastFrameTimeLastSecondStartTime FrameCountLastSecondFrameCountMinFPSMaxFPS LastSecFPSaPoint EyeHeight RouteCacheOldMessageTime VoiceType VoicePitch AlarmTagcarriedDecorationSharedAlarmTaghome NextLabel NextStatebExtra0bExtra2bExtra1 bWatermarkbFire bFreeLook bAltFirebDuckbStrafe bSnapLevelLogAr StatLogFinal NewMsgTextbZoombLook NewMsgTypebRun WaterStep NewMsgPlayerLand HitSound1 NewMsgTickAction BigMessageYStartYEndLineiLine TypingPromptShortMessages ExtraSpace NextMoveLastPainSound PlayerMenu S_ZoneInfo noise2other bSaveToFileAvg AvgStringATextLTextH noise2spotnoise1loudness Texture0 noise1spot Texture1 EAttitude Texture2 Palette55Skill Texture3 Palette57SpaceXSpaceYOrgXOrgYClipXCurXCurYCurYLSizeXSizeY FramePtr RenderPtr SpecialGoalCRUnderWaterTime WireFrameClearZZonePlayerEventZonePlayerCount bCheckHotKey DamagePerSecXBYBDropWhenKilled CamActor CamLocation CamRotationReducedDamagePctReducedDamageType SpecialMeshSelectionMesh DamageString ZoneNameRectXRectY ExitSoundSkyZone SecretCount DieCount KillCount ItemCount bWaterZone bFogZone bKillZone SplashTime bNeutralZoneString StrPropertyStructPropertyRadiusbTwoWayWith Palette9Replace bAutoBuiltArrayPropertyWallSoundLocationbUpdatePosition ScriptTextbFilterByVolume newSecretNextHUDMutator bHUDMutatorClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty BytePropertyXYCL bSpecialMenuMbBadConnectionAlert bAllowPickupAnim ActorProxyNextMessageMutatorPaddingbWorldBatcherErrorFrame NewFilename ReceiverbScriptInitializedReceivedSecretChecksum NextNode ObserverMessageMutator SkelAnim Palette59 bProscribed S_ClipMarkerpkg SkinItembExternalBatcherbLowResbFrozen SkinPackItemS_ClipMarker3LastMessageWindow Palette61 Palette65 Palette29S_ClipMarker2S_ClipMarker1 Palette63 OldScoreMsg PolyFlagsNGroup ReturnValuejRiVBaseYawNewRotCoordsTimeGetPropertyTextSetPropertyTextDynamicLoadObjectGetEnumLenGAlphaStKeyNameRoll NewStatePitchWD NumPlayers EInputKeyf:T"":::$-e ::$-e--U ::$-\-e ::$-\:j:$-\-P-Q ::$-\-P-Q ::$-\-P-Q"::$ a/!  ::$::$ 7\tԝXГX'1111 1111111Г111Г11111111111ԝX1111 t{#U =$:ettt ԝX   Гttttt  =$:e/yrүԝXX'<G<G<G<G<G<G<G<G<G<G<G<Gtt{#U{#U ԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝX{#U{#U{#U bQ23%ГГГ {#UtttԝXԝX<GԝXԝXԝXX'X'X'ГX'X'ГX'  ԝXԝXԝXГԝXГГГГГГГГГГГГГГX'11tt t{#Ut{#Utttt  ttttt ttt{#U{#UtttX'X'X'X'X'ГX'ГX'{#UX'R$=X$?Z$C[$HC{$C^$C_$A`$L=p U$@Eh$?r$@Gs$By"d^ NS$ W$ r$?s$?wBy] a ~]eF8F Ry Y.\B @@$@<sdjKvs :nP F$@ZFF_V::$-e ::$-B :j:$ ::$::$-e -Cw~* ::$-e -C-\::$-q-L ::$- "-U-~  :j:$ ::$- :G:$ :G:$"-U-~  :j:$ ::$:j:$-W-:j:$-U-~ -s-W$:j:$-U -~ :j:$ :K:$-U:G:$1:j:$-e -C-\::$::$:G:$ -R-k-e ::$:G:$ ::$:G:$ ::$::$:g:$ ::$::$'ԝXxWԝXԝXԝXԝXԝXԝXttt  =$:ettt ttt  =$:ettt l8o$?M$?QUTQLNKkF  h:e$?l$?qv$BTB @[@@$?($A)$Asv$BF$?c$Bk0u0- ::$@`61 w$?n] Untitledo]NoneP}d$?vM.LSQ.X. -e ::$-e ::$-\ ::$::$::$::$::$::$ -\::$::$::$ -\:j:$ 6q > YtttԝXԝX R~R~R~R~R~R~ԝXԝXtttttX'tttԝX   {#U{#U{#U{#U {#U{#U{#U{#U 11111{#U{#UГX'11X'11ԝXԝXtttttX'ttt t{#UttԝXԝXtt ԝXԝXГГX'Г    n]Hn]Hn]Hn]H )5IГГГX'ГX')5I)5InkbԝXtԝXԝX1   i'n 6ГѸBѸBГX'ГГГГ X'X'  IR@G]I&/IR@GIR@G  ԝXtt{#Ut{#UԝXԝXtt{#Ut{#UԝXttt{#Ut t{#UԝX {#Utt> Yt{#U  {#U   ГԝXX'{#UX'X'X'{#UX'X'ГГГГГГГГГГГГX'ГГX'X'ѸBtX'X'X'Г)5IX'X'ГГX')5I)5I)5I)5I)5I)5IГГГ ttt{#U> Y> Y    ttttt{#U> Ytt   =$:eГX'X'X'X'ѸBX'X'X'X'ѸBX'X'ГX'ГX'X'X'X'ѸBX'X'X'ѸBX'ГX'ГX'X'X'X'ѸBX'X'X'X'ѸBX'X'ГX'ГX'X'X'X'ѸBX'X'X'ѸBX'ГX'X' =$:eX'X'X'  ttt{#U{#Ut  =$:ettttt> Y> Y> Yt ttt  =$:ettt  &   &   &   & {#Uy 4 tttt{#U{#UttԝX{#U > YX'ԝXԝXԝXԝX )5Im OXR~R~R~R~1<GR~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~X'ttttttR~tt{#UR~R~R~R~R~R~IR@GR~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~ttttttR~tt{#UR~R~R~R~R~R~R~R~ԝX<G<G<G<GX'X'IR@GIR@GԝX{#UIR@G{#Uy 4IR@GIR@G]I&/)5IIR@GIR@G]I&/)5IOEl{#U{#U  {#U tt{#Uttt{#U{#Ut{#Ut{#Uttt{#Ut{#UX')5IX'{#U{#UUV$u:c???j$Bk$B}x$?y$h~Y\^k$@@p^]\[ZYXW V U T S RQPONMLKJIHG F!E"D#C$B%Aq$)\=J$@@N] Quick SavingO]Game is not pauseableP]Now viewing fromQ= own cameraR]Failed to change view.{v@OW$>U$ EeS^ F$@@j8k8 rO!::$-e::$3rГԝXГԝX tttttԝX  &   & ttГ ԝX ttԝXГԝXtt ԝXԝX111111ԝXГГГГГГГГГГГГГГttГГГ  &   & t  ГГГГГtttԝXttttaҗOtГtГtГГxxԝX> YԝXtxU_ V]Snagged an item.D]aB$?A$u?@$?|$?X$ ף;pJy] activated.x= selected.G] deactivated.8k V;K U^ ($A)$A<}s :ni:n0uF$33?c$ Ay E0F0^"f ::$ {#Uy YQZ1wFzԝXwFzwFzwFz> Y> Ytb c$@[A\AZ-e ::$3LX'ГԝXtԝX> Y> YtttttѸBtttѸBtttttѸBtttԝXttԝXttԝXttԝXtѸB> YtԝXѸB> YtԝXԝXtttԝXttѸBѸBԝXttѸBГtttttX'tttX'tԝXѸBttѸBtѸBѸBѸB> Y> YX'X'> Y> Y> Y> Y> Y> Y ГГГГГГX'X'X'tX'X'ѸBГtГГX'X'X'ѸBѸBX'tX'Гt  &   & ГtГtГГГГГГѸBttX'X'ѸBX'ѸBX'X'ѸBX'ѸBX'ѸBX'ѸBttX' t_t_t_t_> Y> Y> Y> YtxxxxxxxxxxxxxxԝXtxttttѸBѸBѸBtr$EC|$zD}$zDl$ Ds$Cf$=t$@m$=o$?i$?g] has no ammo.y]%o was killed by %k's %w.f*j$@{$=GKV]You got a weaponN]WeaponP $AC:cAX$?z]( ](L"##h) XB;F1 6A XU[ttttt=$:eԝX& & & & & & & & > Y> Y> Y> Yt{#U& & & & t{#Utt{#UtttГГԝXԝXԝXԝXtГttX' =$:etX'ttX'tX'X'X'tX'X'tttГГГ=$:ettГГt1=$:e=$:ett{#Uttt{#U=$:etttX'ttt& & t{#Ut{#UtX't{#U& & & & ttttttttttX'ttX't{#Ut{#U& t{#Ut{#U& t{#Ut{#U& t{#Ut{#U& t{#Ut{#U> Y> Y> Ytw4w4tw4ttttttttw4w4tttttXEx8Q hQ hQ httt=$:ettX'X'tX'X'X'X'=$:et{#Uttt{#U& & > Yttt> Ytttt> Yttt{#Ut> Y> Y> Y> Y> Y> Y> Y> Yt=$:et> Y> Y> Y> Y{#U{#U> Y{#U> Yt> Yw4w4> Yw4> Y> Y{#U> Y> Y> Y{#U> Y> Y> Y> Y{#U> Y> Y> Y> Y{#Uw4& & > Y> Y& & & & & & > Y> Y> Y> Y> Y> Y> Y> Y=$:e=$:e=$:eԝXԝXԝXԝXԝXԝXԝXtԝXԝXԝXԝXԝXԝXԝX1& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & > Y> Y{#U=$:e=$:e=$:e=$:e& i'n 6i'n 6i'n 6i'n 6& & & & & & & & & & & =$:e& =$:e& & & & & & & =$:e& =$:e& 1111111111111> Y> Y> Y{#U> Y> Y> Y> Y> Y{#U> Y> Y{#U> Y{#U> Y> Y{#U> Y> Y{#UKjiATHI${n?h$?K"e]UMenu.UMenuBotConfigSClientd]UMenu.UMenuGameRulesSClientb] UMenu.UMenuGameSettingsSClientb]UMenu.UMenuGameMenua]UMenu.UMenuMultiplayerMenu`]UMenu.UMenuOptionsMenuH]Switching LevelsM]Player^] left the game.]]Failed to spawn player actor_]HFCould not find starting spot (level might need a 'PlayerStart' actor)Y] Could not find team for playerX]Name changed to Z] entered the game.c ]GameV] Server is already at capacity.U]('The password you entered is incorrect.W]10You need to enter a password to join this game.S]10Your IP address has been banned on this server.R" T] ACCEPT,*\OQIBF= server.logE@JQ"r '!#w! X{,oa8 ::$@`21XU[tԝXԝXԝXԝXtԝXԝXԝXԝXԝXԝXԝXP O>]:cmT$AU$?Q$@EB "Y[E$?D$?v$EBdA"pl l "j j F~@"|"Qg~ h0c$@c"` !HHDHexxWZ!Z!Z!Z!Z!Z!P$?F s *XAVBGR}FI|FXpFE,I& XU[{#U{#UГt{#UtГt{#UГГt{#UГt{#Ut{#Ut{#Ut{#Ut{#Ut{#Ut{#UttX't{#Ut{#Ut{#Ut{#Ut{#Ut{#Ut{#Ut{#Ut{#Ut{#Ut{#Ut{#Uttt{#Ut{#U> Yt{#Ut{#U  i'n 6 i'n 6 i'n 6 i'n 6 i'n 6 i'n 6 i'n 6 i'n 6 B]ngLogq]ngLogs]1.2H]#"http://www.netgamesusa.com/ngLog/c ]UnrealG]Epic MegaGames, Inc.F]http://www.epicgames.com/E]:9http://unreal.epicgames.com/Unreal_Log_Decoder_Ring.htmlD]*)../NetGamesUSA.com/ngStats/ngStatsUT.exeB]32../NetGamesUSA.com/ngStats/html/ngStats_Main.htmlA]65../NetGamesUSA.com/ngWorldStats/bin/ngWorldStats.exe@]/.-d ../NetGamesUSA.com/ngWorldStats/logs -g UTi]http://www.netgamesusa.comh] ../Logsj]&%../NetGamesUSA.com/ngWorldStats/logsXKE|ZR~XU[= j eK,})^NP! RZ!p\i$?g$?e$?V$?S$?}Q gXa;b;R4=$:eXU[t> Y> Y)5I> Y)5I=$:e=$:e=$:e=$:e=$:e=$:e=$:eԝXԝXԝXԝXԝXԝXԝXГГaҗOГГԝXԝXԝXԝXГԝXГГԝXԝXԝXԝX=$:e =$:e =$:e=$:e=$:e=$:e=$:e=$:e=$:ek NoEpEQ/-e ::$3*ѸBN^ГГГѸBГtГ ѸBГГѸB  &   & ГtГtГГГГѸBГГttѸBѸBѸBѸBV]You picked up some ammo.P $AX$L> DFI@($8B)$HBs)C^ ##g Oh~ !c N@N.O.u)5IԝX> Y> Y> YUD"[]UMenu.UMenuHUDConfigCWZ*>8j!_P n8 @z!QD n l>m> b ::$ @I/yrүn tԝXttttԝXttԝXttԝXԝXԝXԝXԝXԝX/yrүtԝXԝXtԝXttԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXtttw4tw4t/yrү/yrүԝXtttttԝX/yrү/yrү /yrү/yrү/yrү/yrү/yrү/yrүԝXԝXԝXtttttttttttttttttttttttttttttttttttԝXMWԝXMWԝXtԝXttttԝXttԝXtttttԝXԝXԝXԝXԝXԝXMWԝXMWyBzs$?C$@QS>Se~\ 8Su@@$@@($ C)$ C<djF$,@LloQLAl:k <j @q#Er!#m, n8#E~<<^B*<GԝXԝXԝXԝXԝX1ooԝX1ooottԝXԝXԝXГԝXtԝXԝX<GԝX1111111ԝX1111tttQe v$]"l^#jE! I @{  q' rUqwIr@ ##|a @U XiRjQN%O# XU[> YO# O# O# O# O# O# O# O# O# O# O# O# O# O# ԝXԝXp7O# xzv" w$H@v]Tim>S~8| +P K@!"B|,_%rsW q,AXU[ԝX>c$@H P d?hw>NlE|(|y@GO,l@se uAk Brqponmly WFXF_#B!::$-U ::$ i'n 6y YQZ{#U N~]????What You Talk'in Bout????{] UT Serverx]Mr Phantasticm]If You Got To Fight l]Fight Dirty!!8C?!GeA O@[M6P/P2nkbԝXxxxxx)5I> Y> YIR@G]I&/> Y)5I)5Inkbk"~)(This menu has not yet been implemented.N]LeftU]Rightb]Centera] Enabledc] Disabled`]yes_-no>X~2HF*`!_mXYnzt- @vRsLj@|!w4t|!tttttt/yrүttt/yrүtK'@ y Y ^)Y'! TYHi]=!MH!{C]/ XS~{FzFgIR@GxW~"( A" NLEaJhDԝXQ> ME@($ A)$ AP/Cl AnKH$a@2#MWAPԝXԝXԝXttԝXԝXԝXttԝXtttԝXt_tԝXtԝXttttttttԝXQSm dLI! X]6^6c OElXU[> Y> Y)5I> Y> Y> Y> YIR@G> YIR@G]I&/}"s *K dDZe okNyGhHJM [ hZ f S]OL4} `LO&5hN] r:" `) x~E`!# @ap>bj@a<w=x=\Bn]H<G1111ttgQSeS\x$4CF Wm$fff?k `>($A)$@<sKv$4Cj$B^JxRLhpJhDtԝXԝXtԝXԝXԝXԝXԝXpppppW$?Y$?P$?K$?QSy zPGv!#KpJO*S"t_ԝX/yrүԝXԝXԝXԝXԝXԝXԝXtԝXԝXԝXԝXr$D{{\x$ Cyk L*D@($)$<sF$ @U}OYIG-|::$ :a JhHiHs2 wFzJhD111wFzwFzwFzwFzR@@VpFo!RGfm^JYAPԝX>($ B)$ B<s G OaC@{  1 )   )) 1  9 ) 1 ) )1 9 J9 ))1))))Z9)1)1) 9)A)9))1 11J)91J)11)9111191)J119)J199s b)99)J9Z1999J9A9)Z1J9 A99b19A1JAs1AAAJA)ZAJAAbAZA1JJZA)bAJJ1bA)sAJJAbJ1JJJsARJAJRAAbRsJRRRbR)ZRA1AsRbRAsR jR9RZZJAZZZRRsZ)R)bb9sb RbbRbbbbsb9jbRAZb)bsj9b9jjZZjjjjZsjjjAj1jsssZZssjj1s1ssssJ{sjsZsJsjssZj {{js1ssJ{{{sAZjs1s1jZss)9A{RŃs̓Js)sRŔ sՔRŔRŜZJs՜Jͬ)ZAެ)ͬb Zʹ޴j)9Žsb9JŬjŔ)ՃsՋսJh|@NmQE"!EVDL\ fg]@#kHLHUfTxWsHtH`  ::$VmԝXVmVmVmVmVmVmVm}>~{r oK~7U6a!::$-U ::$@ @;XEx8w4ttw4tw4ttttԝXtԝXtԝXԝX XEx8XEx8ԝXXEx8ԝXԝXԝXtԝXԝX ԝXԝXԝXԝXttԝXttttttԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXzE 8y i8@($A)$ B<` D@[PJD=!ZyCY@Q\A-p/M)   wI|r@g Al} ^lO S T U V W X Y Z [ \ ] ^ _ ` a b c { e f g h i j k l m n o p q r s t u v w x d z { | } ~  @ABy U EFGCHIJKLn N o L K M I H J F E G C B D @ A }|~zy{wvxtsuqpr\ M I F D E }  B C { r t ^k i c a b XW` \ Y Z V X N J H D B @ { y z GY [ W X a wd i h xzyDvutsrqponmlap `hUTNKD~|}ZYXWVU@IcaZJ@PCBkEFN][Oif\[EHbLMMRSeiR ehK gI H J lE D jB  ~ } z | okt r q o n m l k j i me g nc a ^ ] ojikd [ Z W V U T S R Q P {|@$!-RfF8c /hVWHIw+ImD O F@p| 7h NuT=!f4@a c!# v@[CT,P=!k@uCw*| V!M_=!M^ RVsJ J@atNKOKn"ot_11111ԝX11t1r{Se \8x$A($A)$@ YԝXԝXRkgXԝXԝXtԝXttԝXttttԝXԝXԝXԝXRkgXB "jueD!W+dzh(9#V |@ H2@KAfj [ A @d6rl4[@^s TAAQ  @z wp@f~i@x x(a  wi i4^@ R,S Z@a@oCM2@D X @h8!@U@~){&! u I@_cf /fwVBMBB:{]I&/xWxxxx> Yxxxxxxxxxx> Y> Y> Y> Y> Y> Y)5I> Y)5Inkb> Y> Y)5I> Y)5Inkb> Y> Y)5I> Y)5Inkbnkbnkb> Y> Y)5I> Y)5Inkb> Y> Y)5I> Y)5Inkb> Y> Y)5I> Y)5Inkb> Y> Yx> Y> Y)5I> Yxxxxx> Y> Yxxxxxxxx{#Uxxxxx{#Uxxxxxxxxxxxxxxxxxxxxxxxxx> Y> Yxx> Y> Y> Y> Y> Y> Yxxx> Y> Y)5IYyHs\ZAN] LOADING]]SAVING= CONNECTING}]PAUSED|= PRECACHING[= Frame Ratev]Avg{] Last Sec\]Minq]Maxt]fpsm] seconds.l]frames rendered inxwQH @tz>{>]Z( A#OEl-}mmNF)@J G;aM!hRJSpp7xWLW7hBfGD{ @D LG o'|k,AF5z}' j iDd w9YcD::$ppppV client damage type WI by VZ -S*%g:K:$y:K:$6L6L>LrZL?LL?W aYIZS-J!VW%PEw*WaWILPWYwZ*?Za/ a/ZWD?W?N33>J!VJ! JIWD?W?&Ngw _* _ qWZLLIcL*Ww6*uL#L *%wZ* wZ{ZZ?WLIL-SP"!U ?WLILP?W?*WswZ* wZ{Z0ZIL-Yq!Kab? QH*GJLn ILe^n @F@@ @c}@ d@g}#KR1M-d#FO'!tKKwx* }O%x  O }GA7vh t @#DkD\@@F. {)J-l%-R'-_{z ::$n::$ w*-R Q l-_zz ,b( w*-k'\ %l [h|+^-Z'-_{z ::$n::$ w*-Z ^ |-_zz ,b( w*-k'\ +| d v J*!UzmDl|A~l } FLuR; f\/PGVGNI@uw/KT9`htHW@X `F @LRQNSETE/D-e ::$3SN^Гtttttt  &   & tN^tԝX  &   & tttГttN^N^ГГ  &   & ГtГtГГГГГГГ  &   & ГtГtГГГГГГ_ SFwBICIS@ Q hw4 ԝX> Y  ihE y KI@($A)$ BE@n~PhqBpBLm ^QpgAZ&[EHA<*uG '| XQeQOTQf M)v@iP@o@}E@xB@B|#!@hB@@  1 )   )) 1  9 ) 1 ) )1 9 J9 ))1))))Z9)1)1) 9)A)9))1 11J)91J)11)9111191)J119)J199s b)99)J9Z1999J9A9)Z1J9 A99b19A1JAs1AAAJA)ZAJAAbAZA1JJZA)bAJJ1bA)sAJJAbJ1JJJsARJAJRAAbRsJRRRbR)ZRA1AsRbRAsR jR9RZZJAZZZRRsZ)R)bb9sb RbbRbbbbsb9jbRAZb)bsj9b9jjZZjjjjZsjjjAj1jsssZZssjj1s1ssssJ{sjsZsJsjssZj {{js1ssJ{{{sAZjs1s1jZss)9A{RŃs̓Js)sRŔ sՔRŔRŜZJs՜Jͬ)ZAެ)ͬb Zʹ޴j)9Žsb9JŬjŔ)ՃsՋսJM YW6@ hDtJVX @  A  `T1 _G ] RQ C @ lE  e1aIM N O P Q gHU@`2P O>18L(Uw3D  p F `Q,o=z Q[1JAo e* Xh e no|B )y9a+H*i uYea"d"NVq NI is-@-iM"XEFFFyy 4XU[8x$ A~U-s N} NI>tpy_ W*[]CYBFQq+ uv i|}  u,z+c )z+]]@hVu PPZ Gq|YORaqal[ Q P Z O P aP lP  MG e"S SXuRSc %8x.ԝXQ>g RRTS($A)$A@ ~@X Y @~ tx@[@RKGzjL@EH@P Vk~O Q kO j WhCfKubn'@@M3p|4@qA&l w Y6rs&$Tw1. *T1. A:s:yX 'g:y:$(:s:$^^?q!lq!'( @?Y ZAc @K[ U @Fhc3bY/H e3K\ @qK w lK@xZ Ba t@HeJCo oAiA'7k oUQ%ghE+@oXOFPFkm OXXU[N h k@,wuEf PSK@qA@D w8 \L=F ho{"halG C @] @fBQ3 C t@U,nD G,@n @LIMIR 6W '-> Y tt> Y> Y> Yt {#U {#UUI\$Cp ^ x] Spectator> Kh"RP.q C iu XC8]y YQZXU[~[)MK_v ~jH u|nDn\)RziU%hwO nhF^ T u@H [7$wH =:H %,&:H :H:Y:Hv?v}d:YtA a<W:YM} A "vo$ -x 'HYYH D?\) ף;L [)}X%6A W%6A Y%6A 6nBv6nB #<D6nC<H<Y R}K@kL s$@L  _} \7ef hJ_ N&MD~Zea>b>Dn ԝXHZ{???}Z{???|Z{???Q>gGk}EU` { t\'ABBB%Z9BS&q!bMw.*.y@B-k'\-F C?%. iC-M)|mr P-{(-Rm [ KK}SA U%Dx gg(tWA NJz AuV?W^ xd mY \n@d@ ExkUGob<!~>FW0D twWE _**& O-H *%*N NwN *N pWE N N Mqw6*u pWE +!/a0 b+b W10 ] 6 ff?oDE tl-Yoa`E _ -d :j:$o E _q!K Pb:V9g.n aլfff?g`@g ::$.::$:j:$n g5#?1n g:#?Y[g `6Yff> ?[6g `n Yn  E N@wwwkkkccc[[[SSSOOOGGG???;;;333///+++'''###˿÷ǻwwkwkck_WcWO[OKWKCOG?G?;C;7;7/7/+/+'+'## ӫ˟×sk{cs[gW_OWGwSCkK;cC7[?3S7/O3+G/'C+#;'7#/+#  ߯sӣgǗ[SK{GsCo?g;_7{[3sW/gO+_G'S?#K7C3?/;+3'/#+#  wg[OKGwCo?g;_w7[o3Wg/O_+KW'CO'?K#;C3?/;+3'/#+#  ;;77'' wkc[SKG?;3/'# sg[OGw?o;g7_/W+S'Ks#Ck?c7[3S+K'G#?73 +# Ϸۯ_ߟ/Ӌ'{k_OC 73{+s#kc_WO GC;3/# _[_ga9j) rv-#^>v>wNyBeo qQ VsB]&n ^ ZYJMKIGsCG{AVl E} c(gwAjk WC` MTso vrxL@ pj\ZbcegkwAXAV+s"|WD%D G% ^Faz X de(jVm$@,U!w}SyO@ojT z|]H(^Kb@s>H`KjD@O~|gi!Eg!E@s!"BmUGdV iLgL# O?"d)@l@Z yn{!#x !#C @R ^,eR}@McRJN{a@2 AK.MW11ԝX11ԝXԝXtIrFyPAu?Tr@V*i"\b"d#@tQk:pN @@Ekg]Jj"]@U  cNN ^oJZXaҗOw4WLIS($A)$ B{D|DbbQ23%ԝX\"R{e 8kID($)$r S&zAt(@L hBvOxOV I -t [6 t HBGa=6 F-Q' lB @K zvo3O"cbv-H &r"X!L>hw *v < qv v @@BCCa;CC8CC*D?*CCI-wh* ah #"C a  #"d-r5?%5L?8:5:U%U=:$x,,zKKvVzjjVD U:ag1p%p UOaa "OQQO++q!dwOO@O-q'O ZaO wbv StSXH}O_QUw@MA p)d |/v\`H \ ip5L@@]R_!T%@h @WPYVy jZOn5_xVcfP Seo [lFx-dL/e2~e *%0~!L  e%!U  ^xU\Ov_ _"E$i{JN DMY+c,Xq5Y iz\P,@ Oy r@ V1HWD|o: k WHz -P: ko0*!  Xj1G @@)@R(@q-nhc@bn;\F'@Ed8A(!U C@GJ,w@ [fn0m^$A-_{z?w * { m Nr* w*w*[ }m[*r[*[ }mr[* r*![A""w[!["T!* XUho0 fUopq { T y W0 y pvxUg7n`/LEhnJ  b@dGo-o*K$K$0-p*C$8C$-f-q*^*@r*s*t*o@ x){<Oy,m o5lm  4:r%Nm <r?o:4lNo:6G?t,6G?,6G6G?,6G?D?t,,6G?,6G6G?,6G?D?t,,96G?,6G6G?,G?,-nt,@%-lt, %-d t,%-d -F-Nt, %E$ &E$ ,E$ ,E$ ,E$ BNl-n-l-d EG"lNNXM,XNN?,Gu?, -d -F-N-F-N-p-J w*V :}%%}$}$M-C+-H w*Z BB:o%+o$Uo$Bm lO ?%C BG?$O C P C BC ?P P P ?Blm O $6H:]6HM[:K:$ :K:${,b{&N{69 N{69N6H{696H{696HNxa="H6N6M6%a+Hq=zz B?%BB-V-W-d }Gx$JC?HGK@F88$J4C?HGS yKSSK?,sw./=*y =  ~y J$d m aK6y6y6y6 6 6 = BcG@O NqpAn^{C%d$rT )d$A L?"B itt|  s'z8KLG>w.* {w. p}wq!u fWZHD^MB%c8|Jbr]aL  P?@g8A_J`Jk@2kAo8APtԝXtM|]Only %i more to go...O= Completed! nJX5J?g@JYG?o;A6\.o-::$ r\* S::$\- {::$o??,  Y!/a0 JYJ \104w\*\- I!/a0 JIJ \104r\P\P* WZ@ W@ f@Tl@ C@ _>nq^oL5QBDEh {^Q oDs@ C*P$R$R: & RR$-O$( ~s)4jkO]mQ@V=!ST@c^=}fr?w.=*r.=6.=uwa*-}TawD* >TDw{* >T{}aT}j$}o$}-L'w.}*.} q!/!OR+!/a0 u+Qu*10j-baq$c ^jB;_m `\jD9HJ|-L'#-qaA(HH-}-w'PA Yptm e(@a@@c@d@L&@f@v)q@| ux^xuBjpn b^i(@j @M N {q(@D'A=R}aBdMt42z , , U p Fc9p!z -H **p!SS?cSx-R D_!-R'tu-Yxa L~0.-R-R'r+-Y.a leOdOVeya[6 [6 33ib6 iC-Q' [ @Q<E Ok'! T @w!|&z}}vV@ z!#]zu:cg:fBwn*nZ*@w.*._ [:Z:rN< {3@M+@VCS'v@ o:OtLJe@?, -L'xO Yewx*xNN-H-LxO Ywx*L?&?xNxI7L?N ף;L?I #<LL ZZ' s'_Nf)>r_''r*( N_ x9N:@*M+a @* @o$j$|x @PA-L'pw.*._*q!/!O S:@m!Qh@D X:V|U!W:K:$j$DZ'C)-k(-R(- (x33?a'(( }S  W4Q-@cC"\ f]`wr*ra'::$ b\ cw\ *\ a\ \ 5**-w * T w * aZ N wZ *Z p*!Z Z Mc  {i`#eJF_bSNk jLRMS@ j@`ADAUDr!.r*GQQa!@@kw*CA!* r!*!I !w!*!??, w6*uw*C!Aw* q Dw *: q&b=< q!* x}@qR@RlHFw4y zQ@o g"NcQe _F@o@ c#reVT!MPkln`@dC]!Aw)]!)`!)a!)U!)c!)o!fMWck [WqA E@t]tK!@S,@@ It ~,N3x y@im @JISY c os@@}yui9W tRMQW 7u oW '-UI% Y7nX O u]c @ aG m e  m S6xKO _Dp@F@@%S ` BkO i@LDtS4S~)t)~){)@ JKSh%@b@GfXWH2D2GnN$SaST@J @ L@x^q)@SbX@P@E(Si @n@xD4S<H~C@kI snOf@z@k{krFa*m}4-pppp, game_end, a* V@fI!@D_ M!@D_ @L G* woF!@D_ H!@D_ vD@]8L S n@]$]I! z){v  v -'g#???x::$B A R PR@UrO6MG\ i{]igwi*ai?i`[?i^[?i`?i^ _l`*!@D_ v, sd f o@,jQ yEll$@,TL#Etg m @Ou @FEhvV AS+fjuY#kUcG$'#-c (-N(-e(-e (-@(-o(-z( L,_*iNgNcp\xW*@@*o*l*rQJABCDEFG0nOtw o)@-CtM\jrD@G!D!\V  W fhv#v7*4Q@T uM ZbLuy.o HKSP U@j,!# vH.Ova m.}-aVA2 U*P F-^+P,fK-Y+a/! r*? w.*.-k& q !/a0 fq f.10d-P+r#:K:$  rdda/!g:K:$o$  r n}zxw.}*.}-xk% q !/a0 iq wij.}10 /@@nbEJ%gPq -`nJ%`NN` c!@D_ mF!@D_ @m @DBL+ ArSC "aE`EsQA |K-d| -} -0 xtI*hS@okD^1`'Ӎ::$ rr*2r tN-G   9?#\C-z'`r*G XCG/I }sEm ~ {EJdGuA }!#ua/! pppppppppp, player, Connect, u ,, Su D, T.u-0pppppppppp, player, Connect, u ,, Su D, T(ku fj @AF@+tKW;X;dXh̓xWb"`,@D [@rArEJ J.dzE| lYCS+"Hzn6H} E6EXEH6}6 ?8X?%sY^Y X5?^Y)X5sY)XzXA Y)C Y LL`={d^ kF\EG5nasz6@@nnի>;@2a%s!P `D6 >826nD6@?%(@D6n6@6nD6n6n6@@6n6n6@@2n ;(' |pDyEAwi LyAMQl [,kV,pLk x.z.RE}Ck t~Bdv xrcl ^"bHEH6oTIUShSWN}E<os73!w* so  Xr`_BEBICm TD@bDv4J`C{I6 ?,| J ;J!k @J "j[`6jd^ fd6fP fj6^6 ?8P ?%@JtJ  P 5?tJGP d[<P ~ JG J ]-nU qeL lfb o u ql vCrha4Cy n= CJKLMv h`kBm itBQJn y@"jH"L"@] @M0Or XBAc@l0MF dNnwd*Wd-|d ,MnddMwd* Ed Id ,!.'rd#*#d I-Jw#*-J#| XZd@JN`@ir0U_.5w * -V i*/a0Uu ri* wu @-0r * Eu iu -w'ru #i*10wi*-vmia/!.i-!{.i , I.i ,!.' IVi!.'#i-v-w I|!.' I!.'#*-Jw#*-J#| X]@v_GTWXqY\]_@eFx5y$ axgG42ggfd-X-L-c-E c@}<!DQ\niHj[@spqlY@rtAL6]GJA uB{|}OH?@CDdCŗ2ggff-X-X-c-c EJKLMvBW n o$a V O W1\V)W|.B @T@@PGZ[h^`_O4kM !Fw#*k#y#  G # "C.#&wC*::$C-C gC:fwC*C @dC-G C &-J6yC:D-J`yG 4C ky y-J`yG CG 6y:y` S_NCaZ5eco5fI1li02 )l)i$jl@/ICa@ByB8A8ZWޚ sz{A6}h~g/x]0@$+29@GNU\cjqx     $ + 2 9 @ G N U \ c j q x               $+29@GNU\cjqx\%%j.%7%+%c%G%.@%c77x777j7+777777j%U%N%79%%%%2.cj.q......x.$%777$7N7@7G7\7277$%.+x2G9@\%UNq.%%77%U797Q\W]SUhQONfLJI@GHFEDCJU/bI@@O}t6DJ@KNIJi0f]g{ Xe Nqnilkh_daS8RRUK8D( VL8rܩ0pV should never call base spawncarcass* WtE OJNJKEFCBT[XXJY8X8i6 a8a`cekA9@Bmi@OC^8d FGzH@@N?"jv@y@@<]hLu@AR1[}>s8xnWi d xjpppj ,inK Et8{7 QoMC^ _@UGFr ʭP Q w-nZ^z1y1 l,9 X~1Zm9 bq [0""""* * "= hQ@                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              a@@                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    @@f@                                                                                                                                                     g@                                    fg@           g  g g [ X@X!YG2?n\: n=in_@\._K[ 7q!l nhKmnFp@j-RD@A@qr~@s2uK6^Gw }r~B8-_zz ,b(@-f' wR@ @DuRC{S @@wE BLO C uG BjT![::$ $D>D$e:K:$b?mb>-6(U-S*j-S ::$w6(U` *a6(U` $?*w6(U\ *a6(U\  8#?j-S ::$X7??,?6 ?@<wjY*^a^W ծ8?,(#L? 8#L?(r^*ajY$@X<aT$??XwjQ*NajQ  8#?wN*NCX6(U-Ej-E6(k-Stj-Et #< I RLO K F CRU!::$ 6(k-SC-Sp- t?% t?,L w*a%!O -o(6(U-EtC-S6(U-EtAw*a%!]  di] iQ@S T U V W X Y Z [ \ ] ^ _ ` a b c { e f g h i j k l m n o p q r s t u v w x d z { | } ~  @ABy U EFGCHIJKLn N o L K M I H J F E G C B D @ A }|~zy{wvxtsuqpr\ M I F D E }  B C { r t ^k i c a b XW` \ Y Z V X N J H D B @ { y z GY [ W X a wd i h xzyDvutsrqponmlap `hUTNKD~|}ZYXWVU@IcaZJ@PCBkEFN][Oif\[EHbLMMRSeiR ehK gI H J lE D jB  ~ } z | okt r q o n m l k j i me g nc a ^ ] z{|}d [ Z W V U T S R Q P _/@VJDlLO Z k@V @oLu2J}B*${ @-|'>{$wNww*"wa/! -|A !L -PwXJ\ L B:Jk:w kwXJ\ L Brrrw \ L !P r\ *wj L BwwMR B/[ a Y {2X>E ^ i` ii hd i_ j @e il ig V/@eip@~8h}8Y g|&*%::$ 6(U-EY >k6(]-EY >6(k-EY L>(6(Ua%a/!  {6(UQ D?6(UaY * #6(UEhh****D?*Y ?6(Ua~*%t?6(k-S,* 8#?#!]*%t@ Z @x "m @}r @B!"z | nOA!w @E!@MC!K="N@H!F!~ @u{@M_n9t i ^:K:$ -QI ? At z::6 6^ ?&I l5I Q 8:Q :Q Q 86^ 6 `:Q :Q cI  At z33>?-Q(::?&I 5lI `e`e``@fff?t `e``fff?t `e`e?, `e\-] st ?7sfff?sfff?eBsB?*C ]NGDAeCTAB~J #'#55:5d6(]-S k!B6(k-StAo$q!sqk tW!c!Y!V!jt\!b3a3`3W>\N"rC*CQ WwC*CCQlCQrC*CQ B/^!`!a!jU!o!e!A t'%w!*! KZ B"O!q *%0*!L  g!@b!j!~m!n!_9h!@L!u!v!w!x!y!z!{!|!}!~!!hYP|}Aq\*%0*!L  W9]_ h!EgP a>( cPJ"B"^ ]% ?,<6 4Co$ }N"\A"An.AJBJjQ"D& t{#Utt{#Ut{#U> Yt{#Ut{#U  j]$#../Logs/unreal.ngStats.Unknown.logx lHmHP2S"v?xWW"X"CiEmPF"K ie: o$Y a0b0^RY"Z!V"Z"["O"eD\q9Ayk#Mq_pQD \e#]@Qh|"p [" " " " * *×"F#Ʉ@LJKJEHKMMPPU6LIGJKKKJFIPSKIIJHDGGEBGLOPMKJJIGEGFHFILLLMJJIHGGHFHHJLKLMKIIIGHHGHHKMKLOMKIIHHHFFHKKILOLJHIHGHFFIJIHLROMJJIHIKJKLJKPQOMMKKKKKLJJMQOMNLKLLKKJLQQMMMKLLJJHMNLJLKJGIKOINQPJL p"q"r"s"Ou"z"w"E QbQ~"@"@#C#@sQOPIRz XT#KPc K#M#OO#P#G#Q#Z#@X#JQ[#H\#@\eT#rJRtX]TRA \W} JhQh#j~n#XWRp#lK0X{Qo#lQhVRJ#_#yt#Jr{#WOr#!h^tMy#ru#h'@mZRVD$F$^pKnI%XV:nV+!/a0 G+UGjnn&10 J$ nhL$G(y AKb&4H/8ba/!z M b  b -b-i$b-E"b-hha^H( ^ 'rhbb-m!.ba^  Wb^-Wbb  b; b   "kS\Jd Z-nr-{d a  #A]-{d   #d a+"Rd '-{ @O$@Z^@X$S$F)S$R*Q$A,)Q$Q*D}*@D,Y$@D,^$x? @`TH!6 `/{v  v ::$g  b$B AGG -'T>Tel:5 a/!Z::$g# \Hw: [$|D! _$\$HY \$ @T6 ) @e$@HAH@ _H@,i$@,P@,k$@,j$@,@[>n$@@E@w$@[GA r4::$}-IBZp f -'T>T:5x@@R y$u$@x${$@P(U@l@ ]Y(@RHc$pS )c$E% b*H%E F S eE\iE^N#r^e-L+yuw * E^.w * E^.r^C*. ^V!/3.%?^C%**^^a^u @^Z-{&N^NN^Nw * E^.4w * E^.rr^C*. ^V!/.%?^C%**^^a^u @^Z'r*( N^ FEL%@CN%pDgP%gT@u(@D)@GWEJNEOEz V%JhDԝX> YԝXQS>SX8x$@ke$?K (<@ ~}X }X% Y% n \%Z%E@OO ]%a%g@@Q/s?w?f%n?o%o2v%y S -J-v% Xc?d>@Q2Bh@|zr<t<}%o<%~%i<h .&-0::$ R Bc@&d<tr -B 3-0::$ AA You feel much lightera'''-L'q!Y BcUC&@G&@H&UH`O= c@D(Z<@qQ&@V(s@W&U&[&X&WV&~;\&^&@_&`&@a&@v;e&g& @i&b j&o;m&n&o&p&O@q&s&Ay&z&@'s @@z:W`y߿uWWK ~udK WppWuK F'uuK }dK ~ud%WpWu }J}&sc r* Y::$/a/! r.H* a   Va+. }&a(  M  EC'G'K @I'w&@@ O'Q'E'n:XVa,7(w*aVS'5V* |0dG CQ"-_{z DrC*CQ wC*dCwd*rd*d-P] dddldwdCrd*d-P] dddOw] *C]  pC}Cl X[! X'! ) ]'@A:B:%l/ l+['\'@:+/ z9j+}0'r**% }j+ URb'[R@mXRf'k y"qfOC;I@k @x8KR'-PRw * U.w * U.{v. p}vq!b } R0z'\bEMT; I@8@9/I`|$-p+ :K:$o$6-o'Q=,E-U M  O$\9Hn!U ~],fu' g s{'!U n@'!U K$B(p'@RS@FK@PEq$@M(@}$|$@A%$@ O)T(Vxu@`@~* @ [( @ w" " " " *k*"F# @S?$Ƣ>ISSIA>ĘҀjpVNVS>Įc/V'666,6'[ec$SM/'/''''',3'6Vjcj[?VM???6V;L[;6VvjIV?NVVVe,V;NVvͦeN?6NV;$,$V;6NvjSVI?Ne> >$/pVrN;jpNN,$$vLN;cp/I;N?V>ypv͎0vN,VNr,ޮ;NN?VcM^eV;N,Vc3?BrV,N6VV>^?#6VV$V63>/$jNV A5| 75-0::$A?restart$( X@|+q4][Q-0z]&#]]}]&vNwv*va/! .vm.v k@.v l]%vvMF  c}]vNwv*v-va/!Ww *w r* rkv ]!['vZ ]!['vZ ]!['vvM  X`(c 4UD@@Pf(K^ _.z r6*M u Xo({@ `@p(tb @n(@L#~d"B -P rp*p*% ~Nw~*~-*:~ k: k~l ~~MV BMr(@n)@t@JP~(`c{J(vVDH -@)b~(A)B) X|@R)gG~$nA)@@PB)@(S%@H)G)I)J)K)L)z eeW)P)e Q)t mgsDw xEV){(Y)Z)W% BT)@@{N+t_)tZtc)l2@f)w%NE,f x%@k)@t1@-w(@m)@-p1KOr)iXt)ov=^@u)ozFtsrqVHeM{)Snmpu&E; A*@B*C*z,Z/oEUNr[*a LQ[[[uQu*Q WQepZ0 VUTSR%A!U o7[" " " " **"F#<@                                     N*[K_Mw ? __ y -hy?-h(-{'-z(6r%6rD?6r%69D?69@?69D?69@?69D?69@?0y?,<6_333?o$-K(q!Ky?,2|?ab$?? CY?>aa$?? CY?> xwJ\MP; r::$jw./]*./]-| ]*Dp& ?E( !b?]  N$\\wk*::$ak  P\ rJrncj nra@69Dr?,r69Dr?,r69Dr?,r l/W$U$Bg)U$T$_M7N7aR7wHPJMHNHoXs XzI{If\*XU[iGjG\LN!@_ @ud*e*f*g*h*eK(@Pc*|p@/lp*q*s*t*r*h\ v*` X19r` *r` u*rHD* Ra` uwR*R@ ` y*z*{* Y|*gZz0;wHD*HDcgaUU-@+-J q~w * cgaU ]*xEz*{*RXB+S . rH* 'j !j !.bwHD*HDc Sj |-E+-J qw * c Sj  @F% A+4Y 4ad.G+?:.&G+u H+I+J+K+ d(@m4@Z3@H+OI+J+K+nE/}3a)tUA w/A.f@Q+fY@G>K.j P+d D> 8L-a-o (o$K:K:$6~?%6~? ?,~??,V+!v  >y  ,a?yL??? >?6 ?,aS -a # y)LG=xaq$-b( gd@.a%-E' _+J&|%e+f+g+`;`x' |9^'j'@{R`Rgo+GԝX{kD($)$V u y L9]&eBo]Ww * E.]w * E.]g.]rC*.] V!/.]?C%**auS: q&]"b=< qr.]F.]m-zr].]-za @a,@y DLh&/+):hOV ?%;$T V  T $+!/a0 }+}hh&10ha/!r.hP.hP*{Qh&  Q-n a())q?%aq( Y qgD+@s,@HDq~+@+@YB,@C,\tl)@PT<h!U t@X+-O%tZW,LR SJ @c~ yX,Z,\,_,@-#@mx+@ @I-s+gY)s+`l,^ b-W-iE* Current ping isS C i-k V![_+|.i ?, |L>k V|k >333?i [`a+ff&?]i @|f f ?&?Ak t  #<f ?Ak t t ?&?,k +i ?, 6`f ]?,@A|Y6`f ]i @A| Y,g,I_#G5 -o -P I%\.#w\*\-\ AI#*-J( \N}w\*fw\ **:\ k: k\ -o\ AIdw\#\-J' \\M E::$_ 'w#*9.#-.# -o_ '-w#* I.# ,!.'E I|!.' X-!# h,HA,AZ)A,)B,)C, nDpw*{q )w*)]*4p,]d* ] X|-R+U^y*  UR+ XK//============================================================================= // Info, the root of all information holding classes. //============================================================================= class Info extends Actor abstract native; h.@6rd,}+_)}+)~+)+"w, ,]) ,E/{.flY u*q2 W/yHN-s(z:Ku:C-O-fym-t'pwy*yUlmyuyu[[y[|ymmJ?%/a0 ~w~~  #~-hf~    f?%~  f?%~   ~;;yc[~)o~  ?? C10JycBycy-Ny-ey-@yGy '"yyu@-t(C=uK=z-f-O Gc//============================================================================= // ZoneInfo, the built-in Unreal class for defining properties // of zones. If you place one ZoneInfo actor in a // zone you have partioned, the ZoneInfo defines the // properties of the zone. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class ZoneInfo extends Info native nativereplication; #exec Texture Import File=Textures\ZoneInfo.pcx Name=S_ZoneInfo Mips=Off Flags=2 //----------------------------------------------------------------------------- // Zone properties. var() name ZoneTag; var() vector ZoneGravity; var() vector ZoneVelocity; var() float ZoneGroundFriction; var() float ZoneFluidFriction; var() float ZoneTerminalVelocity; var() name ZonePlayerEvent; var int ZonePlayerCount; var int NumCarcasses; var() int DamagePerSec; var() name DamageType; var() localized string DamageString; var(LocationStrings) localized string ZoneName; var LocationID LocationID; var() int MaxCarcasses; var() sound EntrySound; //only if waterzone var() sound ExitSound; // only if waterzone var() class EntryActor; // e.g. a splash (only if water zone) var() class ExitActor; // e.g. a splash (only if water zone) var skyzoneinfo SkyZone; // Optional sky zone containing this zone's sky. //----------------------------------------------------------------------------- // Zone flags. var() bool bWaterZone; // Zone is water-filled. var() const bool bFogZone; // Zone is fog-filled. var() const bool bKillZone; // Zone instantly kills those who enter. var() bool bNeutralZone; // Players can't take damage in this zone. var() bool bGravityZone; // Use ZoneGravity. var() bool bPainZone; // Zone causes pain. var() bool bDestructive; // Destroys carcasses. var() bool bNoInventory; var() bool bMoveProjectiles; // this velocity zone should impart velocity to projectiles and effects var() bool bBounceVelocity; // this velocity zone should bounce actors that land in it //----------------------------------------------------------------------------- // Zone light. var(ZoneLight) byte AmbientBrightness, AmbientHue, AmbientSaturation; var(ZoneLight) color FogColor; var(ZoneLight) float FogDistance; var(ZoneLight) const texture EnvironmentMap; var(ZoneLight) float TexUPanSpeed, TexVPanSpeed; var(ZoneLight) vector ViewFlash, ViewFog; //----------------------------------------------------------------------------- // Reverb. // Settings. var(Reverb) bool bReverbZone; var(Reverb) bool bRaytraceReverb; var(Reverb) float SpeedOfSound; var(Reverb) byte MasterGain; var(Reverb) int CutoffHz; var(Reverb) byte Delay[6]; var(Reverb) byte Gain[6]; //----------------------------------------------------------------------------- // Lens flare. var(LensFlare) texture LensFlare[12]; var(LensFlare) float LensFlareOffset[12]; var(LensFlare) float LensFlareScale[12]; //----------------------------------------------------------------------------- // per-Zone mesh LOD lighting control // the number of lights applied to the actor mesh is interpolated between the following // properties, as a function of the MeshPolyCount for the previous frame. var() byte MinLightCount; // minimum number of lights to use (when MaxLightingPolyCount is exceeded) var() byte MaxLightCount; // maximum number of lights to use (when MeshPolyCount drops below MinLightingPolyCount) var() int MinLightingPolyCount; var() int MaxLightingPolyCount; // (NOTE: the default LOD properties (below) have no effect on the mesh lighting behavior) //============================================================================= // Network replication. replication { reliable if( Role==ROLE_Authority ) ZoneGravity, ZoneVelocity, // ZoneTerminalVelocity, // ZoneGroundFriction, ZoneFluidFriction, AmbientBrightness, AmbientHue, AmbientSaturation, TexUPanSpeed, TexVPanSpeed, // ViewFlash, ViewFog, // Not replicated because vectors replicated with elements rounded to integers bReverbZone, FogColor; } //============================================================================= // Iterator functions. // Iterate through all actors in this zone. native(308) final iterator function ZoneActors( class BaseClass, out actor Actor ); //============================================================================= simulated function LinkToSkybox() { local skyzoneinfo TempSkyZone; // SkyZone. foreach AllActors( class 'SkyZoneInfo', TempSkyZone, '' ) SkyZone = TempSkyZone; foreach AllActors( class 'SkyZoneInfo', TempSkyZone, '' ) if( TempSkyZone.bHighDetail == Level.bHighDetailMode ) SkyZone = TempSkyZone; } //============================================================================= // Engine notification functions. simulated function PreBeginPlay() { Super.PreBeginPlay(); // call overridable function to link this ZoneInfo actor to a skybox LinkToSkybox(); } function Trigger( actor Other, pawn EventInstigator ) { if (DamagePerSec != 0) bPainZone = true; } // When an actor enters this zone. event ActorEntered( actor Other ) { local actor A; local vector AddVelocity; if ( bNoInventory && Other.IsA('Inventory') && (Other.Owner == None) ) { Other.LifeSpan = 1.5; return; } if( Pawn(Other)!=None && Pawn(Other).bIsPlayer ) if( ++ZonePlayerCount==1 && ZonePlayerEvent!='' ) foreach AllActors( class 'Actor', A, ZonePlayerEvent ) A.Trigger( Self, Pawn(Other) ); if ( bMoveProjectiles && (ZoneVelocity != vect(0,0,0)) ) { if ( Other.Physics == PHYS_Projectile ) Other.Velocity += ZoneVelocity; else if ( Other.IsA('Effects') && (Other.Physics == PHYS_None) ) { Other.SetPhysics(PHYS_Projectile); Other.Velocity += ZoneVelocity; } } } // When an actor leaves this zone. event ActorLeaving( actor Other ) { local actor A; if( Pawn(Other)!=None && Pawn(Other).bIsPlayer ) if( --ZonePlayerCount==0 && ZonePlayerEvent!='' ) foreach AllActors( class 'Actor', A, ZonePlayerEvent ) A.UnTrigger( Self, Pawn(Other) ); } },P*@*XZ6D t! o FD a`DwD *D RD S* hu/q!MB-sH$q! D-!Xy/!XpE-@J0!XR|'t+1()t+W'Mʵ>"-_{z <wC*CK Xb,G-hQ0ImSN-SX0IJ@S- cT- c\0e,d0~G & O-SX-Y^-s1@w* s>w * s  Ko0q0F ) o/`f,k+~!w* ~k+ g_-})J1@e-m-E1g-x@,j -B h-0::$ @!/a0 x@gx10 c-P1Z-d+Va BpppppppGetting Vd+, Ve+, Vf+, Vg+  h-bY-k-pc1a10 h1E*wNV<w%ww,4wD?w,,w Tnv -z@-u-S"u1@j!# Ky-}tz@) )z)y i,tF'Average AI TimeUW+p < 5% S% Wp < 10% S& Wp < 15% S, Wp < 20% S, Wp < 25% S, Wp < 30% S, Wp < 35% S, Wp > 35% S, W {-T+pU)3-0Y1T+1{Y Y Xz-CCu) )C)@ i!# G.B.fC.-D.-E.g-n,l ayFi/a0 P l !!`l 10/a0 P l !fel -X-n`l 10 k1W ^n-V:K% :C%6(]a/!h w6*i::$ :c%6* w6*-V' ::$W P6   6W 6W 6" 6W  6W u r,~-~-fE) )f){ }H""""*z*ε".b p.@\uԮe{}oSbûȥ||ddddv||:n>fmR{غhƏz¡>SG@LܳtOTőѸ՛ȷ|dPZglx|?*hOǶrXSp_Vn.D'Vگn7> cʶ`4׉-LGٽk11@ ײw;":Nn{ŲĴڠ|vd`vzzze :mϺ{K# `(V8m_oG@! ƵeC:51{w{ɣڹĻׯ|xiq|xx`WxرrrjoaN":fSAž`;  ΍:'LAV†A.LVYmaJ@beTtƳ|nixx|x|Ӻ}umhar}f\j_r޺uN- ֫iGLQզy.DS\2_mSL6So{eƸyͣIJȻxǶwkmhcLSoO6Զӱb7  *yS@LБiSyX1LG8h_hptԸէ̯įvq¬{TJaa_XrS6͡e< L{t]TC:|FO.6.X=_mzbūT\ƮŸȻĻܖg^㱋}W:1S\aSQňƼyS15}kJC;40ܯd7H@V_tƀk\yͮIJ|~~x}a@*1OXa<ūʦj:1@wu\@5/-*%ȊI5LDּmp}ȻûְtJ/"5SXf.ѧmʼt0%"Sh+rÉK0:*\tutɼ~~~x~ş{XJL¶t@}\J<5/%"mzդxF>O${oo}Ƹ~~~~X'ɿS\yuYO@5*"8Ͼ͸iNOXcưx~~~~~w{]<5@߿ɿoXjLaaTH5*±Ӧyoj*hƿͿ~~~~~eba{}ƵyoS.>[}mVSy{D8}{ssst{wXOTb]a`C@<@5{eNC;;;;;;!$'VY¼~{pi``n~{taafj:00074Gʾ{we>%"0[}ujjGc}bC**5@HvkbTH]rYA#0""FH<:CB>Mlx{n``RKB7-0-00  ¡}zof*QtC>JG:**/4`~si[RFB;440-) 'ضytL{wN  z_LA=A-7>4iO{]::1>n~ʺ];774*=_¬}f${ws`Su_LGDL@>R4ie/%wʞuB4(ƅ.!Qʺh.$!wsie;{aSJLLL;%[]T5ew{ݼfL.֮}mž}y_=$$11ow~~~s[N>*teXLLQQJeaHnְ}X1'z}Y':fw`Rd~i>-weXXQVQ #1ƿƿt:"Ѣ}u8aƪyof]]mrSVt@<:1">ֽkOƼRLzӾW- *Ƽk1"ټwyhضzh_YSSG(((t XҟiCѼyʿ_.= =¨zmbOJD@AAucVGAAAGLYcopiniЯ|? 0*Gɜf.Ѱ\:$5'Xt]<""CxHͼmYcʼfL >yoh_Y\TJHKR[> BC ϼ}LƌT$_ڳ`>HT@A}J${xxէbDjƢ{yӺk\hmr'wfa][d`RW}ztpe]]TRW[[i 8m϶ot@p].YřsI0CJDV}zua@Cܽ]$<=ؼyrh_ؾ\SYmr}taXTT[[T`{wpe``[`i&; YVǪwa\X.߭XJ:6ƫR7>JSzzzzhmu\ˤt]:{H¢r_.@ӾyVS_mayo\SOOR[W"C{snnnnsn*Mltw4*OoƢeTSe$eO<<m{[FR\z}rcct@ղ{e~~pb:/XhL$ϼ}rYVhr1tj\TOHWW[t~{xwss{]CF7ZdIpo\ajmѵ`NOOaŔ}ytb@T@'$:C@Ӫ<GrcahG}pb]XORRWT K[H@'Ot{{{ta<5xwK)tRMtS@'L¸iCCOXSwTN'4C{ӵD:'jtoe=OtpaXTTT[W5ZsF"C* p߸|;={]NTab6fO'$D=6hzA( _zzrmhmmhcY_atkJa}Ӱo'R]o}mL {wkbXW[[W nK-:H'@ƿ׃>fy0Ӻytf\fjOTT/'=͵S8}rzrm____YYYYokpJyaYӦp]D/p5t]$4;4C{wki``W[!-dF-5*5`?*h.ǶrTOojjSѝbHba_¦ɗoLzrzzzr__VV_YYYSoOb5=Ǚ]@O *>`[B"'wtniie]1"xiK;%>spWN>pR 6r϶a@/Hf@=ѝj1yaQٽbSrhzzzm_VVVVYYYSj<{t]5ص{C5J CB%4R5k{iieS4;4WF5*'n{peWNHs# LǪ{K/!=zy{rAͧw;:hhrzrh___VVVYSYX*epT/*Cjʗ`/>HFxBZW7FX{sb:5'B~{niW<>~potj\mƺ> cʶ`4T]YɸcԼR%*S_crrm___Y_YYYc1:b*mhӵ}H>W ~`|x^Nst`4K{pe]TN7zzze TO'L\SL1__VVVVVQV_f= yhuzhmi`^FUdMU|`nC%%[wttiNC;7-ǶwkmhcLSoL6Զӵb7  5}uQխx-;H@$!6AYY\YSYcV. Ӿr_SLDen`FBIqPxWW`7Wtkt~`C>;7¨{TJaccXrS6͡e< {}uj.ѻRBFH<a5JftjG$GSSSXXL5$ߡӾmQA@5XiBIMBl[ddFHtN%CtkkwpW>;70$㱋}W:5SaaSQňƼyS15wwtSGnM[O@ Gͧ{XLY6fa1 oӾmS@1/';3I^vPld`Cs{e>"wnee`K;70%}a@*1OXa@ūʦj:t{t\r~n\= $jܽR@16wbO"Ӿ¬}bH5*'$%9MgMP^lĻi0 >{{n4epbXNC>70#ְuJ/"5SXf.ѫmʼt"De\HTpe1A}yW' \ׯxB%:.t{iXTjN5*""",3?BllФW`e{w]$1kbNC>>7) neC'$@\jX@ܗyjµT"`{@ū<Sjˤ~R<ЛZ)*5=ttnWJ@±}]>###UUķdZvv[5t]@SLTepbT:;/ lso@'1Xjѹ֧t¶e:b˽b'uܲs`O$Sմ|?5H[NCCiweC-% UP|PM^ȩF>bƸbN@_csXJ>7- ZUFRXS=DҳyjǺt"eƪ{NHB~ţ{XJLǿt5@oí{nbd#-JJ@ȥq9%/)#Bd4lΘ}eC-&EE^vqqgZqĤn;7kbCC@mS<1/**%:K4?^x]CUKɿS5:Sn]Xs7%H:̩|I4KlxړzrfW>-##93EEE^q|Яdv{iTNtNC:s]O@ͭM)#;K'DZ, 0-#>зe}rhYO<0%%%%,E,9E?Pdi[i|d{{k@fkO<5.Jy\HC40)">IMq|qlN\syƵuoS]~snt`T@.dMFFF%kqU?BB44I7ZjXOC:/4- 99&3EEi{H*gvtJ$TjS@>0%""7II^v|vqliƵoY~kJ=1'C"Jxi[WC%R~~~i`R>[sZ|~вˌ[WKCB3&&&339d{b<0p]$O\J<50%"BI?gvqlZgʰ}oo@sMěЖ[:i{sFFZ>#)iiKC0%#wÉx[xZ,,&&E?9&&3?EwXC'{`H$*wy}yYJ<5/%"Pg^vvql^¦p\fFF0`nč̉iEEqvv^EEEPvpJ:1kR1yjm\TC5*4|gUvqӿwbS\J.WMqЍvdgȻqUKUЕxensp|xȖPZ^lld^{X<1}kJ:$`XHaXLjaOO:/!^qElvͧ{WNJXXMIlש||ĴqUUlЉ``~`wȐפwkqvUI|Fowb@1i}uaJ1' R~O**OYGH:*!9UqvqPvvƳ`CCTXfZMIx̷̍|`xxe֤`>Hb`x^v߫v^ƶ@:MM͢~v~ndiix~˳ōB)%FvIvMUs-SuӶ}jsȯdPbouo\S<:J<1":fn`Z^?^|^^vltaafj@RIRHyʬ}ȻZZxx^^WЩw׭q,)nZ?dP܉0'hǶmOD^Urm\SSO<{a1{|n`[RE^q^^vg}ujjLiaLӾfOgdP^˻ФpI #B;?ldC 8zϵ]:'@|ĒzzrYSDH@Tafxi`RMIZlE^l|lqy}}yaX܃- hz¦uO:/wdlȻПw˟i)&&P` V¦sF*xȚjXGDD'Da{`WKF>>BP|lgd^`iZMF ӵ`;$;>>^vqg^`ttnei 8m¢wK%$|xsлs>*zzr}[ GmrϱtC# C~T:<<<50)-40>g^|v¨zrrjjuw4'Oo!ӬtK% qț~pw`H7ӺyumhXuofjY޺oH) grX>*/5 >̴˭xWW`ws±pbmhcSDoD'ԱǪX0 K{}rYJ5'1:C|~{wbXNC:/)#%)0-v|^ۺkjmcf@Ɯa@GǜtH) ˹sR4On:t徨tH@\c_S_ѪtDɡm}\1 %ttkXH51170-%)0,4ZvPUӱkHXa_h.+Ѫy1Լ}O* DϪ˹nF)Ti:}{㬆yN41S\aSVəƵa:"/`{wk{nXH<7:Wqsnn]JC;/0)%)4,FgEvʞpC/D\\f"צͼh@*"Q͔Wò`75tp{ez\:'1OXa5ūǪN~pWWCC:Ksie]KC>7*--04#^|ZvяmO4'@X\f.׸ӼOHfy~7"H~N'1{wHHӪtC*"5S\aA͙rª{Onnxx~~ni`RKB;440--#qqgvn͏\<''DXa@߸hµWri:{ţiHTwbOO{eOe>$'H\otoׅytfµ]`xȴxi`WKF>;7404B|PUlnN/!1Ofj@f࿅ya¢wZlUvCD˸R-*OeL@S\@a{OJSƼtHw|qgddgv|vddgB,%^|ι||ZwºTcӵutAR05jyaL{oƼLڕĩ|vqlgvqll#Ļx^ZlvBiUZ3ZƼ}=tLsX@Jy{kwpwXf{ư}tв̯|qU^|x||ZU^Zq>#FM&XƸySρ_һ{eJX]ytҧoѳyƵ{ЭĴ|vl^qvUqglg|gqK^Zͼ}tfS}rέŮsR@șƵӼorIJȠvqv||ld;U|ddvUvԲXԪ֐fѿ~`CҳǬ}oa\ĴлȴȻ|v||vvqdZPIBl||qvI{ϺyySys#1f˹ɿ~`>Ký¢kaXLjܴĻĠ|v|gvv|qZ^Zd`ZIlqMZ|g?Pʱ}fSk'W@G`B/Ըp]XSXt܉xĊvZ||d>FMgqq^U^dZvPUP^ͪkXOp$}ߕ0 = Ųt˽K>eýɣwNHJXpĻдvKvxdUZZlvq||^dqlZlvgvԼiNOJfyn=ѽtbo˹iF{չnH˻W>KXX{ĄnZZddZdZdlvlgdgl[Zd^¿wKCJXTݢH!@!ųpbO\iK;˭inλãt]X]fXnĻȻĻȯ|lRBZvZRd|vg^^gqqqldqleOO]b<Ƙ“cVVA8Sy\ajhϿ{tnW@]ä˹ufcjf@̷ȕ|׉3ZNBURdI?Zlv|~d^t}jaaj\YhAAr_Q_rrfczo}jep˻˻}tjfGû̻̩xvMdRIUdq| E߸tK`t\Grݧm>@@bpμĻ˻v^q}1]ۨmrND@F4н˽ĽķïBlϜC1|=r50'WķȒxv{zR DnH8Y88u@5w{ĻĻss|s~ݱzmhTDcӋC џ<_zTDAu_SywƹսĻįxݨ{bc@Db b@n6D_zuk}Ȼv~z<@\'߮c$5tuҽ~}Tɶ}fmD1#r±}]ò~~~e}ٿyJakJ1'޺@68μ˩~x}ص\1HO'zOH!ب*׿~~ʐbTLTCCkfx[ؿuy~{{ǰ]O]]D8SiNBimm1Ž~siw]bbH:-mYzc11H~tX@*)-ئAŽp C"{O15^~weJ:*%-+ǏyGhŽp:uu5">@J>BPvs`H7--) _笆u8G}<rL10NT14s{C40VӡYYs[pLG!4Ck:ӆ:=u_V.*SwnwKOpSQ2Steeb$ӆ@ǿ~K~7WfY}}mXQ=km]4GϋOyʿ;>s5fAurm_LGGfGb cϿ۾ƿż4RwTTT{G!AcVQA(AOۘH!zˆHGɿCɪDH@!@GYYVLmmrk@ cuVSAظ`"$ͣɿ1eܗSuopapL@$ XB mŒ;Ƽu:eؿy}ءmYO88}X~5m'Q] /ŹXb@Cb}_؋tXG@m__mttH OM5yfYz/e{H]NƋ'Ƣ6=6}cO@LhG==Lakn</'԰͜{'7<{<]í~XԸcϵ}85cG=V}Y=222L]e"9 $A՝ʰJ1JJ$JŚtV+zG.YucA+cV=2++@T`5^F>ԅǵeHbapƜbJ}AQmrhmcư}smcG2++@JW-.yfָmګtLtb{ҫ}༓h}rŮ~TzVA8=GHW0*VS.j8iS}]JXݢuϓrrGƼtpnNycQSJKR>uӗ}k@i>GLO*<ήDϏyrºuYr]{bX['O{pbW` ~ 'ῈkSJ1HJz}}mhkˇw/JL!ǶhYYOtXOW/W~sspH ^we x~lCsk'C{eN{zrR Dnb$]npT16_hc_YY1rhzXddd`5wkJ;ݱzmhOCcӋC yh;J.1LYYVY6}cmiI^^iR:t}sC7ݨ{bc@Ab *}V~K5bOYOup.ǾzL5HB^x~:{4tk[;0z<@b'߮cO~pSi]c`1V{X}f5$9M%e~1]]C;/]'GbG͋}Ӹ]1b{//X<)BPvlص\~ki;e>-`~x9IU99^b5e. NrX:'"vqlqʐbTCd̎giN{nŇ|Zw{@~f5KCJS@'?|^xǮ]J]d^vxixs*Hxds{yTdXX8X/OfbCMMdx]bHstͶxvg7NPLݾy<|suaO5}S~eRPgdvmuwc۶mJxi Fs%ӪN5uJ@*sNF>Ildn[ӗBWxȐ~ Huu04>l|}zz[Jn IíxswN¦rmbacϜO UrC*<~{]J1%)-红um\Xr֋@ ;`Xt:YY.ܵƜu'Fwb@5`|~sTB/)-4qlkCaDcш\S«T˹4T]Ϗ@*XHb@obutѳp\ư]wdZgx[3g{ի~n¢]آXşR5{}{}uԿ|vdvdl^|TPBƪyΣwJ}ϣzĻ||vqUvql͍ƦŐɫNض}af̻|vld^Ivllw֪zaykŤūHԙXTwĻdgKgvdggvdьX]yK'թtbչi]enN]ĻȠ^Zd^gdlgq]OTӶD=.}rptȳrkfȷMIZv#dó{`}fmr}z@@B@Wҿȯ^]}r:m1wĽ|54`r*V}zȻ|uXppC֕1]}ijC{ur0:p:˳wԦcX']Ƕ=}ų~Ѽf]He~JǺJ~w{]t<{KCLrǁŽCXxn7%(mǵpcuz}~}_2=RkDSO}k1JƋyaeNkX> rDkmukbO]Tc8yT:;]X]NNnDwb}Vmzr__Te1~5~]`5/X}G=buJVhYOwk>F|xH5s:}54/r@JOVc!hT^v{-Jn;uXmeab@~.te:7C]HT]C{X{HT;~k3lWH<'FwԦe]g)N0~n7,?O@p4^qѼfs~iګep~wG/Cu@;q{TNZ-CzCbiIlsp%@~4mCip5{wC-Z|rD{HtCTu`b``;-ZCJbzteXkyTֺ~NZxWTجwɚb|vlinۈfxggdv|݂p'ԂtfķUdPwec C@eνįw˽c]btkkeνw]bJ{;mhɽ:5OOƼk`ShYhbOzYr/u}bmpu8;pwzsnYOi]4nccp[R{CWuH{C,xH];RntCpU}wwcW~eTBeinxv|uxvquy6D@{Ҹ{pkɹ]a}p}m`}pkkewy]kKXb{wnXnvUDuhypsbvhDu{xD{///============================================================================= // HUD: Superclass of the heads-up display. //============================================================================= class HUD extends Actor abstract native config(user); //============================================================================= // Variables. var globalconfig int HudMode; var globalconfig int Crosshair; var() class MainMenuType; var() string HUDConfigWindowType; var color WhiteColor; var Menu MainMenu; var Mutator HUDMutator; var PlayerPawn PlayerOwner; // always the actual owner struct HUDLocalizedMessage { var Class Message; var int Switch; var PlayerReplicationInfo RelatedPRI; var Object OptionalObject; var float EndOfLife; var float LifeTime; var bool bDrawing; var int numLines; var string StringMessage; var color DrawColor; var font StringFont; var float XL, YL; var float YPos; }; function ClearMessage(out HUDLocalizedMessage M) { M.Message = None; M.Switch = 0; M.RelatedPRI = None; M.OptionalObject = None; M.EndOfLife = 0; M.StringMessage = ""; M.DrawColor = WhiteColor; M.XL = 0; M.bDrawing = false; } function CopyMessage(out HUDLocalizedMessage M1, HUDLocalizedMessage M2) { M1.Message = M2.Message; M1.Switch = M2.Switch; M1.RelatedPRI = M2.RelatedPRI; M1.OptionalObject = M2.OptionalObject; M1.EndOfLife = M2.EndOfLife; M1.StringMessage = M2.StringMessage; M1.DrawColor = M2.DrawColor; M1.XL = M2.XL; M1.YL = M2.YL; M1.YPos = M2.YPos; M1.bDrawing = M2.bDrawing; M1.LifeTime = M2.LifeTime; M1.numLines = M2.numLines; } //============================================================================= // Status drawing. simulated event PreRender( canvas Canvas ); simulated event PostRender( canvas Canvas ); simulated function InputNumber(byte F); simulated function ChangeHud(int d); simulated function ChangeCrosshair(int d); simulated function DrawCrossHair( canvas Canvas, int StartX, int StartY); //============================================================================= // Messaging. simulated function Message( PlayerReplicationInfo PRI, coerce string Msg, name N ); simulated function LocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject, optional string CriticalString ); simulated function PlayReceivedMessage( string S, string PName, ZoneInfo PZone ) { PlayerPawn(Owner).ClientMessage(S); if (PlayerPawn(Owner).bMessageBeep) PlayerPawn(Owner).PlayBeepSound(); } // DisplayMessages is called by the Console in PostRender. // It offers the HUD a chance to deal with messages instead of the // Console. Returns true if messages were dealt with. simulated function bool DisplayMessages(canvas Canvas) { return false; } function bool ProcessKeyEvent( int Key, int Action, FLOAT Delta ) { return false; } A3B3Ae ( ZV //============================================================================= // PlayerPawn. // player controlled pawns // Note that Pawns which implement functions for the PlayerTick messages // must handle player control in these functions //============================================================================= class PlayerPawn expands Pawn config(user) native nativereplication; // Player info. var const player Player; var globalconfig string Password; // for restarting coop savegames var travel float DodgeClickTimer; // max double click interval for dodge move var(Movement) globalconfig float DodgeClickTime; var(Movement) globalconfig float Bob; var float LandBob, AppliedBob; var float bobtime; // Camera info. var int ShowFlags; var int RendMap; var int Misc1; var int Misc2; var actor ViewTarget; var vector FlashScale, FlashFog; var HUD myHUD; var ScoreBoard Scoring; var class HUDType; var class ScoringType; var float DesiredFlashScale, ConstantGlowScale, InstantFlash; var vector DesiredFlashFog, ConstantGlowFog, InstantFog; var globalconfig float DesiredFOV; var globalconfig float DefaultFOV; // Music info. var music Song; var byte SongSection; var byte CdTrack; var EMusicTransition Transition; var float shaketimer; // player uses this for shaking view var int shakemag; // max magnitude in degrees of shaking var float shakevert; // max vertical shake magnitude var float maxshake; var float verttimer; var(Pawn) class CarcassType; var travel globalconfig float MyAutoAim; var travel globalconfig float Handedness; var(Sounds) sound JumpSound; // Player control flags var bool bAdmin; var() globalconfig bool bLookUpStairs; // look up/down stairs (player) var() globalconfig bool bSnapToLevel; // Snap to level eyeheight when not mouselooking var() globalconfig bool bAlwaysMouseLook; var globalconfig bool bKeyboardLook; // no snapping when true var bool bWasForward; // used for dodge move var bool bWasBack; var bool bWasLeft; var bool bWasRight; var bool bEdgeForward; var bool bEdgeBack; var bool bEdgeLeft; var bool bEdgeRight; var bool bIsCrouching; var bool bShakeDir; var bool bAnimTransition; var bool bIsTurning; var bool bFrozen; var bool bBadConnectionAlert; var globalconfig bool bInvertMouse; var bool bShowScores; var bool bShowMenu; var bool bSpecialMenu; var bool bWokeUp; var bool bPressedJump; var bool bUpdatePosition; var bool bDelayedCommand; var bool bRising; var bool bReducedVis; var bool bCenterView; var() globalconfig bool bMaxMouseSmoothing; var bool bMouseZeroed; var bool bReadyToPlay; var globalconfig bool bNoFlash; var globalconfig bool bNoVoices; var globalconfig bool bMessageBeep; var bool bZooming; var() bool bSinglePlayer; // this class allowed in single player var bool bJustFired; var bool bJustAltFired; var bool bIsTyping; var bool bFixedCamera; var globalconfig bool bNeverAutoSwitch; // if true, don't automatically switch to picked up weapon var bool bJumpStatus; // used in net games var bool bUpdating; var bool bCheatsEnabled; var float ZoomLevel; var class SpecialMenu; var string DelayedCommand; var globalconfig float MouseSensitivity; var globalconfig name WeaponPriority[50]; //weapon class priorities (9 is highest) var float SmoothMouseX, SmoothMouseY, BorrowedMouseX, BorrowedMouseY; var() globalconfig float MouseSmoothThreshold; var float MouseZeroTime; // Input axes. var input float aBaseX, aBaseY, aBaseZ, aMouseX, aMouseY, aForward, aTurn, aStrafe, aUp, aLookUp, aExtra4, aExtra3, aExtra2, aExtra1, aExtra0; // Move Buffering. var SavedMove SavedMoves; var SavedMove FreeMoves; var SavedMove PendingMove; var float CurrentTimeStamp,LastUpdateTime,ServerTimeStamp,TimeMargin, ClientUpdateTime; var globalconfig float MaxTimeMargin; // Progess Indicator. var string ProgressMessage[8]; var color ProgressColor[8]; var float ProgressTimeOut; // Localized strings var localized string QuickSaveString; var localized string NoPauseMessage; var localized string ViewingFrom; var localized string OwnCamera; var localized string FailedView; // ReplicationInfo var GameReplicationInfo GameReplicationInfo; // ngWorldStats Logging var() globalconfig private string ngWorldSecret; var() globalconfig bool ngSecretSet; var bool ReceivedSecretChecksum; // Remote Pawn ViewTargets var rotator TargetViewRotation; var float TargetEyeHeight; var vector TargetWeaponViewOffset; // Demo recording view rotation var int DemoViewPitch; var int DemoViewYaw; var float LastPlaySound; // text message sending var float LastMessageWindow; replication { // Things the server should send to the client. reliable if( bNetOwner && Role==ROLE_Authority ) ViewTarget, ScoringType, HUDType, GameReplicationInfo, bFixedCamera, bCheatsEnabled; unreliable if ( bNetOwner && Role==ROLE_Authority ) TargetViewRotation, TargetEyeHeight, TargetWeaponViewOffset; reliable if( bDemoRecording && Role==ROLE_Authority ) DemoViewPitch, DemoViewYaw; // Things the client should send to the server reliable if ( Role 0.01 ) { AppliedBob += FMin(1, 16 * deltatime) * LandBob; LandBob *= (1 - 8*Deltatime); } if ( Speed2D < 10 ) WalkBob.Z = AppliedBob + Bob * 30 * sin(12 * BobTime); else WalkBob.Z = AppliedBob + Bob * Speed2D * sin(12 * BobTime); } exec function ViewPlayerNum(optional int num) { local Pawn P; if ( !PlayerReplicationInfo.bIsSpectator && !Level.Game.bTeamGame ) return; if ( num >= 0 ) { P = Pawn(ViewTarget); if ( (P != None) && P.bIsPlayer && (P.PlayerReplicationInfo.TeamID == num) ) { ViewTarget = None; bBehindView = false; return; } for ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == PlayerReplicationInfo.Team) && !P.PlayerReplicationInfo.bIsSpectator && (P.PlayerReplicationInfo.TeamID == num) ) { if ( P != self ) { ViewTarget = P; bBehindView = true; } return; } return; } if ( Role == ROLE_Authority ) { ViewClass(class'Pawn', true); While ( (ViewTarget != None) && (!Pawn(ViewTarget).bIsPlayer || Pawn(ViewTarget).PlayerReplicationInfo.bIsSpectator) ) ViewClass(class'Pawn', true); if ( ViewTarget != None ) ClientMessage(ViewingFrom@Pawn(ViewTarget).PlayerReplicationInfo.PlayerName, 'Event', true); else ClientMessage(ViewingFrom@OwnCamera, 'Event', true); } } exec function Profile() { //TEMP for performance measurement log("Average AI Time"@Level.AvgAITime); log(" < 5% "$Level.AIProfile[0]); log(" < 10% "$Level.AIProfile[1]); log(" < 15% "$Level.AIProfile[2]); log(" < 20% "$Level.AIProfile[3]); log(" < 25% "$Level.AIProfile[4]); log(" < 30% "$Level.AIProfile[5]); log(" < 35% "$Level.AIProfile[6]); log(" > 35% "$Level.AIProfile[7]); } // Execute an administrative console command on the server. exec function Admin( string CommandLine ) { local string Result; if( bAdmin ) Result = ConsoleCommand( CommandLine ); if( Result!="" ) ClientMessage( Result ); } // Login as the administrator. exec function AdminLogin( string Password ) { Level.Game.AdminLogin( Self, Password ); } // Logout as the administrator. exec function AdminLogout() { Level.Game.AdminLogout( Self ); } exec function SShot() { local float b; b = float(ConsoleCommand("get ini:Engine.Engine.ViewportManager Brightness")); ConsoleCommand("set ini:Engine.Engine.ViewportManager Brightness 1"); ConsoleCommand("flush"); ConsoleCommand("shot"); ConsoleCommand("set ini:Engine.Engine.ViewportManager Brightness "$string(B)); ConsoleCommand("flush"); } exec function PlayerList() { local PlayerReplicationInfo PRI; log("Player List:"); ForEach AllActors(class'PlayerReplicationInfo', PRI) log(PRI.PlayerName@"( ping"@PRI.Ping$")"); } // // Native ClientSide Functions // event ReceiveLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Message.Static.ClientReceive( Self, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); } event ClientMessage( coerce string S, optional Name Type, optional bool bBeep ) { if (Player == None) return; if (Type == '') Type = 'Event'; if (Player.Console != None) Player.Console.Message( PlayerReplicationInfo, S, Type ); if (bBeep && bMessageBeep) PlayBeepSound(); if ( myHUD != None ) myHUD.Message( PlayerReplicationInfo, S, Type ); } event TeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep ) { if (Player.Console != None) Player.Console.Message ( PRI, S, Type ); if (bBeep && bMessageBeep) PlayBeepSound(); if ( myHUD != None ) myHUD.Message( PRI, S, Type ); } function ClientVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID) { local VoicePack V; if ( (Sender == None) || (Sender.voicetype == None) || (Player.Console == None) ) return; V = Spawn(Sender.voicetype, self); if ( V != None ) V.ClientInitialize(Sender, Recipient, messagetype, messageID); } simulated function PlayBeepSound(); // // Send movement to the server. // Passes acceleration in components so it doesn't get rounded. // function ServerMove ( float TimeStamp, vector InAccel, vector ClientLoc, bool NewbRun, bool NewbDuck, bool NewbJumpStatus, bool bFired, bool bAltFired, bool bForceFire, bool bForceAltFire, eDodgeDir DodgeMove, byte ClientRoll, int View, optional byte OldTimeDelta, optional int OldAccel ) { local float DeltaTime, clientErr, OldTimeStamp; local rotator DeltaRot, Rot; local vector Accel, LocDiff; local int maxPitch, ViewPitch, ViewYaw; local actor OldBase; local bool NewbPressedJump, OldbRun, OldbDuck; local eDodgeDir OldDodgeMove; // If this move is outdated, discard it. if ( CurrentTimeStamp >= TimeStamp ) return; // if OldTimeDelta corresponds to a lost packet, process it first if ( OldTimeDelta != 0 ) { OldTimeStamp = TimeStamp - float(OldTimeDelta)/500 - 0.001; if ( CurrentTimeStamp < OldTimeStamp - 0.001 ) { // split out components of lost move (approx) Accel.X = OldAccel >>> 23; if ( Accel.X > 127 ) Accel.X = -1 * (Accel.X - 128); Accel.Y = (OldAccel >>> 15) & 255; if ( Accel.Y > 127 ) Accel.Y = -1 * (Accel.Y - 128); Accel.Z = (OldAccel >>> 7) & 255; if ( Accel.Z > 127 ) Accel.Z = -1 * (Accel.Z - 128); Accel *= 20; OldbRun = ( (OldAccel & 64) != 0 ); OldbDuck = ( (OldAccel & 32) != 0 ); NewbPressedJump = ( (OldAccel & 16) != 0 ); if ( NewbPressedJump ) bJumpStatus = NewbJumpStatus; switch (OldAccel & 7) { case 0: OldDodgeMove = DODGE_None; break; case 1: OldDodgeMove = DODGE_Left; break; case 2: OldDodgeMove = DODGE_Right; break; case 3: OldDodgeMove = DODGE_Forward; break; case 4: OldDodgeMove = DODGE_Back; break; } //log("Recovered move from "$OldTimeStamp$" acceleration "$Accel$" from "$OldAccel); MoveAutonomous(OldTimeStamp - CurrentTimeStamp, OldbRun, OldbDuck, NewbPressedJump, OldDodgeMove, Accel, rot(0,0,0)); CurrentTimeStamp = OldTimeStamp; } } // View components ViewPitch = View/32768; ViewYaw = 2 * (View - 32768 * ViewPitch); ViewPitch *= 2; // Make acceleration. Accel = InAccel/10; NewbPressedJump = (bJumpStatus != NewbJumpStatus); bJumpStatus = NewbJumpStatus; // handle firing and alt-firing if ( bFired ) { if ( bForceFire && (Weapon != None) ) Weapon.ForceFire(); else if ( bFire == 0 ) Fire(0); bFire = 1; } else bFire = 0; if ( bAltFired ) { if ( bForceAltFire && (Weapon != None) ) Weapon.ForceAltFire(); else if ( bAltFire == 0 ) AltFire(0); bAltFire = 1; } else bAltFire = 0; // Save move parameters. DeltaTime = TimeStamp - CurrentTimeStamp; if ( ServerTimeStamp > 0 ) { // allow 1% error TimeMargin += DeltaTime - 1.01 * (Level.TimeSeconds - ServerTimeStamp); if ( TimeMargin > MaxTimeMargin ) { // player is too far ahead TimeMargin -= DeltaTime; if ( TimeMargin < 0.5 ) MaxTimeMargin = Default.MaxTimeMargin; else MaxTimeMargin = 0.5; DeltaTime = 0; } } CurrentTimeStamp = TimeStamp; ServerTimeStamp = Level.TimeSeconds; Rot.Roll = 256 * ClientRoll; Rot.Yaw = ViewYaw; if ( (Physics == PHYS_Swimming) || (Physics == PHYS_Flying) ) maxPitch = 2; else maxPitch = 1; If ( (ViewPitch > maxPitch * RotationRate.Pitch) && (ViewPitch < 65536 - maxPitch * RotationRate.Pitch) ) { If (ViewPitch < 32768) Rot.Pitch = maxPitch * RotationRate.Pitch; else Rot.Pitch = 65536 - maxPitch * RotationRate.Pitch; } else Rot.Pitch = ViewPitch; DeltaRot = (Rotation - Rot); ViewRotation.Pitch = ViewPitch; ViewRotation.Yaw = ViewYaw; ViewRotation.Roll = 0; SetRotation(Rot); OldBase = Base; // Perform actual movement. if ( (Level.Pauser == "") && (DeltaTime > 0) ) MoveAutonomous(DeltaTime, NewbRun, NewbDuck, NewbPressedJump, DodgeMove, Accel, DeltaRot); // Accumulate movement error. if ( Level.TimeSeconds - LastUpdateTime > 500.0/Player.CurrentNetSpeed ) ClientErr = 10000; else if ( Level.TimeSeconds - LastUpdateTime > 180.0/Player.CurrentNetSpeed ) { LocDiff = Location - ClientLoc; ClientErr = LocDiff Dot LocDiff; } // If client has accumulated a noticeable positional error, correct him. if ( ClientErr > 3 ) { if ( Mover(Base) != None ) ClientLoc = Location - Base.Location; else ClientLoc = Location; //log("Client Error at "$TimeStamp$" is "$ClientErr$" with acceleration "$Accel$" LocDiff "$LocDiff$" Physics "$Physics); LastUpdateTime = Level.TimeSeconds; ClientAdjustPosition ( TimeStamp, GetStateName(), Physics, ClientLoc.X, ClientLoc.Y, ClientLoc.Z, Velocity.X, Velocity.Y, Velocity.Z, Base ); } //log("Server "$Role$" moved "$self$" stamp "$TimeStamp$" location "$Location$" Acceleration "$Acceleration$" Velocity "$Velocity); } function ProcessMove ( float DeltaTime, vector newAccel, eDodgeDir DodgeMove, rotator DeltaRot) { Acceleration = newAccel; } final function MoveAutonomous ( float DeltaTime, bool NewbRun, bool NewbDuck, bool NewbPressedJump, eDodgeDir DodgeMove, vector newAccel, rotator DeltaRot ) { if ( NewbRun ) bRun = 1; else bRun = 0; if ( NewbDuck ) bDuck = 1; else bDuck = 0; bPressedJump = NewbPressedJump; HandleWalking(); ProcessMove(DeltaTime, newAccel, DodgeMove, DeltaRot); AutonomousPhysics(DeltaTime); //log("Role "$Role$" moveauto time "$100 * DeltaTime$" ("$Level.TimeDilation$")"); } // ClientAdjustPosition - pass newloc and newvel in components so they don't get rounded function ClientAdjustPosition ( float TimeStamp, name newState, EPhysics newPhysics, float NewLocX, float NewLocY, float NewLocZ, float NewVelX, float NewVelY, float NewVelZ, Actor NewBase ) { local Decoration Carried; local vector OldLoc, 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; SetBase(NewBase); if ( Mover(NewBase) != None ) NewLocation += NewBase.Location; //log("Client "$Role$" adjust "$self$" stamp "$TimeStamp$" location "$Location); Carried = CarriedDecoration; OldLoc = Location; bCanTeleport = false; SetLocation(NewLocation); bCanTeleport = true; if ( Carried != None ) { CarriedDecoration = Carried; CarriedDecoration.SetLocation(NewLocation + CarriedDecoration.Location - OldLoc); CarriedDecoration.SetPhysics(PHYS_None); CarriedDecoration.SetBase(self); } SetPhysics(newPhysics); if ( !IsInState(newState) ) GotoState(newState); bUpdatePosition = true; } function ClientUpdatePosition() { local SavedMove CurrentMove; local int realbRun, realbDuck; local bool bRealJump; local float TotalTime, AdjPCol; local pawn P; local vector Dir; bUpdatePosition = false; realbRun= bRun; realbDuck = bDuck; bRealJump = bPressedJump; CurrentMove = SavedMoves; bUpdating = true; while ( CurrentMove != None ) { if ( CurrentMove.TimeStamp <= CurrentTimeStamp ) { SavedMoves = CurrentMove.NextMove; CurrentMove.NextMove = FreeMoves; FreeMoves = CurrentMove; FreeMoves.Clear(); CurrentMove = SavedMoves; } else { // adjust radius of nearby players with uncertain location if ( TotalTime > 0 ) ForEach AllActors(class'Pawn', P) if ( (P != self) && (P.Velocity != vect(0,0,0)) && P.bBlockPlayers ) { Dir = Normal(P.Location - Location); if ( (Velocity Dot Dir > 0) && (P.Velocity Dot Dir > 0) ) { // if other pawn moving away from player, push it away if its close // since the client-side position is behind the server side position if ( VSize(P.Location - Location) < P.CollisionRadius + CollisionRadius + CurrentMove.Delta * GroundSpeed ) P.MoveSmooth(P.Velocity * 0.5 * PlayerReplicationInfo.Ping); } } TotalTime += CurrentMove.Delta; MoveAutonomous(CurrentMove.Delta, CurrentMove.bRun, CurrentMove.bDuck, CurrentMove.bPressedJump, CurrentMove.DodgeMove, CurrentMove.Acceleration, rot(0,0,0)); CurrentMove = CurrentMove.NextMove; } } bUpdating = false; bDuck = realbDuck; bRun = realbRun; bPressedJump = bRealJump; //log("Client adjusted "$self$" stamp "$CurrentTimeStamp$" location "$Location$" dodge "$DodgeDir); } final function SavedMove GetFreeMove() { local SavedMove s; if ( FreeMoves == None ) return Spawn(class'SavedMove'); else { s = FreeMoves; FreeMoves = FreeMoves.NextMove; s.NextMove = None; return s; } } function int CompressAccel(int C) { if ( C >= 0 ) C = Min(C, 127); else C = Min(abs(C), 127) + 128; return C; } // // Replicate this client's desired movement to the server. // function ReplicateMove ( float DeltaTime, vector NewAccel, eDodgeDir DodgeMove, rotator DeltaRot ) { local SavedMove NewMove, OldMove, LastMove; local byte ClientRoll; local int i; local float OldTimeDelta, TotalTime, NetMoveDelta; local int OldAccel; local vector BuildAccel, AccelNorm; local float AdjPCol; local pawn P; local vector Dir; // Get a SavedMove actor to store the movement in. if ( PendingMove != None ) { //add this move to the pending move PendingMove.TimeStamp = Level.TimeSeconds; if ( VSize(NewAccel) > 3072 ) NewAccel = 3072 * Normal(NewAccel); TotalTime = PendingMove.Delta + DeltaTime; PendingMove.Acceleration = (DeltaTime * NewAccel + PendingMove.Delta * PendingMove.Acceleration)/TotalTime; // Set this move's data. if ( PendingMove.DodgeMove == DODGE_None ) PendingMove.DodgeMove = DodgeMove; PendingMove.bRun = (bRun > 0); PendingMove.bDuck = (bDuck > 0); PendingMove.bPressedJump = bPressedJump || PendingMove.bPressedJump; PendingMove.bFire = PendingMove.bFire || bJustFired || (bFire != 0); PendingMove.bForceFire = PendingMove.bForceFire || bJustFired; PendingMove.bAltFire = PendingMove.bAltFire || bJustAltFired || (bAltFire != 0); PendingMove.bForceAltFire = PendingMove.bForceAltFire || bJustFired; PendingMove.Delta = TotalTime; } if ( SavedMoves != None ) { NewMove = SavedMoves; AccelNorm = Normal(NewAccel); while ( NewMove.NextMove != None ) { // find most recent interesting move to send redundantly if ( NewMove.bPressedJump || ((NewMove.DodgeMove != Dodge_NONE) && (NewMove.DodgeMove < 5)) || ((NewMove.Acceleration != NewAccel) && ((normal(NewMove.Acceleration) Dot AccelNorm) < 0.95)) ) OldMove = NewMove; NewMove = NewMove.NextMove; } if ( NewMove.bPressedJump || ((NewMove.DodgeMove != Dodge_NONE) && (NewMove.DodgeMove < 5)) || ((NewMove.Acceleration != NewAccel) && ((normal(NewMove.Acceleration) Dot AccelNorm) < 0.95)) ) OldMove = NewMove; } LastMove = NewMove; NewMove = GetFreeMove(); NewMove.Delta = DeltaTime; if ( VSize(NewAccel) > 3072 ) NewAccel = 3072 * Normal(NewAccel); NewMove.Acceleration = NewAccel; // Set this move's data. NewMove.DodgeMove = DodgeMove; NewMove.TimeStamp = Level.TimeSeconds; NewMove.bRun = (bRun > 0); NewMove.bDuck = (bDuck > 0); NewMove.bPressedJump = bPressedJump; NewMove.bFire = (bJustFired || (bFire != 0)); NewMove.bForceFire = bJustFired; NewMove.bAltFire = (bJustAltFired || (bAltFire != 0)); NewMove.bForceAltFire = bJustAltFired; if ( Weapon != None ) // approximate pointing so don't have to replicate Weapon.bPointing = ((bFire != 0) || (bAltFire != 0)); bJustFired = false; bJustAltFired = false; // adjust radius of nearby players with uncertain location ForEach AllActors(class'Pawn', P) if ( (P != self) && (P.Velocity != vect(0,0,0)) && P.bBlockPlayers ) { Dir = Normal(P.Location - Location); if ( (Velocity Dot Dir > 0) && (P.Velocity Dot Dir > 0) ) { // if other pawn moving away from player, push it away if its close // since the client-side position is behind the server side position if ( VSize(P.Location - Location) < P.CollisionRadius + CollisionRadius + NewMove.Delta * GroundSpeed ) P.MoveSmooth(P.Velocity * 0.5 * PlayerReplicationInfo.Ping); } } // Simulate the movement locally. ProcessMove(NewMove.Delta, NewMove.Acceleration, NewMove.DodgeMove, DeltaRot); AutonomousPhysics(NewMove.Delta); //log("Role "$Role$" repmove at "$Level.TimeSeconds$" Move time "$100 * DeltaTime$" ("$Level.TimeDilation$")"); // Decide whether to hold off on move // send if dodge, jump, or fire unless really too soon, or if newmove.delta big enough // on client side, save extra buffered time in LastUpdateTime if ( PendingMove == None ) PendingMove = NewMove; else { NewMove.NextMove = FreeMoves; FreeMoves = NewMove; FreeMoves.Clear(); NewMove = PendingMove; } NetMoveDelta = FMax(64.0/Player.CurrentNetSpeed, 0.011); if ( !PendingMove.bForceFire && !PendingMove.bForceAltFire && !PendingMove.bPressedJump && (PendingMove.Delta < NetMoveDelta - ClientUpdateTime) ) { // save as pending move return; } else if ( (ClientUpdateTime < 0) && (PendingMove.Delta < NetMoveDelta - ClientUpdateTime) ) return; else { ClientUpdateTime = PendingMove.Delta - NetMoveDelta; if ( SavedMoves == None ) SavedMoves = PendingMove; else LastMove.NextMove = PendingMove; PendingMove = None; } // check if need to redundantly send previous move if ( OldMove != None ) { // log("Redundant send timestamp "$OldMove.TimeStamp$" accel "$OldMove.Acceleration$" at "$Level.Timeseconds$" New accel "$NewAccel); // old move important to replicate redundantly OldTimeDelta = FMin(255, (Level.TimeSeconds - OldMove.TimeStamp) * 500); BuildAccel = 0.05 * OldMove.Acceleration + vect(0.5, 0.5, 0.5); OldAccel = (CompressAccel(BuildAccel.X) << 23) + (CompressAccel(BuildAccel.Y) << 15) + (CompressAccel(BuildAccel.Z) << 7); if ( OldMove.bRun ) OldAccel += 64; if ( OldMove.bDuck ) OldAccel += 32; if ( OldMove.bPressedJump ) OldAccel += 16; OldAccel += OldMove.DodgeMove; } //else // log("No redundant timestamp at "$Level.TimeSeconds$" with accel "$NewAccel); // Send to the server ClientRoll = (Rotation.Roll >> 8) & 255; if ( NewMove.bPressedJump ) bJumpStatus = !bJumpStatus; ServerMove ( NewMove.TimeStamp, NewMove.Acceleration * 10, Location, NewMove.bRun, NewMove.bDuck, bJumpStatus, NewMove.bFire, NewMove.bAltFire, NewMove.bForceFire, NewMove.bForceAltFire, NewMove.DodgeMove, ClientRoll, (32767 & (ViewRotation.Pitch/2)) * 32768 + (32767 & (ViewRotation.Yaw/2)), OldTimeDelta, OldAccel ); //log("Replicated "$self$" stamp "$NewMove.TimeStamp$" location "$Location$" dodge "$NewMove.DodgeMove$" to "$DodgeDir); } function HandleWalking() { local rotator carried; bIsWalking = ((bRun != 0) || (bDuck != 0)) && !Region.Zone.IsA('WarpZoneInfo'); if ( CarriedDecoration != None ) { if ( (Role == ROLE_Authority) && (standingcount == 0) ) CarriedDecoration = None; if ( CarriedDecoration != None ) //verify its still in front { bIsWalking = true; if ( Role == ROLE_Authority ) { carried = Rotator(CarriedDecoration.Location - Location); carried.Yaw = ((carried.Yaw & 65535) - (Rotation.Yaw & 65535)) & 65535; if ( (carried.Yaw > 3072) && (carried.Yaw < 62463) ) DropDecoration(); } } } } //---------------------------------------------- simulated event Destroyed() { Super.Destroyed(); if ( myHud != None ) myHud.Destroy(); if ( Scoring != None ) Scoring.Destroy(); While ( FreeMoves != None ) { FreeMoves.Destroy(); FreeMoves = FreeMoves.NextMove; } While ( SavedMoves != None ) { SavedMoves.Destroy(); SavedMoves = SavedMoves.NextMove; } } function ServerReStartGame() { } function PlayHit(float Damage, vector HitLocation, name damageType, vector Momentum) { Level.Game.SpecialDamageString = ""; } function SetFOVAngle(float newFOV) { FOVAngle = newFOV; } function ClientFlash( float scale, vector fog ) { DesiredFlashScale = scale; DesiredFlashFog = 0.001 * fog; } function ClientInstantFlash( float scale, vector fog ) { InstantFlash = scale; InstantFog = 0.001 * fog; } //Play a sound client side (so only client will hear it simulated function ClientPlaySound(sound ASound, optional bool bInterrupt, optional bool bVolumeControl ) { local actor SoundPlayer; LastPlaySound = Level.TimeSeconds; // so voice messages won't overlap if ( ViewTarget != None ) SoundPlayer = ViewTarget; else SoundPlayer = self; SoundPlayer.PlaySound(ASound, SLOT_None, 16.0, bInterrupt); SoundPlayer.PlaySound(ASound, SLOT_Interface, 16.0, bInterrupt); SoundPlayer.PlaySound(ASound, SLOT_Misc, 16.0, bInterrupt); SoundPlayer.PlaySound(ASound, SLOT_Talk, 16.0, bInterrupt); } simulated function ClientReliablePlaySound(sound ASound, optional bool bInterrupt, optional bool bVolumeControl ) { ClientPlaySound(ASound, bInterrupt, bVolumeControl); } function ClientAdjustGlow( float scale, vector fog ) { ConstantGlowScale += scale; ConstantGlowFog += 0.001 * fog; } function ClientShake(vector shake) { if ( (shakemag < shake.X) || (shaketimer <= 0.01 * shake.Y) ) { shakemag = shake.X; shaketimer = 0.01 * shake.Y; maxshake = 0.01 * shake.Z; verttimer = 0; ShakeVert = -1.1 * maxshake; } } function ShakeView( float shaketime, float RollMag, float vertmag) { local vector shake; shake.X = RollMag; shake.Y = 100 * shaketime; shake.Z = 100 * vertmag; ClientShake(shake); } function ClientSetMusic( music NewSong, byte NewSection, byte NewCdTrack, EMusicTransition NewTransition ) { Song = NewSong; SongSection = NewSection; CdTrack = NewCdTrack; Transition = NewTransition; } function ServerFeignDeath() { } function ServerSetHandedness( float hand) { Handedness = hand; if ( Weapon != None ) Weapon.SetHand(Handedness); } function ServerReStartPlayer() { } function ServerChangeSkin( coerce string SkinName, coerce string FaceName, byte TeamNum ) { local string MeshName; MeshName = GetItemName(string(Mesh)); if ( Level.Game.bCanChangeSkin ) { Self.static.SetMultiSkin(Self, SkinName, FaceName, TeamNum ); } } //************************************************************************************* // Normal gameplay execs // Type the name of the exec function at the console to execute it exec function ShowSpecialMenu( string ClassName ) { local class aMenuClass; aMenuClass = class( DynamicLoadObject( ClassName, class'Class' ) ); if( aMenuClass!=None ) { bSpecialMenu = true; SpecialMenu = aMenuClass; ShowMenu(); } } exec function Jump( optional float F ) { if ( !bShowMenu && (Level.Pauser == PlayerReplicationInfo.PlayerName) ) SetPause(False); else bPressedJump = true; } exec function CauseEvent( name N ) { local actor A; if( !bCheatsEnabled ) return; if( (bAdmin || (Level.Netmode == NM_Standalone)) && (N != '') ) foreach AllActors( class 'Actor', A, N ) A.Trigger( Self, Self ); } exec function Taunt( name Sequence ) { if ( GetAnimGroup(Sequence) == 'Gesture' ) { ServerTaunt(Sequence); PlayAnim(Sequence, 0.7, 0.2); } } function ServerTaunt(name Sequence ) { PlayAnim(Sequence, 0.7, 0.2); } exec function FeignDeath() { } exec function CallForHelp() { local Pawn P; if ( !Level.Game.bTeamGame || (Enemy == None) || (Enemy.Health <= 0) ) return; for ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( P.bIsPlayer && (P.PlayerReplicationInfo.Team == PlayerReplicationInfo.Team) ) P.HandleHelpMessageFrom(self); } function damageAttitudeTo(pawn Other) { if ( Other != Self ) Enemy = Other; } exec function Grab() { if (CarriedDecoration == None) GrabDecoration(); else DropDecoration(); } // Send a voice message of a certain type to a certain player. exec function Speech( int Type, int Index, int Callsign ) { local VoicePack V; V = Spawn( PlayerReplicationInfo.VoiceType, Self ); if (V != None) V.PlayerSpeech( Type, Index, Callsign ); } function PlayChatting(); function Typing( bool bTyping ) { bIsTyping = bTyping; if (bTyping) { if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogTypingEvent(True, Self); if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogTypingEvent(True, Self); PlayChatting(); } else { if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogTypingEvent(False, Self); if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogTypingEvent(False, Self); } } // Send a message to all players. exec function Say( string Msg ) { local Pawn P; if ( bAdmin && (left(Msg,1) == "#") ) { Msg = right(Msg,len(Msg)-1); for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.IsA('PlayerPawn') ) { PlayerPawn(P).ClearProgressMessages(); PlayerPawn(P).SetProgressTime(6); PlayerPawn(P).SetProgressMessage(Msg,0); } return; } if ( Level.Game.AllowsBroadcast(self, Len(Msg)) ) for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.bIsPlayer || P.IsA('MessagingSpectator') ) { if ( (Level.Game != None) && (Level.Game.MessageMutator != None) ) { if ( Level.Game.MessageMutator.MutatorTeamMessage(Self, P, PlayerReplicationInfo, Msg, 'Say', true) ) P.TeamMessage( PlayerReplicationInfo, Msg, 'Say', true ); } else P.TeamMessage( PlayerReplicationInfo, Msg, 'Say', true ); } return; } exec function TeamSay( string Msg ) { local Pawn P; if ( !Level.Game.bTeamGame ) { Say(Msg); return; } if ( Msg ~= "Help" ) { CallForHelp(); return; } if ( Level.Game.AllowsBroadcast(self, Len(Msg)) ) for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.bIsPlayer && (P.PlayerReplicationInfo.Team == PlayerReplicationInfo.Team) ) { if ( P.IsA('PlayerPawn') ) { if ( (Level.Game != None) && (Level.Game.MessageMutator != None) ) { if ( Level.Game.MessageMutator.MutatorTeamMessage(Self, P, PlayerReplicationInfo, Msg, 'TeamSay', true) ) P.TeamMessage( PlayerReplicationInfo, Msg, 'TeamSay', true ); } else P.TeamMessage( PlayerReplicationInfo, Msg, 'TeamSay', true ); } } } exec function RestartLevel() { if( bAdmin || Level.Netmode==NM_Standalone ) ClientTravel( "?restart", TRAVEL_Relative, false ); } exec function LocalTravel( string URL ) { if( bAdmin || Level.Netmode==NM_Standalone ) ClientTravel( URL, TRAVEL_Relative, true ); } exec function ThrowWeapon() { if( Level.NetMode == NM_Client ) return; if( Weapon==None || (Weapon.Class==Level.Game.BaseMutator.MutatedDefaultWeapon()) || !Weapon.bCanThrow ) return; Weapon.Velocity = Vector(ViewRotation) * 500 + vect(0,0,220); Weapon.bTossedOut = true; TossWeapon(); if ( Weapon == None ) SwitchToBestWeapon(); } function ToggleZoom() { if ( DefaultFOV != DesiredFOV ) EndZoom(); else StartZoom(); } function StartZoom() { ZoomLevel = 0.0; bZooming = true; } function StopZoom() { bZooming = false; } function EndZoom() { bZooming = false; DesiredFOV = DefaultFOV; } exec function FOV(float F) { SetDesiredFOV(F); } exec function SetDesiredFOV(float F) { if( (F >= 80.0) || Level.bAllowFOV || bAdmin || (Level.Netmode==NM_Standalone) ) { DefaultFOV = FClamp(F, 1, 170); DesiredFOV = DefaultFOV; SaveConfig(); } } /* PrevWeapon() - switch to previous inventory group weapon */ exec function PrevWeapon() { local int prevGroup; local Inventory inv; local Weapon realWeapon, w, Prev; local bool bFoundWeapon; if( bShowMenu || Level.Pauser!="" ) return; if ( Weapon == None ) { SwitchToBestWeapon(); return; } prevGroup = 0; realWeapon = Weapon; if ( PendingWeapon != None ) Weapon = PendingWeapon; PendingWeapon = None; for (inv=Inventory; inv!=None; inv=inv.Inventory) { w = Weapon(inv); if ( w != None ) { if ( w.InventoryGroup == Weapon.InventoryGroup ) { if ( w == Weapon ) { bFoundWeapon = true; if ( Prev != None ) { PendingWeapon = Prev; break; } } else if ( !bFoundWeapon && ((w.AmmoType == None) || (w.AmmoType.AmmoAmount>0)) ) Prev = W; } else if ( (w.InventoryGroup < Weapon.InventoryGroup) && ((w.AmmoType == None) || (w.AmmoType.AmmoAmount>0)) && (w.InventoryGroup >= prevGroup) ) { prevGroup = w.InventoryGroup; PendingWeapon = w; } } } bFoundWeapon = false; prevGroup = Weapon.InventoryGroup; if ( PendingWeapon == None ) for (inv=Inventory; inv!=None; inv=inv.Inventory) { w = Weapon(inv); if ( w != None ) { if ( w.InventoryGroup == Weapon.InventoryGroup ) { if ( w == Weapon ) bFoundWeapon = true; else if ( bFoundWeapon && (PendingWeapon == None) && ((w.AmmoType == None) || (w.AmmoType.AmmoAmount>0)) ) PendingWeapon = W; } else if ( (w.InventoryGroup > PrevGroup) && ((w.AmmoType == None) || (w.AmmoType.AmmoAmount>0)) ) { prevGroup = w.InventoryGroup; PendingWeapon = w; } } } Weapon = realWeapon; if ( PendingWeapon == None ) return; Weapon.PutDown(); } /* NextWeapon() - switch to next inventory group weapon */ exec function NextWeapon() { local int nextGroup; local Inventory inv; local Weapon realWeapon, w, Prev; local bool bFoundWeapon; if( bShowMenu || Level.Pauser!="" ) return; if ( Weapon == None ) { SwitchToBestWeapon(); return; } nextGroup = 100; realWeapon = Weapon; if ( PendingWeapon != None ) Weapon = PendingWeapon; PendingWeapon = None; for (inv=Inventory; inv!=None; inv=inv.Inventory) { w = Weapon(inv); if ( w != None ) { if ( w.InventoryGroup == Weapon.InventoryGroup ) { if ( w == Weapon ) bFoundWeapon = true; else if ( bFoundWeapon && ((w.AmmoType == None) || (w.AmmoType.AmmoAmount>0)) ) { PendingWeapon = W; break; } } else if ( (w.InventoryGroup > Weapon.InventoryGroup) && ((w.AmmoType == None) || (w.AmmoType.AmmoAmount>0)) && (w.InventoryGroup < nextGroup) ) { nextGroup = w.InventoryGroup; PendingWeapon = w; } } } bFoundWeapon = false; nextGroup = Weapon.InventoryGroup; if ( PendingWeapon == None ) for (inv=Inventory; inv!=None; inv=inv.Inventory) { w = Weapon(Inv); if ( w != None ) { if ( w.InventoryGroup == Weapon.InventoryGroup ) { if ( w == Weapon ) { bFoundWeapon = true; if ( Prev != None ) PendingWeapon = Prev; } else if ( !bFoundWeapon && (PendingWeapon == None) && ((w.AmmoType == None) || (w.AmmoType.AmmoAmount>0)) ) Prev = W; } else if ( (w.InventoryGroup < nextGroup) && ((w.AmmoType == None) || (w.AmmoType.AmmoAmount>0)) ) { nextGroup = w.InventoryGroup; PendingWeapon = w; } } } Weapon = realWeapon; if ( PendingWeapon == None ) return; Weapon.PutDown(); } exec function Mutate(string MutateString) { if( Level.NetMode == NM_Client ) return; Level.Game.BaseMutator.Mutate(MutateString, Self); } exec function QuickSave() { if ( (Health > 0) && (Level.NetMode == NM_Standalone) && !Level.Game.bDeathMatch ) { ClientMessage(QuickSaveString); ConsoleCommand("SaveGame 9"); } } exec function QuickLoad() { if ( (Level.NetMode == NM_Standalone) && !Level.Game.bDeathMatch ) ClientTravel( "?load=9", TRAVEL_Absolute, false); } exec function Kick( string S ) { local Pawn aPawn; if( !bAdmin ) return; for( aPawn=Level.PawnList; aPawn!=None; aPawn=aPawn.NextPawn ) if ( aPawn.bIsPlayer && aPawn.PlayerReplicationInfo.PlayerName~=S && (PlayerPawn(aPawn)==None || NetConnection(PlayerPawn(aPawn).Player)!=None ) ) { aPawn.Destroy(); return; } } exec function KickBan( string S ) { local Pawn aPawn; local string IP; local int j; if( !bAdmin ) return; for( aPawn=Level.PawnList; aPawn!=None; aPawn=aPawn.NextPawn ) if ( aPawn.bIsPlayer && aPawn.PlayerReplicationInfo.PlayerName~=S && (PlayerPawn(aPawn)==None || NetConnection(PlayerPawn(aPawn).Player)!=None ) ) { IP = PlayerPawn(aPawn).GetPlayerNetworkAddress(); if(Level.Game.CheckIPPolicy(IP)) { IP = Left(IP, InStr(IP, ":")); Log("Adding IP Ban for: "$IP); for(j=0;j<50;j++) if(Level.Game.IPPolicies[j] == "") break; if(j < 50) Level.Game.IPPolicies[j] = "DENY,"$IP; Level.Game.SaveConfig(); } aPawn.Destroy(); return; } } // Try to set the pause state; returns success indicator. function bool SetPause( BOOL bPause ) { return Level.Game.SetPause(bPause, self); } exec function SetMouseSmoothThreshold( float F ) { MouseSmoothThreshold = FClamp(F, 0, 0.1); SaveConfig(); } exec function SetMaxMouseSmoothing( bool B ) { bMaxMouseSmoothing = B; SaveConfig(); } // Try to pause the game. exec function Pause() { if ( bShowMenu ) return; if( !SetPause(Level.Pauser=="") ) ClientMessage(NoPauseMessage); } // Activate specific inventory item exec function ActivateInventoryItem( class InvItem ) { local Inventory Inv; Inv = FindInventoryType(InvItem); if ( Inv != None ) Inv.Activate(); } // Translator Hotkey exec function ActivateTranslator() { if ( bShowMenu || Level.Pauser!="" ) return; If (Inventory!=None) Inventory.ActivateTranslator(False); } // Translator Hotkey exec function ActivateHint() { if ( bShowMenu || Level.Pauser!="" ) return; If (Inventory!=None) Inventory.ActivateTranslator(True); } // HUD exec function ChangeHud() { if ( myHud != None ) myHUD.ChangeHud(1); myHUD.SaveConfig(); } // Crosshair exec function ChangeCrosshair() { if ( myHud != None ) myHUD.ChangeCrosshair(1); myHUD.SaveConfig(); } event PreRender( canvas Canvas ) { if ( myHud != None ) myHUD.PreRender(Canvas); else if ( (Viewport(Player) != None) && (HUDType != None) ) myHUD = spawn(HUDType, self); } event PostRender( canvas Canvas ) { if ( myHud != None ) myHUD.PostRender(Canvas); else if ( (Viewport(Player) != None) && (HUDType != None) ) myHUD = spawn(HUDType, self); } //============================================================================= // Inventory-related input notifications. // Handle function keypress for F1-F10. exec function FunctionKey( byte Num ) { } // The player wants to switch to weapon group numer I. exec function SwitchWeapon (byte F ) { local weapon newWeapon; if ( bShowMenu || Level.Pauser!="" ) { if ( myHud != None ) myHud.InputNumber(F); return; } if ( Inventory == None ) return; if ( (Weapon != None) && (Weapon.Inventory != None) ) newWeapon = Weapon.Inventory.WeaponChange(F); else newWeapon = None; if ( newWeapon == None ) newWeapon = Inventory.WeaponChange(F); if ( newWeapon == None ) return; if ( Weapon == None ) { PendingWeapon = newWeapon; ChangedWeapon(); } else if ( Weapon != newWeapon ) { PendingWeapon = newWeapon; if ( !Weapon.PutDown() ) PendingWeapon = None; } } exec function GetWeapon(class NewWeaponClass ) { local Inventory Inv; if ( (Inventory == None) || (NewWeaponClass == None) || ((Weapon != None) && (Weapon.Class == NewWeaponClass)) ) return; for ( Inv=Inventory; Inv!=None; Inv=Inv.Inventory ) if ( Inv.Class == NewWeaponClass ) { PendingWeapon = Weapon(Inv); if ( (PendingWeapon.AmmoType != None) && (PendingWeapon.AmmoType.AmmoAmount <= 0) ) { Pawn(Owner).ClientMessage( PendingWeapon.ItemName$PendingWeapon.MessageNoAmmo ); PendingWeapon = None; return; } Weapon.PutDown(); return; } } // The player wants to select previous item exec function PrevItem() { local Inventory Inv, LastItem; if ( bShowMenu || Level.Pauser!="" ) return; if (SelectedItem==None) { SelectedItem = Inventory.SelectNext(); Return; } if (SelectedItem.Inventory!=None) for( Inv=SelectedItem.Inventory; Inv!=None; Inv=Inv.Inventory ) { if (Inv==None) Break; if (Inv.bActivatable) LastItem=Inv; } for( Inv=Inventory; Inv!=SelectedItem; Inv=Inv.Inventory ) { if (Inv==None) Break; if (Inv.bActivatable) LastItem=Inv; } if (LastItem!=None) { SelectedItem = LastItem; ClientMessage(SelectedItem.ItemName$SelectedItem.M_Selected); } } // The player wants to active selected item exec function ActivateItem() { if( bShowMenu || Level.Pauser!="" ) return; if (SelectedItem!=None) SelectedItem.Activate(); } // The player wants to fire. exec function Fire( optional float F ) { bJustFired = true; if( bShowMenu || (Level.Pauser!="") || (Role < ROLE_Authority) ) { if( (Role < ROLE_Authority) && (Weapon!=None) ) bJustFired = Weapon.ClientFire(F); if ( !bShowMenu && (Level.Pauser == PlayerReplicationInfo.PlayerName) ) SetPause(False); return; } if( Weapon!=None ) { Weapon.bPointing = true; PlayFiring(); Weapon.Fire(F); } } // The player wants to alternate-fire. exec function AltFire( optional float F ) { bJustAltFired = true; if( bShowMenu || (Level.Pauser!="") || (Role < ROLE_Authority) ) { if( (Role < ROLE_Authority) && (Weapon!=None) ) bJustAltFired = Weapon.ClientAltFire(F); if ( !bShowMenu && (Level.Pauser == PlayerReplicationInfo.PlayerName) ) SetPause(False); return; } if( Weapon!=None ) { Weapon.bPointing = true; PlayFiring(); Weapon.AltFire(F); } } //Player Jumped function DoJump( optional float F ) { if ( CarriedDecoration != None ) return; if ( !bIsCrouching && (Physics == PHYS_Walking) ) { if ( !bUpdating ) PlayOwnedSound(JumpSound, SLOT_Talk, 1.5, true, 1200, 1.0 ); if ( (Level.Game != None) && (Level.Game.Difficulty > 0) ) MakeNoise(0.1 * Level.Game.Difficulty); PlayInAir(); if ( bCountJumps && (Role == ROLE_Authority) && (Inventory != None) ) Inventory.OwnerJumped(); Velocity.Z = JumpZ; if ( (Base != Level) && (Base != None) ) Velocity.Z += Base.Velocity.Z; SetPhysics(PHYS_Falling); } } exec function Suicide() { KilledBy( None ); } exec function AlwaysMouseLook( Bool B ) { ChangeAlwaysMouseLook(B); SaveConfig(); } function ChangeAlwaysMouseLook(Bool B) { bAlwaysMouseLook = B; if ( bAlwaysMouseLook ) bLookUpStairs = false; } exec function SnapView( bool B ) { ChangeSnapView(B); SaveConfig(); } function ChangeSnapView( bool B ) { bSnapToLevel = B; } exec function StairLook( bool B ) { ChangeStairLook(B); SaveConfig(); } function ChangeStairLook( bool B ) { bLookUpStairs = B; if ( bLookUpStairs ) bAlwaysMouseLook = false; } exec function SetDodgeClickTime( float F ) { ChangeDodgeClickTime(F); SaveConfig(); } function ChangeDodgeClickTime( float F ) { DodgeClickTime = FMin(0.3, F); } final function ReplaceText(out string Text, string Replace, string With) { local int i; local string Input; Input = Text; Text = ""; i = InStr(Input, Replace); while(i != -1) { Text = Text $ Left(Input, i) $ With; Input = Mid(Input, i + Len(Replace)); i = InStr(Input, Replace); } Text = Text $ Input; } exec function SetName( coerce string S ) { if ( Len(S) > 28 ) S = left(S,28); ReplaceText(S, " ", "_"); ChangeName(S); UpdateURL("Name", S, true); SaveConfig(); } exec function Name( coerce string S ) { SetName(S); } function ChangeName( coerce string S ) { Level.Game.ChangeName( self, S, false ); } function ChangeTeam( int N ) { local int OldTeam; OldTeam = PlayerReplicationInfo.Team; Level.Game.ChangeTeam(self, N); if ( Level.Game.bTeamGame && (PlayerReplicationInfo.Team != OldTeam) ) Died( None, '', Location ); } function ClientChangeTeam( int N ) { local Pawn P; if ( PlayerReplicationInfo != None ) PlayerReplicationInfo.Team = N; // if listen server, this may be called for non-local players that are logging in // if so, don't update URL if ( (Level.NetMode == NM_ListenServer) && (Player == None) ) { // check if any other players exist for ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( P.IsA('PlayerPawn') && (ViewPort(PlayerPawn(P).Player) != None) ) return; } UpdateURL("Team",string(N), true); } exec function SetAutoAim( float F ) { ChangeAutoAim(F); SaveConfig(); } function ChangeAutoAim( float F ) { MyAutoAim = FMax(Level.Game.AutoAim, F); } exec function PlayersOnly() { if ( Level.Netmode != NM_Standalone ) return; Level.bPlayersOnly = !Level.bPlayersOnly; } exec function SetHand( string S ) { ChangeSetHand(S); SaveConfig(); } function ChangeSetHand( string S ) { if ( S ~= "Left" ) Handedness = 1; else if ( S~= "Right" ) Handedness = -1; else if ( S ~= "Center" ) Handedness = 0; else if ( S ~= "Hidden" ) Handedness = 2; ServerSetHandedness(Handedness); } exec function ViewPlayer( string S ) { local pawn P; for ( P=Level.pawnList; P!=None; P= P.NextPawn ) if ( P.bIsPlayer && (P.PlayerReplicationInfo.PlayerName ~= S) ) break; if ( (P != None) && Level.Game.CanSpectate(self, P) ) { ClientMessage(ViewingFrom@P.PlayerReplicationInfo.PlayerName, 'Event', true); if ( P == self) ViewTarget = None; else ViewTarget = P; } else ClientMessage(FailedView); bBehindView = ( ViewTarget != None ); if ( bBehindView ) ViewTarget.BecomeViewTarget(); } exec function CheatView( class aClass ) { local actor other, first; local bool bFound; if( !bCheatsEnabled ) return; if( !bAdmin && Level.NetMode!=NM_Standalone ) return; first = None; ForEach AllActors( aClass, other ) { if ( (first == None) && (other != self) ) { first = other; bFound = true; } if ( other == ViewTarget ) first = None; } if ( first != None ) { if ( first.IsA('Pawn') && Pawn(first).bIsPlayer && (Pawn(first).PlayerReplicationInfo.PlayerName != "") ) ClientMessage(ViewingFrom@Pawn(first).PlayerReplicationInfo.PlayerName, 'Event', true); else ClientMessage(ViewingFrom@first, 'Event', true); ViewTarget = first; } else { if ( bFound ) ClientMessage(ViewingFrom@OwnCamera, 'Event', true); else ClientMessage(FailedView, 'Event', true); ViewTarget = None; } bBehindView = ( ViewTarget != None ); if ( bBehindView ) ViewTarget.BecomeViewTarget(); } exec function ViewSelf() { bBehindView = false; Viewtarget = None; ClientMessage(ViewingFrom@OwnCamera, 'Event', true); } exec function ViewClass( class aClass, optional bool bQuiet ) { local actor other, first; local bool bFound; if ( (Level.Game != None) && !Level.Game.bCanViewOthers ) return; first = None; ForEach AllActors( aClass, other ) { if ( (first == None) && (other != self) && ( (bAdmin && Level.Game==None) || Level.Game.CanSpectate(self, other) ) ) { first = other; bFound = true; } if ( other == ViewTarget ) first = None; } if ( first != None ) { if ( !bQuiet ) { if ( first.IsA('Pawn') && Pawn(first).bIsPlayer && (Pawn(first).PlayerReplicationInfo.PlayerName != "") ) ClientMessage(ViewingFrom@Pawn(first).PlayerReplicationInfo.PlayerName, 'Event', true); else ClientMessage(ViewingFrom@first, 'Event', true); } ViewTarget = first; } else { if ( !bQuiet ) { if ( bFound ) ClientMessage(ViewingFrom@OwnCamera, 'Event', true); else ClientMessage(FailedView, 'Event', true); } ViewTarget = None; } bBehindView = ( ViewTarget != None ); if ( bBehindView ) ViewTarget.BecomeViewTarget(); } exec function NeverSwitchOnPickup( bool B ) { bNeverAutoSwitch = B; bNeverSwitchOnPickup = B; ServerNeverSwitchOnPickup(B); SaveConfig(); } function ServerNeverSwitchOnPickup(bool B) { bNeverSwitchOnPickup = B; } exec function InvertMouse( bool B ) { bInvertMouse = B; SaveConfig(); } exec function SwitchLevel( string URL ) { if( bAdmin || Player.IsA('ViewPort') ) Level.ServerTravel( URL, false ); } exec function SwitchCoopLevel( string URL ) { if( bAdmin || Player.IsA('ViewPort') ) Level.ServerTravel( URL, true ); } exec function ShowScores() { bShowScores = !bShowScores; } exec function ShowMenu() { WalkBob = vect(0,0,0); bShowMenu = true; // menu is responsible for turning this off Player.Console.GotoState('Menuing'); if( Level.Netmode == NM_Standalone ) SetPause(true); } exec function ShowLoadMenu() { ShowMenu(); } exec function AddBots(int N) { ServerAddBots(N); } function ServerAddBots(int N) { local int i; if ( !bAdmin && (Level.Netmode != NM_Standalone) ) return; if ( !Level.Game.bDeathMatch ) return; for ( i=0; i aClass) { local Actor A; if( !bAdmin && (Level.Netmode != NM_Standalone) ) return; ForEach AllActors(class 'Actor', A) if ( ClassIsChildOf(A.class, aClass) ) A.Destroy(); } exec function KillPawns() { local Pawn P; if( !bCheatsEnabled || (Level.Netmode != NM_Standalone) ) return; ForEach AllActors(class 'Pawn', P) if (PlayerPawn(P) == None) P.Destroy(); } exec function Summon( string ClassName ) { local class NewClass; if( !bCheatsEnabled ) return; if( !bAdmin && (Level.Netmode != NM_Standalone) ) return; log( "Fabricate " $ ClassName ); NewClass = class( DynamicLoadObject( ClassName, class'Class' ) ); if( NewClass!=None ) Spawn( NewClass,,,Location + 72 * Vector(Rotation) + vect(0,0,1) * 15 ); } //============== // Navigation Aids exec function ShowPath() { //find next path to remembered spot local Actor node; node = FindPathTo(Destination); if (node != None) { log("found path"); Spawn(class 'WayBeacon', self, '', node.location); } else log("didn't find path"); } exec function RememberSpot() { //remember spot Destination = Location; } //============================================================================= // Input related functions. // Postprocess the player's input. event PlayerInput( float DeltaTime ) { local float SmoothTime, FOVScale, MouseScale, AbsSmoothX, AbsSmoothY, MouseTime; if ( bShowMenu && (myHud != None) ) { if ( myHud.MainMenu != None ) myHud.MainMenu.MenuTick( DeltaTime ); // clear inputs bEdgeForward = false; bEdgeBack = false; bEdgeLeft = false; bEdgeRight = false; bWasForward = false; bWasBack = false; bWasLeft = false; bWasRight = false; aStrafe = 0; aTurn = 0; aForward = 0; aLookUp = 0; return; } else if ( bDelayedCommand ) { bDelayedCommand = false; ConsoleCommand(DelayedCommand); } // Check for Dodge move // flag transitions bEdgeForward = (bWasForward ^^ (aBaseY > 0)); bEdgeBack = (bWasBack ^^ (aBaseY < 0)); bEdgeLeft = (bWasLeft ^^ (aStrafe > 0)); bEdgeRight = (bWasRight ^^ (aStrafe < 0)); bWasForward = (aBaseY > 0); bWasBack = (aBaseY < 0); bWasLeft = (aStrafe > 0); bWasRight = (aStrafe < 0); // Smooth and amplify mouse movement SmoothTime = FMin(0.2, 3 * DeltaTime * Level.TimeDilation); FOVScale = DesiredFOV * 0.01111; MouseScale = MouseSensitivity * FOVScale; aMouseX *= MouseScale; aMouseY *= MouseScale; //************************************************************************ //log("X "$aMouseX$" Smooth "$SmoothMouseX$" Borrowed "$BorrowedMouseX$" zero time "$(Level.TimeSeconds - MouseZeroTime)$" vs "$MouseSmoothThreshold); AbsSmoothX = SmoothMouseX; AbsSmoothY = SmoothMouseY; MouseTime = (Level.TimeSeconds - MouseZeroTime)/Level.TimeDilation; if ( bMaxMouseSmoothing && (aMouseX == 0) && (MouseTime < MouseSmoothThreshold) ) { SmoothMouseX = 0.5 * (MouseSmoothThreshold - MouseTime) * AbsSmoothX/MouseSmoothThreshold; BorrowedMouseX += SmoothMouseX; } else { if ( (SmoothMouseX == 0) || (aMouseX == 0) || ((SmoothMouseX > 0) != (aMouseX > 0)) ) { SmoothMouseX = aMouseX; BorrowedMouseX = 0; } else { SmoothMouseX = 0.5 * (SmoothMouseX + aMouseX - BorrowedMouseX); if ( (SmoothMouseX > 0) != (aMouseX > 0) ) { if ( AMouseX > 0 ) SmoothMouseX = 1; else SmoothMouseX = -1; } BorrowedMouseX = SmoothMouseX - aMouseX; } AbsSmoothX = SmoothMouseX; } if ( bMaxMouseSmoothing && (aMouseY == 0) && (MouseTime < MouseSmoothThreshold) ) { SmoothMouseY = 0.5 * (MouseSmoothThreshold - MouseTime) * AbsSmoothY/MouseSmoothThreshold; BorrowedMouseY += SmoothMouseY; } else { if ( (SmoothMouseY == 0) || (aMouseY == 0) || ((SmoothMouseY > 0) != (aMouseY > 0)) ) { SmoothMouseY = aMouseY; BorrowedMouseY = 0; } else { SmoothMouseY = 0.5 * (SmoothMouseY + aMouseY - BorrowedMouseY); if ( (SmoothMouseY > 0) != (aMouseY > 0) ) { if ( AMouseY > 0 ) SmoothMouseY = 1; else SmoothMouseY = -1; } BorrowedMouseY = SmoothMouseY - aMouseY; } AbsSmoothY = SmoothMouseY; } if ( (aMouseX != 0) || (aMouseY != 0) ) MouseZeroTime = Level.TimeSeconds; // adjust keyboard and joystick movements aLookUp *= FOVScale; aTurn *= FOVScale; // Remap raw x-axis movement. if( bStrafe!=0 ) { // Strafe. aStrafe += aBaseX + SmoothMouseX; aBaseX = 0; } else { // Forward. aTurn += aBaseX * FOVScale + SmoothMouseX; aBaseX = 0; } // Remap mouse y-axis movement. if( (bStrafe == 0) && (bAlwaysMouseLook || (bLook!=0)) ) { // Look up/down. if ( bInvertMouse ) aLookUp -= SmoothMouseY; else aLookUp += SmoothMouseY; } else { // Move forward/backward. aForward += SmoothMouseY; } SmoothMouseX = AbsSmoothX; SmoothMouseY = AbsSmoothY; if ( bSnapLevel != 0 ) { bCenterView = true; bKeyboardLook = false; } else if (aLookUp != 0) { bCenterView = false; bKeyboardLook = true; } else if ( bSnapToLevel && !bAlwaysMouseLook ) { bCenterView = true; bKeyboardLook = false; } // Remap other y-axis movement. if ( bFreeLook != 0 ) { bKeyboardLook = true; aLookUp += 0.5 * aBaseY * FOVScale; } else aForward += aBaseY; aBaseY = 0; // Handle walking. HandleWalking(); } //============================================================================= // functions. event UpdateEyeHeight(float DeltaTime) { local float smooth, bound; // smooth up/down stairs If( (Physics==PHYS_Walking) && !bJustLanded ) { smooth = FMin(1.0, 10.0 * DeltaTime/Level.TimeDilation); EyeHeight = (EyeHeight - Location.Z + OldLocation.Z) * (1 - smooth) + ( ShakeVert + BaseEyeHeight) * smooth; bound = -0.5 * CollisionHeight; if (EyeHeight < bound) EyeHeight = bound; else { bound = CollisionHeight + FClamp((OldLocation.Z - Location.Z), 0.0, MaxStepHeight); if ( EyeHeight > bound ) EyeHeight = bound; } } else { smooth = FClamp(10.0 * DeltaTime/Level.TimeDilation, 0.35,1.0); bJustLanded = false; EyeHeight = EyeHeight * ( 1 - smooth) + (BaseEyeHeight + ShakeVert) * smooth; } // teleporters affect your FOV, so adjust it back down if ( FOVAngle != DesiredFOV ) { if ( FOVAngle > DesiredFOV ) FOVAngle = FOVAngle - FMax(7, 0.9 * DeltaTime * (FOVAngle - DesiredFOV)); else FOVAngle = FOVAngle - FMin(-7, 0.9 * DeltaTime * (FOVAngle - DesiredFOV)); if ( Abs(FOVAngle - DesiredFOV) <= 10 ) FOVAngle = DesiredFOV; } // adjust FOV for weapon zooming if ( bZooming ) { ZoomLevel += DeltaTime * 1.0; if (ZoomLevel > 0.9) ZoomLevel = 0.9; DesiredFOV = FClamp(90.0 - (ZoomLevel * 88.0), 1, 170); } } event PlayerTimeOut() { if (Health > 0) Died(None, 'Suicided', Location); } // Just changed to pendingWeapon function ChangedWeapon() { Super.ChangedWeapon(); if ( PendingWeapon != None ) PendingWeapon.SetHand(Handedness); } function JumpOffPawn() { Velocity += 60 * VRand(); Velocity.Z = 120; SetPhysics(PHYS_Falling); } event TravelPostAccept() { if ( Health <= 0 ) Health = Default.Health; } // This pawn was possessed by a player. event Possess() { if ( Level.Netmode == NM_Client ) { // replicate client weapon preferences to server ServerNeverSwitchOnPickup(bNeverAutoSwitch); ServerSetHandedness(Handedness); UpdateWeaponPriorities(); } ServerUpdateWeapons(); bIsPlayer = true; DodgeClickTime = FMin(0.3, DodgeClickTime); EyeHeight = BaseEyeHeight; NetPriority = 3; StartWalk(); } function UpdateWeaponPriorities() { local byte i; // send new priorities to server if ( Level.Netmode == NM_Client ) for ( i=0; i maxZ ) { if ( TraceDir.Z >= 0 ) return false; adjZ = (maxZ - HitLocation.Z)/TraceDir.Z; HitLocation.Z = maxZ; HitLocation.X = HitLocation.X + TraceDir.X * adjZ; HitLocation.Y = HitLocation.Y + TraceDir.Y * adjZ; if ( VSize(HitLocation - Location) > CollisionRadius ) return false; } return true; } /* AdjustAim() Calls this version for player aiming help. Aimerror not used in this version. Only adjusts aiming at pawns */ function rotator AdjustAim(float projSpeed, vector projStart, int aimerror, bool bLeadTarget, bool bWarnTarget) { local vector FireDir, AimSpot, HitNormal, HitLocation; local actor BestTarget; local float bestAim, bestDist; local actor HitActor; FireDir = vector(ViewRotation); HitActor = Trace(HitLocation, HitNormal, projStart + 4000 * FireDir, projStart, true); if ( (HitActor != None) && HitActor.bProjTarget ) { if ( bWarnTarget && HitActor.IsA('Pawn') ) Pawn(HitActor).WarnTarget(self, projSpeed, FireDir); return ViewRotation; } bestAim = FMin(0.93, MyAutoAim); BestTarget = PickTarget(bestAim, bestDist, FireDir, projStart); if ( bWarnTarget && (Pawn(BestTarget) != None) ) Pawn(BestTarget).WarnTarget(self, projSpeed, FireDir); if ( (Level.NetMode != NM_Standalone) || (Level.Game.Difficulty > 2) || bAlwaysMouseLook || ((BestTarget != None) && (bestAim < MyAutoAim)) || (MyAutoAim >= 1) ) return ViewRotation; if ( BestTarget == None ) { bestAim = MyAutoAim; BestTarget = PickAnyTarget(bestAim, bestDist, FireDir, projStart); if ( BestTarget == None ) return ViewRotation; } AimSpot = projStart + FireDir * bestDist; AimSpot.Z = BestTarget.Location.Z + 0.3 * BestTarget.CollisionHeight; return rotator(AimSpot - projStart); } function Falling() { //SetPhysics(PHYS_Falling); //Note - physics changes type to PHYS_Falling by default //log(class$" Falling"); PlayInAir(); } function Landed(vector HitNormal) { //Note - physics changes type to PHYS_Walking by default for landed pawns if ( bUpdating ) return; PlayLanded(Velocity.Z); LandBob = FMin(50, 0.055 * Velocity.Z); TakeFallingDamage(); bJustLanded = true; } function Died(pawn Killer, name damageType, vector HitLocation) { StopZoom(); Super.Died(Killer, damageType, HitLocation); } function eAttitude AttitudeTo(Pawn Other) { if (Other.bIsPlayer) return AttitudeToPlayer; else return Other.AttitudeToPlayer; } function string KillMessage( name damageType, pawn Other ) { return ( Level.Game.PlayerKillMessage(damageType, Other.PlayerReplicationInfo)$PlayerReplicationInfo.PlayerName ); } //============================================================================= // Player Control function KilledBy( pawn EventInstigator ) { Health = 0; Died( EventInstigator, 'Suicided', Location ); } // Player view. // Compute the rendering viewpoint for the player. // function CalcBehindView(out vector CameraLocation, out rotator CameraRotation, float Dist) { local vector View,HitLocation,HitNormal; local float ViewDist; CameraRotation = ViewRotation; View = vect(1,0,0) >> CameraRotation; if( Trace( HitLocation, HitNormal, CameraLocation - (Dist + 30) * vector(CameraRotation), CameraLocation ) != None ) ViewDist = FMin( (CameraLocation - HitLocation) Dot View, Dist ); else ViewDist = Dist; CameraLocation -= (ViewDist - 30) * View; } event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { local Pawn PTarget; if ( ViewTarget != None ) { ViewActor = ViewTarget; CameraLocation = ViewTarget.Location; CameraRotation = ViewTarget.Rotation; PTarget = Pawn(ViewTarget); if ( PTarget != None ) { if ( Level.NetMode == NM_Client ) { if ( PTarget.bIsPlayer ) PTarget.ViewRotation = TargetViewRotation; PTarget.EyeHeight = TargetEyeHeight; if ( PTarget.Weapon != None ) PTarget.Weapon.PlayerViewOffset = TargetWeaponViewOffset; } if ( PTarget.bIsPlayer ) CameraRotation = PTarget.ViewRotation; if ( !bBehindView ) CameraLocation.Z += PTarget.EyeHeight; } if ( bBehindView ) CalcBehindView(CameraLocation, CameraRotation, 180); return; } ViewActor = Self; CameraLocation = Location; if( bBehindView ) //up and behind CalcBehindView(CameraLocation, CameraRotation, 150); else { // First-person view. CameraRotation = ViewRotation; CameraLocation.Z += EyeHeight; CameraLocation += WalkBob; } } exec function SetViewFlash(bool B) { bNoFlash = !B; } function ViewFlash(float DeltaTime) { local vector goalFog; local float goalscale, delta; if ( bNoFlash ) { InstantFlash = 0; InstantFog = vect(0,0,0); } delta = FMin(0.1, DeltaTime); goalScale = 1 + DesiredFlashScale + ConstantGlowScale + HeadRegion.Zone.ViewFlash.X; goalFog = DesiredFlashFog + ConstantGlowFog + HeadRegion.Zone.ViewFog; DesiredFlashScale -= DesiredFlashScale * 2 * delta; DesiredFlashFog -= DesiredFlashFog * 2 * delta; FlashScale.X += (goalScale - FlashScale.X + InstantFlash) * 10 * delta; FlashFog += (goalFog - FlashFog + InstantFog) * 10 * delta; InstantFlash = 0; InstantFog = vect(0,0,0); if ( FlashScale.X > 0.981 ) FlashScale.X = 1; FlashScale = FlashScale.X * vect(1,1,1); if ( FlashFog.X < 0.019 ) FlashFog.X = 0; if ( FlashFog.Y < 0.019 ) FlashFog.Y = 0; if ( FlashFog.Z < 0.019 ) FlashFog.Z = 0; } function ViewShake(float DeltaTime) { if (shaketimer > 0.0) //shake view { shaketimer -= DeltaTime; if ( verttimer == 0 ) { verttimer = 0.1; ShakeVert = -1.1 * maxshake; } else { verttimer -= DeltaTime; if ( verttimer < 0 ) { verttimer = 0.2 * FRand(); shakeVert = (2 * FRand() - 1) * maxshake; } } ViewRotation.Roll = ViewRotation.Roll & 65535; if (bShakeDir) { ViewRotation.Roll += Int( 10 * shakemag * FMin(0.1, DeltaTime)); bShakeDir = (ViewRotation.Roll > 32768) || (ViewRotation.Roll < (0.5 + FRand()) * shakemag); if ( (ViewRotation.Roll < 32768) && (ViewRotation.Roll > 1.3 * shakemag) ) { ViewRotation.Roll = 1.3 * shakemag; bShakeDir = false; } else if (FRand() < 3 * DeltaTime) bShakeDir = !bShakeDir; } else { ViewRotation.Roll -= Int( 10 * shakemag * FMin(0.1, DeltaTime)); bShakeDir = (ViewRotation.Roll > 32768) && (ViewRotation.Roll < 65535 - (0.5 + FRand()) * shakemag); if ( (ViewRotation.Roll > 32768) && (ViewRotation.Roll < 65535 - 1.3 * shakemag) ) { ViewRotation.Roll = 65535 - 1.3 * shakemag; bShakeDir = true; } else if (FRand() < 3 * DeltaTime) bShakeDir = !bShakeDir; } } else { ShakeVert = 0; ViewRotation.Roll = ViewRotation.Roll & 65535; if (ViewRotation.Roll < 32768) { if ( ViewRotation.Roll > 0 ) ViewRotation.Roll = Max(0, ViewRotation.Roll - (Max(ViewRotation.Roll,500) * 10 * FMin(0.1,DeltaTime))); } else { ViewRotation.Roll += ((65536 - Max(500,ViewRotation.Roll)) * 10 * FMin(0.1,DeltaTime)); if ( ViewRotation.Roll > 65534 ) ViewRotation.Roll = 0; } } } function UpdateRotation(float DeltaTime, float maxPitch) { local rotator newRotation; DesiredRotation = ViewRotation; //save old rotation ViewRotation.Pitch += 32.0 * DeltaTime * aLookUp; ViewRotation.Pitch = ViewRotation.Pitch & 65535; If ((ViewRotation.Pitch > 18000) && (ViewRotation.Pitch < 49152)) { If (aLookUp > 0) ViewRotation.Pitch = 18000; else ViewRotation.Pitch = 49152; } ViewRotation.Yaw += 32.0 * DeltaTime * aTurn; ViewShake(deltaTime); ViewFlash(deltaTime); newRotation = Rotation; newRotation.Yaw = ViewRotation.Yaw; newRotation.Pitch = ViewRotation.Pitch; If ( (newRotation.Pitch > maxPitch * RotationRate.Pitch) && (newRotation.Pitch < 65536 - maxPitch * RotationRate.Pitch) ) { If (ViewRotation.Pitch < 32768) newRotation.Pitch = maxPitch * RotationRate.Pitch; else newRotation.Pitch = 65536 - maxPitch * RotationRate.Pitch; } setRotation(newRotation); } function SwimAnimUpdate(bool bNotForward) { if ( !bAnimTransition && (GetAnimGroup(AnimSequence) != 'Gesture') ) { if ( bNotForward ) { if ( GetAnimGroup(AnimSequence) != 'Waiting' ) TweenToWaiting(0.1); } else if ( GetAnimGroup(AnimSequence) == 'Waiting' ) TweenToSwimming(0.1); } } auto state InvalidState { event PlayerTick( float DeltaTime ) { log(self$" invalid state"); if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove( float DeltaTime ) { if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, vect(0,0,0), Dodge_None, rot(0,0,0)); } } // Player movement. // Player Standing, walking, running, falling. state PlayerWalking { ignores SeePlayer, HearNoise, Bump; exec function FeignDeath() { if ( Physics == PHYS_Walking ) { ServerFeignDeath(); Acceleration = vect(0,0,0); GotoState('FeigningDeath'); } } function ServerFeignDeath() { local Weapon W; W = Weapon; PendingWeapon = None; if ( Weapon != None ) Weapon.PutDown(); PendingWeapon = W; GotoState('FeigningDeath'); } function ZoneChange( ZoneInfo NewZone ) { if (NewZone.bWaterZone) { setPhysics(PHYS_Swimming); GotoState('PlayerSwimming'); } } function AnimEnd() { local name MyAnimGroup; bAnimTransition = false; if (Physics == PHYS_Walking) { if (bIsCrouching) { if ( !bIsTurning && ((Velocity.X * Velocity.X + Velocity.Y * Velocity.Y) < 1000) ) PlayDuck(); else PlayCrawling(); } else { MyAnimGroup = GetAnimGroup(AnimSequence); if ((Velocity.X * Velocity.X + Velocity.Y * Velocity.Y) < 1000) { if ( MyAnimGroup == 'Waiting' ) PlayWaiting(); else { bAnimTransition = true; TweenToWaiting(0.2); } } else if (bIsWalking) { if ( (MyAnimGroup == 'Waiting') || (MyAnimGroup == 'Landing') || (MyAnimGroup == 'Gesture') || (MyAnimGroup == 'TakeHit') ) { TweenToWalking(0.1); bAnimTransition = true; } else PlayWalking(); } else { if ( (MyAnimGroup == 'Waiting') || (MyAnimGroup == 'Landing') || (MyAnimGroup == 'Gesture') || (MyAnimGroup == 'TakeHit') ) { bAnimTransition = true; TweenToRunning(0.1); } else PlayRunning(); } } } else PlayInAir(); } function Landed(vector HitNormal) { Global.Landed(HitNormal); if (DodgeDir == DODGE_Active) { DodgeDir = DODGE_Done; DodgeClickTimer = 0.0; Velocity *= 0.1; } else DodgeDir = DODGE_None; } function Dodge(eDodgeDir DodgeMove) { local vector X,Y,Z; if ( bIsCrouching || (Physics != PHYS_Walking) ) return; GetAxes(Rotation,X,Y,Z); if (DodgeMove == DODGE_Forward) Velocity = 1.5*GroundSpeed*X + (Velocity Dot Y)*Y; else if (DodgeMove == DODGE_Back) Velocity = -1.5*GroundSpeed*X + (Velocity Dot Y)*Y; else if (DodgeMove == DODGE_Left) Velocity = 1.5*GroundSpeed*Y + (Velocity Dot X)*X; else if (DodgeMove == DODGE_Right) Velocity = -1.5*GroundSpeed*Y + (Velocity Dot X)*X; Velocity.Z = 160; PlayOwnedSound(JumpSound, SLOT_Talk, 1.0, true, 800, 1.0 ); PlayDodge(DodgeMove); DodgeDir = DODGE_Active; SetPhysics(PHYS_Falling); } function ProcessMove(float DeltaTime, vector NewAccel, eDodgeDir DodgeMove, rotator DeltaRot) { local vector OldAccel; OldAccel = Acceleration; Acceleration = NewAccel; bIsTurning = ( Abs(DeltaRot.Yaw/DeltaTime) > 5000 ); if ( (DodgeMove == DODGE_Active) && (Physics == PHYS_Falling) ) DodgeDir = DODGE_Active; else if ( (DodgeMove != DODGE_None) && (DodgeMove < DODGE_Active) ) Dodge(DodgeMove); if ( bPressedJump ) DoJump(); if ( (Physics == PHYS_Walking) && (GetAnimGroup(AnimSequence) != 'Dodge') ) { if (!bIsCrouching) { if (bDuck != 0) { bIsCrouching = true; PlayDuck(); } } else if (bDuck == 0) { OldAccel = vect(0,0,0); bIsCrouching = false; TweenToRunning(0.1); } if ( !bIsCrouching ) { if ( (!bAnimTransition || (AnimFrame > 0)) && (GetAnimGroup(AnimSequence) != 'Landing') ) { if ( Acceleration != vect(0,0,0) ) { if ( (GetAnimGroup(AnimSequence) == 'Waiting') || (GetAnimGroup(AnimSequence) == 'Gesture') || (GetAnimGroup(AnimSequence) == 'TakeHit') ) { bAnimTransition = true; TweenToRunning(0.1); } } else if ( (Velocity.X * Velocity.X + Velocity.Y * Velocity.Y < 1000) && (GetAnimGroup(AnimSequence) != 'Gesture') ) { if ( GetAnimGroup(AnimSequence) == 'Waiting' ) { if ( bIsTurning && (AnimFrame >= 0) ) { bAnimTransition = true; PlayTurning(); } } else if ( !bIsTurning ) { bAnimTransition = true; TweenToWaiting(0.2); } } } } else { if ( (OldAccel == vect(0,0,0)) && (Acceleration != vect(0,0,0)) ) PlayCrawling(); else if ( !bIsTurning && (Acceleration == vect(0,0,0)) && (AnimFrame > 0.1) ) PlayDuck(); } } } event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove( float DeltaTime ) { local vector X,Y,Z, NewAccel; local EDodgeDir OldDodge; local eDodgeDir DodgeMove; local rotator OldRotation; local float Speed2D; local bool bSaveJump; local name AnimGroupName; GetAxes(Rotation,X,Y,Z); aForward *= 0.4; aStrafe *= 0.4; aLookup *= 0.24; aTurn *= 0.24; // Update acceleration. NewAccel = aForward*X + aStrafe*Y; NewAccel.Z = 0; // Check for Dodge move if ( DodgeDir == DODGE_Active ) DodgeMove = DODGE_Active; else DodgeMove = DODGE_None; if (DodgeClickTime > 0.0) { if ( DodgeDir < DODGE_Active ) { OldDodge = DodgeDir; DodgeDir = DODGE_None; if (bEdgeForward && bWasForward) DodgeDir = DODGE_Forward; if (bEdgeBack && bWasBack) DodgeDir = DODGE_Back; if (bEdgeLeft && bWasLeft) DodgeDir = DODGE_Left; if (bEdgeRight && bWasRight) DodgeDir = DODGE_Right; if ( DodgeDir == DODGE_None) DodgeDir = OldDodge; else if ( DodgeDir != OldDodge ) DodgeClickTimer = DodgeClickTime + 0.5 * DeltaTime; else DodgeMove = DodgeDir; } if (DodgeDir == DODGE_Done) { DodgeClickTimer -= DeltaTime; if (DodgeClickTimer < -0.35) { DodgeDir = DODGE_None; DodgeClickTimer = DodgeClickTime; } } else if ((DodgeDir != DODGE_None) && (DodgeDir != DODGE_Active)) { DodgeClickTimer -= DeltaTime; if (DodgeClickTimer < 0) { DodgeDir = DODGE_None; DodgeClickTimer = DodgeClickTime; } } } AnimGroupName = GetAnimGroup(AnimSequence); if ( (Physics == PHYS_Walking) && (AnimGroupName != 'Dodge') ) { //if walking, look up/down stairs - unless player is rotating view if ( !bKeyboardLook && (bLook == 0) ) { if ( bLookUpStairs ) ViewRotation.Pitch = FindStairRotation(deltaTime); else if ( bCenterView ) { ViewRotation.Pitch = ViewRotation.Pitch & 65535; if (ViewRotation.Pitch > 32768) ViewRotation.Pitch -= 65536; ViewRotation.Pitch = ViewRotation.Pitch * (1 - 12 * FMin(0.0833, deltaTime)); if ( Abs(ViewRotation.Pitch) < 1000 ) ViewRotation.Pitch = 0; } } Speed2D = Sqrt(Velocity.X * Velocity.X + Velocity.Y * Velocity.Y); //add bobbing when walking if ( !bShowMenu ) CheckBob(DeltaTime, Speed2D, Y); } else if ( !bShowMenu ) { BobTime = 0; WalkBob = WalkBob * (1 - FMin(1, 8 * deltatime)); } // Update rotation. OldRotation = Rotation; UpdateRotation(DeltaTime, 1); if ( bPressedJump && (AnimGroupName == 'Dodge') ) { bSaveJump = true; bPressedJump = false; } else bSaveJump = false; if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, NewAccel, DodgeMove, OldRotation - Rotation); else ProcessMove(DeltaTime, NewAccel, DodgeMove, OldRotation - Rotation); bPressedJump = bSaveJump; } function BeginState() { if ( Mesh == None ) SetMesh(); WalkBob = vect(0,0,0); DodgeDir = DODGE_None; bIsCrouching = false; bIsTurning = false; bPressedJump = false; if (Physics != PHYS_Falling) SetPhysics(PHYS_Walking); if ( !IsAnimating() ) PlayWaiting(); } function EndState() { WalkBob = vect(0,0,0); bIsCrouching = false; } } state FeigningDeath { ignores SeePlayer, HearNoise, Bump; function ZoneChange( ZoneInfo NewZone ) { if (NewZone.bWaterZone) { setPhysics(PHYS_Swimming); GotoState('PlayerSwimming'); } } exec function Fire( optional float F ) { bJustFired = true; } exec function AltFire( optional float F ) { bJustFired = true; } function PlayChatting() { } exec function Taunt( name Sequence ) { } function AnimEnd() { if ( Role < ROLE_Authority ) return; if ( Health <= 0 ) { GotoState('Dying'); return; } GotoState('PlayerWalking'); PendingWeapon.SetDefaultDisplayProperties(); ChangedWeapon(); } function Landed(vector HitNormal) { if ( Role == ROLE_Authority ) PlaySound(Land, SLOT_Interact, 0.3, false, 800, 1.0); if ( bUpdating ) return; TakeFallingDamage(); bJustLanded = true; } function Rise() { if ( (Role == ROLE_Authority) && (Health <= 0) ) { GotoState('Dying'); return; } if ( !bRising ) { Enable('AnimEnd'); BaseEyeHeight = Default.BaseEyeHeight; bRising = true; PlayRising(); } } function ProcessMove(float DeltaTime, vector NewAccel, eDodgeDir DodgeMove, rotator DeltaRot) { if ( bJustFired || bPressedJump || (NewAccel.Z > 0) ) Rise(); Acceleration = vect(0,0,0); } event PlayerTick( float DeltaTime ) { Weapon = None; // in case client confused because of weapon switch just before feign death if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function ServerMove ( float TimeStamp, vector Accel, vector ClientLoc, bool NewbRun, bool NewbDuck, bool NewbJumpStatus, bool bFired, bool bAltFired, bool bForceFire, bool bForceAltFire, eDodgeDir DodgeMove, byte ClientRoll, int View, optional byte OldTimeDelta, optional int OldAccel ) { Global.ServerMove(TimeStamp, Accel, ClientLoc, NewbRun, NewbDuck, NewbJumpStatus, bFired, bAltFired, bForceFire, bForceAltFire, DodgeMove, ClientRoll, (32767 & (Rotation.Pitch/2)) * 32768 + (32767 & (Rotation.Yaw/2))); } function PlayerMove( float DeltaTime) { local rotator currentRot; local vector NewAccel; aLookup *= 0.24; aTurn *= 0.24; // Update acceleration. if ( !IsAnimating() && (aForward != 0) || (aStrafe != 0) ) NewAccel = vect(0,0,1); else NewAccel = vect(0,0,0); // Update view rotation. currentRot = Rotation; UpdateRotation(DeltaTime, 1); SetRotation(currentRot); if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, NewAccel, DODGE_None, Rot(0,0,0)); else ProcessMove(DeltaTime, NewAccel, DODGE_None, Rot(0,0,0)); bPressedJump = false; } function PlayTakeHit(float tweentime, vector HitLoc, int Damage) { if ( IsAnimating() ) { Enable('AnimEnd'); Global.PlayTakeHit(tweentime, HitLoc, Damage); } } function PlayDying(name DamageType, vector HitLocation) { BaseEyeHeight = Default.BaseEyeHeight; if ( bRising || IsAnimating() ) Global.PlayDying(DamageType, HitLocation); } function ChangedWeapon() { Weapon = None; Inventory.ChangedWeapon(); } function EndState() { bJustFired = false; PlayerReplicationInfo.bFeigningDeath = false; } function BeginState() { local rotator NewRot; if ( carriedDecoration != None ) DropDecoration(); NewRot = Rotation; NewRot.Pitch = 0; SetRotation(NewRot); BaseEyeHeight = -0.5 * CollisionHeight; bIsCrouching = false; bPressedJump = false; bJustFired = false; bRising = false; Disable('AnimEnd'); PlayFeignDeath(); PlayerReplicationInfo.bFeigningDeath = true; } } // Player movement. // Player Swimming state PlayerSwimming { ignores SeePlayer, HearNoise, Bump; event UpdateEyeHeight(float DeltaTime) { local float smooth, bound; // smooth up/down stairs if( !bJustLanded ) { smooth = FMin(1.0, 10.0 * DeltaTime/Level.TimeDilation); EyeHeight = (EyeHeight - Location.Z + OldLocation.Z) * (1 - smooth) + ( ShakeVert + BaseEyeHeight) * smooth; bound = -0.5 * CollisionHeight; if (EyeHeight < bound) EyeHeight = bound; else { bound = CollisionHeight + FClamp((OldLocation.Z - Location.Z), 0.0, MaxStepHeight); if ( EyeHeight > bound ) EyeHeight = bound; } } else { smooth = FClamp(10.0 * DeltaTime/Level.TimeDilation, 0.35, 1.0); bJustLanded = false; EyeHeight = EyeHeight * ( 1 - smooth) + (BaseEyeHeight + ShakeVert) * smooth; } // teleporters affect your FOV, so adjust it back down if ( FOVAngle != DesiredFOV ) { if ( FOVAngle > DesiredFOV ) FOVAngle = FOVAngle - FMax(7, 0.9 * DeltaTime * (FOVAngle - DesiredFOV)); else FOVAngle = FOVAngle - FMin(-7, 0.9 * DeltaTime * (FOVAngle - DesiredFOV)); if ( Abs(FOVAngle - DesiredFOV) <= 10 ) FOVAngle = DesiredFOV; } // adjust FOV for weapon zooming if ( bZooming ) { ZoomLevel += DeltaTime * 1.0; if (ZoomLevel > 0.9) ZoomLevel = 0.9; DesiredFOV = FClamp(90.0 - (ZoomLevel * 88.0), 1, 170); } } function Landed(vector HitNormal) { if ( !bUpdating ) { //log(class$" Landed while swimming"); PlayLanded(Velocity.Z); TakeFallingDamage(); bJustLanded = true; } if ( Region.Zone.bWaterZone ) SetPhysics(PHYS_Swimming); else { GotoState('PlayerWalking'); AnimEnd(); } } function AnimEnd() { local vector X,Y,Z; GetAxes(Rotation, X,Y,Z); if ( (Acceleration Dot X) <= 0 ) { if ( GetAnimGroup(AnimSequence) == 'TakeHit' ) { bAnimTransition = true; TweenToWaiting(0.2); } else PlayWaiting(); } else { if ( GetAnimGroup(AnimSequence) == 'TakeHit' ) { bAnimTransition = true; TweenToSwimming(0.2); } else PlaySwimming(); } } function ZoneChange( ZoneInfo NewZone ) { local actor HitActor; local vector HitLocation, HitNormal, checkpoint; if (!NewZone.bWaterZone) { SetPhysics(PHYS_Falling); if (bUpAndOut && CheckWaterJump(HitNormal)) //check for waterjump { velocity.Z = 330 + 2 * CollisionRadius; //set here so physics uses this for remainder of tick PlayDuck(); GotoState('PlayerWalking'); } else if (!FootRegion.Zone.bWaterZone || (Velocity.Z > 160) ) { GotoState('PlayerWalking'); AnimEnd(); } else //check if in deep water { checkpoint = Location; checkpoint.Z -= (CollisionHeight + 6.0); HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, false); if (HitActor != None) { GotoState('PlayerWalking'); AnimEnd(); } else { Enable('Timer'); SetTimer(0.7,false); } } //log("Out of water"); } else { Disable('Timer'); SetPhysics(PHYS_Swimming); } } function ProcessMove(float DeltaTime, vector NewAccel, eDodgeDir DodgeMove, rotator DeltaRot) { local vector X,Y,Z, Temp; GetAxes(ViewRotation,X,Y,Z); Acceleration = NewAccel; SwimAnimUpdate( (X Dot Acceleration) <= 0 ); bUpAndOut = ((X Dot Acceleration) > 0) && ((Acceleration.Z > 0) || (ViewRotation.Pitch > 2048)); if ( bUpAndOut && !Region.Zone.bWaterZone && CheckWaterJump(Temp) ) //check for waterjump { velocity.Z = 330 + 2 * CollisionRadius; //set here so physics uses this for remainder of tick PlayDuck(); GotoState('PlayerWalking'); } } event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove(float DeltaTime) { local rotator oldRotation; local vector X,Y,Z, NewAccel; local float Speed2D; GetAxes(ViewRotation,X,Y,Z); aForward *= 0.2; aStrafe *= 0.1; aLookup *= 0.24; aTurn *= 0.24; aUp *= 0.1; NewAccel = aForward*X + aStrafe*Y + aUp*vect(0,0,1); //add bobbing when swimming if ( !bShowMenu ) { Speed2D = Sqrt(Velocity.X * Velocity.X + Velocity.Y * Velocity.Y); WalkBob = Y * Bob * 0.5 * Speed2D * sin(4.0 * Level.TimeSeconds); WalkBob.Z = Bob * 1.5 * Speed2D * sin(8.0 * Level.TimeSeconds); } // Update rotation. oldRotation = Rotation; UpdateRotation(DeltaTime, 2); if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, NewAccel, DODGE_None, OldRotation - Rotation); else ProcessMove(DeltaTime, NewAccel, DODGE_None, OldRotation - Rotation); bPressedJump = false; } function Timer() { if ( !Region.Zone.bWaterZone && (Role == ROLE_Authority) ) { //log("timer out of water"); GotoState('PlayerWalking'); AnimEnd(); } Disable('Timer'); } function BeginState() { Disable('Timer'); if ( !IsAnimating() ) TweenToWaiting(0.3); //log("player swimming"); } } state PlayerFlying { ignores SeePlayer, HearNoise, Bump; function AnimEnd() { PlaySwimming(); } event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove(float DeltaTime) { local rotator newRotation; local vector X,Y,Z; GetAxes(Rotation,X,Y,Z); aForward *= 0.2; aStrafe *= 0.2; aLookup *= 0.24; aTurn *= 0.24; Acceleration = aForward*X + aStrafe*Y; // Update rotation. UpdateRotation(DeltaTime, 2); if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, Acceleration, DODGE_None, rot(0,0,0)); else ProcessMove(DeltaTime, Acceleration, DODGE_None, rot(0,0,0)); } function BeginState() { SetPhysics(PHYS_Flying); if ( !IsAnimating() ) PlayWalking(); //log("player flying"); } } state CheatFlying { ignores SeePlayer, HearNoise, Bump, TakeDamage; function AnimEnd() { PlaySwimming(); } function ProcessMove(float DeltaTime, vector NewAccel, eDodgeDir DodgeMove, rotator DeltaRot) { Acceleration = Normal(NewAccel); Velocity = Normal(NewAccel) * 300; AutonomousPhysics(DeltaTime); } event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove(float DeltaTime) { local rotator newRotation; local vector X,Y,Z; GetAxes(ViewRotation,X,Y,Z); aForward *= 0.1; aStrafe *= 0.1; aLookup *= 0.24; aTurn *= 0.24; aUp *= 0.1; Acceleration = aForward*X + aStrafe*Y + aUp*vect(0,0,1); UpdateRotation(DeltaTime, 1); if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, Acceleration, DODGE_None, rot(0,0,0)); else ProcessMove(DeltaTime, Acceleration, DODGE_None, rot(0,0,0)); } function BeginState() { EyeHeight = BaseEyeHeight; SetPhysics(PHYS_Flying); if ( !IsAnimating() ) PlaySwimming(); // log("cheat flying"); } } state PlayerWaiting { ignores SeePlayer, HearNoise, Bump, TakeDamage, Died, ZoneChange, FootZoneChange; exec function Jump( optional float F ) { } exec function Suicide() { } function ChangeTeam( int N ) { Level.Game.ChangeTeam(self, N); } exec function Fire(optional float F) { bReadyToPlay = true; } exec function AltFire(optional float F) { bReadyToPlay = true; } function ProcessMove(float DeltaTime, vector NewAccel, eDodgeDir DodgeMove, rotator DeltaRot) { Acceleration = NewAccel; MoveSmooth(Acceleration * DeltaTime); } function PlayWaiting() {} event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove(float DeltaTime) { local rotator newRotation; local vector X,Y,Z; GetAxes(ViewRotation,X,Y,Z); aForward *= 0.1; aStrafe *= 0.1; aLookup *= 0.24; aTurn *= 0.24; aUp *= 0.1; Acceleration = aForward*X + aStrafe*Y + aUp*vect(0,0,1); UpdateRotation(DeltaTime, 1); if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, Acceleration, DODGE_None, rot(0,0,0)); else ProcessMove(DeltaTime, Acceleration, DODGE_None, rot(0,0,0)); } function EndState() { SetMesh(); PlayerReplicationInfo.bIsSpectator = false; PlayerReplicationInfo.bWaitingPlayer = false; SetCollision(true,true,true); } function BeginState() { Mesh = None; if ( PlayerReplicationInfo != None ) { PlayerReplicationInfo.bIsSpectator = true; PlayerReplicationInfo.bWaitingPlayer = true; } SetCollision(false,false,false); EyeHeight = BaseEyeHeight; SetPhysics(PHYS_None); } } state PlayerSpectating { ignores SeePlayer, HearNoise, Bump, TakeDamage, Died, ZoneChange, FootZoneChange; exec function Suicide() { } function SendVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID, name broadcasttype) { } exec function AltFire( optional float F ) { bBehindView = false; Viewtarget = None; ClientMessage(ViewingFrom@OwnCamera, 'Event', true); } function ChangeTeam( int N ) { Level.Game.ChangeTeam(self, N); } exec function Fire( optional float F ) { if ( Role == ROLE_Authority ) { ViewPlayerNum(-1); bBehindView = true; } } function ProcessMove(float DeltaTime, vector NewAccel, eDodgeDir DodgeMove, rotator DeltaRot) { Acceleration = NewAccel; MoveSmooth(Acceleration * DeltaTime); } event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove(float DeltaTime) { local rotator newRotation; local vector X,Y,Z; GetAxes(ViewRotation,X,Y,Z); aForward *= 0.1; aStrafe *= 0.1; aLookup *= 0.24; aTurn *= 0.24; aUp *= 0.1; Acceleration = aForward*X + aStrafe*Y + aUp*vect(0,0,1); UpdateRotation(DeltaTime, 1); if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, Acceleration, DODGE_None, rot(0,0,0)); else ProcessMove(DeltaTime, Acceleration, DODGE_None, rot(0,0,0)); } function EndState() { PlayerReplicationInfo.bIsSpectator = false; PlayerReplicationInfo.bWaitingPlayer = false; SetMesh(); SetCollision(true,true,true); } function BeginState() { PlayerReplicationInfo.bIsSpectator = true; PlayerReplicationInfo.bWaitingPlayer = true; bShowScores = true; Mesh = None; SetCollision(false,false,false); EyeHeight = Default.BaseEyeHeight; SetPhysics(PHYS_None); } } //=============================================================================== state PlayerWaking { ignores SeePlayer, HearNoise, KilledBy, Bump, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, SwitchWeapon, Falling; function Timer() { BaseEyeHeight = Default.BaseEyeHeight; } event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove(Float DeltaTime) { ViewFlash(deltaTime * 0.5); if ( TimerRate == 0 ) { ViewRotation.Pitch -= DeltaTime * 12000; if ( ViewRotation.Pitch < 0 ) { ViewRotation.Pitch = 0; GotoState('PlayerWalking'); } } if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, vect(0,0,0), DODGE_None, rot(0,0,0)); else ProcessMove(DeltaTime, vect(0,0,0), DODGE_None, rot(0,0,0)); } function BeginState() { if ( bWokeUp ) { ViewRotation.Pitch = 0; SetTimer(0, false); return; } BaseEyeHeight = 0; EyeHeight = 0; SetTimer(3.0, false); bWokeUp = true; } } state Dying { ignores SeePlayer, HearNoise, KilledBy, Bump, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, SwitchWeapon, Falling, PainTimer; exec function Suicide() { } function ServerReStartPlayer() { //log("calling restartplayer in dying with netmode "$Level.NetMode); if ( (bFrozen && (TimerRate>0.0)) || (Level.NetMode == NM_Client) ) return; if( Level.Game.RestartPlayer(self) ) { ServerTimeStamp = 0; TimeMargin = 0; Enemy = None; Level.Game.StartPlayer(self); if ( Mesh != None ) PlayWaiting(); ClientReStart(); } else log("Restartplayer failed"); } exec function Fire( optional float F ) { if ( (Level.NetMode == NM_Standalone) && !Level.Game.bDeathMatch ) { if ( bFrozen ) return; ShowLoadMenu(); } else if ( !bFrozen || (TimerRate <= 0.0) ) ServerReStartPlayer(); } exec function AltFire( optional float F ) { Fire(F); } function PlayChatting() { } exec function Taunt( name Sequence ) { } function ServerMove ( float TimeStamp, vector Accel, vector ClientLoc, bool NewbRun, bool NewbDuck, bool NewbJumpStatus, bool bFired, bool bAltFired, bool bForceFire, bool bForceAltFire, eDodgeDir DodgeMove, byte ClientRoll, int View, optional byte OldTimeDelta, optional int OldAccel ) { Global.ServerMove( TimeStamp, Accel, ClientLoc, false, false, false, false, false, false, false, DodgeMove, ClientRoll, View); } function PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { local vector View,HitLocation,HitNormal, FirstHit, spot; local float DesiredDist, ViewDist, WallOutDist; local actor HitActor; local Pawn PTarget; if ( ViewTarget != None ) { ViewActor = ViewTarget; CameraLocation = ViewTarget.Location; CameraRotation = ViewTarget.Rotation; PTarget = Pawn(ViewTarget); if ( PTarget != None ) { if ( Level.NetMode == NM_Client ) { if ( PTarget.bIsPlayer ) PTarget.ViewRotation = TargetViewRotation; PTarget.EyeHeight = TargetEyeHeight; if ( PTarget.Weapon != None ) PTarget.Weapon.PlayerViewOffset = TargetWeaponViewOffset; } if ( PTarget.bIsPlayer ) CameraRotation = PTarget.ViewRotation; CameraLocation.Z += PTarget.EyeHeight; } if ( Carcass(ViewTarget) != None ) { if ( bBehindView || (ViewTarget.Physics == PHYS_None) ) CameraRotation = ViewRotation; else ViewRotation = CameraRotation; if ( bBehindView ) CalcBehindView(CameraLocation, CameraRotation, 190); } else if ( bBehindView ) CalcBehindView(CameraLocation, CameraRotation, 180); return; } // View rotation. CameraRotation = ViewRotation; DesiredFOV = DefaultFOV; ViewActor = self; if( bBehindView ) //up and behind (for death scene) CalcBehindView(CameraLocation, CameraRotation, 180); else { // First-person view. CameraLocation = Location; CameraLocation.Z += Default.BaseEyeHeight; } } event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove(float DeltaTime) { local vector X,Y,Z; if ( !bFrozen ) { if ( bPressedJump ) { Fire(0); bPressedJump = false; } GetAxes(ViewRotation,X,Y,Z); // Update view rotation. aLookup *= 0.24; aTurn *= 0.24; ViewRotation.Yaw += 32.0 * DeltaTime * aTurn; ViewRotation.Pitch += 32.0 * DeltaTime * aLookUp; ViewRotation.Pitch = ViewRotation.Pitch & 65535; If ((ViewRotation.Pitch > 18000) && (ViewRotation.Pitch < 49152)) { If (aLookUp > 0) ViewRotation.Pitch = 18000; else ViewRotation.Pitch = 49152; } if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, vect(0,0,0), DODGE_None, rot(0,0,0)); } ViewShake(DeltaTime); ViewFlash(DeltaTime); } function FindGoodView() { local vector cameraLoc; local rotator cameraRot; local int tries, besttry; local float bestdist, newdist; local int startYaw; local actor ViewActor; //fixme - try to pick view with killer visible //fixme - also try varying starting pitch ////log("Find good death scene view"); ViewRotation.Pitch = 56000; tries = 0; besttry = 0; bestdist = 0.0; startYaw = ViewRotation.Yaw; for (tries=0; tries<16; tries++) { cameraLoc = Location; PlayerCalcView(ViewActor, cameraLoc, cameraRot); newdist = VSize(cameraLoc - Location); if (newdist > bestdist) { bestdist = newdist; besttry = tries; } ViewRotation.Yaw += 4096; } ViewRotation.Yaw = startYaw + besttry * 4096; } function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { if ( !bHidden ) Super.TakeDamage(Damage, instigatedBy, hitlocation, momentum, damageType); } function Timer() { bFrozen = false; bShowScores = true; bPressedJump = false; } function BeginState() { BaseEyeheight = Default.BaseEyeHeight; EyeHeight = BaseEyeHeight; if ( Carcass(ViewTarget) == None ) bBehindView = true; bFrozen = true; bPressedJump = false; bJustFired = false; bJustAltFired = false; FindGoodView(); if ( (Role == ROLE_Authority) && !bHidden ) Super.Timer(); SetTimer(1.0, false); // clean out saved moves while ( SavedMoves != None ) { SavedMoves.Destroy(); SavedMoves = SavedMoves.NextMove; } if ( PendingMove != None ) { PendingMove.Destroy(); PendingMove = None; } } function EndState() { // clean out saved moves while ( SavedMoves != None ) { SavedMoves.Destroy(); SavedMoves = SavedMoves.NextMove; } if ( PendingMove != None ) { PendingMove.Destroy(); PendingMove = None; } Velocity = vect(0,0,0); Acceleration = vect(0,0,0); bBehindView = false; bShowScores = false; bJustFired = false; bJustAltFired = false; bPressedJump = false; if ( Carcass(ViewTarget) != None ) ViewTarget = None; //Log(self$" exiting dying with remote role "$RemoteRole$" and role "$Role); } } state GameEnded { ignores SeePlayer, HearNoise, KilledBy, Bump, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, Falling, TakeDamage, PainTimer, Died, Suicide; exec function ThrowWeapon() { } exec function Taunt( name Sequence ) { if ( Health > 0 ) Global.Taunt(Sequence); } exec function ViewClass( class aClass, optional bool bQuiet ) { } exec function ViewPlayer( string S ) { } function ServerReStartGame() { Level.Game.RestartGame(); } exec function Fire( optional float F ) { if ( Role < ROLE_Authority) return; if ( !bFrozen ) ServerReStartGame(); else if ( TimerRate <= 0 ) SetTimer(1.5, false); } exec function AltFire( optional float F ) { Fire(F); } event PlayerTick( float DeltaTime ) { if ( bUpdatePosition ) ClientUpdatePosition(); PlayerMove(DeltaTime); } function PlayerMove(float DeltaTime) { local vector X,Y,Z; GetAxes(ViewRotation,X,Y,Z); // Update view rotation. if ( !bFixedCamera ) { aLookup *= 0.24; aTurn *= 0.24; ViewRotation.Yaw += 32.0 * DeltaTime * aTurn; ViewRotation.Pitch += 32.0 * DeltaTime * aLookUp; ViewRotation.Pitch = ViewRotation.Pitch & 65535; If ((ViewRotation.Pitch > 18000) && (ViewRotation.Pitch < 49152)) { If (aLookUp > 0) ViewRotation.Pitch = 18000; else ViewRotation.Pitch = 49152; } } else if ( ViewTarget != None ) ViewRotation = ViewTarget.Rotation; ViewShake(DeltaTime); ViewFlash(DeltaTime); if ( Role < ROLE_Authority ) // then save this move and replicate it ReplicateMove(DeltaTime, vect(0,0,0), DODGE_None, rot(0,0,0)); else ProcessMove(DeltaTime, vect(0,0,0), DODGE_None, rot(0,0,0)); bPressedJump = false; } function ServerMove ( float TimeStamp, vector InAccel, vector ClientLoc, bool NewbRun, bool NewbDuck, bool NewbJumpStatus, bool bFired, bool bAltFired, bool bForceFire, bool bForceAltFire, eDodgeDir DodgeMove, byte ClientRoll, int View, optional byte OldTimeDelta, optional int OldAccel ) { Global.ServerMove(TimeStamp, InAccel, ClientLoc, NewbRun, NewbDuck, NewbJumpStatus, bFired, bAltFired, bForceFire, bForceAltFire, DodgeMove, ClientRoll, (32767 & (ViewRotation.Pitch/2)) * 32768 + (32767 & (ViewRotation.Yaw/2)) ); } function FindGoodView() { local vector cameraLoc; local rotator cameraRot; local int tries, besttry; local float bestdist, newdist; local int startYaw; local actor ViewActor; ViewRotation.Pitch = 56000; tries = 0; besttry = 0; bestdist = 0.0; startYaw = ViewRotation.Yaw; for (tries=0; tries<16; tries++) { if ( ViewTarget != None ) cameraLoc = ViewTarget.Location; else cameraLoc = Location; PlayerCalcView(ViewActor, cameraLoc, cameraRot); newdist = VSize(cameraLoc - Location); if (newdist > bestdist) { bestdist = newdist; besttry = tries; } ViewRotation.Yaw += 4096; } ViewRotation.Yaw = startYaw + besttry * 4096; } function Timer() { bFrozen = false; } function BeginState() { local Pawn P; EndZoom(); AnimRate = 0.0; SimAnim.Y = 0; bFire = 0; bAltFire = 0; SetCollision(false,false,false); bShowScores = true; bFrozen = true; if ( !bFixedCamera ) { FindGoodView(); bBehindView = true; } SetTimer(1.5, false); SetPhysics(PHYS_None); ForEach AllActors(class'Pawn', P) { P.Velocity = vect(0,0,0); P.SetPhysics(PHYS_None); } } } // ngStats Accessors function string GetNGSecret() { return ngWorldSecret; } function SetNGSecret(string newSecret) { ngWorldSecret = newSecret; } g2`"j Xs ``" Bo,P\j<+PL1get ini:Engine.Engine.ViewportManager Brightness1set ini:Engine.Engine.ViewportManager Brightness 11flush1shot1pset ini:Engine.Engine.ViewportManager Brightness UP1flush C3W.r _$u])$-w#*Z#4ZZar $A-q Zar $A-q Zar $A-q Zar $A-q  Bn2b)l&tt b)m o:c) Bx,Fg YF F" " " " *m*"F# @jIlpcpe/Pp$pM/SIvi^/$Iގv>e>$NyڦeV>//Vr3Ҹjr>ҏ$jjjN6B/j?cƂB6vҎN^$ٮ[B,?jNzMIvpB^z"ڂVMB'6cSejN$$cvN?V)vvV7?KV͸veVvejƁ?3vvc?>$vvjSI>$ T3[ l 4!x?q6[ z  #<6[ qD6[ z  #<6[ s  #<6[ C ľs  B{@^.OP4Fs(B{RwBpB M4zx96B %y%xp6B %B ,z MTzUvz vxxvyB 6B @6py ~`.I,*-R~IJKLM hQ4^M\-sH$^ g.`4AL S.Q{v,TPlayer List:/a0 QQpQ,( pingSQC)10 f.@s4r4FK i.j.k.HP"H@6yo?-8oyz{(((((((|}~ Bt,ro B5y4eHS W"S3g3K  iz5q.K5mG56_m6_j6Zm6Zj6Ym6Yj6Pm6Pj6Om6Oj6Mm6Mj6Lm6Lj6Hm6Hj6`m6`j6_m6_j-6Gm-6Gj6]m6]j6\m6\j [Ht.L.QG#* )Q)i u.w.@U5@K +)@HR/B o~a~8oB E G -I -K -d-U -Z -[ -a _ i 6,6, B}.`L s,)`)_)S.dP,)d)e)cA/nRQ-)n ~.b x#6i %j%GA6i %i ,nw#*b #  yb  Mtb uOb  OGGOji 6i @6Aj B/S}- T"p.I/C. iHV56 le~d ~D/`5T- X"J/F~D6R"}$o$a(((-T'-`'`-Kx-J'a?(o$/a0 FF  #Fo$10 LC/W -`( }5r!D6q |5Z~ SnlZB-j-0::$lZ?*Celb P6fOTk:f:$hN ZS:f:$&fS PS &S UZ:f:$(fS S US &Z:f:$ -R 'H hZ:f:$%-R 'G wZ:f:$'-R 'O wZ.|:fi*&-R '+K wZZ|:fK(&-R 'ZN wi-L(|  N/B-s$L} A!C!-Kdu>Tu>6DBsT6DBsd666PF6d?%6PF6w#*# "SsFs^::$Is#$"*s#$"-f( V6MV.)MY/Byd JVly ly6jc*6jd*6je*6 f*6 g*6 h*a*ew./e*je  E6{ -s(a j-s'0wE*6E6a j6  {6o$6a*ol*LaAqA-s' BX6,QT/S/W!/]nr @z{b/c/]. d/y, e/f/A + E7u6K* `7|@k/F7J(f m/n/D', EO7h& @Ub7R # s/F(Q B::$  t QF( XX7Gwf"-_{z 5r*G G,dW^w!*!!*HwH*U.HwU*":UZ:ZrU-{ '-{ 1rU*U-%!U:UZ:Z1rU*U-%:UZGG:UZ!UHHp-{ (G:ZXr!*HXwH*U.HAwU*:UZ:ZxrU-{ 'uwr*!r-{  r!*1rU*U-%rUAA:UZG1rU*U-%G:UZ!UHHWpr!* T XhD0L-%3;::$ $-`O99S?%a?( kt/B+=ױ %B x/C-!X/!X}/@P~/@Pp7@PB0XA0@P}7@PH-Xi*@PG[-O. h  l"//============================================================================= // PlayerReplicationInfo. //============================================================================= class PlayerReplicationInfo expands ReplicationInfo native nativereplication; var string PlayerName; // Player name, or blank if none. var string OldName; // Temporary value. var int PlayerID; // Unique id number. var string TeamName; // Team name, or blank if none. var byte Team; // Player Team, 255 = None for player. var int TeamID; // Player position in team. var float Score; // Player's current score. var float Deaths; // Number of player's deaths. var class VoiceType; var Decoration HasFlag; var int Ping; var byte PacketLoss; var bool bIsFemale; var bool bIsABot; var bool bFeigningDeath; var bool bIsSpectator; var bool bWaitingPlayer; var bool bAdmin; var Texture TalkTexture; var ZoneInfo PlayerZone; var LocationID PlayerLocation; // Time elapsed. var int StartTime; var int TimeAcc; replication { // Things the server should send to the client. reliable if ( Role == ROLE_Authority ) PlayerName, OldName, PlayerID, TeamName, Team, TeamID, Score, Deaths, VoiceType, HasFlag, Ping, PacketLoss, bIsFemale, bIsABot, bFeigningDeath, bIsSpectator, bWaitingPlayer, bAdmin, TalkTexture, PlayerZone, PlayerLocation, StartTime; } function PostBeginPlay() { StartTime = Level.TimeSeconds; Timer(); SetTimer(2.0, true); bIsFemale = Pawn(Owner).bIsFemale; } function Timer() { local float MinDist, Dist; local LocationID L; MinDist = 1000000; PlayerLocation = None; if ( PlayerZone != None ) for ( L=PlayerZone.LocationID; L!=None; L=L.NextLocation ) { Dist = VSize(Owner.Location - L.Location); if ( (Dist < L.Radius) && (Dist < MinDist) ) { PlayerLocation = L; MinDist = Dist; } } if ( FRand() < 0.65 ) return; if (PlayerPawn(Owner) != None) Ping = int(PlayerPawn(Owner).ConsoleCommand("GETPING")); if (PlayerPawn(Owner) != None) PacketLoss = int(PlayerPawn(Owner).ConsoleCommand("GETLOSS")); } LG0D71D$tIL*wK*[Kr w[*d   [  d [~' d DL[Dd [[g 1ff&? w.*CJ.1GETPING/w.*}'=J.1GETLOSS @,!,AG*D$a@'-u'.-e o6Y#n0 H0PZ$0 )P)Ij#!XP0!IG8^'&1kI.fHqkw * a4ws*sabw[*[a[[u4wm*mammub  T8o\JH::$ -lA?load=9$( M-IO0IV0IN0@(h -0 nNwn*n-|n ,@(.r.n*w..nH*na nnM! Xhb8I9%BnJ::$ -lA-` A ll-` Sf S0y'l. -0 INwI*I-|I ,y'.r.I*w..IH*H.I|' YHHH~H:pAdding IP Ban for: Ha%Fa,2<za JFa ~a,2a JpDENY,H bIa IIM! XP-IC <R- cq8t'fODt'=b @ V-~H""""" NϺ@H"""""mc;@Y~X^wwhnmmwmwYQPXIo&QQE ))AT4444B4BT4044V,?HZt3@H@KINN3IH\scUI`UCU[J[IIIIIIIIJC[UkvՄWMWvvvu}uvv}{k]XPX~ݒۓۓY%%~~܉܈~w~X%YQQ^QX'&&&P'''_I(IIEE* *B?IA̵̳͵͵ͳ?4IA0-VT--4,44aIINZHIK@db\F3FHI@a@3sIcpC[[[GGI`cIpfJ`JCO}ùďùďu]x{}}keeOMO%YI~~Y&X2R__R 2_SSRR)jS*)SijjiSjR4I?4ABT-BTI4AL?I0FNd@KdHbqHdIKZaHIJsrIUpIps[UI[Dxuuexտx{uWv}uknwۓ%nPEE_S_S_S_SRR_S_S40A04IB/A-\@IIII3\IIHZc`cp`IUII`r}uѼekekeϼxeuď}uu~ܒ~~~%&&'_ijijiji)E_SijSE_SijI̳͵I0I0I0II}[44A04UI0L?A0I0?I\H@I3UdIK@[U[U[U[[I`[U[J`IUU[Us[[U}}}}}ϼxx{}WvkeU}}v]}PXYij_S_S_SRRYRY_S_SI0ijijSijijijI0-4I?I0I0I0I0I0[UHr[U[U[U[U[U[Uuu}ù}x}}}}}UUSYUUS2RUI4I?UUS\FNUSUU}}}ϼxUU@I""""" Y{@ % $ $  / !!                        #                                           "1   !                                                                                                         !       !""$                          !""$                                       !! !!!! !                                                                                                                           !!                                     AI""""" {@(    7(    rwkrk-rwkkk- (?H(  rrkkk- >>>?zzr6zzr6 )7HT?7)// a) zzr6 7 ( UUUH̯G̯G ./HHUU?.7H77/)ͯG)7/..>7)H/.))  ?./WWWJЯЯ8J>WVJl>WWJIlWV0 VJ 8ЯHUUU>?UU? UUV/. .H/>^^^J"鯩|鯩| @K! lJ^JJ8 ^^^J^X0 KX"!0 鯩| lVWW>8WWW8W80 VJ%0 bbbY" ЩSЩSY% b"bbYK0 ۸l0lX% KX%9%&""ЩS^^^9%^^^@&lJK  ^J%%cccY"馏馏&9,Y,$ccZY"Z999&Z, KZ,9!",099@9,馏bbb@"bbb@" 9 8&"!XK%dddL,==,A:  &A; ddZ3Z: AZ,: :;LALԆA!$=ccc@"ccc@" $3A:!"Y9,eeeL32311,ALA,2123;LL,eem:2Z: Ae, :,2[eeL:eA! dddL3dddA":eL3 ZZ,, mmmN3[mfN[mmmmmf[NmN:[mmN,1m: Nm1;1[mmmA, mA2eeeL3eeeL3 ;mN3 e[,3nnfN2nfnffMM**# nf:1*:܊M*[ff55:NnnN2fnnM<mmmN3mmmN3 MnfD  mN31nnfg*MOO*5nn\<*#弊fO5_M fnnM* hfhM1nnnN<nnnN< M111D\nMD11<*+OCCCCC++2fMDsst_4OOqMO ssgD*#\st_C#C<+5CC5 sgOD_qg<nnng<nnn_< t_g__gtsssqgg54oQQQQP4+_hOO yy_4yD<yOOyyqDCqy+O)).) .7>7.//>?I>.).777>>/ a?IHIHTTTTTH? .//77// T>>>>7>>>/ //777/))../7/)/HUaaUa?7IV7/?VU.)/HUUU?HaUUUUI UUaa 7HHUUU//ҶaUU7/IIUUUU?/IVUU/JWWaWӵWWW0 8IVVWI 8JJlӶW% aJWallWWV8VWalWWV%WWWWI>88888?JWVaaWW>0088VaWW>0>VWJ>WWV88JWJWW>ҴWW% @X^^^@^^X@9@J^^^^^J" JJJK ^@^^^8^^^@%^JX^^X%^^^^8X^^X@Ӹ^K l^^@bX^^@0 ^^@l^^@0"l^^9rwkSErwkSSXbbX%bbbK&bbbY" lbK@!ԅbK&㸷9bbbK&bY@9bbX%bbbX%0lbbX%Թ8lbb@bbb@% lbbK"bb9%bbK&zzkSzzkS  cccc"cccK&ԇccY"!cK@cK,@99,cccK" Z@0"ccc,cccZ, Kccc" ,999" ccc@ccK" @ccK"cc9"ccK"ͯz-̯z-dddZ3dddL3 ddZ3 ;Z&$dA,dddZA!A&ddZ,dddd, !&!!$ LddZ" $ddZ;ddZ3 AdZA!!dd;3ddL3Яz-Яz- """&&""" eee[3eeeL3eeZ3,A,1!,meA:$$1eee[,$L[:2ee[,eee[A;AL[A;LeeZ, 1ee[: :eL:Ae[L:$1ee;3eeL3ͦGͦG&&&,;;3$,11111111111123;;,&&&mmm[3mmmA3 fmm[3[mmm;: ;;;fmN:* mN21mmf:*mmmmNmmm[;Nmmm;*111*;mm[3mf;:;N[[A$1mmA2#mmN3* 323:ALeA;*N::::::::::::A1;AeLA:323 nnn[<nnnM< Nnnh<1nnmh:2nnfN<M11nnf:*nnfտnfM1NnnfM2:MMM:1#fnf[2Mnn[NfffN<1nnN<$nnN<*2223;N[mA#<պD#Am[N;3222nnnh<nnn\< gnnh<hnnn_O$nhM1MfM5nnfO* ֿh\#nng<gnnnnM*nhg1OhnnnhO12nhO<TTTaTT?)7?IHT?.TTTTT? TTTTTTT7?TTTTTT?7).ITT>TTT??TT/TT? TTT.TTTHIaT?)TT..>?IHH7  00 WJ7VUaaaUIUUHIVVUU/>HUHUUHUUUҵUU?)UUUaaU/ ?UUUUaU/./IUUUaa.UUU??UU/ UU?UUU/UUUVHUU/)UU./IUUaU7%0   J WWaVWVWW?>IWWJ00VWWJ>WW%WWI0%lWWV>WWWW>IWW>>% J?WJJ00aIWWWJIWW8 WW?WWW8WWWJ%JWWV0WW8" 8JVWVValWW8 0&""&$l!l^^b0^"^^@8^^^8&8X^^J% ^^0 ^^@"^^^K^^^^0K^^90^^K@^0^^^J"K^^8" ^^@"^^^8^^^X8Jl^@%^^8"^^^^K8 ^^K" 9"!YcYZ9",!$,!bbXY&b%&bbY9bbb@"lXbbY"bbb8& bbK"bbbY&bbbX% Kbb8%bbK8lb8!bbbY" Kbb8" !bbK"bbb9bbbX@0Kbb0%bb8" llbb9%bbX0!:$L, Z,,:d$9ccY9c:&ccY9cccK"cccY" cc9"ccK"cccY&cccc" Kcc9"ccK99&cccY"9cc9"ccK"ccc9cccYKYYcY,!cc9&Ըc9cccK&;,e:1e:3 e2dddA; LdA&ddZA! ddLYdddY3L,!ddL3ddZ3ddd3Ldd;"!ddL;ԔY!dddd, ,ddd;3 !ddL3dddAdddZA&LZdA,$!dd;&ZAAA!dddL"N3$m2$3:1 m2Zd:3$eL2$eedL1 1[e[A;eee[3 庺[:1eeL3eeed3eeem,LeeL,1eeL;L1eeee;,:Aeee;31eeL3eeeA!eeedLLLee:3 1ee;2eeeL3M*Mf1 2D1<f[3*m[31mmmN;:;NNN:$mmmN3 1mmN31mmmf3mmmm;311*Nmm[;:2**1mmN;*mmmmN;:Afmm;31mmN3*mmmA1mmmm[[[m[:21mm;2mmmN3*\5\*5D*n<n\D$f<2nnnfMMMhNMnnnN< 1nnN<5nnnf<nnnnNMD2*Nnnn[NN:11nnNM1 nnnnnnnnnnnM<1nnN<*nnnM1nnnnnnnnN<*1nn;<nnnf<1M#D+OD+q<5nMDnO2nnnnnh\<*nnn_< 1nng<5nnnh<nnnnnnn_< gnnnnnngO1nng\<O11115nnnfnnnM<1nn_<*nnn\1nnnnnnnnh<*1nnM<  nnnh<C\#D#\D_5OsODsMC ssq_s_<4sss_< Cssg<5ssst<ssssstO gsssss\#Cssg_<_DDDD<*ssssssM<#Cssg<4sss\CsssssssstDCCssM< HHTTI)?TTHTaT?)  .7IHaH> TTTTaTH/IHHTH/TTTTTTTTTTI?TT7 TTH. TT.TTI TT>TTT/TT?. ??HI?UUUUUV ?UUUUU??UI UU? IUUIҴUU/ ?UUHa촃U/ )7UUVUUU>UUUaaӃUU/)IUVVUUӳaUI)ӳUUUaa/ ?UU>)UUH. UU/aUUU UU?  UUU/UU>. ҐV//UUU/ WWWWWV0 VWWWWW?IWW% WW>WWWWJ8WWJ0IWWV0WIVJWVV>%%WWIWWWV8 WW8 JVWJ>0I҄W?>>VWWWa>IWW>0WWJ8WW>aWWWWWI%WWW8WW>0W8 JVV?0^^^^^X9X^^^^^K"K^^8!^^K"bb^^K%^^^@K^^X%K^K" lX^J9 ^^X8^^^X% X^^K" ^^^K"^JJ^^^^0K^^@8^^X9 l^K&8^^^X% l^X% l^^^90l^^@% ӄJ0"JXX@bbbbbb@8bbbbbbK" KbbY"bbK"bbbK"bbbK&KbbY"lbK" bbK9 bbb8&bbbX"YbbY& !bbY%ԑb%bbbY% Kbb@9bbX9bX%YbbbY%bX0& 0lbbb@& @bbb9%ӓb@% 8YXX8 cccccc@9cccccK" Kccc,, ccK"cccK"cccY&KccY"cK" ccK9 ccc9"cccY" KccY" &ccZ0& ,cccY" KccK9!ccZ9cc:!ccc@" ccc9& 9cccY&$cccZ9&K9,@ccK&dddddZAddZdddL"LdddA,$ddL3dddL"dddZ&LddZ3!dL3 ddL; dddA3dddZ,LdddL, ԆddL,&$dddd3LddL;!ddZAdd:dddAAddA&ddddZ&! ddd:۔dLLZddL$eeeemee[eeeL3 LeeeZ:A$meeL3eeeL3eeeZ3 Lee[,2meL3eeL; eeeA3eeee,LeeeL1eeL,21eeee3 LeeLA1eeeA,eeA1 eed;!3eeL3 meeeee32 eeZ:$eeeeeL,mmmmm,m1[m2mmmN3 NmmmmNN:fmmN3*mmm[3mmm[3 Nmmf:$;[mmN3mmN;5 mmmA3mmmm;::fmf[AN庈mm[:1*mmmm3 NmmNA1mmfA*$mmN2mmm;**mmN3 mmmm:3 mm[:[mmmmfN1nnnn1NNf*nnnN< NnnnnfNN[nnN<*nnn[<nnnf< NnnfM::NfnfM2nnNM5 nnnM<nnnnNffnfNM$彍nnfM<5nnnn< NnnNM1nnfM*n[21nnfM$nn[: nf[f:< nn[DMnnnfM*nnnn$h_h5nnng< gnnnnnnnng<*nnnh<nnnh< gnnnhhhhnnnO1nngM5 nnn\<nnnnnf_<#hܖnnhO1$ nnn< gnn_M1nnf\*n_O5OnnhOnhO$hhgMD$nn_D DfnnnnM1ssssgsg_sssg< gsssssssg<*sssg<sssq< gssssq<#ssg\5 sss\<ssss忖q\5#NsssM5+sss< _ssgMCssq\*sq\CgssqOsqM+Cqg\\\O*ss\< \qsssg5#yyyy_ty_OyyygD qyyyqOyygD4yyyqDyyyqD qyyygggq_O*yyg\5 yyy\Dyyyq\# yqD4OޖyyOByyyD \yyg\Cyyt\4tyy\DtyyyqD yt\5Oq_D+gOD4yy\CBgyytyqO+ŽvOvPƎvQ {vPĜxQ4Ž{Q~Q {~o+ŽxoB ŽvQ{OuC   ~F+Q P{o#CŽ~o4Q׎vovQŽvQo{o+#~oO+yoBO~{PyoC˜oP—vBǘvQ {oQ~{Q4˜{Q~Q {}Q#˜{oB ˜vQ~Q~P+jFFB46ؘQ+ØQ PØ{j6F˜~u4+٘{o+xPjǘ{j{xjǗxo+~o4v~~~uƘxPŘuBêu+ǘxQ }pBŞ{Q4ƞ{QØ}i}}Q'Ř{uB ŘuQØ~i}i'4xujQ6FޞoPØQ FØ}j6F˜~u4٪xP}~uPQ٘~}}~vQê~xi~o4-x~~Pؘ}j6šu6j-ơxi}i=٪}iEá{iá}i}i'Ƥ}uB šiái}i'BƤ}pE'Ϟuiái Fšj6PšoEá}}uE6ϡoPϞ}p'P}x-E桛oBɣu-i'ɣii6`ɣiEȤipi'˪` ȣ`ȣii'EϪpEiȣiEˬ6ip6ɣu='ϣuEiडpଣ`Υ|``ɥwʥw-ग़wEȬwkʥw'ɥpB-Eȥwʥw'-ȥ]rSȥw=ɥ`||-॥w-Ϭp-kᤥw|˥w'ΫzSS Ϋwʫw'ᬝwEʫ6ʫw-ΰk̫wʫw-ʫ|||6̫wʬz zᬫ`̫w'-ଫk]]ૢ|Sݮr==ݮzʮz-S̢zSʧkʮz-]ݰ|=̮zʮz'̫k̮zʮG=ᰮ]ΰkʰ]=G갮]⯯`-'䯯z̯z-zS]ͭz̯z-ͯ`گzͯz-ͰkگzگSͯSͰSͰG|ͰkrͩGzGG]󯦟Щ'G6͟66ЏGͰ=G͏6kͭݩkکzSG-ѭS6GGG-    /  ( (   ( 7//T?( ?77  H(((((((/H>>>/.? /H>>>/>HU)T/ TI.TTTTTTT/?UUH)>/H.UU??>WW>>U7UH.ҵUUU7IWWV0 0%JVWWI @Xl^%l>%WJ0 WWW8K^^X0 %%J^ l^^J" K@K9!K0X@%l^^X9KbbY% %KX%bbY" $K99Z&Ԇ"Y0&!bY@"bbbX9KccY" ,9Y"ccY"AL;,A!9c9::cY@!cccK9 LddL3 ,,ZZ!ddZ3$LA:1e3!$dAAAZLAZdZA"LeeL33,[e 1ee[3;N;3;1ՈLALeL: 3ee[ANmmN3 13Nm1mm[3NN:2:f21[N:[[N3[mmmN;NnnN< DMf21nn[<_h<*\<Mf[NfN\1 fnfMDgnng< OOh_1nnh<g<_sO5*܊nnnhM5ngM1gss_< OOhsCssq<#֍sssgO_ssgOqyy_D COgy#CyyqDyytg<yyyy\O{vQ +OvPCŽ~Q#vĎ~v5+~oP{vQ jj~vF˜~Qjǘ~v4Q}o+}vQQj~F˜~i'FŘ~xEvj}i Fp}'Fši'FšxEuii=p]`ɣi'`ɣE`uEʥw|rɥw'`ɥE|rS=-ʫr||]w-`ΫE`Gʮwk`|zz-`ήSʫ|kͯzkS|S|z-`ݯSݯrЯz-Яz-GͭzrаͭGSѦY//============================================================================= // ScriptedTexture: A scriptable Unreal texture // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class ScriptedTexture extends Texture safereplace native noexport; // A SciptedTexture calls its Script's Render() method to draw to the texture at // runtime var Actor NotifyActor; var() Texture SourceTexture; var transient const int Junk1; // C++ stuff var transient const int Junk2; // C++ stuff var transient const int Junk3; // C++ stuff var transient const float LocalTime; // C++ stuff native(473) final function DrawTile( float X, float Y, float XL, float YL, float U, float V, float UL, float VL, Texture Tex, bool bMasked ); native(472) final function DrawText( float X, float Y, string Text, Font Font ); native(474) final function DrawColoredText( float X, float Y, string Text, Font Font, color FontColor ); native(475) final function ReplaceTexture( Texture Tex ); native(476) final function TextSize( string Text, out float XL, out float YL, Font Font ); c0n+S )n+)j')f')b'k9`'t9)`'f0m'bg-qYm'+wq*qK g0e\ȧ5 -_ 3bzz p' XY0r'cUd-J-r'b F" " " " *HF*"F#@ile???/'ix63??33'djȮiN??>3' \ҎeV????\xd'zK???d6i???Oűű?i̖??űűz̡?ōxշB}+d衖6}gzz'}w}#ig'ugE d}nud }iڊiugYgiiz}u}gidu}u \dz}} iir}u}i͈y}; qxҮu;z}; x򱩱Hz#E  iE x}}u*nxĪx xzzrii}z H#C)BVz,ZC)*w* KZ Xg9e'e(P"w * ee'NNw.H* wg * ag  }e//============================================================================= // LevelInfo contains information about the current level. There should // be one per level and it should be actor 0. UnrealEd creates each level's // LevelInfo automatically so you should never have to place one // manually. // // The ZoneInfo properties in the LevelInfo are used to define // the properties of all zones which don't themselves have ZoneInfo. //============================================================================= class LevelInfo extends ZoneInfo native nativereplication; // Textures. #exec Texture Import File=Textures\DefaultTexture.pcx //----------------------------------------------------------------------------- // Level time. // Time passage. var() float TimeDilation; // Normally 1 - scales real time passage. // Current time. var float TimeSeconds; // Time in seconds since level began play. var transient int Year; // Year. var transient int Month; // Month. var transient int Day; // Day of month. var transient int DayOfWeek; // Day of week. var transient int Hour; // Hour. var transient int Minute; // Minute. var transient int Second; // Second. var transient int Millisecond; // Millisecond. //----------------------------------------------------------------------------- // Text info about level. var() localized string Title; var() string Author; // Who built it. var() localized string IdealPlayerCount;// Ideal number of players for this level. I.E.: 6-8 var() int RecommendedEnemies; // number of enemy bots recommended (used by rated games) var() int RecommendedTeammates; // number of friendly bots recommended (used by rated games) var() localized string LevelEnterText; // Message to tell players when they enter. var() string LocalizedPkg; // Package to look in for localizations. var string Pauser; // If paused, name of person pausing the game. var levelsummary Summary; var string VisibleGroups; // List of the group names which were checked when the level was last saved //----------------------------------------------------------------------------- // Flags affecting the level. var() bool bLonePlayer; // No multiplayer coordination, i.e. for entranceways. var bool bBegunPlay; // Whether gameplay has begun. var bool bPlayersOnly; // Only update players. var bool bHighDetailMode; // Client high-detail mode. var bool bDropDetail; // frame rate is below DesiredFrameRate, so drop high detail actors var bool bAggressiveLOD; // frame rate is well below DesiredFrameRate, so make LOD more aggressive var bool bStartup; // Starting gameplay. var() bool bHumansOnly; // Only allow "human" player pawns in this level var bool bNoCheating; var bool bAllowFOV; var config bool bLowRes; // optimize for low resolution (e.g. TV) //----------------------------------------------------------------------------- // Audio properties. var(Audio) const music Song; // Default song for level. var(Audio) const byte SongSection; // Default song order for level. var(Audio) const byte CdTrack; // Default CD track for level. var(Audio) float PlayerDoppler; // Player doppler shift, 0=none, 1=full. //----------------------------------------------------------------------------- // Miscellaneous information. var() float Brightness; var() texture Screenshot; var texture DefaultTexture; var int HubStackLevel; var transient enum ELevelAction { LEVACT_None, LEVACT_Loading, LEVACT_Saving, LEVACT_Connecting, LEVACT_Precaching } LevelAction; //----------------------------------------------------------------------------- // Renderer Management. var() bool bNeverPrecache; //----------------------------------------------------------------------------- // Networking. var enum ENetMode { NM_Standalone, // Standalone game. NM_DedicatedServer, // Dedicated server, no local client. NM_ListenServer, // Listen server. NM_Client // Client only, no local server. } NetMode; var string ComputerName; // Machine's name according to the OS. var string EngineVersion; // Engine version. var string MinNetVersion; // Min engine version that is net compatible. //----------------------------------------------------------------------------- // Gameplay rules var() class DefaultGameType; var GameInfo Game; //----------------------------------------------------------------------------- // Navigation point and Pawn lists (chained using nextNavigationPoint and nextPawn). var const NavigationPoint NavigationPointList; var const Pawn PawnList; //----------------------------------------------------------------------------- // Server related. var string NextURL; var bool bNextItems; var float NextSwitchCountdown; //----------------------------------------------------------------------------- // Actor Performance Management var int AIProfile[8]; // TEMP statistics var float AvgAITime; //moving average of Actor time //----------------------------------------------------------------------------- // Physics control var() bool bCheckWalkSurfaces; // enable texture-specific physics code for Pawns. //----------------------------------------------------------------------------- // Spawn notification list var SpawnNotify SpawnNotify; //----------------------------------------------------------------------------- // Functions. // // Return the URL of this level on the local machine. // native simulated function string GetLocalURL(); // // Return the URL of this level, which may possibly // exist on a remote machine. // native simulated function string GetAddressURL(); // // Jump the server to a new level. // event ServerTravel( string URL, bool bItems ) { if( NextURL=="" ) { bNextItems = bItems; NextURL = URL; if( Game!=None ) Game.ProcessServerTravel( URL, bItems ); else NextSwitchCountdown = 0; } } //----------------------------------------------------------------------------- // Network replication. replication { reliable if( Role==ROLE_Authority ) Pauser, TimeDilation, bNoCheating, bAllowFOV; } j;` G |` LeftZ?z=|` RightZz]|` CenterZzz|` HiddenZ@BZ a r9JK j0j9m Rs0d-_&f 9M'[ B2)M')O')Q')E')G')I')w&)y&)z&)@'@f;d$)-J(#* I|!.' Xm L1ei *%8ie a-v0b {t0XoYWzU -G,-QU XLw * U X-QWP @x0R'BSK -R'b y0T'J L -J -T'-J -L( a U'aFJ -U'b 0ݔI -G6%a( 5:a@@(-G' onZ°Ar* rn*#w*rn fwf*rfn!.fw!*!-%.$ p!}!O!* T ffL Xw0P'K Y׽-d-P' hm:dM-sH$d ~0^ $ F^ ?[S?%6D^ ?.[6%6%q!B::$I^ #$"*^ #$" A1^B1 C1 D1  G1H1n 0TkBNgwB*PB-Bq!CBBBM' K1c ߦ 0txn -S&' -d'/a0 w!c _w*10w* mx-L&|)a* w* mxK&a* S;@u8j.k2@S1c+c̤L .c+wL *[$L B?,$?,(L B@?L B>$~|%~ H_1` N1x&IDL x&b TAq6 w * k=A::$ rH*ONwO*Oa/! w..OH* OOMXb"TeamSA' `-O1D<T&ls,stT& e<hY1h o?Restart( B  @{:|&J! J|&( XgH<M&kN&M&$ Z1sB2E2^I2J2HJ C2OM2U+a@Ҕ*"6(z% ]-P*%U+ K2L2S2Yd7!YOrrY a y@Jq R2V2Wa1!W{__W aa|r: -`' Y2Z2E,?' NT2W w::::$ *o$*0*!O  W2U2i^; ]2^2n   died.  [2\2a2{zlx |Jr{x  r{*x  J ?&w{*{yw{ *{ J ?&tz{x  _2`2@d2F,Y 6)F,)l))k))x%$b2j2ST ƎAaM%S h% S N2e2vGh2Zs { f2n<N >+w*p Weapon: Vw*pppInv: V state Wa6wC*稨Selected ItemVCChargeSCN X}?cpG-wc*c-HcnqGFH(!yw*OGq*w*OGq* 0q!L {{FY c ,G ,c}{(!y-P'G q+?&ZrcG rc*q!w*OG!r cw*OG!r cw*OGqcw*OGqcW-PVq!OaM,G *Wq!waM,G *Wq!]aM,G *Wq!MaM,G *Wq!vaM,G *W<q!qaM,G *WaM&G *c-pNonewc*pc}oNonewG*oG}:c k:G krw*C\c DG Dpoqw*C\c DG Dpoqz#w*C]c DG Dpoqzw*C]c DG Dpoq-P wG*T cGqzcG }N{Nk2Bof"h - s%t%GX 5x t%b R.e)| se e)[ o:f) B`?H@  -B 3-0::$ cJ!VJ! God mode off J!V God Mode on Xv?l?i%v s tr-0::$ hi% b Bb XC@en</|e&@ee}e&-O'W|e&.epp.Rge -O -P c}eYNwY*Y-Ya/!WYZ e![YYM  c}eYNwY*Y-*:Y k: kYa/! YZ e!MYYMW B/r2sp5@!} srq!L t2yuA!} ywu!b  z2pg`z =-v::$::$'T|p=,|rT* Player start not found!!!(-upa T  -uT Rp'pa+T "p p "p '#p  #p*p*pa'''p"bT  T "p-R(pepepo po {ppVT Player start not useable!!!-u v2x2D@@3|Gx>{q/a0 Xw=<|WwQq0w10/a0 Q_|{_-m_-s0_10WARNING: All single player starts were disabled - picking one anyway!/a0 Q__-m0_10No single player start found* y2|2TENOz#n >p \ z#{#  , r@t3l3o ` ( I3h@e@l E j@^%Q _&-0::$ /a0 O\[aO^%Oa10 XU.X))=w_X)-Y)-Z) L3gr+sK{g稨All inventory fromg ,is accepted k3bZ.N)yBUyK6t P)6t BN)6t BQ)l t  |@{@FFzD O3v T m-p'`v a/! Yv a/!R-p(V::$o`|-p.::$::$Fpv  ,T%(w* zv w* zv  RAV3O um K3tcFZ:K:$o$L6 ?|6t?%6t? t P3mbGu 669669r66u 696u 696u %a+u a m tO:z0L iG3U)b.w!eU)ko:V) F3Mx V&-B::$ /a0 MSRr.M*Ma10 Y3vniv2hzS+Q+$::${Nw{*{- w{v{-qvHV%{ `&{ `,{ `,{ `vV{Vw{ *{ -Q {a/! v-q.{HV%v `&v `,v `,v `.{VvV{{Mf \3Yv=(Ys::$laU W ioS"::$ |%H f*`% |`H f*tzU Y`l9`Name,B =X`Team,v9`PasswordB9`Skin}9`Facej9`ChecksumLogin:l|{vPasswordve|*B Yre*H S%*X NwX *r.X wr*rrH*wr *r-({r , ,::$9|r ,l|rwvErX X M{rE*'-W-L,U -faU W U O)EaU e  e "{wE*E e "rE*pCouldn't spawn player at VeH D)*EbEB}B E Dx(En E ".zllUy::$zE ,UJEl(WE:B H u(*Ea/!R::$oEwvE-0{wzvwE -} E-0hE-0Administrator logged in!EGB::$::$FpE ,w((e RE'w* AE)w*AEjE-x+|jNoChecksumkEa/!R|E [.@`BR%XV?k 9R%T7{k Tk Jk M+ [3R!$0L q!C t^3]3t ,L _3U`3]Me r* "UVT!7M իL?;Uի?;V T K [!Z!YS`POT KwT *4rT Z!T T T  * sd3M TaQ2rM *ptried to add none inventory to VK pwK *YrK M (K K =M aM M ' q3Jڬ.wm*mammuLw4*4a4* #'#-J(-T(-R(-Z(-f(w.n#*#* ie]YV(weH*w.n e*'R--n w.e*'( xi3~QZw.~*w ~ s3h3U3eu  -B 3-0::$ pFabricate eLe wL*aL  ?,H9"#??, XI"CBx u] k\"Pfc)\")[")Z")V")E@ ]`JXi::$ [-qXr&`*K-b kXb$qqrV*VVw *r * a  F"r3h55:5.r.n#*-J'-`'-f(-R(-Z(xu::$ -Ra?(wm*mammu~w4*4a4* a.-`(-T'-f( v3F+XV! F.  F+D.-J .q p3BrJkei?%-g'-L '-i(-l(jM:r:$-o'c:r:$-l ' |3].w R  eG4m3Ku I\Kb]FwK*found patha V%!K  Zdidn't find path Xyz3@c.\4cQ k H4xaOb j 9xPasswordX::$ q xb f{{ {j { zw{j wzj b r(tNEEDPWb t(tWRONGPWYq(b n( u3V_l DD 3zbamHF{Ry.R Fwy*zVy  S @4~d\nLV~V_  X4|uVv I5F4R4S4q N`% |` Flwu I4mwd b.H $W?-`'-f%-f(YZ[du>Tu>6DBH T6DBH d66 6PF6d?%6PF 6?::$IH #$"SH FH  K4J4nx ql ` uva#?uzwaUv#l ծx?,9ul *yl Uvxyxl կy?,v W4]l.eMVw#*e#s#  h# "D.#wD*::$D-D gD:fwD*D @dD-hD 6sD:w.n#*[-J:#K:$hfh-J`sh>C-J`sh4C hele-J`sh4Cs 6s5 U4rU PI?Gw*mmapchangexa*w*mmapchangexa*ProcessServerTravel:r/a0 ^ w.^ H*^ Ar$-i(B^ ^ G 10::$ wB*U ppppppppppU ?Skin=B R Skin?Face=B R Face?Team=B R Team?Name=B R Name?Class=B R Class=::$::$P T4@Z4[4e ~"HPppppppppK, G, m( S|/S` N4L4vIx n= D4@Bzqx nz ]4Yw?BInitGame:Y`, XYMaxPlayers`A9YDifficultyp{Aq=JAA9YAdminPassword{AwAA9YGameSpeed{AGameSpeedAhLAtaD,pBase Mutator is VtA9YMutator {AMutatorsA {AC ~A,C %I AC AA}AC &I AApAdd mutator I hI t~ahRA9YGamePasswordX{A{ AGamePasswordAA9YLocalLog|Atrue-g'A9YWorldLog|Atrue-f' @e.g4y+9,8AE@Qy+esedc=|dD+c Y4z_3y nz ^4sty n= h4_4t yd sb4|  z A@n4C+n@@<QC+bsbae(9|ad('( j4d4c4@Jz i4e4~ tz o4e@u4Hs >YD~H=%WH~H=TH~H=&WWHT p4r.Pbl=!-h(-b-bVw * E'w * E'Lw * E(w * E( Xt4w4GJ o.C5{ I| `D{Q<z{&?w {&E~w ?%w w ~w ?{{&}~{?%{{~{?{'( SDGDtz a^H+~EError - play gut hit must be implemented in subclass ofV x4\sM~ ^\ z4UA R~ ^U E5] V&6}Z-n/a0 ] YX] -X] -|] a10/a0 AzAa10 {4_C W3 ^_ M~4`Ze a(RM* -P[R B|RHelpd  c}RENwE*E-*:E k: kEa/! gw *w r*d rkE R!M'EZ R!M'EZ R!M'EEMy Xs.D5XG% zDj5 @@5Z DbFjaZ J~L'w.j*MZ .jaZ ~Lj.jDZ J~Mj H5M5>d- r>* >Bpppppp>, game, GameName, t>Dpppppp>, game, GameClass, V>Npppppp>, game, GameVersion, t>Ppppppp>, game, MinNetVersion, d)>Fpppppp>, game, NoMonsters, T-G>Jpppppp>, game, MuteSpectators, T-s>Fpppppp>, game, HumansOnly, T-W>Gpppppp>, game, WeaponsStay, T-S>Ppppppp>, game, ClassicDeathmessages, T-r>Cpppppp>, game, LowGore, T-Z>Gpppppp>, game, VeryLowGore, T-[>Dpppppp>, game, TeamGame, T-P>Jpppppp>, game, GameSpeed, SDc ?,d>Hpppppp>, game, MaxSpectators, SS>Epppppp>, game, MaxPlayers, S` amw(|6_m*6Zm%6Ym*6Pm*6Om6Mm6LmW(6Hm-6Gm( HT5n*bu,~-I%l-0::$h-n*zl ,yz'( v.wH_*)w EEyE  O5O) P5E E N5vI*)v QE{r Y5fEbm+C^b c~^: oc%J^c& R5J ^+)r5JW0V -o( -Q (a''' UJV7Yz ]5^5DA'Tkzp@ tB?w@ *F %Y QEngine.Mutator%Y K({Y  F ,2|Y V@ D~K,DKKD{pppp, pppK(F QEngine.MutatorF Y Kc@ @ B(k{pTppT\mutators\pTppppT\listenserver\T::$\password\T{{ T cED[ J] Di]  ף;?] ] a\$A]  g5h5F,%:w*-}*S\worldlog\trueQS\worldlog\falsew*SpS\wantworldlog\trueSpS\wantworldlog\falseS T@[5\ _5\5I ԉ E b5a5kEa d5c5[!$b> .r@* b$w?a@$?E z?E @ah$?E z?E @ e5L   k5l5W "*%S@F/d=s-] ' f5u/mkw6*6-C'6a**6o$6   ?, 6&6* m5X /$WB-~*-PB\(tB[(VB-F%-r @\Fm"Hw*mserverquitxa*w*mserverquitxa* C6@HZwEF$CۅZXfA=o=du>Tu>X='AZoXX#?zF?::$IF'$"*F'$" dFxZ 3"-g-cInitiating local logging...a`-F(wPM[xtwx* VxxxBdB%@!::$::$  -f-cInitiating world logging...a`-F'wPM[C%xtwx* VxxxBdY(@ i5fCߏ -] ( F_Fd4 v5w5t5~H-] (el K/k@GQG++  -L' y5Z(RNb ~ Z( 5Dm a7\8i* M/I6unB6@J6b(_ Urzw zs$w_ -0'_  -} _ -0Administrator logged in.F_  ,became a server administrator. HGW(@uX/y(z(Xr}A|nz( ?w|*-|('}(|u bF(a<6 33ib6 iC96 ?i6 ?i J!V* #!O::$D6 ?i* #!Oy333>̒86 Y6 o6 __6 ?ib33> H4//============================================================================= // Menu: An in-game menu. // This is a built-in Unreal class and it shouldn't be modified. // // Serves as a generic menu master class. Can be used with any style // of menu implementation. Offers menu services such as reading input. // Not dependent on any visual style. //============================================================================= class Menu extends Actor native; var Menu ParentMenu; var int Selection; var() int MenuLength; var bool bConfigChanged; var bool bExitAllMenus; var PlayerPawn PlayerOwner; var() localized string HelpMessage[24]; var() localized string MenuList[24]; var() localized string LeftString; var() localized string RightString; var() localized string CenterString; var() localized string EnabledString; var() localized string DisabledString; var() localized string MenuTitle; var() localized string YesString; var() localized string NoString; function bool ProcessSelection(); function bool ProcessLeft(); function bool ProcessRight(); function bool ProcessYes(); function bool ProcessNo(); function SaveConfigs(); function PlaySelectSound(); function PlayModifySound(); function PlayEnterSound(); function ProcessMenuInput( coerce string InputString ); function ProcessMenuUpdate( coerce string InputString ); function ProcessMenuEscape(); function ProcessMenuKey( int KeyNo, string KeyName ); function MenuTick( float DeltaTime ); function MenuInit(); function DrawMenu(canvas Canvas); function ExitAllMenus() { while ( Hud(Owner).MainMenu != None ) Hud(Owner).MainMenu.ExitMenu(); } function Menu ExitMenu() { Hud(Owner).MainMenu = ParentMenu; if ( bConfigChanged ) SaveConfigs(); if ( ParentMenu == None ) { PlayerOwner.bShowMenu = false; PlayerOwner.Player.Console.GotoState(''); if( Level.Netmode == NM_Standalone ) PlayerOwner.SetPause(False); } Destroy(); } function SetFontBrightness(canvas Canvas, bool bBright) { if ( bBright ) { Canvas.DrawColor.R = 255; Canvas.DrawColor.G = 255; Canvas.DrawColor.B = 255; } else Canvas.DrawColor = Canvas.Default.DrawColor; } function MenuProcessInput( byte KeyNum, byte ActionNum ) { if ( KeyNum == EInputKey.IK_Escape ) { PlayEnterSound(); ExitMenu(); return; } else if ( KeyNum == EInputKey.IK_Up ) { PlaySelectSound(); Selection--; if ( Selection < 1 ) Selection = MenuLength; } else if ( KeyNum == EInputKey.IK_Down ) { PlaySelectSound(); Selection++; if ( Selection > MenuLength ) Selection = 1; } else if ( KeyNum == EInputKey.IK_Enter ) { bConfigChanged=true; if ( ProcessSelection() ) PlayEnterSound(); } else if ( KeyNum == EInputKey.IK_Left ) { bConfigChanged=true; if ( ProcessLeft() ) PlayModifySound(); } else if ( KeyNum == EInputKey.IK_Right ) { bConfigChanged=true; if ( ProcessRight() ) PlayModifySound(); } else if ( Chr(KeyNum) ~= left(YesString, 1) ) { bConfigChanged=true; if ( ProcessYes() ) PlayModifySound(); } else if ( Chr(KeyNum) ~= left(NoString, 1) ) { bConfigChanged=true; if ( ProcessNo() ) PlayModifySound(); } if ( bExitAllMenus ) ExitAllMenus(); } pG@ g6E ^HpQ-W*6E t=,6E t=,6E t=,nE tE t mGm t MpV being unpossessed1w * a-(:L?8 U6 \*m(@ H/gUj.)g ~@h/YVzGCD } V"C!k  C!v (R** ?'( IHQH[*// // Represents a schematic for a client localized message. // class LocalMessage expands Info; var bool bComplexString; // Indicates a multicolor string message class. var bool bIsSpecial; // If true, don't add to normal queue. var bool bIsUnique; // If true and special, only one can be in the HUD queue at a time. var bool bIsConsoleMessage; // If true, put a GetString on the console. var bool bFadeMessage; // If true, use fade out effect on message. var bool bBeep; // If true, beep! var bool bOffsetYPos; // If the YPos indicated isn't where the message appears. var int Lifetime; // # of seconds to stay in HUD message queue. var class ChildMessage; // In some cases, we need to refer to a child message. // Canvas Variables var bool bFromBottom; // Subtract YPos. var color DrawColor; // Color to display message with. var float XPos, YPos; // Coordinates to print message at. var bool bCenter; // Whether or not to center the message. static function RenderComplexMessage( Canvas Canvas, out float XL, out float YL, optional String MessageString, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ); static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return ""; } static function string AssembleString( HUD myHUD, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional String MessageString ) { return ""; } static function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if ( P.myHUD != None ) P.myHUD.LocalizedMessage( Default.Class, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); if ( Default.bBeep && P.bMessageBeep ) P.PlayBeepSound(); if ( Default.bIsConsoleMessage ) { if ((P.Player != None) && (P.Player.Console != None)) P.Player.Console.AddString(Static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject )); } } static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { return Default.DrawColor; } static function float GetOffset(int Switch, float YL, float ClipY ) { return Default.YPos; } static function int GetFontSize( int Switch ); eH[HY  `6SHb V { ]$Tf K XTVwT*?Ta/!.T^TT  Xh6i6tQ X*  e6f6fHj6^/N8.)xQ(-R R rQ*E-_(EHDq!::$Eb(a n6yu >Ewy *y w ~Q]\q-T*y-J yq-S*wyH*wyHD*yHD Pt ~Q]\  k6a/| 2@;9w.)x*.)xN l6m6v6w6u3  [/DX"90)D vHp6q6r6i/|6}6t )"  x6)y6z6{6@@B7C7v [ ~66@7A7@K7D7FIj/p ) @H7I7J7L7S*T*sIU7w% Q7OX*Z*FJ` `  s_6CY ? q/f$ ZJ  :5o$aL O/Obe%"-_{z 5r*G O%h]w!*!!*FwF*V.FwV*9:VZ:ZrV-T 'ws*!s66-T 1rV*V-%sV:VZ:Z1rV*V-%:VZOO:VZ!VFFo-T (O:ZWr!*FWwF*V.F@wV*:VZ:ZyrV-T '-T  r!*1rV*V-%!V@@:VZO1rV*V-%O:VZ!VFFhor!* T X{Z7]7qJC(g%)C()B()K$)L$)G(bJP`8L&u c7d7N " f7v/K !h wh7l7O K ~Jn7z/G , j7k7EKK*Q{/H  MK@0@Pr7s7t7u7ZcKZz7h[dK7B~L lKp8|7C0@PV7Lz-nw&@]*&@]a/!U"|W&@]QM6 6  88w   6ww;;&rA*`rA**rwi *Ci     A    i A y H8P&[1 -n /P-sPs (~M/%~M#%::$w.P* f .PM//a0 XL|WLQM wLp 10p p /a0 XL87|WLQM wL p %810wL*iPa/!R.P(L ZP+!Pa/!/a0 U+UPP&10//::$.P4 ppTeleport destination for V not found! [7@8QyS s//============================================================================= // ReplicationInfo. //============================================================================= class ReplicationInfo extends Info abstract native; tKD8@LI0]&0gM8N8%Y-n-nW-n{ %W{ ,Mw{ k*&{ k{  E8J8nIQ8kRKIka/!kb? Rk-J,' P8{ P$IL[ZfA Dv!&[[ "-hg[ "6[6"wd*6[6[ "6d "w.[*::$\Nw\*r\p[\ m[  \\M.[a  ::$$h?.[a+[.[ [h$.[m.[FR[([a  u!&(-h[a+[u!&A-I,[  J*@-hm:[K:$6g%b9g_[  b[  [  _b_9[ "-A(6[  -'6[  @-{'6[  ' O8r/r ca*%::$ -l D(1SaveGame 9 XYfa(((n #<-R' U8R8o W8V8t  _Z8Y] k(l(LCta uAwt*t\l(o(p( XpkT0N+!F %N Pm0f5-` S::$  gO C p* S wD*dBRestartplayer failed [_@M!?O +|Ma(((#-n`@ [8s i@I,UF" " " " *(s *"F#4@ܠ̱eػ2['2JIﱱq,Ż/NVN֭ՍgRRYd}}u}pT' c//============================================================================= // The inventory class, the parent class of all objects which can be // picked up and carried by actors. //============================================================================= class Inventory extends Actor abstract native nativereplication; #exec Texture Import File=Textures\Inventry.pcx Name=S_Inventory Mips=Off Flags=2 //----------------------------------------------------------------------------- // Information relevant to Active/Inactive state. var() travel byte AutoSwitchPriority; // Autoswitch value, 0=never autoswitch. var() byte InventoryGroup; // The weapon/inventory set, 1-9 (0=none). var() bool bActivatable; // Whether item can be activated. var() bool bDisplayableInv; // Item displayed in HUD. var travel bool bActive; // Whether item is currently activated. var bool bSleepTouch; // Set when item is touched when leaving sleep state. var bool bHeldItem; // Set once an item has left pickup state. var bool bTossedOut; // true if weapon was tossed out (so players can't cheat w/ weaponstay) //----------------------------------------------------------------------------- // Ambient glow related info. var(Display) bool bAmbientGlow; // Whether to glow or not. //----------------------------------------------------------------------------- // Information relevant to Pickup state. var() bool bInstantRespawn; // Can be tagged so this item respawns instantly. var() bool bRotatingPickup; // Rotates when in pickup state. var() localized string PickupMessage; // Human readable description when picked up. var() localized string ItemName; // Human readable name of item var() localized string ItemArticle; // Human readable article (e.g. "a", "an") var() float RespawnTime; // Respawn after this time, 0 for instant. var name PlayerLastTouched; // Player who last touched this item. //----------------------------------------------------------------------------- // Rendering information. // Player view rendering info. var() vector PlayerViewOffset; // Offset from view center. var() mesh PlayerViewMesh; // Mesh to render. var() float PlayerViewScale; // Mesh scale. var() float BobDamping; // how much to damp view bob // Pickup view rendering info. var() mesh PickupViewMesh; // Mesh to render. var() float PickupViewScale; // Mesh scale. // 3rd person mesh. var() mesh ThirdPersonMesh; // Mesh to render. var() float ThirdPersonScale; // Mesh scale. //----------------------------------------------------------------------------- // Status bar info. var() texture StatusIcon; // Icon used with ammo/charge/power count. //----------------------------------------------------------------------------- // Armor related info. var() name ProtectionType1; // Protects against DamageType (None if non-armor). var() name ProtectionType2; // Secondary protection type (None if non-armor). var() travel int Charge; // Amount of armor or charge if not an armor (charge in time*10). var() int ArmorAbsorption; // Percent of damage item absorbs 0-100. var() bool bIsAnArmor; // Item will protect player. var() int AbsorptionPriority; // Which items absorb damage first (higher=first). var() inventory NextArmor; // Temporary list created by Armors to prioritize damage absorption. //----------------------------------------------------------------------------- // AI related info. var() float MaxDesireability; // Maximum desireability this item will ever have. var InventorySpot MyMarker; //----------------------------------------------------------------------------- // 3rd person muzzleflash var bool bSteadyFlash3rd; var bool bFirstFrame; var(MuzzleFlash) bool bMuzzleFlashParticles; var(MuzzleFlash) bool bToggleSteadyFlash; var bool bSteadyToggle; var byte FlashCount, OldFlashCount; var(MuzzleFlash) ERenderStyle MuzzleFlashStyle; var(MuzzleFlash) mesh MuzzleFlashMesh; var(MuzzleFlash) float MuzzleFlashScale; var(MuzzleFlash) texture MuzzleFlashTexture; //----------------------------------------------------------------------------- // Sound assignments. var() sound PickupSound, ActivateSound, DeActivateSound, RespawnSound; //----------------------------------------------------------------------------- // HUD graphics. var() texture Icon; var() localized String M_Activated; var() localized String M_Selected; var() localized String M_Deactivated; //----------------------------------------------------------------------------- // Messaging var() class PickupMessageClass; var() class ItemMessageClass; // Network replication. replication { // Things the server should send to the client. reliable if( Role==ROLE_Authority && bNetOwner ) bIsAnArmor, Charge, bActivatable, bActive, PlayerViewOffset, PlayerViewMesh, PlayerViewScale; unreliable if( Role==ROLE_Authority ) FlashCount, bSteadyFlash3rd, ThirdPersonMesh, ThirdPersonScale; } function PostBeginPlay() { if ( ItemName == "" ) ItemName = GetItemName(string(Class)); Super.PostBeginPlay(); } // Draw first person view of inventory simulated event RenderOverlays( canvas Canvas ) { if ( Owner == None ) return; if ( (Level.NetMode == NM_Client) && (!Owner.IsA('PlayerPawn') || (PlayerPawn(Owner).Player == None)) ) return; SetLocation( Owner.Location + CalcDrawOffset() ); SetRotation( Pawn(Owner).ViewRotation ); Canvas.DrawActor(self, false); } function String GetHumanName() { return ItemArticle@ItemName; } // overridable function to ask the inventory object to draw its StatusIcon simulated function DrawStatusIconAt( canvas Canvas, int X, int Y, optional float Scale ) { if( Scale == 0.0 ) Scale = 1.0; Canvas.SetPos( X, Y ); Canvas.DrawIcon( StatusIcon, Scale ); } //============================================================================= // AI inventory functions. event float BotDesireability( pawn Bot ) { local Inventory AlreadyHas; local float desire; local bool bChecked; desire = MaxDesireability; if ( RespawnTime < 10 ) { bChecked = true; AlreadyHas = Bot.FindInventoryType(class); if ( (AlreadyHas != None) && (AlreadyHas.Charge >= Charge) ) return -1; } if( bIsAnArmor ) { if ( !bChecked ) AlreadyHas = Bot.FindInventoryType(class); if ( AlreadyHas != None ) desire *= (1 - AlreadyHas.Charge * AlreadyHas.ArmorAbsorption * 0.00003); desire *= (Charge * 0.005); desire *= (ArmorAbsorption * 0.01); return desire; } else return desire; } function Weapon RecommendWeapon( out float rating, out int bUseAltMode ) { if ( inventory != None ) return inventory.RecommendWeapon(rating, bUseAltMode); else { rating = -1; return None; } } //============================================================================= // Inventory travelling across servers. // // Called after a travelling inventory item has been accepted into a level. // event TravelPreAccept() { Super.TravelPreAccept(); GiveTo( Pawn(Owner) ); if( bActive ) Activate(); } //============================================================================= // General inventory functions. // // Called by engine when destroyed. // function Destroyed() { if (MyMarker != None ) MyMarker.markedItem = None; // Remove from owner's inventory. if( Pawn(Owner)!=None ) Pawn(Owner).DeleteInventory( Self ); } // // Compute offset for drawing. // simulated final function vector CalcDrawOffset() { local vector DrawOffset, WeaponBob; local Pawn PawnOwner; PawnOwner = Pawn(Owner); DrawOffset = ((0.9/PawnOwner.FOVAngle * PlayerViewOffset) >> PawnOwner.ViewRotation); if ( (Level.NetMode == NM_DedicatedServer) || ((Level.NetMode == NM_ListenServer) && (Owner.RemoteRole == ROLE_AutonomousProxy)) ) DrawOffset += (PawnOwner.BaseEyeHeight * vect(0,0,1)); else { DrawOffset += (PawnOwner.EyeHeight * vect(0,0,1)); WeaponBob = BobDamping * PawnOwner.WalkBob; WeaponBob.Z = (0.45 + 0.55 * BobDamping) * PawnOwner.WalkBob.Z; DrawOffset += WeaponBob; } return DrawOffset; } // // Become a pickup. // function BecomePickup() { if ( Physics != PHYS_Falling ) RemoteRole = ROLE_SimulatedProxy; Mesh = PickupViewMesh; DrawScale = PickupViewScale; bOnlyOwnerSee = false; bHidden = false; bCarriedItem = false; NetPriority = 1.4; SetCollision( true, false, false ); } // // Become an inventory item. // function BecomeItem() { RemoteRole = ROLE_SimulatedProxy; Mesh = PlayerViewMesh; DrawScale = PlayerViewScale; bOnlyOwnerSee = true; bHidden = true; bCarriedItem = true; NetPriority = 1.4; SetCollision( false, false, false ); SetPhysics(PHYS_None); SetTimer(0.0,False); AmbientGlow = 0; } // // Give this inventory item to a pawn. // function GiveTo( pawn Other ) { Instigator = Other; BecomeItem(); Other.AddInventory( Self ); GotoState('Idle2'); } // Either give this inventory to player Other, or spawn a copy // and give it to the player Other, setting up original to be respawned. // function inventory SpawnCopy( pawn Other ) { local inventory Copy; if( Level.Game.ShouldRespawn(self) ) { Copy = spawn(Class,Other,,,rot(0,0,0)); Copy.Tag = Tag; Copy.Event = Event; GotoState('Sleeping'); } else Copy = self; Copy.RespawnTime = 0.0; Copy.bHeldItem = true; Copy.GiveTo( Other ); return Copy; } // // Set up respawn waiting if desired. // function SetRespawn() { if( Level.Game.ShouldRespawn(self) ) GotoState('Sleeping'); else Destroy(); } // // Toggle Activation of selected Item. // function Activate() { if( bActivatable ) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogItemActivate(Self, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogItemActivate(Self, Pawn(Owner)); if ( M_Activated != "" ) Pawn(Owner).ClientMessage(ItemName$M_Activated); GoToState('Activated'); } } // // Function which lets existing items in a pawn's inventory // prevent the pawn from picking something up. Return true to abort pickup // or if item handles pickup, otherwise keep going through inventory list. // function bool HandlePickupQuery( inventory Item ) { if ( Item.Class == Class ) return true; if ( Inventory == None ) return false; return Inventory.HandlePickupQuery(Item); } // // Select first activatable item. // function Inventory SelectNext() { if ( bActivatable ) { if ( M_Selected != "" ) Pawn(Owner).ClientMessage(ItemName$M_Selected); return self; } if ( Inventory != None ) return Inventory.SelectNext(); else return None; } // // Toss this item out. // function DropFrom(vector StartLocation) { if ( !SetLocation(StartLocation) ) return; RespawnTime = 0.0; //don't respawn SetPhysics(PHYS_Falling); RemoteRole = ROLE_DumbProxy; BecomePickup(); NetPriority = 2.5; NetUpdateFrequency = 20; bCollideWorld = true; if ( Pawn(Owner) != None ) Pawn(Owner).DeleteInventory(self); Inventory = None; GotoState('PickUp', 'Dropped'); } function DropInventory() { } //============================================================================= // Capabilities: For feeding general info to bots. // For future use. function float InventoryCapsFloat( name Property, pawn Other, actor Test ); function string InventoryCapsString( name Property, pawn Other, actor Test ); //============================================================================= // Firing/using. // Fire functions which must be implemented in child classes. function Fire( float Value ); function AltFire( float Value ); function Use( pawn User ); //============================================================================= // Weapon functions. // // Find a weapon in inventory that has an Inventory Group matching F. // function Weapon WeaponChange( byte F ) { if( Inventory == None) return None; else return Inventory.WeaponChange( F ); } //============================================================================= // Armor functions. // // Scan the player's inventory looking for items that reduce damage // to the player. If Armor's protection type matches DamageType, then no damage is taken. // Returns the reduced damage. // function int ReduceDamage( int Damage, name DamageType, vector HitLocation ) { local Inventory FirstArmor; local int ReducedAmount,ArmorDamage; if( Damage<0 ) return 0; ReducedAmount = Damage; FirstArmor = PrioritizeArmor(Damage, DamageType, HitLocation); while( (FirstArmor != None) && (ReducedAmount > 0) ) { ReducedAmount = FirstArmor.ArmorAbsorbDamage(ReducedAmount, DamageType, HitLocation); FirstArmor = FirstArmor.nextArmor; } return ReducedAmount; } // // Return the best armor to use. // function inventory PrioritizeArmor( int Damage, name DamageType, vector HitLocation ) { local Inventory FirstArmor, InsertAfter; if ( Inventory != None ) FirstArmor = Inventory.PrioritizeArmor(Damage, DamageType, HitLocation); else FirstArmor = None; if ( bIsAnArmor) { if ( FirstArmor == None ) { nextArmor = None; return self; } // insert this armor into the prioritized armor list if ( FirstArmor.ArmorPriority(DamageType) < ArmorPriority(DamageType) ) { nextArmor = FirstArmor; return self; } InsertAfter = FirstArmor; while ( (InsertAfter.nextArmor != None) && (InsertAfter.nextArmor.ArmorPriority(DamageType) > ArmorPriority(DamageType)) ) InsertAfter = InsertAfter.nextArmor; nextArmor = InsertAfter.nextArmor; InsertAfter.nextArmor = self; } return FirstArmor; } // // 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 (DamageType=='Drowned') Return Damage; ArmorDamage = (Damage * ArmorAbsorption) / 100; if( ArmorDamage >= Charge ) { ArmorDamage = Charge; Destroy(); } else Charge -= ArmorDamage; return (Damage - ArmorDamage); } // // Return armor value. // function int ArmorPriority(name DamageType) { if ( DamageType == 'Drowned' ) return 0; if( (DamageType!='None') && ((ProtectionType1==DamageType) || (ProtectionType2==DamageType)) ) return 1000000; return AbsorptionPriority; } // // This function is called by ArmorAbsorbDamage and displays a visual effect // for an impact on an armor. // function ArmorImpactEffect(vector HitLocation){ } // // Used to inform inventory when owner jumps. // function OwnerJumped() { if( Inventory != None ) Inventory.OwnerJumped(); } // // Used to inform inventory when owner weapon changes. // function ChangedWeapon() { if( Inventory != None ) Inventory.ChangedWeapon(); } // used to ask inventory if it needs to affect its owners display properties function SetOwnerDisplay() { if( Inventory != None ) Inventory.SetOwnerDisplay(); } //============================================================================= // Pickup state: this inventory item is sitting on the ground. auto state Pickup { singular function ZoneChange( ZoneInfo NewZone ) { local float splashsize; local actor splash; if( NewZone.bWaterZone && !Region.Zone.bWaterZone ) { splashSize = 0.000025 * Mass * (250 - 0.5 * Velocity.Z); if ( NewZone.EntrySound != None ) PlaySound(NewZone.EntrySound, SLOT_Interact, splashSize); if ( NewZone.EntryActor != None ) { splash = Spawn(NewZone.EntryActor); if ( splash != None ) splash.DrawScale = 2 * splashSize; } } } // Validate touch, and if valid trigger event. function bool ValidTouch( actor Other ) { local Actor A; if( Other.bIsPawn && Pawn(Other).bIsPlayer && (Pawn(Other).Health > 0) && Level.Game.PickupQuery(Pawn(Other), self) ) { if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Other, Other.Instigator ); return true; } return false; } // When touched by an actor. function Touch( actor Other ) { // If touched by a player pawn, let him pick this up. if( ValidTouch(Other) ) { if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Self, Pawn(Other)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Self, Pawn(Other)); SpawnCopy(Pawn(Other)); if ( PickupMessageClass == None ) Pawn(Other).ClientMessage(PickupMessage, 'Pickup'); else Pawn(Other).ReceiveLocalizedMessage( PickupMessageClass, 0, None, None, Self.Class ); PlaySound (PickupSound); if ( Level.Game.Difficulty > 1 ) Other.MakeNoise(0.1 * Level.Game.Difficulty); if ( Pawn(Other).MoveTarget == self ) Pawn(Other).MoveTimer = -1.0; } else if ( bTossedOut && (Other.Class == Class) && Inventory(Other).bTossedOut ) Destroy(); } // Landed on ground. function Landed(Vector HitNormal) { local rotator newRot; newRot = Rotation; newRot.pitch = 0; netUpdateFrequency = Default.NetUpdateFrequency; SetRotation(newRot); SetTimer(2.0, false); } // Make sure no pawn already touching (while touch was disabled in sleep). function CheckTouching() { local int i; bSleepTouch = false; for ( i=0; i<4; i++ ) if ( (Touching[i] != None) && Touching[i].IsA('Pawn') ) Touch(Touching[i]); } function Timer() { if ( RemoteRole != ROLE_SimulatedProxy ) { NetPriority = 1.4; RemoteRole = ROLE_SimulatedProxy; if ( bHeldItem ) { if ( bTossedOut ) SetTimer(15.0, false); else SetTimer(40.0, false); } return; } if ( bHeldItem ) { if ( (FRand() < 0.1) || !PlayerCanSeeMe() ) Destroy(); else SetTimer(3.0, true); } } function BeginState() { BecomePickup(); bCollideWorld = true; if ( bHeldItem ) SetTimer(30, false); else if ( Level.bStartup ) { bAlwaysRelevant = true; NetUpdateFrequency = 8; } } function EndState() { bCollideWorld = false; bSleepTouch = false; } Begin: BecomePickup(); if ( bRotatingPickup && (Physics != PHYS_Falling) ) SetPhysics(PHYS_Rotating); Dropped: if( bAmbientGlow ) AmbientGlow=255; if( bSleepTouch ) CheckTouching(); } //============================================================================= // Active state: this inventory item is armed and ready to rock! state Activated { function BeginState() { bActive = true; if ( Pawn(Owner).bIsPlayer && (ProtectionType1 != '') ) Pawn(Owner).ReducedDamageType = ProtectionType1; } function EndState() { bActive = false; if ( (Pawn(Owner) != None) && Pawn(Owner).bIsPlayer && (ProtectionType1 != '') ) Pawn(Owner).ReducedDamageType = ''; } function Activate() { if ( (Pawn(Owner) != None) && (M_Deactivated != "") ) Pawn(Owner).ClientMessage(ItemName$M_Deactivated); GoToState('DeActivated'); } } //============================================================================= // Sleeping state: Sitting hidden waiting to respawn. State Sleeping { ignores Touch; function BeginState() { BecomePickup(); bHidden = true; } function EndState() { local int i; bSleepTouch = false; for ( i=0; i<4; i++ ) if ( (Touching[i] != None) && Touching[i].IsA('Pawn') ) bSleepTouch = true; } Begin: Sleep( ReSpawnTime ); PlaySound( RespawnSound ); Sleep( Level.Game.PlaySpawnEffect(self) ); GoToState( 'Pickup' ); } function ActivateTranslator(bool bHint) { if( Inventory!=None ) Inventory.ActivateTranslator( bHint ); } // // Null state. // State Idle2 { } l8T Pm8C$HO" w* H-C$ w'cLdNHa@ax'a a q!/ \8D @L0Q_*1)Q)U)R)SKOU0v'bJ" b-v' XN|-R' f8_8pӫrppp* o8gd+22)g)e)c)`K nZF&+& Uq!d)a v8|8JL]-s([w.*.- M !.J! y8]KK-s'I.- M !.JM  J wqO O X9i6)=w*i _JI-L(-U ( @RJARRJJJARJJJJJJA999199)AA911) AAAA91JAA)) 999) ) 91)9111) 1))A99111)))  A11 9))1   ) ZRRq LF9GzJ:j:$x33?j$H-q?-zapA(Ha B( x-qo=baxa@@' p n x< w6*(d9"6dkdd ;kl;#??6l8O a|od 'l8wO *r.O *n ?oO 6Ǒ?`dOի?,;kO a|odO'8rO *'( G9bM sFe-U (b%cb,Ywbk*bka/!&bkb lr+J9V_E5`"6`%PPa+`a@( `Q9CoWz@C-m.C-.C*%$ Q .C+!/a0 o+oCC&10'( K9M9eH9e qb ~D}>b -S6(]-SX7??,?6 wb Y*ab Y$Xwb Q*Wab QwW*WC@X "P9R9oQO9N9r UU9S90 `n3up]*#r=* :K:$o$(w.=*=MD?D?&6 ??=? ? !n^((w.<=*6 ?pu.<=??=FD??u6 ? ? !n "Y9A/<w*A Z9g&;w*g [9\9L ; ]9]A :P]!]%H]!M ] v]@Bk' b9cC %8r !]L n'Mr !M r  vr %br !]cB cI,dB NB NaNB cB  S^9f9Gx)w * G& b hOn"p42w*qpn"p a"9q*-HVrq*k*q Ap Ap kqLqwLk*+Lk Ap Ap LLkkLkLkq C"V9] e0Ho6?"-_{z =w*H( Xe9{w?"-_{z =w*H' h9g'XjP"w * Xg'NNw.H* wg * ag  `9F)w * F& b Cm9m+w)m+)^')[')]')l+{ p0D*R )D*)C*)B*)A*WGJy b-_ w *Gw x* x A J-i(-l(-z(-}(-c (-} (-v (-u (oTAd -K-K(1~$-i-c E?%-l-} E?%-z-v o?%-}-u o?%-c E?%-} E?%-v o?%-u o?%@%L>@@Jz]e6<AU]SApAMHE~^ $^zy-J S?% ^ DH?D^ MDy H>H?% S?%H?%S?%HSy 3H?HSy !H?%S?%S?%H?!Hy HSMH-J p?% ^ D~?D^ EDx ~a~?% p?%~?%p?%~px V~?~px D~?%p?%9p?%~?D~x ~pE~S?% p?%^$d]T]:L%oo Ho To ]Ho E:L%-J  :I%6-cd~Bd~QA~HM~E:c%-~ '-C (d?%-~ (-C '-d -J -~ '-C (:^%-C 'd?E]AEE^ BPA z z0r6DBA d666PF6d?%6PF66DBA TSA FA a"6a66a6?6aF ?69(?6a?F ?6966aDF ?696aD?F ?69a+a IPqo}9{9^ p9s9t9exPe& vI8U [A b _'~9F/ q{0eʕ @1C:D:t. H:I:AX. E:F:G:@^Mn- J:K:L:\Q:Qs*Y7-P5{l. p}lUw*QW* ];i;L* oM:P:Fv9u9v Y:bZ%<$*&bfbTq!T V:Ocf"_j$DY'CX'-k'-R'- 'x33?a(((o$a(Q$ W:wSJoF3 `:J'}kO J'b }0N's^L -N'b _:L'L di -L-L'-L-J ( ^:n a:QT:R:r Ud:c:0 ^//============================================================================= // Pawn, the base class of all actors that can be controlled by players or AI. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Pawn extends Actor abstract native nativereplication; #exec Texture Import File=Textures\Pawn.pcx Name=S_Pawn Mips=Off Flags=2 //----------------------------------------------------------------------------- // Pawn variables. // General flags. var bool bBehindView; // Outside-the-player view. var bool bIsPlayer; // Pawn is a player or a player-bot. var bool bJustLanded; // used by eyeheight adjustment var bool bUpAndOut; // used by swimming var bool bIsWalking; var const bool bHitSlopedWall; // used by Physics var globalconfig bool bNeverSwitchOnPickup; // if true, don't automatically switch to picked up weapon var bool bWarping; // Set when travelling through warpzone (so shouldn't telefrag) var bool bUpdatingDisplay; // to avoid infinite recursion through inventory setdisplay //AI flags var(Combat) bool bCanStrafe; var(Orders) bool bFixedStart; var const bool bReducedSpeed; //used by movement natives var bool bCanJump; var bool bCanWalk; var bool bCanSwim; var bool bCanFly; var bool bCanOpenDoors; var bool bCanDoSpecial; var bool bDrowning; var const bool bLOSflag; // used for alternating LineOfSight traces var bool bFromWall; var bool bHunting; // tells navigation code that pawn is hunting another pawn, // so fall back to finding a path to a visible pathnode if none // are reachable var bool bAvoidLedges; // don't get too close to ledges var bool bStopAtLedges; // if bAvoidLedges and bStopAtLedges, Pawn doesn't try to walk along the edge at all var bool bJumpOffPawn; var bool bShootSpecial; var bool bAutoActivate; var bool bIsHuman; // for games which care about whether a pawn is a human var bool bIsFemale; var bool bIsMultiSkinned; var bool bCountJumps; var bool bAdvancedTactics; // used during movement between pathnodes var bool bViewTarget; // Ticked pawn timers var float SightCounter; //Used to keep track of when to check player visibility var float PainTime; //used for getting PainTimer() messages (for Lava, no air, etc.) var float SpeechTime; // Physics updating time monitoring (for AI monitoring reaching destinations) var const float AvgPhysicsTime; // Additional pawn region information. var PointRegion FootRegion; var PointRegion HeadRegion; // Navigation AI var float MoveTimer; var Actor MoveTarget; // set by movement natives var Actor FaceTarget; // set by strafefacing native var vector Destination; // set by Movement natives var vector Focus; // set by Movement natives var float DesiredSpeed; var float MaxDesiredSpeed; var(Combat) float MeleeRange; // Max range for melee attack (not including collision radii) // Player and enemy movement. var(Movement) float GroundSpeed; // The maximum ground speed. var(Movement) float WaterSpeed; // The maximum swimming speed. var(Movement) float AirSpeed; // The maximum flying speed. var(Movement) float AccelRate; // max acceleration rate var(Movement) float JumpZ; // vertical acceleration w/ jump var(Movement) float MaxStepHeight; // Maximum size of upward/downward step. var(Movement) float AirControl; // amount of AirControl available to the pawn // AI basics. var float MinHitWall; // Minimum HitNormal dot Velocity.Normal to get a HitWall from the // physics var() byte Visibility; //How visible is the pawn? 0 = invisible. // 128 = normal. 255 = highly visible. var float Alertness; // -1 to 1 ->Used within specific states for varying reaction to stimuli var float Stimulus; // Strength of stimulus - Set when stimulus happens, used in Acquisition state var(AI) float SightRadius; //Maximum seeing distance. var(AI) float PeripheralVision;//Cosine of limits of peripheral vision. var(AI) float HearingThreshold; //Minimum noise loudness for hearing var vector LastSeenPos; // enemy position when I last saw enemy (auto updated if EnemyNotVisible() enabled) var vector LastSeeingPos; // position where I last saw enemy (auto updated if EnemyNotVisible enabled) var float LastSeenTime; var Pawn Enemy; // Player info. var travel Weapon Weapon; // The pawn's current weapon. var Weapon PendingWeapon; // Will become weapon once current weapon is put down var travel Inventory SelectedItem; // currently selected inventory item // Movement. var rotator ViewRotation; // View rotation. var vector WalkBob; var() float BaseEyeHeight; // Base eye height above collision center. var float EyeHeight; // Current eye height, adjusted for bobbing and stairs. var const vector Floor; // Normal of floor pawn is standing on (only used // by PHYS_Spider) var float SplashTime; // time of last splash // View var float OrthoZoom; // Orthogonal/map view zoom factor. var() float FovAngle; // X field of view angle in degrees, usually 90. // Player game statistics. var int DieCount, ItemCount, KillCount, SecretCount, Spree; //Health var() travel int Health; // Health: 100 = normal maximum // Selection Mesh var() string SelectionMesh; var() string SpecialMesh; // Inherent Armor (for creatures). var() name ReducedDamageType; //Either a damagetype name or 'All', 'AllEnvironment' (Burned, Corroded, Frozen) var() float ReducedDamagePct; // Inventory to drop when killed (for creatures) var() class DropWhenKilled; // Zone pain var(Movement) float UnderWaterTime; //how much time pawn can go without air (in seconds) var(AI) enum EAttitude //important - order in decreasing importance { ATTITUDE_Fear, //will try to run away ATTITUDE_Hate, // will attack enemy ATTITUDE_Frenzy, //will attack anything, indiscriminately ATTITUDE_Threaten, // animations, but no attack ATTITUDE_Ignore, ATTITUDE_Friendly, ATTITUDE_Follow //accepts player as leader } AttitudeToPlayer; //determines how creature will react on seeing player (if in human form) var(AI) enum EIntelligence //important - order in increasing intelligence { BRAINS_NONE, //only reacts to immediate stimulus BRAINS_REPTILE, //follows to last seen position BRAINS_MAMMAL, //simple navigation (limited path length) BRAINS_HUMAN //complex navigation, team coordination, use environment stuff (triggers, etc.) } Intelligence; var(AI) float Skill; // skill, scaled by game difficulty (add difficulty to this value) var actor SpecialGoal; // used by navigation AI var float SpecialPause; // Sound and noise management var const vector noise1spot; var const float noise1time; var const pawn noise1other; var const float noise1loudness; var const vector noise2spot; var const float noise2time; var const pawn noise2other; var const float noise2loudness; var float LastPainSound; // chained pawn list var const pawn nextPawn; // Common sounds var(Sounds) sound HitSound1; var(Sounds) sound HitSound2; var(Sounds) sound Land; var(Sounds) sound Die; var(Sounds) sound WaterStep; // Input buttons. var input byte bZoom, bRun, bLook, bDuck, bSnapLevel, bStrafe, bFire, bAltFire, bFreeLook, bExtra0, bExtra1, bExtra2, bExtra3; var(Combat) float CombatStyle; // -1 to 1 = low means tends to stay off and snipe, high means tends to charge and melee var NavigationPoint home; //set when begin play, used for retreating and attitude checks var name NextState; //for queueing states var name NextLabel; //for queueing states var float SoundDampening; var float DamageScaling; var(Orders) name AlarmTag; // tag of object to go to when see player var(Orders) name SharedAlarmTag; var Decoration carriedDecoration; var Name PlayerReStartState; var() localized string MenuName; //Name used for this pawn type in menus (e.g. player selection) var() localized string NameArticle; //article used in conjunction with this class (e.g. "a", "an") var() byte VoicePitch; //for speech var() string VoiceType; //for speech var float OldMessageTime; //to limit frequency of voice messages // Route Cache for Navigation var NavigationPoint RouteCache[16]; // Replication Info var() class PlayerReplicationInfoClass; var PlayerReplicationInfo PlayerReplicationInfo; // shadow decal var Decal Shadow; replication { // Variables the server should send to the client. reliable if( Role==ROLE_Authority ) Weapon, PlayerReplicationInfo, Health, bCanFly; reliable if( bNetOwner && Role==ROLE_Authority ) bIsPlayer, CarriedDecoration, SelectedItem, GroundSpeed, WaterSpeed, AirSpeed, AccelRate, JumpZ, AirControl, bBehindView, PlayerRestartState; unreliable if( (bNetOwner && bIsPlayer && bNetInitial && Role==ROLE_Authority) || bDemoRecording ) ViewRotation; unreliable if( bNetOwner && Role==ROLE_Authority ) MoveTarget; reliable if( bDemoRecording ) EyeHeight; // Functions the server calls on the client side. reliable if( RemoteRole==ROLE_AutonomousProxy ) ClientDying, ClientReStart, ClientGameEnded, ClientSetRotation, ClientSetLocation, ClientPutDown; unreliable if( (!bDemoRecording || bClientDemoRecording && bClientDemoNetFunc) && Role==ROLE_Authority ) ClientHearSound; reliable if ( (!bDemoRecording || (bClientDemoRecording && bClientDemoNetFunc)) && Role == ROLE_Authority ) ClientVoiceMessage; reliable if ( (!bDemoRecording || (bClientDemoRecording && bClientDemoNetFunc) || (Level.NetMode==NM_Standalone && IsA('PlayerPawn'))) && Role == ROLE_Authority ) ClientMessage, TeamMessage, ReceiveLocalizedMessage; // Functions the client calls on the server. unreliable if( Role Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ); function BecomeViewTarget() { bViewTarget = true; } event FellOutOfWorld() { if ( Role < ROLE_Authority ) return; Health = -1; SetPhysics(PHYS_None); Weapon = None; Died(None, 'Fell', Location); } function PlayRecoil(float Rate); function SpecialFire(); function bool CheckFutureSight(float DeltaTime) { return true; } function RestartPlayer(); // // Broadcast a message to all players, or all on the same team. // function TeamBroadcast( coerce string Msg) { local Pawn P; local bool bGlobal; if ( Left(Msg, 1) ~= "@" ) { Msg = Right(Msg, Len(Msg)-1); bGlobal = true; } if ( Left(Msg, 1) ~= "." ) Msg = "."$VoicePitch$Msg; if ( bGlobal || !Level.Game.bTeamGame ) { if ( Level.Game.AllowsBroadcast(self, Len(Msg)) ) for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.bIsPlayer || P.IsA('MessagingSpectator') ) P.TeamMessage( PlayerReplicationInfo, Msg, 'Say' ); return; } if ( Level.Game.AllowsBroadcast(self, Len(Msg)) ) for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.bIsPlayer && (P.PlayerReplicationInfo.Team == PlayerReplicationInfo.Team) ) { if ( P.IsA('PlayerPawn') ) P.TeamMessage( PlayerReplicationInfo, Msg, 'TeamSay' ); } } //------------------------------------------------------------------------------ // Speech related function SendGlobalMessage(PlayerReplicationInfo Recipient, name MessageType, byte MessageID, float Wait) { SendVoiceMessage(PlayerReplicationInfo, Recipient, MessageType, MessageID, 'GLOBAL'); } function SendTeamMessage(PlayerReplicationInfo Recipient, name MessageType, byte MessageID, float Wait) { SendVoiceMessage(PlayerReplicationInfo, Recipient, MessageType, MessageID, 'TEAM'); } function SendVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID, name broadcasttype) { local Pawn P; local bool bNoSpeak; if ( Level.TimeSeconds - OldMessageTime < 2.5 ) bNoSpeak = true; else OldMessageTime = Level.TimeSeconds; for ( P=Level.PawnList; P!=None; P=P.NextPawn ) { if ( P.IsA('PlayerPawn') ) { if ( !bNoSpeak ) { if ( (broadcasttype == 'GLOBAL') || !Level.Game.bTeamGame ) P.ClientVoiceMessage(Sender, Recipient, messagetype, messageID); else if ( Sender.Team == P.PlayerReplicationInfo.Team ) P.ClientVoiceMessage(Sender, Recipient, messagetype, messageID); } } else if ( (P.PlayerReplicationInfo == Recipient) || ((messagetype == 'ORDER') && (Recipient == None)) ) P.BotVoiceMessage(messagetype, messageID, self); } } function ClientVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID); function BotVoiceMessage(name messagetype, byte MessageID, Pawn Sender); //*************************************************************** function HandleHelpMessageFrom(Pawn Other); function FearThisSpot(Actor ASpot); function float GetRating() { return 1000; } function AddVelocity( vector NewVelocity) { if (Physics == PHYS_Walking) SetPhysics(PHYS_Falling); if ( (Velocity.Z > 380) && (NewVelocity.Z > 0) ) NewVelocity.Z *= 0.5; Velocity += NewVelocity; } function ClientSetLocation( vector NewLocation, rotator NewRotation ) { local Pawn P; ViewRotation = NewRotation; If ( (ViewRotation.Pitch > RotationRate.Pitch) && (ViewRotation.Pitch < 65536 - RotationRate.Pitch) ) { If (ViewRotation.Pitch < 32768) NewRotation.Pitch = RotationRate.Pitch; else NewRotation.Pitch = 65536 - RotationRate.Pitch; } NewRotation.Roll = 0; SetRotation( NewRotation ); SetLocation( NewLocation ); } function ClientSetRotation( rotator NewRotation ) { local Pawn P; ViewRotation = NewRotation; NewRotation.Pitch = 0; NewRotation.Roll = 0; SetRotation( NewRotation ); } function ClientDying(name DamageType, vector HitLocation) { PlayDying(DamageType, HitLocation); GotoState('Dying'); } function ClientReStart() { //log("client restart"); Velocity = vect(0,0,0); Acceleration = vect(0,0,0); BaseEyeHeight = Default.BaseEyeHeight; EyeHeight = BaseEyeHeight; PlayWaiting(); if ( Region.Zone.bWaterZone && (PlayerRestartState == 'PlayerWalking') ) { if (HeadRegion.Zone.bWaterZone) PainTime = UnderWaterTime; setPhysics(PHYS_Swimming); GotoState('PlayerSwimming'); } else GotoState(PlayerReStartState); } function ClientGameEnded() { GotoState('GameEnded'); } //============================================================================= // Inventory related functions. function float AdjustDesireFor(Inventory Inv) { return 0; } // toss out the weapon currently held function TossWeapon() { local vector X,Y,Z; if ( Weapon == None ) return; GetAxes(Rotation,X,Y,Z); Weapon.DropFrom(Location + 0.8 * CollisionRadius * X + - 0.5 * CollisionRadius * Y); } // The player/bot wants to select next item exec function NextItem() { local Inventory Inv; if (SelectedItem==None) { SelectedItem = Inventory.SelectNext(); Return; } if (SelectedItem.Inventory!=None) SelectedItem = SelectedItem.Inventory.SelectNext(); else SelectedItem = Inventory.SelectNext(); if ( SelectedItem == None ) SelectedItem = Inventory.SelectNext(); } // FindInventoryType() // returns the inventory item of the requested class // if it exists in this pawn's inventory function Inventory FindInventoryType( class DesiredClass ) { local Inventory Inv; for( Inv=Inventory; Inv!=None; Inv=Inv.Inventory ) if ( Inv.class == DesiredClass ) return Inv; return None; } // Add Item to this pawn's inventory. // Returns true if successfully added, false if not. function bool AddInventory( inventory NewItem ) { // Skip if already in the inventory. local inventory Inv; // The item should not have been destroyed if we get here. if (NewItem ==None ) log("tried to add none inventory to "$self); for( Inv=Inventory; Inv!=None; Inv=Inv.Inventory ) if( Inv == NewItem ) return false; // Add to front of inventory chain. NewItem.SetOwner(Self); NewItem.Inventory = Inventory; Inventory = NewItem; return true; } // Remove Item from this pawn's inventory, if it exists. // Returns true if it existed and was deleted, false if it did not exist. function bool DeleteInventory( inventory Item ) { // If this item is in our inventory chain, unlink it. local actor Link; if ( Item == Weapon ) Weapon = None; if ( Item == SelectedItem ) SelectedItem = None; for( Link = Self; Link!=None; Link=Link.Inventory ) { if( Link.Inventory == Item ) { Link.Inventory = Item.Inventory; break; } } Item.SetOwner(None); } // Just changed to pendingWeapon function ChangedWeapon() { local Weapon OldWeapon; OldWeapon = Weapon; if (Weapon == PendingWeapon) { if ( Weapon == None ) SwitchToBestWeapon(); else if ( Weapon.IsInState('DownWeapon') ) Weapon.BringUp(); if ( Weapon != None ) Weapon.SetDefaultDisplayProperties(); Inventory.ChangedWeapon(); // tell inventory that weapon changed (in case any effect was being applied) PendingWeapon = None; return; } if ( PendingWeapon == None ) PendingWeapon = Weapon; PlayWeaponSwitch(PendingWeapon); if ( (PendingWeapon != None) && (PendingWeapon.Mass > 20) && (carriedDecoration != None) ) DropDecoration(); if ( Weapon != None ) Weapon.SetDefaultDisplayProperties(); Weapon = PendingWeapon; Inventory.ChangedWeapon(); // tell inventory that weapon changed (in case any effect was being applied) if ( Weapon != None ) { Weapon.RaiseUp(OldWeapon); if ( (Level.Game != None) && (Level.Game.Difficulty > 1) ) MakeNoise(0.1 * Level.Game.Difficulty); } PendingWeapon = None; } //============== // Encroachment event bool EncroachingOn( actor Other ) { if ( (Other.Brush != None) || (Brush(Other) != None) ) return true; if ( (!bIsPlayer || bWarping) && (Pawn(Other) != None)) return true; return false; } event EncroachedBy( actor Other ) { if ( Pawn(Other) != None ) gibbedBy(Other); } function gibbedBy(actor Other) { local pawn instigatedBy; if ( Role < ROLE_Authority ) return; instigatedBy = pawn(Other); if (instigatedBy == None) instigatedBy = Other.instigator; health = -1000; //make sure gibs Died(instigatedBy, 'Gibbed', Location); } event PlayerTimeOut() { if (Health > 0) Died(None, 'Suicided', Location); } //Base change - if new base is pawn or decoration, damage based on relative mass and old velocity // Also, non-players will jump off pawns immediately function JumpOffPawn() { Velocity += 60 * VRand(); Velocity.Z = 180; SetPhysics(PHYS_Falling); } function UnderLift(Mover M); singular event BaseChange() { local float decorMass; if ( (base == None) && (Physics == PHYS_None) ) SetPhysics(PHYS_Falling); else if (Pawn(Base) != None) { Base.TakeDamage( (1-Velocity.Z/400)* Mass/Base.Mass, Self,Location,0.5 * Velocity , 'stomped'); JumpOffPawn(); } else if ( (Decoration(Base) != None) && (Velocity.Z < -400) ) { decorMass = FMax(Decoration(Base).Mass, 1); Base.TakeDamage((-2* Mass/decorMass * Velocity.Z/400), Self, Location, 0.5 * Velocity, 'stomped'); } } event LongFall(); //============================================================================= // Network related functions. simulated event Destroyed() { local Inventory Inv; local Pawn OtherPawn; if ( Shadow != None ) Shadow.Destroy(); if ( Role < ROLE_Authority ) return; RemovePawn(); for( Inv=Inventory; Inv!=None; Inv=Inv.Inventory ) Inv.Destroy(); Weapon = None; Inventory = None; if ( bIsPlayer && (Level.Game != None) ) Level.Game.logout(self); if ( PlayerReplicationInfo != None ) PlayerReplicationInfo.Destroy(); for ( OtherPawn=Level.PawnList; OtherPawn!=None; OtherPawn=OtherPawn.nextPawn ) OtherPawn.Killed(None, self, ''); Super.Destroyed(); } //============================================================================= // functions. // // native client-side functions. // native simulated event ClientHearSound ( actor Actor, int Id, sound S, vector SoundLocation, vector Parameters ); // // Called immediately before gameplay begins. // event PreBeginPlay() { AddPawn(); Super.PreBeginPlay(); if ( bDeleteMe ) return; // Set instigator to self. Instigator = Self; DesiredRotation = Rotation; SightCounter = 0.2 * FRand(); //offset randomly if ( Level.Game != None ) Skill += Level.Game.Difficulty; Skill = FClamp(Skill, 0, 3); PreSetMovement(); if ( DrawScale != Default.Drawscale ) { SetCollisionSize(CollisionRadius*DrawScale/Default.DrawScale, CollisionHeight*DrawScale/Default.DrawScale); Health = Health * DrawScale/Default.DrawScale; } if (bIsPlayer) { if (PlayerReplicationInfoClass != None) PlayerReplicationInfo = Spawn(PlayerReplicationInfoClass, Self,,vect(0,0,0),rot(0,0,0)); else PlayerReplicationInfo = Spawn(class'PlayerReplicationInfo', Self,,vect(0,0,0),rot(0,0,0)); InitPlayerReplicationInfo(); } if (!bIsPlayer) { if ( BaseEyeHeight == 0 ) BaseEyeHeight = 0.8 * CollisionHeight; EyeHeight = BaseEyeHeight; if (Fatness == 0) //vary monster fatness slightly if at default Fatness = 120 + Rand(8) + Rand(8); } if ( menuname == "" ) menuname = GetItemName(string(class)); if (SelectionMesh == "") SelectionMesh = string(Mesh); } event PostBeginPlay() { Super.PostBeginPlay(); SplashTime = 0; } // called after PostBeginPlay on net client simulated event PostNetBeginPlay() { if ( Role != ROLE_SimulatedProxy ) return; if ( bIsMultiSkinned ) { if ( MultiSkins[1] == None ) { if ( bIsPlayer ) SetMultiSkin(self, "","", PlayerReplicationInfo.team); else SetMultiSkin(self, "","", 0); } } else if ( Skin == None ) Skin = Default.Skin; if ( (PlayerReplicationInfo != None) && (PlayerReplicationInfo.Owner == None) ) PlayerReplicationInfo.SetOwner(self); } /* PreSetMovement() default for walking creature. Re-implement in subclass for swimming/flying capability */ function PreSetMovement() { if (JumpZ > 0) bCanJump = true; bCanWalk = true; bCanSwim = false; bCanFly = false; MinHitWall = -0.6; if (Intelligence > BRAINS_Reptile) bCanOpenDoors = true; if (Intelligence == BRAINS_Human) bCanDoSpecial = true; } simulated function SetMesh() { mesh = default.mesh; } //============================================================================= // Multiskin support static function SetMultiSkin( actor SkinActor, string SkinName, string FaceName, byte TeamNum ) { local Texture NewSkin; if(SkinName != "") { NewSkin = texture(DynamicLoadObject(SkinName, class'Texture')); if ( NewSkin != None ) SkinActor.Skin = NewSkin; } } static function GetMultiSkin( Actor SkinActor, out string SkinName, out string FaceName ) { SkinName = String(SkinActor.Skin); FaceName = ""; } static function bool SetSkinElement(Actor SkinActor, int SkinNo, string SkinName, string DefaultSkinName) { local Texture NewSkin; local bool bProscribed; local string pkg, SkinItem, MeshName; local int i; if ( (SkinActor.Level.NetMode != NM_Standalone) && (SkinActor.Level.NetMode != NM_Client) && (DefaultSkinName != "") ) { // make sure that an illegal skin package is not used // ignore if already have skins set if ( SkinActor.Mesh != None ) MeshName = SkinActor.GetItemName(string(SkinActor.Mesh)); else MeshName = SkinActor.GetItemName(string(SkinActor.Default.Mesh)); SkinItem = SkinActor.GetItemName(SkinName); pkg = Left(SkinName, Len(SkinName) - Len(SkinItem) - 1); bProscribed = !CheckValidSkinPackage(pkg, MeshName); if ( bProscribed ) log("Attempted to use illegal skin from package "$pkg$" for "$Meshname); } NewSkin = Texture(DynamicLoadObject(SkinName, class'Texture')); if ( !bProscribed && (NewSkin != None) ) { SkinActor.Multiskins[SkinNo] = NewSkin; return True; } else { log("Failed to load "$SkinName$" so load "$DefaultSkinName); if(DefaultSkinName != "") { NewSkin = Texture(DynamicLoadObject(DefaultSkinName, class'Texture')); SkinActor.Multiskins[SkinNo] = NewSkin; } return False; } } //============================================================================= // Replication function InitPlayerReplicationInfo() { if (PlayerReplicationInfo.PlayerName == "") PlayerReplicationInfo.PlayerName = class'GameInfo'.Default.DefaultPlayerName; } //============================================================================= // Animation playing - should be implemented in subclass, // // PlayWaiting, PlayRunning, and PlayGutHit, PlayMovingAttack (if used) // and PlayDying are required to be implemented in the subclass function PlayRunning() { ////log("Error - PlayRunning should be implemented in subclass of"@class); } function PlayWalking() { PlayRunning(); } function PlayWaiting() { ////log("Error - PlayWaiting should be implemented in subclass"); } function PlayMovingAttack() { ////log("Error - PlayMovingAttack should be implemented in subclass"); //Note - must restart attack timer when done with moving attack PlayRunning(); } function PlayWaitingAmbush() { PlayWaiting(); } function TweenToFighter(float tweentime) { } function TweenToRunning(float tweentime) { TweenToFighter(0.1); } function TweenToWalking(float tweentime) { TweenToRunning(tweentime); } function TweenToPatrolStop(float tweentime) { TweenToFighter(tweentime); } function TweenToWaiting(float tweentime) { TweenToFighter(tweentime); } function PlayThreatening() { TweenToFighter(0.1); } function PlayPatrolStop() { PlayWaiting(); } function PlayTurning() { TweenToFighter(0.1); } function PlayBigDeath(name DamageType); function PlayHeadDeath(name DamageType); function PlayLeftDeath(name DamageType); function PlayRightDeath(name DamageType); function PlayGutDeath(name DamageType); function PlayDying(name DamageType, vector HitLoc) { local vector X,Y,Z, HitVec, HitVec2D; local float dotp; if ( Velocity.Z > 250 ) { PlayBigDeath(DamageType); return; } if ( DamageType == 'Decapitated' ) { PlayHeadDeath(DamageType); return; } GetAxes(Rotation,X,Y,Z); X.Z = 0; HitVec = Normal(HitLoc - Location); HitVec2D= HitVec; HitVec2D.Z = 0; dotp = HitVec2D dot X; //first check for head hit if ( HitLoc.Z - Location.Z > 0.5 * CollisionHeight ) { if (dotp > 0) PlayHeadDeath(DamageType); else PlayGutDeath(DamageType); return; } if (dotp > 0.71) //then hit in front PlayGutDeath(DamageType); else { dotp = HitVec dot Y; if (dotp > 0.0) PlayLeftDeath(DamageType); else PlayRightDeath(DamageType); } } function PlayGutHit(float tweentime) { log("Error - play gut hit must be implemented in subclass of"@class); } function PlayHeadHit(float tweentime) { PlayGutHit(tweentime); } function PlayLeftHit(float tweentime) { PlayGutHit(tweentime); } function PlayRightHit(float tweentime) { PlayGutHit(tweentime); } function FireWeapon(); /* TraceShot - used by instant hit weapons, and monsters */ function actor TraceShot(out vector HitLocation, out vector HitNormal, vector EndTrace, vector StartTrace) { local vector realHit; local actor Other; Other = Trace(HitLocation,HitNormal,EndTrace,StartTrace,True); if ( Pawn(Other) != None ) { realHit = HitLocation; if ( !Pawn(Other).AdjustHitLocation(HitLocation, EndTrace - StartTrace) ) Other = Pawn(Other).TraceShot(HitLocation,HitNormal,EndTrace,realHit); } return Other; } /* Adjust hit location - adjusts the hit location in for pawns, and returns true if it was really a hit, and false if not (for ducking, etc.) */ simulated function bool AdjustHitLocation(out vector HitLocation, vector TraceDir) { local float adjZ, maxZ; TraceDir = Normal(TraceDir); HitLocation = HitLocation + 0.4 * CollisionRadius * TraceDir; if ( (GetAnimGroup(AnimSequence) == 'Ducking') && (AnimFrame > -0.03) ) { maxZ = Location.Z + 0.25 * CollisionHeight; if ( HitLocation.Z > maxZ ) { if ( TraceDir.Z >= 0 ) return false; adjZ = (maxZ - HitLocation.Z)/TraceDir.Z; HitLocation.Z = maxZ; HitLocation.X = HitLocation.X + TraceDir.X * adjZ; HitLocation.Y = HitLocation.Y + TraceDir.Y * adjZ; if ( VSize(HitLocation - Location) > CollisionRadius ) return false; } } return true; } function PlayTakeHit(float tweentime, vector HitLoc, int damage) { local vector X,Y,Z, HitVec, HitVec2D; local float dotp; GetAxes(Rotation,X,Y,Z); X.Z = 0; HitVec = Normal(HitLoc - Location); HitVec2D= HitVec; HitVec2D.Z = 0; dotp = HitVec2D dot X; //first check for head hit if ( HitLoc.Z - Location.Z > 0.5 * CollisionHeight ) { if (dotp > 0) PlayHeadHit(tweentime); else PlayGutHit(tweentime); return; } if (dotp > 0.71) //then hit in front PlayGutHit( tweentime); else if (dotp < -0.71) // then hit in back PlayHeadHit(tweentime); else { dotp = HitVec dot Y; if (dotp > 0.0) PlayLeftHit(tweentime); else PlayRightHit(tweentime); } } function PlayVictoryDance() { TweenToFighter(0.1); } function PlayOutOfWater() { TweenToFalling(); } function PlayDive(); function TweenToFalling(); function PlayInAir(); function PlayDuck(); function PlayCrawling(); function PlayLanded(float impactVel) { local float landVol; //default - do nothing (keep playing existing animation) landVol = impactVel/JumpZ; landVol = 0.005 * Mass * landVol * landVol; PlaySound(Land, SLOT_Interact, FMin(20, landVol)); } function PlayFiring(); function PlayWeaponSwitch(Weapon NewWeapon); function TweenToSwimming(float tweentime); //----------------------------------------------------------------------------- // Sound functions function PlayTakeHitSound(int Damage, name damageType, int Mult) { if ( Level.TimeSeconds - LastPainSound < 0.25 ) return; if (HitSound1 == None)return; LastPainSound = Level.TimeSeconds; if (FRand() < 0.5) PlaySound(HitSound1, SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0)); else PlaySound(HitSound2, SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0)); } function Gasp(); function DropDecoration() { if (CarriedDecoration != None) { CarriedDecoration.bWasCarried = true; CarriedDecoration.SetBase(None); CarriedDecoration.SetPhysics(PHYS_Falling); CarriedDecoration.Velocity = Velocity + 10 * VRand(); CarriedDecoration.Instigator = self; CarriedDecoration = None; } } function GrabDecoration() { local vector lookDir, HitLocation, HitNormal, T1, T2, extent; local actor HitActor; if ( carriedDecoration == None ) { //first trace to find it lookDir = vector(Rotation); lookDir.Z = 0; T1 = Location + BaseEyeHeight * vect(0,0,1) + lookDir * 0.8 * CollisionRadius; T2 = T1 + lookDir * 1.2 * CollisionRadius; HitActor = Trace(HitLocation, HitNormal, T2, T1, true); if ( HitActor == None ) { T1 = T2 - (BaseEyeHeight + CollisionHeight - 2) * vect(0,0,1); HitActor = Trace(HitLocation, HitNormal, T1, T2, true); } else if ( HitActor == Level ) { T2 = HitLocation - lookDir; T1 = T2 - (BaseEyeHeight + CollisionHeight - 2) * vect(0,0,1); HitActor = Trace(HitLocation, HitNormal, T1, T2, true); } if ( (HitActor == None) || (HitActor == Level) ) { extent.X = CollisionRadius; extent.Y = CollisionRadius; extent.Z = CollisionHeight; HitActor = Trace(HitLocation, HitNormal, Location + lookDir * 1.2 * CollisionRadius, Location, true, extent); } if ( Mover(HitActor) != None ) { if ( Mover(HitActor).bUseTriggered ) HitActor.Trigger( self, self ); } else if ( (Decoration(HitActor) != None) && ((weapon == None) || (weapon.Mass < 20)) ) { CarriedDecoration = Decoration(HitActor); if ( !CarriedDecoration.bPushable || (CarriedDecoration.Mass > 40) || (CarriedDecoration.StandingCount > 0) ) { CarriedDecoration = None; return; } lookDir.Z = 0; if ( CarriedDecoration.SetLocation(Location + (0.5 * CollisionRadius + CarriedDecoration.CollisionRadius) * lookDir) ) { CarriedDecoration.SetPhysics(PHYS_None); CarriedDecoration.SetBase(self); } else CarriedDecoration = None; } } } function StopFiring(); function ShakeView( float shaketime, float RollMag, float vertmag); function TakeFallingDamage() { if (Velocity.Z < -1.4 * JumpZ) { MakeNoise(-0.5 * Velocity.Z/(FMax(JumpZ, 150.0))); if (Velocity.Z <= -750 - JumpZ) { if ( (Velocity.Z < -1650 - JumpZ) && (ReducedDamageType != 'All') ) TakeDamage(1000, None, Location, vect(0,0,0), 'Fell'); else if ( Role == ROLE_Authority ) TakeDamage(-0.15 * (Velocity.Z + 700 + JumpZ), None, Location, vect(0,0,0), 'Fell'); ShakeView(0.175 - 0.00007 * Velocity.Z, -0.85 * Velocity.Z, -0.002 * Velocity.Z); } } else if ( Velocity.Z > 0.5 * Default.JumpZ ) MakeNoise(0.35); } /* AdjustAim() ScriptedPawn version does adjustment for non-controlled pawns. PlayerPawn version does the adjustment for player aiming help. Only adjusts aiming at pawns allows more error in Z direction (full as defined by AutoAim - only half that difference for XY) */ function rotator AdjustAim(float projSpeed, vector projStart, int aimerror, bool bLeadTarget, bool bWarnTarget) { return ViewRotation; } function rotator AdjustToss(float projSpeed, vector projStart, int aimerror, bool bLeadTarget, bool bWarnTarget) { return ViewRotation; } function WarnTarget(Pawn shooter, float projSpeed, vector FireDir) { // AI controlled creatures may duck // if not falling, and projectile time is long enough // often pick opposite to current direction (relative to shooter axis) } function SetMovementPhysics() { //implemented in sub-class } function PlayHit(float Damage, vector HitLocation, name damageType, vector Momentum) { } function PlayDeathHit(float Damage, vector HitLocation, name damageType, vector Momentum) { } function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { local int actualDamage; local bool bAlreadyDead; if ( Role < ROLE_Authority ) { log(self$" client damage type "$damageType$" by "$instigatedBy); return; } //log(self@"take damage in state"@GetStateName()); bAlreadyDead = (Health <= 0); if (Physics == PHYS_None) SetMovementPhysics(); if (Physics == PHYS_Walking) momentum.Z = FMax(momentum.Z, 0.4 * VSize(momentum)); if ( instigatedBy == self ) momentum *= 0.6; momentum = momentum/Mass; actualDamage = Level.Game.ReduceDamage(Damage, DamageType, self, instigatedBy); if ( bIsPlayer ) { if (ReducedDamageType == 'All') //God mode actualDamage = 0; else if (Inventory != None) //then check if carrying armor actualDamage = Inventory.ReduceDamage(actualDamage, DamageType, HitLocation); else actualDamage = Damage; } else if ( (InstigatedBy != None) && (InstigatedBy.IsA(Class.Name) || self.IsA(InstigatedBy.Class.Name)) ) ActualDamage = ActualDamage * FMin(1 - ReducedDamagePct, 0.35); else if ( (ReducedDamageType == 'All') || ((ReducedDamageType != '') && (ReducedDamageType == damageType)) ) actualDamage = float(actualDamage) * (1 - ReducedDamagePct); if ( Level.Game.DamageMutator != None ) Level.Game.DamageMutator.MutatorTakeDamage( ActualDamage, Self, InstigatedBy, HitLocation, Momentum, DamageType ); AddVelocity( momentum ); Health -= actualDamage; if (CarriedDecoration != None) DropDecoration(); if ( HitLocation == vect(0,0,0) ) HitLocation = Location; if (Health > 0) { if ( (instigatedBy != None) && (instigatedBy != Self) ) damageAttitudeTo(instigatedBy); PlayHit(actualDamage, hitLocation, damageType, Momentum); } else if ( !bAlreadyDead ) { //log(self$" died"); NextState = ''; PlayDeathHit(actualDamage, hitLocation, damageType, Momentum); if ( actualDamage > mass ) Health = -1 * actualDamage; if ( (instigatedBy != None) && (instigatedBy != Self) ) damageAttitudeTo(instigatedBy); Died(instigatedBy, damageType, HitLocation); } else { //Warn(self$" took regular damage "$damagetype$" from "$instigator$" while already dead"); // SpawnGibbedCarcass(); if ( bIsPlayer ) { HidePlayer(); GotoState('Dying'); } else Destroy(); } MakeNoise(1.0); } function Died(pawn Killer, name damageType, vector HitLocation) { local pawn OtherPawn; local actor A; // mutator hook to prevent deaths // WARNING - don't prevent bot suicides - they suicide when really needed if ( Level.Game.BaseMutator.PreventDeath(self, Killer, damageType, HitLocation) ) { Health = max(Health, 1); //mutator should set this higher return; } if ( bDeleteMe ) return; //already destroyed Health = Min(0, Health); for ( OtherPawn=Level.PawnList; OtherPawn!=None; OtherPawn=OtherPawn.nextPawn ) OtherPawn.Killed(Killer, self, damageType); if ( CarriedDecoration != None ) DropDecoration(); level.game.Killed(Killer, self, damageType); //log(class$" dying"); if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Self, Killer ); Level.Game.DiscardInventory(self); Velocity.Z *= 1.3; if ( Gibbed(damageType) ) { SpawnGibbedCarcass(); if ( bIsPlayer ) HidePlayer(); else Destroy(); } PlayDying(DamageType, HitLocation); if ( Level.Game.bGameEnded ) return; if ( RemoteRole == ROLE_AutonomousProxy ) ClientDying(DamageType, HitLocation); GotoState('Dying'); } function bool Gibbed(name damageType) { return false; } function Carcass SpawnCarcass() { log(self$" should never call base spawncarcass"); return None; } function SpawnGibbedCarcass() { } function HidePlayer() { SetCollision(false, false, false); TweenToFighter(0.01); bHidden = true; } event HearNoise( float Loudness, Actor NoiseMaker); event SeePlayer( actor Seen ); event UpdateEyeHeight( float DeltaTime ); event UpdateTactics(float DeltaTime); // for advanced tactics event EnemyNotVisible(); function Killed(pawn Killer, pawn Other, name damageType) { if ( Enemy == Other ) Enemy = None; } //Typically implemented in subclass function string KillMessage( name damageType, pawn Other ) { local string message; message = Level.Game.CreatureKillMessage(damageType, Other); return (Other.PlayerReplicationInfo.PlayerName$message$namearticle$menuname); } function damageAttitudeTo(pawn Other); function Falling() { //SetPhysics(PHYS_Falling); //Note - physics changes type to PHYS_Falling by default //log(class$" Falling"); PlayInAir(); } // Pawn interface called while PHYS_Walking and PHYS_Swimming to update the pawn with // the latest information about the walk surface -- added by Legend on 1/31/1999 event WalkTexture( texture Texture, vector StepLocation, vector StepNormal ); event Landed(vector HitNormal) { SetMovementPhysics(); if ( !IsAnimating() ) PlayLanded(Velocity.Z); if (Velocity.Z < -1.4 * JumpZ) MakeNoise(-0.5 * Velocity.Z/(FMax(JumpZ, 150.0))); bJustLanded = true; } event FootZoneChange(ZoneInfo newFootZone) { local actor HitActor; local vector HitNormal, HitLocation; local float splashSize; local actor splash; if ( Level.NetMode == NM_Client ) return; if ( Level.TimeSeconds - SplashTime > 0.25 ) { SplashTime = Level.TimeSeconds; if (Physics == PHYS_Falling) MakeNoise(1.0); else MakeNoise(0.3); if ( FootRegion.Zone.bWaterZone ) { if ( !newFootZone.bWaterZone && (Role==ROLE_Authority) ) { if ( FootRegion.Zone.ExitSound != None ) PlaySound(FootRegion.Zone.ExitSound, SLOT_Interact, 1); if ( FootRegion.Zone.ExitActor != None ) Spawn(FootRegion.Zone.ExitActor,,,Location - CollisionHeight * vect(0,0,1)); } } else if ( newFootZone.bWaterZone && (Role==ROLE_Authority) ) { splashSize = FClamp(0.000025 * Mass * (300 - 0.5 * FMax(-500, Velocity.Z)), 1.0, 4.0 ); if ( newFootZone.EntrySound != None ) { HitActor = Trace(HitLocation, HitNormal, Location - (CollisionHeight + 40) * vect(0,0,0.8), Location - CollisionHeight * vect(0,0,0.8), false); if ( HitActor == None ) PlaySound(newFootZone.EntrySound, SLOT_Misc, 2 * splashSize); else PlaySound(WaterStep, SLOT_Misc, 1.5 + 0.5 * splashSize); } if( newFootZone.EntryActor != None ) { splash = Spawn(newFootZone.EntryActor,,,Location - CollisionHeight * vect(0,0,1)); if ( splash != None ) splash.DrawScale = splashSize; } //log("Feet entering water"); } } if (FootRegion.Zone.bPainZone) { if ( !newFootZone.bPainZone && !HeadRegion.Zone.bWaterZone ) PainTime = -1.0; } else if (newFootZone.bPainZone) PainTime = 0.01; } event HeadZoneChange(ZoneInfo newHeadZone) { if ( Level.NetMode == NM_Client ) return; if (HeadRegion.Zone.bWaterZone) { if (!newHeadZone.bWaterZone) { if ( bIsPlayer && (PainTime > 0) && (PainTime < 8) ) Gasp(); if ( Inventory != None ) Inventory.ReduceDamage(0, 'Breathe', Location); //inform inventory of zone change bDrowning = false; if ( !FootRegion.Zone.bPainZone ) PainTime = -1.0; } } else { if (newHeadZone.bWaterZone) { if ( !FootRegion.Zone.bPainZone ) PainTime = UnderWaterTime; if ( Inventory != None ) Inventory.ReduceDamage(0, 'Drowned', Location); //inform inventory of zone change //log("Can't breathe"); } } } event SpeechTimer(); //Pain timer just expired. //Check what zone I'm in (and which parts are) //based on that cause damage, and reset PainTime event PainTimer() { local float depth; //log("Pain Timer"); if ( (Health < 0) || (Level.NetMode == NM_Client) ) return; if ( FootRegion.Zone.bPainZone ) { depth = 0.4; if (Region.Zone.bPainZone) depth += 0.4; if (HeadRegion.Zone.bPainZone) depth += 0.2; if (FootRegion.Zone.DamagePerSec > 0) { if ( IsA('PlayerPawn') ) Level.Game.SpecialDamageString = FootRegion.Zone.DamageString; TakeDamage(int(float(FootRegion.Zone.DamagePerSec) * depth), None, Location, vect(0,0,0), FootRegion.Zone.DamageType); } else if ( Health < Default.Health ) Health = Min(Default.Health, Health - depth * FootRegion.Zone.DamagePerSec); if (Health > 0) PainTime = 1.0; } else if ( HeadRegion.Zone.bWaterZone ) { TakeDamage(5, None, Location + CollisionHeight * vect(0,0,0.5), vect(0,0,0), 'Drowned'); if ( Health > 0 ) PainTime = 2.0; } } function bool CheckWaterJump(out vector WallNormal) { local actor HitActor; local vector HitLocation, HitNormal, checkpoint, start, checkNorm, Extent; if (CarriedDecoration != None) return false; checkpoint = vector(Rotation); checkpoint.Z = 0.0; checkNorm = Normal(checkpoint); checkPoint = Location + CollisionRadius * checkNorm; Extent = CollisionRadius * vect(1,1,0); Extent.Z = CollisionHeight; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, true, Extent); if ( (HitActor != None) && (Pawn(HitActor) == None) ) { WallNormal = -1 * HitNormal; start = Location; start.Z += 1.1 * MaxStepHeight; checkPoint = start + 2 * CollisionRadius * checkNorm; HitActor = Trace(HitLocation, HitNormal, checkpoint, start, true); if (HitActor == None) return true; } return false; } exec function bool SwitchToBestWeapon() { local float rating; local int usealt; if ( Inventory == None ) return false; PendingWeapon = Inventory.RecommendWeapon(rating, usealt); if ( PendingWeapon == Weapon ) PendingWeapon = None; if ( PendingWeapon == None ) return false; if ( Weapon == None ) ChangedWeapon(); if ( Weapon != PendingWeapon ) Weapon.PutDown(); return (usealt > 0); } State Dying { ignores SeePlayer, EnemyNotVisible, HearNoise, KilledBy, Trigger, Bump, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, Falling, WarnTarget, Died, LongFall, PainTimer; function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { if ( bDeleteMe ) return; Health = Health - Damage; Momentum = Momentum/Mass; AddVelocity( momentum ); if ( !bHidden && Gibbed(damageType) ) { bHidden = true; SpawnGibbedCarcass(); if ( bIsPlayer ) HidePlayer(); else Destroy(); } } function Timer() { if ( !bHidden ) { bHidden = true; SpawnCarcass(); if ( bIsPlayer ) HidePlayer(); else Destroy(); } } event Landed(vector HitNormal) { SetPhysics(PHYS_None); } function BeginState() { SetTimer(0.3, false); } } state GameEnded { ignores SeePlayer, HearNoise, KilledBy, Bump, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, Falling, TakeDamage, WarnTarget, Died; function BeginState() { SetPhysics(PHYS_None); HidePlayer(); } } MV'm 'MZ.%-sK [" " " " * #'*"F#xl @                                                              X&SN M}S,SS,&S _JSb"NameS'b i:X~ Ly:- 55 v:yDoPEE?yV?D'?C'y^B'E l:p:q:R"s: xxA'}:hK'} t:h_Pv"M I-sH$v" o|:@;^ \:H'O qCT>H' j:~&{ N ~& q~:e @KD:DP//============================================================================= // GameInfo. // // default game info is normal single player // //============================================================================= class GameInfo extends Info native; //----------------------------------------------------------------------------- // Variables. var int ItemGoals, KillGoals, SecretGoals; // Special game goals. var byte Difficulty; // 0=easy, 1=medium, 2=hard, 3=very hard. var() config bool bNoMonsters; // Whether monsters are allowed in this play mode. var() globalconfig bool bMuteSpectators; // Whether spectators are allowed to speak. var() config bool bHumansOnly; // Whether non human player models are allowed. var() bool bRestartLevel; var() bool bPauseable; // Whether the level is pauseable. var() config bool bCoopWeaponMode; // Whether or not weapons stay when picked up. var() config bool bClassicDeathmessages; // Weapon deathmessages if false. var globalconfig bool bLowGore; // Whether or not to reduce gore. var bool bCanChangeSkin; // Allow player to change skins in game. var() bool bTeamGame; // This is a teamgame. var globalconfig bool bVeryLowGore; // Greatly reduces gore. var() globalconfig bool bNoCheating; // Disallows cheating. Hehe. var() globalconfig bool bAllowFOV; // Allows FOV changes in net games var() bool bDeathMatch; // This game is some type of deathmatch (where players can respawn during gameplay) var bool bGameEnded; // set when game ends var bool bOverTime; var localized bool bAlternateMode; var bool bCanViewOthers; var globalconfig bool bExternalBatcher; var() globalconfig float AutoAim; // How much autoaiming to do (1 = none, 0 = always). // (cosine of max error to correct) var() globalconfig float GameSpeed; // Scale applied to game rate. var float StartTime; var() class DefaultPlayerClass; var() class DefaultWeapon; // Default weapon given to player at start. var() globalconfig int MaxSpectators; // Maximum number of spectators. var int NumSpectators; // Current number of spectators. var() private globalconfig string AdminPassword; // Password to receive bAdmin privileges. var() private globalconfig string GamePassword; // Password to enter game. var() class ScoreBoardType; // Type of scoreboard this game uses. var() class GameMenuType; // Type of oldstyle game options menu to display. var() string BotMenuType; // Type of bot menu to display. var() string RulesMenuType; // Type of rules menu to display. var() string SettingsMenuType; // Type of settings menu to display. var() string GameUMenuType; // Type of Game dropdown to display. var() string MultiplayerUMenuType; // Type of Multiplayer dropdown to display. var() string GameOptionsMenuType; // Type of options dropdown to display. var() class HUDType; // HUD class this game uses. var() class MapListType; // Maplist this game uses. var() string MapPrefix; // Prefix characters for names of maps for this game type. var() string BeaconName; // Identifying string used for finding LAN servers. var() string SpecialDamageString; var localized string SwitchLevelMessage; var int SentText; var localized string DefaultPlayerName; var localized string LeftMessage; var localized string FailedSpawnMessage; var localized string FailedPlaceMessage; var localized string FailedTeamMessage; var localized string NameChangedMessage; var localized string EnteredMessage; var localized string GameName; var localized string MaxedOutMessage; var localized string WrongPassword; var localized string NeedPassword; var localized string IPBanned; var() globalconfig int MaxPlayers; var int NumPlayers; var int CurrentID; var() globalconfig string IPPolicies[50]; // Message classes. var class DeathMessageClass; var class DMMessageClass; // Mutator (for modifying actors as they enter the game) var class MutatorClass; var Mutator BaseMutator; var Mutator DamageMutator; // linked list of mutators which affect damage var Mutator MessageMutator; // linked list of mutators which get localized message queries // Default waterzone entry and exit effects var class WaterZoneType; // What state a player should start in for this game type var name DefaultPlayerState; // ReplicationInfo var() class GameReplicationInfoClass; var GameReplicationInfo GameReplicationInfo; // Server Log var globalconfig string ServerLogName; // Statistics Logging var StatLog LocalLog; var StatLog WorldLog; var globalconfig bool bLocalLog; var globalconfig bool bWorldLog; var globalconfig bool bBatchLocal; var bool bLoggingGame; // Does this gametype log? var string LocalLogFileName; var string WorldLogFileName; var class StatLogClass; // Demo Information var globalconfig int DemoBuild; var globalconfig int DemoHasTuts; // Server query info var string EnabledMutators; //------------------------------------------------------------------------------ // Admin function AdminLogin( PlayerPawn P, string Password ) { if (AdminPassword == "") return; if (Password == AdminPassword) { P.bAdmin = True; P.PlayerReplicationInfo.bAdmin = P.bAdmin; Log("Administrator logged in."); BroadcastMessage( P.PlayerReplicationInfo.PlayerName@"became a server administrator." ); } } function AdminLogout( PlayerPawn P ) { local float OldScore; if (P.bAdmin) { P.bAdmin = False; P.PlayerReplicationInfo.bAdmin = P.bAdmin; if ( P.ReducedDamageType == 'All' ) P.ReducedDamageType = ''; P.StartWalk(); OldScore = P.PlayerReplicationInfo.Score; P.Suicide(); P.PlayerReplicationInfo.Score = OldScore; Log("Administrator logged out."); BroadcastMessage( P.PlayerReplicationInfo.PlayerName@"gave up administrator abilities." ); } } //------------------------------------------------------------------------------ // Engine notifications. function PreBeginPlay() { StartTime = 0; SetGameSpeed(GameSpeed); Level.bNoCheating = bNoCheating; Level.bAllowFOV = bAllowFOV; if (GameReplicationInfoClass != None) GameReplicationInfo = Spawn(GameReplicationInfoClass); else GameReplicationInfo = Spawn(class'GameReplicationInfo'); InitGameReplicationInfo(); } function PostBeginPlay() { local ZoneInfo W; if ( bAlternateMode ) { bLowGore = true; bVeryLowGore = true; } if ( bVeryLowGore ) bLowGore = true; if ( WaterZoneType != None ) { ForEach AllActors(class'ZoneInfo', W ) if ( W.bWaterZone ) { if( W.EntryActor == None ) W.EntryActor = WaterZoneType.Default.EntryActor; if( W.ExitActor == None ) W.ExitActor = WaterZoneType.Default.ExitActor; if( W.EntrySound == None ) W.EntrySound = WaterZoneType.Default.EntrySound; if( W.ExitSound == None ) W.ExitSound = WaterZoneType.Default.ExitSound; } } // Setup local statistics logging. InitLogging(); Super.PostBeginPlay(); } function InitLogging() { local Mutator M; if (bLocalLog && bLoggingGame) { Log("Initiating local logging..."); LocalLog = spawn(StatLogClass); LocalLog.bWorld = False; LocalLog.StartLog(); LocalLog.LogStandardInfo(); LocalLog.LogServerInfo(); LocalLog.LogMapParameters(); for (M = BaseMutator; M != None; M = M.NextMutator) LocalLog.LogMutator(M); LogGameParameters(LocalLog); LocalLogFileName = LocalLog.GetLogFileName(); } // Setup world statistics logging. if ((Level.NetMode != NM_DedicatedServer) && (Level.NetMode != NM_ListenServer)) return; if (bWorldLog && bLoggingGame) { Log("Initiating world logging..."); WorldLog = spawn(StatLogClass); WorldLog.bWorld = True; WorldLog.StartLog(); WorldLog.LogStandardInfo(); WorldLog.LogServerInfo(); WorldLog.LogMapParameters(); WorldLog.InitialCheck(Self); for (M = BaseMutator; M != None; M = M.NextMutator) WorldLog.LogMutator(M); LogGameParameters(WorldLog); WorldLogFileName = WorldLog.GetLogFileName(); } } function Timer() { SentText = 0; } // Called when game shutsdown. event GameEnding() { if (LocalLog != None) { LocalLog.LogGameEnd("serverquit"); LocalLog.StopLog(); LocalLog.Destroy(); LocalLog = None; } if (WorldLog != None) { WorldLog.LogGameEnd("serverquit"); WorldLog.StopLog(); WorldLog.Destroy(); WorldLog = None; } } //------------------------------------------------------------------------------ // Replication function InitGameReplicationInfo() { GameReplicationInfo.bTeamGame = bTeamGame; GameReplicationInfo.GameName = GameName; GameReplicationInfo.GameClass = string(Class); GameReplicationInfo.bClassicDeathmessages = bClassicDeathmessages; } native function string GetNetworkNumber(); //------------------------------------------------------------------------------ // Game Querying. function string GetInfo() { local string ResultSet; // World logging enabled and working if ( WorldLog != None && !WorldLog.bWorldBatcherError ) ResultSet = "\\worldlog\\true"; else ResultSet = "\\worldlog\\false"; // World logging activated if ( WorldLog != None ) ResultSet = ResultSet$"\\wantworldlog\\true"; else ResultSet = ResultSet$"\\wantworldlog\\false"; return ResultSet; } function string GetRules() { local string ResultSet; local Mutator M; local string NextMutator, NextDesc; local int Num, i; ResultSet = ""; if( EnabledMutators == "" ) { for (M = BaseMutator.NextMutator; M != None; M = M.NextMutator) { Num = 0; NextMutator = ""; GetNextIntDesc("Engine.Mutator", 0, NextMutator, NextDesc); while( (NextMutator != "") && (Num < 50) ) { if(NextMutator ~= string(M.Class)) { i = InStr(NextDesc, ","); if(i != -1) NextDesc = Left(NextDesc, i); if(EnabledMutators != "") EnabledMutators = EnabledMutators $ ", "; EnabledMutators = EnabledMutators $ NextDesc; break; } Num++; GetNextIntDesc("Engine.Mutator", Num, NextMutator, NextDesc); } } if(EnabledMutators != "") ResultSet = ResultSet $ "\\mutators\\"$EnabledMutators; } ResultSet = ResultSet $ "\\listenserver\\"$string(Level.NetMode==NM_ListenServer) $ "\\password\\"$string(GamePassword!=""); return ResultSet; } // Return the server's port number. function int GetServerPort() { local string S; local int i; // Figure out the server's port. S = Level.GetAddressURL(); i = InStr( S, ":" ); assert(i>=0); return int(Mid(S,i+1)); } function bool SetPause( BOOL bPause, PlayerPawn P ) { if( bPauseable || P.bAdmin || Level.Netmode==NM_Standalone ) { if( bPause ) Level.Pauser=P.PlayerReplicationInfo.PlayerName; else Level.Pauser=""; return True; } else return False; } //------------------------------------------------------------------------------ // Stat Logging. function LogGameParameters(StatLog StatLog) { if (StatLog == None) return; StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"GameName"$Chr(9)$GameName); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"GameClass"$Chr(9)$Class);// <-- Move to c++ StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"GameVersion"$Chr(9)$Level.EngineVersion); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"MinNetVersion"$Chr(9)$Level.MinNetVersion); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"NoMonsters"$Chr(9)$bNoMonsters); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"MuteSpectators"$Chr(9)$bMuteSpectators); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"HumansOnly"$Chr(9)$bHumansOnly); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"WeaponsStay"$Chr(9)$bCoopWeaponMode); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"ClassicDeathmessages"$Chr(9)$bClassicDeathmessages); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"LowGore"$Chr(9)$bLowGore); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"VeryLowGore"$Chr(9)$bVeryLowGore); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"TeamGame"$Chr(9)$bTeamGame); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"GameSpeed"$Chr(9)$int(GameSpeed*100)); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"MaxSpectators"$Chr(9)$MaxSpectators); StatLog.LogEventString(StatLog.GetTimeStamp()$Chr(9)$"game"$Chr(9)$"MaxPlayers"$Chr(9)$MaxPlayers); } //------------------------------------------------------------------------------ // Game parameters. // // Set gameplay speed. // function SetGameSpeed( Float T ) { GameSpeed = FMax(T, 0.1); Level.TimeDilation = GameSpeed; SetTimer(Level.TimeDilation, true); } static function ResetGame(); // // Called after setting low or high detail mode. // event DetailChange() { local actor A; local zoneinfo Z; local skyzoneinfo S; if( !Level.bHighDetailMode ) { foreach AllActors(class'Actor', A) { if( A.bHighDetail && !A.bGameRelevant ) A.Destroy(); } } foreach AllActors(class'ZoneInfo', Z) Z.LinkToSkybox(); } // // Return whether an actor should be destroyed in // this type of game. // function bool IsRelevant( actor Other ) { local byte bSuperRelevant; // let the mutators mutate the actor or choose to remove it if ( BaseMutator.AlwaysKeep(Other) ) return true; if ( BaseMutator.IsRelevant(Other, bSuperRelevant) ) { if ( bSuperRelevant == 1 ) // mutator wants to override any logic in here return true; } else return false; if ( (Difficulty==0 && !Other.bDifficulty0 ) || (Difficulty==1 && !Other.bDifficulty1 ) || (Difficulty==2 && !Other.bDifficulty2 ) || (Difficulty==3 && !Other.bDifficulty3 ) || (!Other.bSinglePlayer && (Level.NetMode==NM_Standalone) ) || (!Other.bNet && ((Level.NetMode == NM_DedicatedServer) || (Level.NetMode == NM_ListenServer)) ) || (!Other.bNetSpecial && (Level.NetMode==NM_Client)) ) return False; if( bNoMonsters && (Pawn(Other) != None) && !Pawn(Other).bIsPlayer ) return False; if( FRand() > Other.OddsOfAppearing ) return False; // Update the level info goal counts. if( Other.bIsSecretGoal ) SecretGoals++; if( Other.bIsItemGoal ) ItemGoals++; if( Other.bIsKillGoal ) KillGoals++; return True; } //------------------------------------------------------------------------------ // Player start functions // // Grab the next option from a string. // function bool GrabOption( out string Options, out string Result ) { if( Left(Options,1)=="?" ) { // Get result. Result = Mid(Options,1); if( InStr(Result,"?")>=0 ) Result = Left( Result, InStr(Result,"?") ); // Update options. Options = Mid(Options,1); if( InStr(Options,"?")>=0 ) Options = Mid( Options, InStr(Options,"?") ); else Options = ""; return true; } else return false; } // // Break up a key=value pair into its key and value. // function GetKeyValue( string Pair, out string Key, out string Value ) { if( InStr(Pair,"=")>=0 ) { Key = Left(Pair,InStr(Pair,"=")); Value = Mid(Pair,InStr(Pair,"=")+1); } else { Key = Pair; Value = ""; } } // // See if an option was specified in the options string. // function bool HasOption( string Options, string InKey ) { local string Pair, Key, Value; while( GrabOption( Options, Pair ) ) { GetKeyValue( Pair, Key, Value ); if( Key ~= InKey ) return true; } return false; } // // Find an option in the options string and return it. // function string ParseOption( string Options, string InKey ) { local string Pair, Key, Value; while( GrabOption( Options, Pair ) ) { GetKeyValue( Pair, Key, Value ); if( Key ~= InKey ) return Value; } return ""; } // // Initialize the game. //warning: this is called before actors' PreBeginPlay. // event InitGame( string Options, out string Error ) { local string InOpt, LeftOpt; local int pos; local class MClass; log( "InitGame:" @ Options ); MaxPlayers = Min( 32,GetIntOption( Options, "MaxPlayers", MaxPlayers )); InOpt = ParseOption( Options, "Difficulty" ); if( InOpt != "" ) Difficulty = int(InOpt); InOpt = ParseOption( Options, "AdminPassword"); if( InOpt!="" ) AdminPassword = InOpt; InOpt = ParseOption( Options, "GameSpeed"); if( InOpt != "" ) { log("GameSpeed"@InOpt); SetGameSpeed(float(InOpt)); } BaseMutator = spawn(MutatorClass); log("Base Mutator is "$BaseMutator); InOpt = ParseOption( Options, "Mutator"); if ( InOpt != "" ) { log("Mutators"@InOpt); while ( InOpt != "" ) { pos = InStr(InOpt,","); if ( pos > 0 ) { LeftOpt = Left(InOpt, pos); InOpt = Right(InOpt, Len(InOpt) - pos - 1); } else { LeftOpt = InOpt; InOpt = ""; } log("Add mutator "$LeftOpt); MClass = class(DynamicLoadObject(LeftOpt, class'Class')); BaseMutator.AddMutator(Spawn(MClass)); } } InOpt = ParseOption( Options, "GamePassword"); if( InOpt != "" ) { GamePassWord = InOpt; log( "GamePassword" @ InOpt ); } InOpt = ParseOption( Options, "LocalLog"); if( InOpt ~= "true" ) bLocalLog = True; InOpt = ParseOption( Options, "WorldLog"); if( InOpt ~= "true" ) bWorldLog = True; } // // Return beacon text for serverbeacon. // event string GetBeaconText() { return Level.ComputerName $ " " $ Left(Level.Title,24) $ " " $ BeaconName $ " " $ NumPlayers $ "/" $ MaxPlayers; } // // Optional handling of ServerTravel for network games. // function ProcessServerTravel( string URL, bool bItems ) { local playerpawn P, LocalPlayer; if (LocalLog != None) { LocalLog.LogGameEnd("mapchange"); LocalLog.StopLog(); LocalLog.Destroy(); LocalLog = None; } if (WorldLog != None) { WorldLog.LogGameEnd("mapchange"); WorldLog.StopLog(); WorldLog.Destroy(); WorldLog = None; } // Notify clients we're switching level and give them time to receive. // We call PreClientTravel directly on any local PlayerPawns (ie listen server) log("ProcessServerTravel:"@URL); foreach AllActors( class'PlayerPawn', P ) if( NetConnection(P.Player)!=None ) P.ClientTravel( URL, TRAVEL_Relative, bItems ); else { LocalPlayer = P; P.PreClientTravel(); } if ( (Level.NetMode == NM_ListenServer) && (LocalPlayer != None) ) Level.NextURL = Level.NextURL$"?Skin="$LocalPlayer.GetDefaultURL("Skin") $"?Face="$LocalPlayer.GetDefaultURL("Face") $"?Team="$LocalPlayer.GetDefaultURL("Team") $"?Name="$LocalPlayer.GetDefaultURL("Name") $"?Class="$LocalPlayer.GetDefaultURL("Class"); // Switch immediately if not networking. if( Level.NetMode!=NM_DedicatedServer && Level.NetMode!=NM_ListenServer ) Level.NextSwitchCountdown = 0.0; } function bool AtCapacity(string Options) { return ( (MaxPlayers>0) && (NumPlayers>=MaxPlayers) ); } // // Accept or reject a player on the server. // Fails login if you set the Error to a non-empty string. // event PreLogin ( string Options, string Address, out string Error, out string FailCode ) { // Do any name or password or name validation here. local string InPassword; Error=""; InPassword = ParseOption( Options, "Password" ); if( (Level.NetMode != NM_Standalone) && AtCapacity(Options) ) { Error=MaxedOutMessage; } else if ( GamePassword!="" && caps(InPassword)!=caps(GamePassword) && (AdminPassword=="" || caps(InPassword)!=caps(AdminPassword)) ) { if( InPassword == "" ) { Error = NeedPassword; FailCode = "NEEDPW"; } else { Error = WrongPassword; FailCode = "WRONGPW"; } } if(!CheckIPPolicy(Address)) Error = IPBanned; } function bool CheckIPPolicy(string Address) { local int i, j, LastMatchingPolicy; local string Policy, Mask; local bool bAcceptAddress, bAcceptPolicy; // strip port number j = InStr(Address, ":"); if(j != -1) Address = Left(Address, j); bAcceptAddress = True; for(i=0; i<50 && IPPolicies[i] != ""; i++) { j = InStr(IPPolicies[i], ","); if(j==-1) continue; Policy = Left(IPPolicies[i], j); Mask = Mid(IPPolicies[i], j+1); if(Policy ~= "ACCEPT") bAcceptPolicy = True; else if(Policy ~= "DENY") bAcceptPolicy = False; else continue; j = InStr(Mask, "*"); if(j != -1) { if(Left(Mask, j) == Left(Address, j)) { bAcceptAddress = bAcceptPolicy; LastMatchingPolicy = i; } } else { if(Mask == Address) { bAcceptAddress = bAcceptPolicy; LastMatchingPolicy = i; } } } if(!bAcceptAddress) Log("Denied connection for "$Address$" with IP policy "$IPPolicies[LastMatchingPolicy]); return bAcceptAddress; } function int GetIntOption( string Options, string ParseString, int CurrentValue) { local string InOpt; InOpt = ParseOption( Options, ParseString ); if ( InOpt != "" ) { log(ParseString@InOpt); return int(InOpt); } return CurrentValue; } // // Log a player in. // Fails login if you set the Error string. // PreLogin is called before Login, but significant game time may pass before // Login is called, especially if content is downloaded. // event playerpawn Login ( string Portal, string Options, out string Error, class SpawnClass ) { local NavigationPoint StartSpot; local PlayerPawn NewPlayer, TestPlayer; local Pawn PawnLink; local string InName, InPassword, InSkin, InFace, InChecksum; local byte InTeam; // Make sure there is capacity. (This might have changed since the PreLogin call). if ( Level.NetMode != NM_Standalone ) { if ( ClassIsChildOf(SpawnClass, class'Spectator') ) { if ( (NumSpectators >= MaxSpectators) && ((Level.NetMode != NM_ListenServer) || (NumPlayers > 0)) ) { Error=MaxedOutMessage; return None; } } else if ( (MaxPlayers>0) && (NumPlayers>=MaxPlayers) ) { Error=MaxedOutMessage; return None; } } BaseMutator.ModifyLogin(SpawnClass, Portal, Options); // Get URL options. InName = Left(ParseOption ( Options, "Name"), 20); InTeam = GetIntOption( Options, "Team", 255 ); // default to "no team" InPassword = ParseOption ( Options, "Password" ); InSkin = ParseOption ( Options, "Skin" ); InFace = ParseOption ( Options, "Face" ); InChecksum = ParseOption ( Options, "Checksum" ); log( "Login:" @ InName ); if( InPassword != "" ) log( "Password"@InPassword ); // Find a start spot. StartSpot = FindPlayerStart( None, InTeam, Portal ); if( StartSpot == None ) { Error = FailedPlaceMessage; return None; } // Try to match up to existing unoccupied player in level, // for savegames and coop level switching. for( PawnLink=Level.PawnList; PawnLink!=None; PawnLink=PawnLink.NextPawn ) { TestPlayer = PlayerPawn(PawnLink); if ( TestPlayer!=None && TestPlayer.Player==None && TestPlayer.PlayerReplicationInfo != None && TestPlayer.bIsPlayer && TestPlayer.PlayerReplicationInfo.PlayerName != class'PlayerReplicationInfo'.default.PlayerName ) { if ( (Level.NetMode==NM_Standalone) || (TestPlayer.PlayerReplicationInfo.PlayerName~=InName && TestPlayer.Password~=InPassword) ) { // Found matching unoccupied player, so use this one. NewPlayer = TestPlayer; break; } } } // In not found, spawn a new player. if( NewPlayer==None ) { // Make sure this kind of player is allowed. if ( (bHumansOnly || Level.bHumansOnly) && !SpawnClass.Default.bIsHuman && !ClassIsChildOf(SpawnClass, class'Spectator') ) SpawnClass = DefaultPlayerClass; NewPlayer = Spawn(SpawnClass,,,StartSpot.Location,StartSpot.Rotation); if( NewPlayer!=None ) NewPlayer.ViewRotation = StartSpot.Rotation; } // Handle spawn failure. if( NewPlayer == None ) { log("Couldn't spawn player at "$StartSpot); Error = FailedSpawnMessage; return None; } NewPlayer.static.SetMultiSkin(NewPlayer, InSkin, InFace, InTeam); // Set the player's ID. NewPlayer.PlayerReplicationInfo.PlayerID = CurrentID++; // Init player's information. NewPlayer.ClientSetRotation(NewPlayer.Rotation); if( InName=="" ) InName=DefaultPlayerName; if( Level.NetMode!=NM_Standalone || NewPlayer.PlayerReplicationInfo.PlayerName==DefaultPlayerName ) ChangeName( NewPlayer, InName, false ); // Change player's team. if ( !ChangeTeam(newPlayer, InTeam) ) { Error = FailedTeamMessage; return None; } if( NewPlayer.IsA('Spectator') && (Level.NetMode == NM_DedicatedServer) ) NumSpectators++; // Init player's administrative privileges NewPlayer.Password = InPassword; NewPlayer.bAdmin = AdminPassword!="" && caps(InPassword)==caps(AdminPassword); NewPlayer.PlayerReplicationInfo.bAdmin = NewPlayer.bAdmin; if( NewPlayer.bAdmin ) log( "Administrator logged in!" ); // Init player's replication info NewPlayer.GameReplicationInfo = GameReplicationInfo; // If we are a server, broadcast a welcome message. if( Level.NetMode==NM_DedicatedServer || Level.NetMode==NM_ListenServer ) BroadcastMessage( NewPlayer.PlayerReplicationInfo.PlayerName$EnteredMessage, false ); // Teleport-in effect. StartSpot.PlayTeleportEffect( NewPlayer, true ); // Log it. if ( LocalLog != None ) LocalLog.LogPlayerConnect(NewPlayer); if ( WorldLog != None ) WorldLog.LogPlayerConnect(NewPlayer, InChecksum); NewPlayer.ReceivedSecretChecksum = !(InChecksum ~= "NoChecksum"); if ( !NewPlayer.IsA('Spectator') ) NumPlayers++; return newPlayer; } // // Called after a successful login. This is the first place // it is safe to call replicated functions on the PlayerPawn. // event PostLogin( playerpawn NewPlayer ) { local Pawn P; // Start player's music. NewPlayer.ClientSetMusic( Level.Song, Level.SongSection, Level.CdTrack, MTRAN_Fade ); if ( Level.NetMode != NM_Standalone ) { // replicate skins for ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( P.bIsPlayer && (P != NewPlayer) ) { if ( P.bIsMultiSkinned ) NewPlayer.ClientReplicateSkins(P.MultiSkins[0], P.MultiSkins[1], P.MultiSkins[2], P.MultiSkins[3]); else NewPlayer.ClientReplicateSkins(P.Skin); if ( (P.PlayerReplicationInfo != None) && P.PlayerReplicationInfo.bWaitingPlayer && P.IsA('PlayerPawn') ) { if ( NewPlayer.bIsMultiSkinned ) PlayerPawn(P).ClientReplicateSkins(NewPlayer.MultiSkins[0], NewPlayer.MultiSkins[1], NewPlayer.MultiSkins[2], NewPlayer.MultiSkins[3]); else PlayerPawn(P).ClientReplicateSkins(NewPlayer.Skin); } } } } // // Add bot to game. // function bool AddBot(); function bool ForceAddBot(); // // Pawn exits. // function Logout( pawn Exiting ) { local bool bMessage; bMessage = true; if ( Exiting.IsA('PlayerPawn') ) { if ( Exiting.IsA('Spectator') ) { bMessage = false; if ( Level.NetMode == NM_DedicatedServer ) NumSpectators--; } else NumPlayers--; } if( bMessage && (Level.NetMode==NM_DedicatedServer || Level.NetMode==NM_ListenServer) ) BroadcastMessage( Exiting.PlayerReplicationInfo.PlayerName$LeftMessage, false ); if ( LocalLog != None ) LocalLog.LogPlayerDisconnect(Exiting); if ( WorldLog != None ) WorldLog.LogPlayerDisconnect(Exiting); } // // Examine the passed player's inventory, and accept or discard each item. // AcceptInventory needs to gracefully handle the case of some inventory // being accepted but other inventory not being accepted (such as the default // weapon). There are several things that can go wrong: A weapon's // AmmoType not being accepted but the weapon being accepted -- the weapon // should be killed off. Or the player's selected inventory item, active // weapon, etc. not being accepted, leaving the player weaponless or leaving // the HUD inventory rendering messed up (AcceptInventory should pick another // applicable weapon/item as current). // event AcceptInventory(pawn PlayerPawn) { //default accept all inventory except default weapon (spawned explicitly) local inventory inv; // Initialize the inventory. AddDefaultInventory( PlayerPawn ); log( "All inventory from" @ PlayerPawn.PlayerReplicationInfo.PlayerName @ "is accepted" ); } // // Spawn any default inventory for the player. // function AddDefaultInventory( pawn PlayerPawn ) { local Weapon newWeapon; local class WeapClass; PlayerPawn.JumpZ = PlayerPawn.Default.JumpZ * PlayerJumpZScaling(); if( PlayerPawn.IsA('Spectator') ) return; // Spawn default weapon. WeapClass = BaseMutator.MutatedDefaultWeapon(); if( (WeapClass!=None) && (PlayerPawn.FindInventoryType(WeapClass)==None) ) { newWeapon = Spawn(WeapClass,,,PlayerPawn.Location); if( newWeapon != None ) { newWeapon.Instigator = PlayerPawn; newWeapon.BecomeItem(); PlayerPawn.AddInventory(newWeapon); newWeapon.BringUp(); newWeapon.GiveAmmo(PlayerPawn); newWeapon.SetSwitchPriority(PlayerPawn); newWeapon.WeaponSet(PlayerPawn); } } BaseMutator.ModifyPlayer(PlayerPawn); } // // Return the 'best' player start for this player to start from. // Re-implement for each game type. // function NavigationPoint FindPlayerStart( Pawn Player, optional byte InTeam, optional string incomingName ) { local PlayerStart Dest; local Teleporter Tel; if( incomingName!="" ) foreach AllActors( class 'Teleporter', Tel ) if( string(Tel.Tag)~=incomingName ) return Tel; foreach AllActors( class 'PlayerStart', Dest ) if( Dest.bSinglePlayerStart && Dest.bEnabled ) return Dest; // if none, check for any that aren't enabled log("WARNING: All single player starts were disabled - picking one anyway!"); foreach AllActors( class 'PlayerStart', Dest ) if( Dest.bSinglePlayerStart ) return Dest; log( "No single player start found" ); return None; } // // Restart a player. // function bool RestartPlayer( pawn aPlayer ) { local NavigationPoint startSpot; local bool foundStart; if( bRestartLevel && Level.NetMode!=NM_DedicatedServer && Level.NetMode!=NM_ListenServer ) return true; startSpot = FindPlayerStart(aPlayer, 255); if( startSpot == None ) { log(" Player start not found!!!"); return false; } foundStart = aPlayer.SetLocation(startSpot.Location); if( foundStart ) { startSpot.PlayTeleportEffect(aPlayer, true); aPlayer.SetRotation(startSpot.Rotation); aPlayer.ViewRotation = aPlayer.Rotation; aPlayer.Acceleration = vect(0,0,0); aPlayer.Velocity = vect(0,0,0); aPlayer.Health = aPlayer.Default.Health; aPlayer.SetCollision( true, true, true ); aPlayer.ClientSetLocation( startSpot.Location, startSpot.Rotation ); aPlayer.bHidden = false; aPlayer.DamageScaling = aPlayer.Default.DamageScaling; aPlayer.SoundDampening = aPlayer.Default.SoundDampening; AddDefaultInventory(aPlayer); } else log(startspot$" Player start not useable!!!"); return foundStart; } // // Start a player. // function StartPlayer(PlayerPawn Other) { if( Level.NetMode==NM_DedicatedServer || Level.NetMode==NM_ListenServer || !bRestartLevel ) Other.GotoState(Other.PlayerRestartState); else Other.ClientTravel( "?restart", TRAVEL_Relative, false ); } //------------------------------------------------------------------------------ // Level death message functions. function Killed( pawn Killer, pawn Other, name damageType ) { local String Message, KillerWeapon, OtherWeapon; local bool bSpecialDamage; if (Other.bIsPlayer) { if ( (Killer != None) && (!Killer.bIsPlayer) ) { Message = Killer.KillMessage(damageType, Other); BroadcastMessage( Message, false, 'DeathMessage'); if ( LocalLog != None ) LocalLog.LogSuicide(Other, DamageType, None); if ( WorldLog != None ) WorldLog.LogSuicide(Other, DamageType, None); return; } if ( (DamageType == 'SpecialDamage') && (SpecialDamageString != "") ) { BroadcastMessage( ParseKillMessage( Killer.PlayerReplicationInfo.PlayerName, Other.PlayerReplicationInfo.PlayerName, Killer.Weapon.ItemName, SpecialDamageString ), false, 'DeathMessage'); bSpecialDamage = True; } Other.PlayerReplicationInfo.Deaths += 1; if ( (Killer == Other) || (Killer == None) ) { // Suicide if (damageType == '') { if ( LocalLog != None ) LocalLog.LogSuicide(Other, 'Unknown', Killer); if ( WorldLog != None ) WorldLog.LogSuicide(Other, 'Unknown', Killer); } else { if ( LocalLog != None ) LocalLog.LogSuicide(Other, damageType, Killer); if ( WorldLog != None ) WorldLog.LogSuicide(Other, damageType, Killer); } if (!bSpecialDamage) { if ( damageType == 'Fell' ) BroadcastLocalizedMessage(DeathMessageClass, 2, Other.PlayerReplicationInfo, None); else if ( damageType == 'Eradicated' ) BroadcastLocalizedMessage(DeathMessageClass, 3, Other.PlayerReplicationInfo, None); else if ( damageType == 'Drowned' ) BroadcastLocalizedMessage(DeathMessageClass, 4, Other.PlayerReplicationInfo, None); else if ( damageType == 'Burned' ) BroadcastLocalizedMessage(DeathMessageClass, 5, Other.PlayerReplicationInfo, None); else if ( damageType == 'Corroded' ) BroadcastLocalizedMessage(DeathMessageClass, 6, Other.PlayerReplicationInfo, None); else if ( damageType == 'Mortared' ) BroadcastLocalizedMessage(DeathMessageClass, 7, Other.PlayerReplicationInfo, None); else BroadcastLocalizedMessage(DeathMessageClass, 1, Other.PlayerReplicationInfo, None); } } else { if ( Killer.bIsPlayer ) { KillerWeapon = "None"; if (Killer.Weapon != None) KillerWeapon = Killer.Weapon.ItemName; OtherWeapon = "None"; if (Other.Weapon != None) OtherWeapon = Other.Weapon.ItemName; if ( Killer.PlayerReplicationInfo.Team == Other.PlayerReplicationInfo.Team ) { if ( LocalLog != None ) LocalLog.LogTeamKill( Killer.PlayerReplicationInfo.PlayerID, Other.PlayerReplicationInfo.PlayerID, KillerWeapon, OtherWeapon, damageType ); if ( WorldLog != None ) WorldLog.LogTeamKill( Killer.PlayerReplicationInfo.PlayerID, Other.PlayerReplicationInfo.PlayerID, KillerWeapon, OtherWeapon, damageType ); } else { if ( LocalLog != None ) LocalLog.LogKill( Killer.PlayerReplicationInfo.PlayerID, Other.PlayerReplicationInfo.PlayerID, KillerWeapon, OtherWeapon, damageType ); if ( WorldLog != None ) WorldLog.LogKill( Killer.PlayerReplicationInfo.PlayerID, Other.PlayerReplicationInfo.PlayerID, KillerWeapon, OtherWeapon, damageType ); } if (!bSpecialDamage && (Other != None)) { BroadcastRegularDeathMessage(Killer, Other, damageType); } } } } ScoreKill(Killer, Other); } function BroadcastRegularDeathMessage(pawn Killer, pawn Other, name damageType) { BroadcastLocalizedMessage(DeathMessageClass, 0, Killer.PlayerReplicationInfo, Other.PlayerReplicationInfo, Killer.Weapon.Class); } // %k = Owner's PlayerName (Killer) // %o = Other's PlayerName (Victim) // %w = Owner's Weapon ItemName static native function string ParseKillMessage( string KillerName, string VictimName, string WeaponName, string DeathMessage ); function ScoreKill(pawn Killer, pawn Other) { Other.DieCount++; if( (killer == Other) || (killer == None) ) Other.PlayerReplicationInfo.Score -= 1; else if ( killer != None ) { killer.killCount++; if ( killer.PlayerReplicationInfo != None ) killer.PlayerReplicationInfo.Score += 1; } BaseMutator.ScoreKill(Killer, Other); } // // Default death message. // static function string KillMessage( name damageType, pawn Other ) { return " died."; } //------------------------------------------------------------------------------------- // Level gameplay modification. // // Return whether Viewer is allowed to spectate from the // point of view of ViewTarget. // function bool CanSpectate( pawn Viewer, actor ViewTarget ) { return true; } function RegisterDamageMutator(Mutator M) { M.NextDamageMutator = DamageMutator; DamageMutator = M; } function RegisterMessageMutator(Mutator M) { M.NextMessageMutator = MessageMutator; MessageMutator = M; } // // Use reduce damage for teamplay modifications, etc. // function int ReduceDamage( int Damage, name DamageType, pawn injured, pawn instigatedBy ) { if( injured.Region.Zone.bNeutralZone ) return 0; return Damage; } // // Award a score to an actor. // function ScoreEvent( name EventName, actor EventActor, pawn InstigatedBy ) { } // // Return whether an item should respawn. // function bool ShouldRespawn( actor Other ) { if( Level.NetMode == NM_StandAlone ) return false; return Inventory(Other)!=None && Inventory(Other).ReSpawnTime!=0.0; } // // Called when pawn has a chance to pick Item up (i.e. when // the pawn touches a weapon pickup). Should return true if // he wants to pick it up, false if he does not want it. // function bool PickupQuery( Pawn Other, Inventory item ) { local Mutator M; local byte bAllowPickup; if ( BaseMutator.HandlePickupQuery(Other, item, bAllowPickup) ) return (bAllowPickup == 1); if ( Other.Inventory == None ) return true; else return !Other.Inventory.HandlePickupQuery(Item); } // // Discard a player's inventory after he dies. // function DiscardInventory( Pawn Other ) { local actor dropped; local inventory Inv; local weapon weap; local float speed; if( Other.DropWhenKilled != None ) { dropped = Spawn(Other.DropWhenKilled,,,Other.Location); Inv = Inventory(dropped); if ( Inv != None ) { Inv.RespawnTime = 0.0; //don't respawn Inv.BecomePickup(); } if ( dropped != None ) { dropped.RemoteRole = ROLE_DumbProxy; dropped.SetPhysics(PHYS_Falling); dropped.bCollideWorld = true; dropped.Velocity = Other.Velocity + VRand() * 280; } if ( Inv != None ) Inv.GotoState('PickUp', 'Dropped'); } if( (Other.Weapon!=None) && (Other.Weapon.Class!=Level.Game.BaseMutator.MutatedDefaultWeapon()) && Other.Weapon.bCanThrow ) { speed = VSize(Other.Velocity); weap = Other.Weapon; if (speed != 0) weap.Velocity = Normal(Other.Velocity/speed + 0.5 * VRand()) * (speed + 280); else { weap.Velocity.X = 0; weap.Velocity.Y = 0; weap.Velocity.Z = 0; } Other.TossWeapon(); if ( weap.PickupAmmoCount == 0 ) weap.PickupAmmoCount = 1; } Other.Weapon = None; Other.SelectedItem = None; for( Inv=Other.Inventory; Inv!=None; Inv=Inv.Inventory ) Inv.Destroy(); } // Return the player jumpZ scaling for this gametype function float PlayerJumpZScaling() { return 1.0; } // // Try to change a player's name. // function ChangeName( Pawn Other, coerce string S, bool bNameChange ) { if( S == "" ) return; if (LocalLog != None) LocalLog.LogNameChange(Other); if (WorldLog != None) WorldLog.LogNameChange(Other); Other.PlayerReplicationInfo.PlayerName = S; if( bNameChange ) Other.ClientMessage( NameChangedMessage $ Other.PlayerReplicationInfo.PlayerName ); } // // Return whether a team change is allowed. // function bool ChangeTeam(Pawn Other, int N) { Other.PlayerReplicationInfo.Team = N; if (LocalLog != None) LocalLog.LogTeamChange(Other); if (WorldLog != None) WorldLog.LogTeamChange(Other); return true; } // // Play an inventory respawn effect. // function float PlaySpawnEffect( inventory Inv ) { return 0.3; } // // Generate a player killled message. // static function string PlayerKillMessage( name damageType, PlayerReplicationInfo Other ) { local string message; message = " was killed by "; return message; } // // Generate a killed by creature message. // static function string CreatureKillMessage( name damageType, pawn Other ) { return " was killed by a "; } // // Send a player to a URL. // function SendPlayer( PlayerPawn aPlayer, string URL ) { aPlayer.ClientTravel( URL, TRAVEL_Relative, true ); } // // Play a teleporting special effect. // function PlayTeleportEffect( actor Incoming, bool bOut, bool bSound); // // Restart the game. // function RestartGame() { Level.ServerTravel( "?Restart", false ); } // // Whether players are allowed to broadcast messages now. // function bool AllowsBroadcast( actor broadcaster, int Len ) { local PlayerPawn P; P = PlayerPawn(BroadCaster); if ( P != None ) { // prevent message spamming if ( (Level.TimeSeconds - P.LastMessageWindow < 20) && (Level.TimeSeconds > 20) ) return false; P.LastMessageWindow = 0.75 * P.LastMessageWindow + 0.25 * Level.TimeSeconds; } SentText += Len; return (SentText < 260); } // // End of game. // function EndGame( string Reason ) { local actor A; local Mutator M; // don't end game if not really ready // mutator can set bOverTime if doesn't want game to end if ( !BaseMutator.HandleEndGame() && !SetEndCams(Reason) ) { bOverTime = true; return; } bGameEnded = true; foreach AllActors(class'Actor', A, 'EndGame') A.trigger(self, none); if (LocalLog != None) { LocalLog.LogGameEnd(Reason); LocalLog.StopLog(); if (bBatchLocal) LocalLog.ExecuteSilentLogBatcher(); LocalLog.Destroy(); LocalLog = None; } if (WorldLog != None) { WorldLog.LogGameEnd(Reason); WorldLog.StopLog(); WorldLog.ExecuteWorldLogBatcher(); WorldLog.Destroy(); WorldLog = None; } } function bool SetEndCams(string Reason) { local pawn aPawn; for ( aPawn=Level.PawnList; aPawn!=None; aPawn=aPawn.NextPawn ) if ( aPawn.bIsPlayer ) { aPawn.GotoState('GameEnded'); aPawn.ClientGameEnded(); } return true; } p+ @F;! B'! H; I;J;4K;4L;M; N;O;4^ P;4Q;4u4i+ Bv A;DF" " " " *.` *"F# @yJ\yiG4ב̅}q\U@Jгdia6 W}ǖ}rW JxdiܪiX̴B;;, xzi *H yxiqiiiz[J,5, H ,iLO\i\draB,,5,,H \H5O\OxЖ555,,,L;kqL\ii55;55,,a?qyB;5;B5 xio=[61BJB5 ',a\yaoJBek i\ 4MXM;;yHU@5 5'eiJ,#,,LWiWULG91*&5)qå@ , ),,HsOWUHU5@5,G;, ,,, ,,;,!XLGGHGG9L@,, ,)#),; J\WWLGH:x@,, ,, O*)@aqUHL 5 ;,& )qaO)5,6G# X //============================================================================= // RenderIterator. // // Created by Mark Poesch //============================================================================= class RenderIterator expands Object native noexport; struct ActorBuffer { var byte Padding[520]; }; struct ActorNode { var ActorBuffer ActorProxy; var Actor NextNode; }; var() int MaxItems; var int Index; var transient PlayerPawn Observer; var transient Actor Frame; // just a generic pointer used for binary compatibility only (FSceneNode*). Y;dZ;[; \; h+^;aW5YEKim o_;h+m`//============================================================================= // Mutator. // called by the IsRelevant() function of DeathMatchPlus // by adding new mutators, you can change actors in the level without requiring // a new game class. Multiple mutators can be linked together. //============================================================================= class Mutator expands Info native; var Mutator NextMutator; var Mutator NextDamageMutator; var Mutator NextMessageMutator; var Mutator NextHUDMutator; var bool bHUDMutator; var class DefaultWeapon; event PreBeginPlay() { //Don't call Actor PreBeginPlay() } simulated event PostRender( canvas Canvas ); function ModifyPlayer(Pawn Other) { // called by GameInfo.RestartPlayer() if ( NextMutator != None ) NextMutator.ModifyPlayer(Other); } function bool HandleRestartGame() { if ( NextMutator != None ) return NextMutator.HandleRestartGame(); return false; } function bool HandleEndGame() { // called by GameInfo.RestartPlayer() if ( NextMutator != None ) return NextMutator.HandleEndGame(); return false; } function bool HandlePickupQuery(Pawn Other, Inventory item, out byte bAllowPickup) { if ( NextMutator != None ) return NextMutator.HandlePickupQuery(Other, item, bAllowPickup); return false; } function bool PreventDeath(Pawn Killed, Pawn Killer, name damageType, vector HitLocation) { if ( NextMutator != None ) return NextMutator.PreventDeath(Killed,Killer, damageType,HitLocation); return false; } function ModifyLogin(out class SpawnClass, out string Portal, out string Options) { if ( NextMutator != None ) NextMutator.ModifyLogin(SpawnClass, Portal, Options); } function ScoreKill(Pawn Killer, Pawn Other) { // called by GameInfo.ScoreKill() if ( NextMutator != None ) NextMutator.ScoreKill(Killer, Other); } // return what should replace the default weapon // mutators further down the list override earlier mutators function Class MutatedDefaultWeapon() { local Class W; if ( NextMutator != None ) { W = NextMutator.MutatedDefaultWeapon(); if ( W == Level.Game.DefaultWeapon ) W = MyDefaultWeapon(); } else W = MyDefaultWeapon(); return W; } function Class MyDefaultWeapon() { if ( DefaultWeapon != None ) return DefaultWeapon; else return Level.Game.DefaultWeapon; } function AddMutator(Mutator M) { if ( NextMutator == None ) NextMutator = M; else NextMutator.AddMutator(M); } /* ReplaceWith() Call this function to replace an actor Other with an actor of aClass. */ function bool ReplaceWith(actor Other, string aClassName) { local Actor A; local class aClass; if ( Other.IsA('Inventory') && (Other.Location == vect(0,0,0)) ) return false; aClass = class(DynamicLoadObject(aClassName, class'Class')); if ( aClass != None ) A = Spawn(aClass,Other.Owner,Other.tag,Other.Location, Other.Rotation); if ( Other.IsA('Inventory') ) { if ( Inventory(Other).MyMarker != None ) { Inventory(Other).MyMarker.markedItem = Inventory(A); if ( Inventory(A) != None ) { Inventory(A).MyMarker = Inventory(Other).MyMarker; A.SetLocation(A.Location + (A.CollisionHeight - Other.CollisionHeight) * vect(0,0,1)); } Inventory(Other).MyMarker = None; } else if ( A.IsA('Inventory') ) { Inventory(A).bHeldItem = true; Inventory(A).Respawntime = 0.0; } } if ( A != None ) { A.event = Other.event; A.tag = Other.tag; return true; } return false; } /* Force game to always keep this actor, even if other mutators want to get rid of it */ function bool AlwaysKeep(Actor Other) { if ( NextMutator != None ) return ( NextMutator.AlwaysKeep(Other) ); return false; } function bool IsRelevant(Actor Other, out byte bSuperRelevant) { local bool bResult; // allow mutators to remove actors bResult = CheckReplacement(Other, bSuperRelevant); if ( bResult && (NextMutator != None) ) bResult = NextMutator.IsRelevant(Other, bSuperRelevant); return bResult; } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { return true; } function Mutate(string MutateString, PlayerPawn Sender) { if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { if ( NextDamageMutator != None ) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); } function bool MutatorTeamMessage( Actor Sender, Pawn Receiver, PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep ) { if ( NextMessageMutator != None ) return NextMessageMutator.MutatorTeamMessage( Sender, Receiver, PRI, S, Type, bBeep ); else return true; } function bool MutatorBroadcastMessage( Actor Sender, Pawn Receiver, out coerce string Msg, optional bool bBeep, out optional name Type ) { if ( NextMessageMutator != None ) return NextMessageMutator.MutatorBroadcastMessage( Sender, Receiver, Msg, bBeep, Type ); else return true; } function bool MutatorBroadcastLocalizedMessage( Actor Sender, Pawn Receiver, out class Message, out optional int Switch, out optional PlayerReplicationInfo RelatedPRI_1, out optional PlayerReplicationInfo RelatedPRI_2, out optional Object OptionalObject ) { if ( NextMessageMutator != None ) return NextMessageMutator.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); else return true; } // Registers the current mutator on the client to receive PostRender calls. simulated function RegisterHUDMutator() { local Pawn P; ForEach AllActors(class'Pawn', P) if ( P.IsA('PlayerPawn') && (PlayerPawn(P).myHUD != None) ) { NextHUDMutator = PlayerPawn(P).myHud.HUDMutator; PlayerPawn(P).myHUD.HUDMutator = Self; bHUDMutator = True; } } c;J eD/a0 J J a/! w.J  *~).J  Y.J  Y-u&'10 g;t&vEAwO*O)vt&s&q&p&o&n&m&C' U;!DM1v&L &G v& Kk&! -B 3-0::$ _*/a0k&b ur_* wb _b -'rb #_*10Cw_*_a/!._-!{._ , I._ ,!.'5 IV_!.'#_g- I|!.'x I!.'#*-Jw#*-J#| p;l&y;<8wO*O yl&j&i&-g&e&:' e;G<::$ -@-@ Xk;?I -o' -Q '-T'D*a(((:5o$ h;r&KoG r&b l;J0 -o( -Q (Va''' m;a$y~sA=o=du>Tu>X='Ayo~X#?za?::$Ia'$"*a'$" h{;zM-sH$z yw;c&kA=wO*O%kc&a&`&_&^&-\&?' z;A  u R`w\+-I-`-V -`}-`b Xr;h&}dR-V -h& Xs;f&ui-c-f&b t;d&eo64-0Ha/!o od&( X;Y&q:8w{*{$qY&X&[&V&U&W& u;b&fus64-0Ha/!o ob&' Xx;C {-T-T y;u%T`#-_'HDq![R::$b' bC<@*~'Ao'@ q;]&_= @ ]& F<R&Q&$wB*BQR&Q& };h||;Z&@ &-0::$ E -l W%}WZ& O WL Xhg<h<%#!::$-J' B<@mi@%g@,@t6@i =,6@i =,6@i =,@ G<R3G3 I<J EffectWhenDestroyed; var() bool bPushable; var() bool bOnlyTriggerable; var bool bSplash; var bool bBobbing; var bool bWasCarried; var() sound PushSound; var const int numLandings; // Used by engine physics. var() class contents; var() class content2; var() class content3; var() sound EndPushSound; var bool bPushSoundPlaying; simulated function FollowHolder(Actor Other); function Drop(vector newVel); function Landed(vector HitNormall) { if( bWasCarried && !SetLocation(Location) ) { if( Instigator!=None && (VSize(Instigator.Location - Location) < CollisionRadius + Instigator.CollisionRadius) ) SetLocation(Instigator.Location); TakeDamage( 1000, Instigator, Location, Vect(0,0,1)*900,'exploded' ); } bWasCarried = false; bBobbing = false; } singular function ZoneChange( ZoneInfo NewZone ) { local float splashsize; local actor splash; if( NewZone.bWaterZone ) { if( bSplash && !Region.Zone.bWaterZone && Mass<=Buoyancy && ((Abs(Velocity.Z) < 100) || (Mass == 0)) && (FRand() < 0.05) && !PlayerCanSeeMe() ) { bSplash = false; SetPhysics(PHYS_None); } else if( !Region.Zone.bWaterZone && (Velocity.Z < -200) ) { // Else play a splash. splashSize = FClamp(0.0001 * Mass * (250 - 0.5 * FMax(-600,Velocity.Z)), 1.0, 3.0 ); if( NewZone.EntrySound != None ) PlaySound(NewZone.EntrySound, SLOT_Interact, splashSize); if( NewZone.EntryActor != None ) { splash = Spawn(NewZone.EntryActor); if ( splash != None ) splash.DrawScale = splashSize; } } bSplash = true; } else if( Region.Zone.bWaterZone && (Buoyancy > Mass) ) { bBobbing = true; if( Buoyancy > 1.1 * Mass ) Buoyancy = 0.95 * Buoyancy; // waterlog else if( Buoyancy > 1.03 * Mass ) Buoyancy = 0.99 * Buoyancy; } if( NewZone.bPainZone && (NewZone.DamagePerSec > 0) ) TakeDamage(100, None, location, vect(0,0,0), NewZone.DamageType); } function Trigger( actor Other, pawn EventInstigator ) { Instigator = EventInstigator; TakeDamage( 1000, Instigator, Location, Vect(0,0,1)*900,'exploded' ); } singular function BaseChange() { local float decorMass, decorMass2; decormass= FMax(1, Mass); bBobbing = false; if( Velocity.Z < -500 ) TakeDamage( (1-Velocity.Z/30),Instigator,Location,vect(0,0,0) , 'crushed'); if( (base == None) && (bPushable || IsA('Carcass')) && (Physics == PHYS_None) ) SetPhysics(PHYS_Falling); else if( (Pawn(base) != None) && (Pawn(Base).CarriedDecoration != self) ) { Base.TakeDamage( (1-Velocity.Z/400)* decormass/Base.Mass,Instigator,Location,0.5 * Velocity , 'crushed'); Velocity.Z = 100; if (FRand() < 0.5) Velocity.X += 70; else Velocity.Y += 70; SetPhysics(PHYS_Falling); } else if( Decoration(Base)!=None && Velocity.Z<-500 ) { decorMass2 = FMax(Decoration(Base).Mass, 1); Base.TakeDamage((1 - decorMass/decorMass2 * Velocity.Z/30), Instigator, Location, 0.2 * Velocity, 'stomped'); Velocity.Z = 100; if (FRand() < 0.5) Velocity.X += 70; else Velocity.Y += 70; SetPhysics(PHYS_Falling); } else instigator = None; } function Destroyed() { local actor dropped, A; local class tempClass; if( (Pawn(Base) != None) && (Pawn(Base).CarriedDecoration == self) ) Pawn(Base).DropDecoration(); if( (Contents!=None) && !Level.bStartup ) { tempClass = Contents; if (Content2!=None && FRand()<0.3) tempClass = Content2; if (Content3!=None && FRand()<0.3) tempClass = Content3; dropped = Spawn(tempClass); dropped.RemoteRole = ROLE_DumbProxy; dropped.SetPhysics(PHYS_Falling); dropped.bCollideWorld = true; if ( inventory(dropped) != None ) inventory(dropped).GotoState('Pickup', 'Dropped'); } if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Self, None ); if ( bPushSoundPlaying ) PlaySound(EndPushSound, SLOT_Misc,0.0); Super.Destroyed(); } simulated function skinnedFrag(class FragType, texture FragSkin, vector Momentum, float DSize, int NumFrags) { local int i; local actor A, Toucher; local Fragment s; if ( bOnlyTriggerable ) return; if (Event!='') foreach AllActors( class 'Actor', A, Event ) A.Trigger( Toucher, pawn(Toucher) ); if ( Region.Zone.bDestructive ) { Destroy(); return; } for (i=0 ; i FragType, vector Momentum, float DSize, int NumFrags) { local int i; local actor A, Toucher; local Fragment s; if ( bOnlyTriggerable ) return; if (Event!='') foreach AllActors( class 'Actor', A, Event ) A.Trigger( Toucher, pawn(Toucher) ); if ( Region.Zone.bDestructive ) { Destroy(); return; } for (i=0 ; i 40) ) { bBobbing = false; oldZ = Velocity.Z; speed = VSize(Other.Velocity); Velocity = Other.Velocity * FMin(120.0, 20 + speed)/speed; if ( Physics == PHYS_None ) { Velocity.Z = 25; if (!bPushSoundPlaying) PlaySound(PushSound, SLOT_Misc,0.25); bPushSoundPlaying = True; } else Velocity.Z = oldZ; SetPhysics(PHYS_Falling); SetTimer(0.3,False); Instigator = Pawn(Other); } } Y]+q ;-Pw.q *q ??,(-o (s6 bq    q   BAbb:K:$6 A-bax)$>-b'6 so$a>(&.q  J=O=\ ݡm was killed by m  ;Rz!RlB=!RlC=!Rl`"d1I=z)T -n O+!/a0 j+Njq.q10k6(]-Ca X%Xv)Waz)Wxu)WCi?333?iXra E="Xw)c -n O+!/a0 V+NVS.S10k6(]-Ca O%Os)Qaw)Qxr)?,dQVt)QCK?333?KOra U=Y=a $> H="s AM=Q=N=i1cR=S=m1CW`C k=p)=w* VC\w* VC' XQW=[=X=!r1Z= `e={pZ K{??-o (e6 ? D?&6 ?,& #!Ir=*-P a/!\ :K:$o$Ijw.=*w.=6=QD?D?&6 ?{=?& ? !I6 BS?6 ?,Fb6 ?,Fo$IBw.<=*6 ? x.<=??=CD?&{x6 ?,& L> !n6 B+?6 ?,F:6 ?,Fo$I&* "f!XGN  a= b="c=gh=i=RC <&Z+& #??!s  d=f=qk=s~,Ws-S-x6(]-S ?^ 6 ?,d ??% L=b-x(o$vv6(]-S6 ?8w8??,?6 ?@@,wsY*asY$wvwsQ*sasQvws*sCw-x'6(]-S ^?-o '^̌??^33s?^^ ׃??^p}?^Us-Esa%,d* #sE "Z+lp=q=V.-C a  gw&*/&   ;&;a &  & #??!s -C(-o ( g=l="m=" r=s=_ t=u=` P^aN%//============================================================================= // Carcass. //============================================================================= class Carcass extends Decoration native; // Sprite. #exec Texture Import File=Textures\Corpse.pcx Name=S_Corpse Mips=Off Flags=2 // Variables. var bool bPlayerCarcass; var() byte flies; var() byte rats; var() bool bReducedHeight; var bool bDecorative; var bool bSlidingCarcass; var int CumulativeDamage; var PlayerReplicationInfo PlayerOwner; var Pawn Bugs; function CreateReplacement() { if (Bugs != None) Bugs.Destroy(); } function Destroyed() { local Actor A; if (Bugs != None) Bugs.Destroy(); Super.Destroyed(); } function Initfor(actor Other) { //implemented in subclasses } function ChunkUp(int Damage) { destroy(); } static simulated function bool AllowChunk(int N, name A) { return true; } function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { if ( !bDecorative ) { bBobbing = false; SetPhysics(PHYS_Falling); } if ( (Physics == PHYS_None) && (Momentum.Z < 0) ) Momentum.Z *= -1; Velocity += 3 * momentum/(Mass + 200); if ( DamageType == 'shot' ) Damage *= 0.4; CumulativeDamage += Damage; if ( (((Damage > 30) || !IsAnimating()) && (CumulativeDamage > 0.8 * Mass)) || (Damage > 0.4 * Mass) || ((Velocity.Z > 150) && !IsAnimating()) ) ChunkUp(Damage); if ( bDecorative ) Velocity = vect(0,0,0); } auto state Dying { ignores TakeDamage; Begin: Sleep(0.2); GotoState('Dead'); } state Dead { function Timer() { local bool bSeen; local Pawn aPawn; local float dist; if ( Region.Zone.NumCarcasses <= Region.Zone.MaxCarcasses ) { if ( !PlayerCanSeeMe() ) Destroy(); else SetTimer(2.0, false); } else Destroy(); } function AddFliesAndRats() { } function CheckZoneCarcasses() { } function BeginState() { if ( bDecorative ) lifespan = 0.0; else SetTimer(18.0, false); } Begin: FinishAnim(); Sleep(5.0); CheckZoneCarcasses(); Sleep(7.0); if ( !bDecorative && !bHidden && !Region.Zone.bWaterZone && !Region.Zone.bPainZone ) AddFliesAndRats(); } y=z=Wvaa@J a@m-a -R6(]-S6(]-EI  \p[+C>KNx$aL>q!W \|=p:"-a aA(   }=J l ~=I h ]+=[JE6(]U*6(]@,9baBa@(Ha @>A>j=[+K>Ls P>Q>X2' !{= E> z%F> J>~L>M>N>O>T>U>S-ia R>S>V>W>R)< XX>Y>f wZ*ZaX o$]QwZ*Za H> \>\]>\a\yZF" " " " */t"*"F# @3[ӎ<ye$VS"j'KȏjIзVepvNI=33'eNSKjKBc$Nv3Vk3Vr>3cSI)py$I?I>?Qc/>$2VD{%e>@f>g>Dh>Di>j>Dk>D{%D]//============================================================================= // The moving brush class. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Mover extends Brush native nativereplication; // How the mover should react when it encroaches an actor. var() enum EMoverEncroachType { ME_StopWhenEncroach, // Stop when we hit an actor. ME_ReturnWhenEncroach, // Return to previous position when we hit an actor. ME_CrushWhenEncroach, // Crush the poor helpless actor. ME_IgnoreWhenEncroach, // Ignore encroached actors. } MoverEncroachType; // How the mover moves from one position to another. var() enum EMoverGlideType { MV_MoveByTime, // Move linearly. MV_GlideByTime, // Move with smooth acceleration. } MoverGlideType; // What classes can bump trigger this mover var() enum EBumpType { BT_PlayerBump, // Can only be bumped by player. BT_PawnBump, // Can be bumped by any pawn BT_AnyBump, // Cany be bumped by any solid actor } BumpType; //----------------------------------------------------------------------------- // Keyframe numbers. var() byte KeyNum; // Current or destination keyframe. var byte PrevKeyNum; // Previous keyframe. var() const byte NumKeys; // Number of keyframes in total (0-3). var() const byte WorldRaytraceKey; // Raytrace the world with the brush here. var() const byte BrushRaytraceKey; // Raytrace the brush here. //----------------------------------------------------------------------------- // Movement parameters. var() float MoveTime; // Time to spend moving between keyframes. var() float StayOpenTime; // How long to remain open before closing. var() float OtherTime; // TriggerPound stay-open time. var() int EncroachDamage; // How much to damage encroached actors. //----------------------------------------------------------------------------- // Mover state. var() bool bTriggerOnceOnly; // Go dormant after first trigger. var() bool bSlave; // This brush is a slave. var() bool bUseTriggered; // Triggered by player grab var() bool bDamageTriggered; // Triggered by taking damage var() bool bDynamicLightMover; // Apply dynamic lighting to mover. var() name PlayerBumpEvent; // Optional event to cause when the player bumps the mover. var() name BumpEvent; // Optional event to cause when any valid bumper bumps the mover. var actor SavedTrigger; // Who we were triggered by. var() float DamageThreshold; // minimum damage to trigger var int numTriggerEvents; // number of times triggered ( count down to untrigger ) var Mover Leader; // for having multiple movers return together var Mover Follower; var() name ReturnGroup; // if none, same as tag var() float DelayTime; // delay before starting to open //----------------------------------------------------------------------------- // Audio. var(MoverSounds) sound OpeningSound; // When start opening. var(MoverSounds) sound OpenedSound; // When finished opening. var(MoverSounds) sound ClosingSound; // When start closing. var(MoverSounds) sound ClosedSound; // When finish closing. var(MoverSounds) sound MoveAmbientSound; // Optional ambient sound when moving. //----------------------------------------------------------------------------- // Internal. var vector KeyPos[8]; var rotator KeyRot[8]; var vector BasePos, OldPos, OldPrePivot, SavedPos; var rotator BaseRot, OldRot, SavedRot; // AI related var NavigationPoint myMarker; var Actor TriggerActor; var Actor TriggerActor2; var Pawn WaitingPawn; var bool bOpening, bDelaying, bClientPause; var bool bPlayerOnly; var Trigger RecommendedTrigger; // for client side replication var vector SimOldPos; var int SimOldRotPitch, SimOldRotYaw, SimOldRotRoll; var vector SimInterpolate; var vector RealPosition; var rotator RealRotation; var int ClientUpdate; replication { // Things the server should send to the client. reliable if( Role==ROLE_Authority ) SimOldPos, SimOldRotPitch, SimOldRotYaw, SimOldRotRoll, SimInterpolate, RealPosition, RealRotation; } simulated function Timer() { if ( Velocity != vect(0,0,0) ) { bClientPause = false; return; } if ( Level.NetMode == NM_Client ) { if ( ClientUpdate == 0 ) // not doing a move { if ( bClientPause ) { if ( VSize(RealPosition - Location) > 3 ) SetLocation(RealPosition); else RealPosition = Location; SetRotation(RealRotation); bClientPause = false; } else if ( RealPosition != Location ) bClientPause = true; } else bClientPause = false; } else { RealPosition = Location; RealRotation = Rotation; } } function FindTriggerActor() { local Actor A; TriggerActor = None; TriggerActor2 = None; ForEach AllActors(class 'Actor', A) if ( (A.Event == Tag) && (A.IsA('Trigger') || A.IsA('Mover')) ) { if ( A.IsA('Counter') || A.IsA('Pawn') ) { bPlayerOnly = true; return; //FIXME - handle counters } if (TriggerActor == None) TriggerActor = A; else if ( TriggerActor2 == None ) TriggerActor2 = A; } if ( TriggerActor == None ) { bPlayerOnly = (BumpType == BT_PlayerBump); return; } bPlayerOnly = ( TriggerActor.IsA('Trigger') && (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) ); if ( bPlayerOnly && ( TriggerActor2 != None) ) { bPlayerOnly = ( TriggerActor2.IsA('Trigger') && (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) ); if ( !bPlayerOnly ) { A = TriggerActor; TriggerActor = TriggerActor2; TriggerActor2 = A; } } } /* set specialgoal/movetarget or special pause if necessary if mover can't be affected by this pawn, return false Each mover state should implement the appropriate version */ function bool HandleDoor(pawn Other) { return false; } function bool HandleTriggerDoor(pawn Other) { local bool bOne, bTwo; local float DP1, DP2, Dist1, Dist2; if ( bOpening || bDelaying ) { WaitingPawn = Other; Other.SpecialPause = 2.5; return true; } if ( bPlayerOnly && !Other.bIsPlayer ) return false; if ( bUseTriggered ) { WaitingPawn = Other; Other.SpecialPause = 2.5; Trigger(Other, Other); return true; } if ( (BumpEvent == tag) || (Other.bIsPlayer && (PlayerBumpEvent == tag)) ) { WaitingPawn = Other; Other.SpecialPause = 2.5; if ( Other.Base == Self ) Trigger(Other, Other); return true; } if ( bDamageTriggered ) { WaitingPawn = Other; Other.SpecialGoal = self; if ( !Other.bCanDoSpecial || (Other.Weapon == None) ) return false; Other.Target = self; Other.bShootSpecial = true; Other.FireWeapon(); Trigger(Self, Other); Other.bFire = 0; Other.bAltFire = 0; return true; } if ( RecommendedTrigger != None ) { Other.SpecialGoal = RecommendedTrigger; Other.MoveTarget = RecommendedTrigger; return True; } bOne = ( (TriggerActor != None) && (!TriggerActor.IsA('Trigger') || Trigger(TriggerActor).IsRelevant(Other)) ); bTwo = ( (TriggerActor2 != None) && (!TriggerActor2.IsA('Trigger') || Trigger(TriggerActor2).IsRelevant(Other)) ); if ( bOne && bTwo ) { // Dotp, dist Dist1 = VSize(TriggerActor.Location - Other.Location); Dist2 = VSize(TriggerActor2.Location - Other.Location); if ( Dist1 < Dist2 ) { if ( (Dist1 < 500) && Other.ActorReachable(TriggerActor) ) bTwo = false; } else if ( (Dist2 < 500) && Other.ActorReachable(TriggerActor2) ) bOne = false; if ( bOne && bTwo ) { DP1 = Normal(Location - Other.Location) Dot (TriggerActor.Location - Other.Location)/Dist1; DP2 = Normal(Location - Other.Location) Dot (TriggerActor2.Location - Other.Location)/Dist2; if ( (DP1 > 0) && (DP2 < 0) ) bOne = false; else if ( (DP1 < 0) && (DP2 > 0) ) bTwo = false; else if ( Dist1 < Dist2 ) bTwo = false; else bOne = false; } } if ( bOne ) { Other.SpecialGoal = TriggerActor; Other.MoveTarget = TriggerActor; return True; } else if ( bTwo ) { Other.SpecialGoal = TriggerActor2; Other.MoveTarget = TriggerActor2; return True; } return false; } function Actor SpecialHandling(Pawn Other) { if ( bDamageTriggered ) { if ( !Other.bCanDoSpecial || (Other.Weapon == None) ) return None; Other.Target = self; Other.bShootSpecial = true; Other.FireWeapon(); Other.bFire = 0; Other.bAltFire = 0; return self; } if ( BumpType == BT_PlayerBump && !Other.bIsPlayer ) return None; return self; } //----------------------------------------------------------------------------- // Movement functions. // Interpolate to keyframe KeyNum in Seconds time. final function InterpolateTo( byte NewKeyNum, float Seconds ) { NewKeyNum = Clamp( NewKeyNum, 0, ArrayCount(KeyPos)-1 ); if( NewKeyNum==PrevKeyNum && KeyNum!=PrevKeyNum ) { // Reverse the movement smoothly. PhysAlpha = 1.0 - PhysAlpha; OldPos = BasePos + KeyPos[KeyNum]; OldRot = BaseRot + KeyRot[KeyNum]; } else { // Start a new movement. OldPos = Location; OldRot = Rotation; PhysAlpha = 0.0; } // Setup physics. SetPhysics(PHYS_MovingBrush); bInterpolating = true; PrevKeyNum = KeyNum; KeyNum = NewKeyNum; PhysRate = 1.0 / FMax(Seconds, 0.005); ClientUpdate++; SimOldPos = OldPos; SimOldRotYaw = OldRot.Yaw; SimOldRotPitch = OldRot.Pitch; SimOldRotRoll = OldRot.Roll; SimInterpolate.X = 100 * PhysAlpha; SimInterpolate.Y = 100 * FMax(0.01, PhysRate); SimInterpolate.Z = 256 * PrevKeyNum + KeyNum; } // Set the specified keyframe. final function SetKeyframe( byte NewKeyNum, vector NewLocation, rotator NewRotation ) { KeyNum = Clamp( NewKeyNum, 0, ArrayCount(KeyPos)-1 ); KeyPos[KeyNum] = NewLocation; KeyRot[KeyNum] = NewRotation; } // Interpolation ended. function InterpolateEnd( actor Other ) { local byte OldKeyNum; OldKeyNum = PrevKeyNum; PrevKeyNum = KeyNum; PhysAlpha = 0; ClientUpdate--; // If more than two keyframes, chain them. if( KeyNum>0 && KeyNumOldKeyNum ) { // Chain to next. InterpolateTo(KeyNum+1,MoveTime); } else { // Finished interpolating. AmbientSound = None; if ( (ClientUpdate == 0) && (Level.NetMode != NM_Client) ) { RealPosition = Location; RealRotation = Rotation; } } } //----------------------------------------------------------------------------- // Mover functions. // Notify AI that mover finished movement function FinishNotify() { local Pawn P; if ( StandingCount > 0 ) for ( P=Level.PawnList; P!=None; P=P.nextPawn ) if ( P.Base == self ) { P.StopWaiting(); if ( (P.SpecialGoal == self) || (P.SpecialGoal == myMarker) ) P.SpecialGoal = None; if ( P == WaitingPawn ) WaitingPawn = None; } if ( WaitingPawn != None ) { WaitingPawn.StopWaiting(); if ( (WaitingPawn.SpecialGoal == self) || (WaitingPawn.SpecialGoal == myMarker) ) WaitingPawn.SpecialGoal = None; WaitingPawn = None; } } // Handle when the mover finishes closing. function FinishedClosing() { // Update sound effects. PlaySound( ClosedSound, SLOT_None ); // Notify our triggering actor that we have completed. if( SavedTrigger != None ) SavedTrigger.EndEvent(); SavedTrigger = None; Instigator = None; FinishNotify(); } // Handle when the mover finishes opening. function FinishedOpening() { local actor A; // Update sound effects. PlaySound( OpenedSound, SLOT_None ); // Trigger any chained movers. if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Self, Instigator ); FinishNotify(); } // Open the mover. function DoOpen() { bOpening = true; bDelaying = false; InterpolateTo( 1, MoveTime ); PlaySound( OpeningSound, SLOT_None ); AmbientSound = MoveAmbientSound; } // Close the mover. function DoClose() { local actor A; bOpening = false; bDelaying = false; InterpolateTo( Max(0,KeyNum-1), MoveTime ); PlaySound( ClosingSound, SLOT_None ); if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.UnTrigger( Self, Instigator ); AmbientSound = MoveAmbientSound; } //----------------------------------------------------------------------------- // Engine notifications. // When mover enters gameplay. simulated function BeginPlay() { local rotator R; // timer updates real position every second in network play if ( Level.NetMode != NM_Standalone ) { if ( Level.NetMode == NM_Client ) settimer(4.0, true); else settimer(1.0, true); if ( Role < ROLE_Authority ) return; } if ( Level.NetMode != NM_Client ) { RealPosition = Location; RealRotation = Rotation; } // Init key info. Super.BeginPlay(); KeyNum = Clamp( KeyNum, 0, ArrayCount(KeyPos)-1 ); PhysAlpha = 0.0; // Set initial location. Move( BasePos + KeyPos[KeyNum] - Location ); // Initial rotation. SetRotation( BaseRot + KeyRot[KeyNum] ); // find movers in same group if ( ReturnGroup == '' ) ReturnGroup = tag; } // Immediately after mover enters gameplay. function PostBeginPlay() { local mover M; //brushes can't be deleted, so if not relevant, make it invisible and non-colliding if ( !Level.Game.IsRelevant(self) ) { SetCollision(false, false, false); SetLocation(Location + vect(0,0,20000)); // temp since still in bsp bHidden = true; } else { FindTriggerActor(); // Initialize all slaves. if( !bSlave ) { foreach AllActors( class 'Mover', M, Tag ) { if( M.bSlave ) { M.GotoState(''); M.SetBase( Self ); } } } if ( Leader == None ) { Leader = self; ForEach AllActors( class'Mover', M ) if ( (M != self) && (M.ReturnGroup == ReturnGroup) ) { M.Leader = self; M.Follower = Follower; Follower = M; } } } } function MakeGroupStop() { // Stop moving immediately. bInterpolating = false; AmbientSound = None; GotoState( , '' ); if ( Follower != None ) Follower.MakeGroupStop(); } function MakeGroupReturn() { // Abort move and reverse course. bInterpolating = false; AmbientSound = None; if( KeyNum= DamageThreshold) ) self.Trigger(self, instigatedBy); } //----------------------------------------------------------------------------- // Trigger states. // When triggered, open, wait, then close. state() TriggerOpenTimed { function bool HandleDoor(pawn Other) { return HandleTriggerDoor(Other); } function Trigger( actor Other, pawn EventInstigator ) { SavedTrigger = Other; Instigator = EventInstigator; if ( SavedTrigger != None ) SavedTrigger.BeginEvent(); GotoState( 'TriggerOpenTimed', 'Open' ); } function BeginState() { bOpening = false; } Open: Disable( 'Trigger' ); if ( DelayTime > 0 ) { bDelaying = true; Sleep(DelayTime); } DoOpen(); FinishInterpolation(); FinishedOpening(); Sleep( StayOpenTime ); if( bTriggerOnceOnly ) GotoState(''); Close: DoClose(); FinishInterpolation(); FinishedClosing(); Enable( 'Trigger' ); } // Toggle when triggered. state() TriggerToggle { function bool HandleDoor(pawn Other) { return HandleTriggerDoor(Other); } function Trigger( actor Other, pawn EventInstigator ) { SavedTrigger = Other; Instigator = EventInstigator; if ( SavedTrigger != None ) SavedTrigger.BeginEvent(); if( KeyNum==0 || KeyNum 0 ) { bDelaying = true; Sleep(DelayTime); } DoOpen(); FinishInterpolation(); FinishedOpening(); if ( SavedTrigger != None ) SavedTrigger.EndEvent(); Stop; Close: DoClose(); FinishInterpolation(); FinishedClosing(); } // Open when triggered, close when get untriggered. state() TriggerControl { function bool HandleDoor(pawn Other) { return HandleTriggerDoor(Other); } function Trigger( actor Other, pawn EventInstigator ) { numTriggerEvents++; SavedTrigger = Other; Instigator = EventInstigator; if ( SavedTrigger != None ) SavedTrigger.BeginEvent(); GotoState( 'TriggerControl', 'Open' ); } function UnTrigger( actor Other, pawn EventInstigator ) { numTriggerEvents--; if ( numTriggerEvents <=0 ) { numTriggerEvents = 0; SavedTrigger = Other; Instigator = EventInstigator; SavedTrigger.BeginEvent(); GotoState( 'TriggerControl', 'Close' ); } } function BeginState() { numTriggerEvents = 0; } Open: if ( DelayTime > 0 ) { bDelaying = true; Sleep(DelayTime); } DoOpen(); FinishInterpolation(); FinishedOpening(); SavedTrigger.EndEvent(); if( bTriggerOnceOnly ) GotoState(''); Stop; Close: DoClose(); FinishInterpolation(); FinishedClosing(); } // Start pounding when triggered. state() TriggerPound { function bool HandleDoor(pawn Other) { return HandleTriggerDoor(Other); } function Trigger( actor Other, pawn EventInstigator ) { numTriggerEvents++; SavedTrigger = Other; Instigator = EventInstigator; GotoState( 'TriggerPound', 'Open' ); } function UnTrigger( actor Other, pawn EventInstigator ) { numTriggerEvents--; if ( numTriggerEvents <= 0 ) { numTriggerEvents = 0; SavedTrigger = None; Instigator = None; GotoState( 'TriggerPound', 'Close' ); } } function BeginState() { numTriggerEvents = 0; } Open: if ( DelayTime > 0 ) { bDelaying = true; Sleep(DelayTime); } DoOpen(); FinishInterpolation(); Sleep(OtherTime); Close: DoClose(); FinishInterpolation(); Sleep(StayOpenTime); if( bTriggerOnceOnly ) GotoState(''); if( SavedTrigger != None ) goto 'Open'; } //----------------------------------------------------------------------------- // Bump states. // Open when bumped, wait, then close. state() BumpOpenTimed { function bool HandleDoor(pawn Other) { if ( (BumpType == BT_PlayerBump) && !Other.bIsPlayer ) return false; Bump(Other); WaitingPawn = Other; Other.SpecialPause = 2.5; return true; } function Bump( actor Other ) { if ( (BumpType != BT_AnyBump) && (Pawn(Other) == None) ) return; if ( (BumpType == BT_PlayerBump) && !Pawn(Other).bIsPlayer ) return; if ( (BumpType == BT_PawnBump) && (Other.Mass < 10) ) return; Global.Bump( Other ); SavedTrigger = None; Instigator = Pawn(Other); GotoState( 'BumpOpenTimed', 'Open' ); } Open: Disable( 'Bump' ); if ( DelayTime > 0 ) { bDelaying = true; Sleep(DelayTime); } DoOpen(); FinishInterpolation(); FinishedOpening(); Sleep( StayOpenTime ); if( bTriggerOnceOnly ) GotoState(''); Close: DoClose(); FinishInterpolation(); FinishedClosing(); Enable( 'Bump' ); } // Open when bumped, close when reset. state() BumpButton { function bool HandleDoor(pawn Other) { if ( (BumpType == BT_PlayerBump) && !Other.bIsPlayer ) return false; Bump(Other); return false; //let pawn try to move around this button } function Bump( actor Other ) { if ( (BumpType != BT_AnyBump) && (Pawn(Other) == None) ) return; if ( (BumpType == BT_PlayerBump) && !Pawn(Other).bIsPlayer ) return; if ( (BumpType == BT_PawnBump) && (Other.Mass < 10) ) return; Global.Bump( Other ); SavedTrigger = Other; Instigator = Pawn( Other ); GotoState( 'BumpButton', 'Open' ); } function BeginEvent() { bSlave=true; } function EndEvent() { bSlave = false; Instigator = None; GotoState( 'BumpButton', 'Close' ); } Open: Disable( 'Bump' ); if ( DelayTime > 0 ) { bDelaying = true; Sleep(DelayTime); } DoOpen(); FinishInterpolation(); FinishedOpening(); if( bTriggerOnceOnly ) GotoState(''); if( bSlave ) Stop; Close: DoClose(); FinishInterpolation(); FinishedClosing(); Enable( 'Bump' ); } //----------------------------------------------------------------------------- // Stand states. // Open when stood on, wait, then close. state() StandOpenTimed { function bool HandleDoor(pawn Other) { if ( bPlayerOnly && !Other.bIsPlayer ) return false; Other.SpecialPause = 2.5; WaitingPawn = Other; if ( Other.Base == self ) Attach(Other); return true; } function Attach( actor Other ) { local pawn P; P = Pawn(Other); if ( (BumpType != BT_AnyBump) && (P == None) ) return; if ( (BumpType == BT_PlayerBump) && !P.bIsPlayer ) return; if ( (BumpType == BT_PawnBump) && (Other.Mass < 10) ) return; SavedTrigger = None; GotoState( 'StandOpenTimed', 'Open' ); } Open: Disable( 'Attach' ); if ( DelayTime > 0 ) { bDelaying = true; Sleep(DelayTime); } DoOpen(); FinishInterpolation(); FinishedOpening(); Sleep( StayOpenTime ); if( bTriggerOnceOnly ) GotoState(''); Close: DoClose(); FinishInterpolation(); FinishedClosing(); Enable( 'Attach' ); } n>o>g ^|v!#f?%-N'afqa-Ba^J-L q!pa-Cu! GJ6dA?B?JY|v!;#f?%-N'afqa-BB-L q!L-E pa-Cu!; GL6dwt>]\f.]-::$ rf* S::$f- {::$]??,  T*q!g !6 Z>kq>r>b ] \c!-K -( |  @] _r = ' s>u>c#x>MA|`w*X*/a0 ||+Q(|a/!|a/! |a/!k|a/!-K'0 rw*w|rX*X|10rw*-K::$ -Kwa/!:.MwG:$-K wX*-KXa/!:.MwG:$-K|wwXX| |>y>SHQ?R?uyU|v!;#f?%-N'afqa-Ba^J-L q!pa-Cu!; GJ6dCD?CY-E (&*q!J!G  }E?LsY -E ' pM?d;X"::$r.d* M::$.d- u::$d??,  8;dTd&.dq!J!6 CiH@l]CJ;ala/!\la/!^l,'*l  #!I(la/!n(la/! rl*la(f%l0f&l  #!Iw.lww*w-<I!;lw*ww=P6w  6  w8333?8wx :w :$O F':w :$O vzla/!T.l-.la.l\$z.la.l@$':w :$l e&(:w :$( F?B"I?"m"K?"bg]AW5&::$g-(;g( Xk"W?X?rHzQ|f?%-N'afqa-aj)pa-a^N-L q!_wT* !6 G-6dpS?F ;nDT"::$r.F * M::$.F - u::$F ??,  8;F T*&.F q!u!6 bB]cxST&::$B-(;B]BB|  @' sT?d?e?qMtf?%-N'afqa-BTCJ-L q!pa-C GK6\Z?E]Q O% i2UI  -B 3-0::$ UwU*w.U*.U-.UzUU> p\?]?j:P5O3O%O%T*&*q!r!G U? g_?i)3O+OTi)&E,q!r!6 ^?bu%].gOeu% Y?y%J, d -B 3-0::$ O-y%-R'f$b-R(ff X2ky; k?n%w i Un% o?p?pIpf?%-N'afqa-BEwT*TCpa-C GF6@Xf?M O% pg?g)jLLOJO%O%Tg)&w%TLq!q!G gj?q%KEOTq%&o%7wT*TLq!q!6 q2g%}} t@ -B 3-0::$ ig% m2r%x ^ z]r%o= bm%][Kem% i?p%Fc w p%b b?l%Cn b v l% p2x?y?m F|v!#f?%-N'afqa-Ba^J-L q!pa-Cu! GJ6@dgq?k%HlTk%&f%0wT*TL^:Y%:Y:Hq!p!6jq!p!G bj%]bHej% a?c2l;' [? t? ?d p`%7D.,-| ?`%_% ]% z?F -} ( g|?b%E>Tb%&a%0wT*TLq!m !6 Hbd%]vEed% w2vS ~wY::$::$ -vvqvkuvA?restart$( h?c%C &N&-0::$ /a0 gKge%c%10 q@{? r?g; H3a{&]t8aiai` ;aa/!R a tN"wa *ra Ya *Zaa a  "wZ*Z&aZfa TZZ@Z laZ ^aZ Dat ka F@G@P@v4:O-x (~*+:Y:Hq !63q !GMwY*Yv B@I@J@"R"M@wR@F)N93-x (~*q !1wY*YF \M N O P Q @S@A!6F :a(((a  #@F-R'`-E /a0 /AQA-E Aq!Aa*10rO *O /a0 /AwAAf f AO AYYYA10 eV@W@wJ3S::$:::$a@'Ca?'S::$ ::$} a "eY=:Y%,&va d:Yt a+a<W:YMf !f Q @RVmRb)V^@_p71z-} (-N(W =%:Y&U aN+$m+!/a0 _+l_ j&10~Z U@QKXMc)Q X@vM[c)v)A)OZ@nP\:d )n)sd@q`04-} '-N(W $U a`)$~Z \@mR_d)m _@ST`d)S }2f@TBk/Ma_)$E+!/a0 T+DT &10E i@C.:aa)$$wT*TCT*&*E a@PVa e)P+\ b@j E k@BE+:c%BNwB*rB=BjrBPrBPBP*rB]]*BBM w]*]jr]Pr]P]P*]* ~?jS Y -B 3-0::$ [[jccj pm@n@je(uHHYvL _:Y%:Y:uW =:Y&U :Y:O+&:Y:uW =:Y&U ~*L %::$} a " g@IXbHe)IW [%f[';Y=:[%%,&:YtZ%:YM\% ul@k Yce)k o@P[fe)P*q_PAV@nL!-| 5n-l rn**n_n-g'n`n}$no$::$n-* p@O]g f)Ov@D^mf)D)t)Bw@[`nlg)[)q)y)Bpz@t@0m Fx3m E3D3}!F R3M n OI-M 6M %6M %a+M  tb3e5-} -N]33|  @'V-K3-(-[]33|  @33' YQ!3- IQ]33|  @r3=33'-| ]33PY3-l r3*(3_3-g'3`33}$3o$'w{ *3P{ 3F{ '-ww*2wa/!.Mw :3-AwX*2Xa/!.MX :3N--A` w  3  a X  3  ` a ` ?3bw-A(FFa ?3bX-(N--Az 3  w  3  ` r 3  X  3  a z?% r?%-(N,z?% r?%-A(NF` a -A(N-(-3Pw3Fw'-A3PX3FX'( x@Laog )L)Z&@A~@bpgCAHcq h)H%DAdrQh FAresh)r[Kcyi)KHAfi- IAmgj)mJAj L^)j! #-D ( ::$L %-D m} ?,a }x} a+a -D (} -D '-D (} a " crj FBW3X3JWm  T)}@I!o J`I!F!q!K tVA U  I YAWD//============================================================================= // Parent class of all weapons. //============================================================================= class Weapon extends Inventory abstract native nativereplication; #exec Texture Import File=Textures\Weapon.pcx Name=S_Weapon Mips=Off Flags=2 //----------------------------------------------------------------------------- // Weapon ammo/firing information: // Two-element arrays here are defined for normal fire (0) and alt fire (1). var() float MaxTargetRange; // Maximum distance to target. var() class AmmoName; // Type of ammo used. var() byte ReloadCount; // Amount of ammo depletion before reloading. 0 if no reloading is done. var() int PickupAmmoCount; // Amount of ammo initially in pick-up item. var travel ammo AmmoType; // Inventory Ammo being used. var bool bPointing; // Indicates weapon is being pointed var() bool bInstantHit; // If true, instant hit rather than projectile firing weapon var() bool bAltInstantHit; // If true, instant hit rather than projectile firing weapon for AltFire var(WeaponAI) bool bWarnTarget; // When firing projectile, warn the target var(WeaponAI) bool bAltWarnTarget; // When firing alternate projectile, warn the target var bool bWeaponUp; // Used in Active State var bool bChangeWeapon; // Used in Active State var bool bLockedOn; var(WeaponAI) bool bSplashDamage; // used by bot AI var() bool bCanThrow; //if true, player can toss this weapon out var(WeaponAI) bool bRecommendSplashDamage; //if true, bot preferentially tries to use splash damage // rather than direct hits var(WeaponAI) bool bRecommendAltSplashDamage; //if true, bot preferentially tries to use splash damage // rather than direct hits var() bool bWeaponStay; var() bool bOwnsCrosshair; // this weapon is responsible for drawing its own crosshair (in its postrender function) var bool bHideWeapon; // if true, weapon is not rendered var(WeaponAI) bool bMeleeWeapon; //Weapon is only a melee weapon var() bool bRapidFire; // used by human animations in determining firing animation (for still firing) var bool bSpecialIcon; var() float FiringSpeed; // used by human animations in determining firing speed var() vector FireOffset; // Offset from drawing location for projectile/trace start var() class ProjectileClass; var() class AltProjectileClass; var() name MyDamageType; var() name AltDamageType; var float ProjectileSpeed; var float AltProjectileSpeed; var float AimError; // Aim Error for bots (note this value doubled if instant hit weapon) var() float ShakeMag; var() float ShakeTime; var() float ShakeVert; var(WeaponAI) float AIRating; var(WeaponAI) float RefireRate; var(WeaponAI) float AltRefireRate; //----------------------------------------------------------------------------- // Sound Assignments var() sound FireSound; var() sound AltFireSound; var() sound CockingSound; var() sound SelectSound; var() sound Misc1Sound; var() sound Misc2Sound; var() sound Misc3Sound; var() Localized string MessageNoAmmo; var() Localized string DeathMessage; var() Color NameColor; // used when drawing name on HUD var Rotator AdjustedAim; //----------------------------------------------------------------------------- // Muzzle Flash // weapon is responsible for setting and clearing bMuzzleFlash whenever it wants the // MFTexture drawn on the canvas (see RenderOverlays() ) var bool bSetFlashTime; var(MuzzleFlash) bool bDrawMuzzleFlash; var byte bMuzzleFlash; var float FlashTime; var(MuzzleFlash) float MuzzleScale, FlashY, FlashO, FlashC, FlashLength; var(MuzzleFlash) int FlashS; // size of (square) texture/2 var(MuzzleFlash) texture MFTexture; var(MuzzleFlash) texture MuzzleFlare; var(MuzzleFlash) float FlareOffset; // Network replication // replication { // Things the server should send to the client. reliable if( bNetOwner && (Role==ROLE_Authority) ) AmmoType, bLockedOn, bHideWeapon; } //============================================================================= // Inventory travelling across servers. event TravelPostAccept() { Super.TravelPostAccept(); if ( Pawn(Owner) == None ) return; if ( AmmoName != None ) { AmmoType = Ammo(Pawn(Owner).FindInventoryType(AmmoName)); if ( AmmoType == None ) { AmmoType = Spawn(AmmoName); // Create ammo type required Pawn(Owner).AddInventory(AmmoType); // and add to player's inventory AmmoType.BecomeItem(); AmmoType.AmmoAmount = PickUpAmmoCount; AmmoType.GotoState('Idle2'); } } if ( self == Pawn(Owner).Weapon ) BringUp(); else GoToState('Idle2'); } function Destroyed() { Super.Destroyed(); if( (Pawn(Owner)!=None) && (Pawn(Owner).Weapon == self) ) Pawn(Owner).Weapon = None; } //============================================================================= // Weapon rendering // Draw first person view of inventory simulated event RenderOverlays( canvas Canvas ) { local rotator NewRot; local bool bPlayerOwner; local int Hand; local PlayerPawn PlayerOwner; if ( bHideWeapon || (Owner == None) ) return; PlayerOwner = PlayerPawn(Owner); if ( PlayerOwner != None ) { if ( PlayerOwner.DesiredFOV != PlayerOwner.DefaultFOV ) return; bPlayerOwner = true; Hand = PlayerOwner.Handedness; if ( (Level.NetMode == NM_Client) && (Hand == 2) ) { bHideWeapon = true; return; } } if ( !bPlayerOwner || (PlayerOwner.Player == None) ) Pawn(Owner).WalkBob = vect(0,0,0); if ( (bMuzzleFlash > 0) && bDrawMuzzleFlash && Level.bHighDetailMode && (MFTexture != None) ) { MuzzleScale = Default.MuzzleScale * Canvas.ClipX/640.0; if ( !bSetFlashTime ) { bSetFlashTime = true; FlashTime = Level.TimeSeconds + FlashLength; } else if ( FlashTime < Level.TimeSeconds ) bMuzzleFlash = 0; if ( bMuzzleFlash > 0 ) { if ( Hand == 0 ) Canvas.SetPos(Canvas.ClipX/2 - 0.5 * MuzzleScale * FlashS + Canvas.ClipX * (-0.2 * Default.FireOffset.Y * FlashO), Canvas.ClipY/2 - 0.5 * MuzzleScale * FlashS + Canvas.ClipY * (FlashY + FlashC)); else Canvas.SetPos(Canvas.ClipX/2 - 0.5 * MuzzleScale * FlashS + Canvas.ClipX * (Hand * Default.FireOffset.Y * FlashO), Canvas.ClipY/2 - 0.5 * MuzzleScale * FlashS + Canvas.ClipY * FlashY); Canvas.Style = 3; Canvas.DrawIcon(MFTexture, MuzzleScale); Canvas.Style = 1; } } else bSetFlashTime = false; SetLocation( Owner.Location + CalcDrawOffset() ); NewRot = Pawn(Owner).ViewRotation; if ( Hand == 0 ) newRot.Roll = -2 * Default.Rotation.Roll; else newRot.Roll = Default.Rotation.Roll * Hand; setRotation(newRot); Canvas.DrawActor(self, false); } //------------------------------------------------------- // AI related functions function PostBeginPlay() { Super.PostBeginPlay(); SetWeaponStay(); MaxDesireability = 1.2 * AIRating; if ( ProjectileClass != None ) { ProjectileSpeed = ProjectileClass.Default.Speed; MyDamageType = ProjectileClass.Default.MyDamageType; } if ( AltProjectileClass != None ) { AltProjectileSpeed = AltProjectileClass.Default.Speed; AltDamageType = AltProjectileClass.Default.MyDamageType; } } function bool SplashJump() { return false; } function SetWeaponStay() { bWeaponStay = bWeaponStay || Level.Game.bCoopWeaponMode; } // tell the bot how much it wants this weapon // called when the bot is trying to decide which inventory item to go after next event float BotDesireability(Pawn Bot) { local Weapon AlreadyHas; local float desire; // bots adjust their desire for their favorite weapons desire = MaxDesireability + Bot.AdjustDesireFor(self); // see if bot already has a weapon of this type AlreadyHas = Weapon(Bot.FindInventoryType(class)); if ( AlreadyHas != None ) { if ( (RespawnTime < 10) && ( bHidden || (AlreadyHas.AmmoType == None) || (AlreadyHas.AmmoType.AmmoAmount < AlreadyHas.AmmoType.MaxAmmo)) ) return 0; // can't pick it up if weapon stay is on if ( (!bHeldItem || bTossedOut) && bWeaponStay ) return 0; if ( AlreadyHas.AmmoType == None ) return 0.25 * desire; // bot wants this weapon for the ammo it holds if ( AlreadyHas.AmmoType.AmmoAmount > 0 ) return FMax( 0.25 * desire, AlreadyHas.AmmoType.MaxDesireability * FMin(1, 0.15 * AlreadyHas.AmmoType.MaxAmmo/AlreadyHas.AmmoType.AmmoAmount) ); else return 0.05; } // incentivize bot to get this weapon if it doesn't have a good weapon already if ( (Bot.Weapon == None) || (Bot.Weapon.AIRating <= 0.4) ) return 2*desire; return desire; } function float RateSelf( out int bUseAltMode ) { if ( (AmmoType != None) && (AmmoType.AmmoAmount <=0) ) return -2; bUseAltMode = int(FRand() < 0.4); return (AIRating + FRand() * 0.05); } // return delta to combat style function float SuggestAttackStyle() { return 0.0; } function float SuggestDefenseStyle() { return 0.0; } //------------------------------------------------------- simulated function PreRender( canvas Canvas ); simulated function PostRender( canvas Canvas ); function ClientWeaponEvent(name EventType); function bool HandlePickupQuery( inventory Item ) { local int OldAmmo; local Pawn P; if (Item.Class == Class) { if ( Weapon(item).bWeaponStay && (!Weapon(item).bHeldItem || Weapon(item).bTossedOut) ) return true; P = Pawn(Owner); if ( AmmoType != None ) { OldAmmo = AmmoType.AmmoAmount; if ( AmmoType.AddAmmo(Weapon(Item).PickupAmmoCount) && (OldAmmo == 0) && (P.Weapon.class != item.class) && !P.bNeverSwitchOnPickup ) WeaponSet(P); } if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Item, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Item, Pawn(Owner)); if (Item.PickupMessageClass == None) P.ClientMessage(Item.PickupMessage, 'Pickup'); else P.ReceiveLocalizedMessage( Item.PickupMessageClass, 0, None, None, item.Class ); Item.PlaySound(Item.PickupSound); Item.SetRespawn(); return true; } if ( Inventory == None ) return false; return Inventory.HandlePickupQuery(Item); } // set which hand is holding weapon function setHand(float Hand) { if ( Hand == 2 ) { PlayerViewOffset.Y = 0; FireOffset.Y = 0; bHideWeapon = true; return; } else bHideWeapon = false; if ( Hand == 0 ) { PlayerViewOffset.X = Default.PlayerViewOffset.X * 0.88; PlayerViewOffset.Y = -0.2 * Default.PlayerViewOffset.Y; PlayerViewOffset.Z = Default.PlayerViewOffset.Z * 1.12; } else { PlayerViewOffset.X = Default.PlayerViewOffset.X; PlayerViewOffset.Y = Default.PlayerViewOffset.Y * Hand; PlayerViewOffset.Z = Default.PlayerViewOffset.Z; } PlayerViewOffset *= 100; //scale since network passes vector components as ints FireOffset.Y = Default.FireOffset.Y * Hand; } // // Change weapon to that specificed by F matching inventory weapon's Inventory Group. function Weapon WeaponChange( byte F ) { local Weapon newWeapon; if ( InventoryGroup == F ) { if ( (AmmoType != None) && (AmmoType.AmmoAmount <= 0) ) { if ( Inventory == None ) newWeapon = None; else newWeapon = Inventory.WeaponChange(F); if ( newWeapon == None ) Pawn(Owner).ClientMessage( ItemName$MessageNoAmmo ); return newWeapon; } else return self; } else if ( Inventory == None ) return None; else return Inventory.WeaponChange(F); } // Either give this inventory to player Other, or spawn a copy // and give it to the player Other, setting up original to be respawned. // Also add Ammo to Other's inventory if it doesn't already exist // function inventory SpawnCopy( pawn Other ) { local inventory Copy; local Weapon newWeapon; if( Level.Game.ShouldRespawn(self) ) { Copy = spawn(Class,Other,,,rot(0,0,0)); Copy.Tag = Tag; Copy.Event = Event; if ( !bWeaponStay ) GotoState('Sleeping'); } else Copy = self; Copy.RespawnTime = 0.0; Copy.bHeldItem = true; Copy.bTossedOut = false; Copy.GiveTo( Other ); newWeapon = Weapon(Copy); newWeapon.Instigator = Other; newWeapon.GiveAmmo(Other); newWeapon.SetSwitchPriority(Other); if ( !Other.bNeverSwitchOnPickup ) newWeapon.WeaponSet(Other); newWeapon.AmbientGlow = 0; return newWeapon; } function SetSwitchPriority(pawn Other) { local int i; local name temp, carried; if ( PlayerPawn(Other) != None ) { for ( i=0; i 0)) ) rating += 0.21; // tend to stick with same weapon } if ( inventory != None ) { Recommended = inventory.RecommendWeapon(oldRating, oldMode); if ( (Recommended != None) && (oldRating > rating) ) { rating = oldRating; bUseAltMode = oldMode; return Recommended; } } return self; } // Toss this weapon out function DropFrom(vector StartLocation) { if ( !SetLocation(StartLocation) ) return; AIRating = Default.AIRating; bMuzzleFlash = 0; AmbientSound = None; if ( AmmoType != None ) { PickupAmmoCount = AmmoType.AmmoAmount; AmmoType.AmmoAmount = 0; } Super.DropFrom(StartLocation); } // Become a pickup function BecomePickup() { Super.BecomePickup(); SetDisplayProperties(Default.Style, Default.Texture, Default.bUnlit, Default.bMeshEnviromap ); } simulated function TweenToStill(); //************************************************************************************** // // Firing functions and states // function CheckVisibility() { local Pawn PawnOwner; PawnOwner = Pawn(Owner); if( Owner.bHidden && (PawnOwner.Health > 0) && (PawnOwner.Visibility < PawnOwner.Default.Visibility) ) { Owner.bHidden = false; PawnOwner.Visibility = PawnOwner.Default.Visibility; } } simulated function bool ClientFire( float Value ) { return true; } function ForceFire(); function ForceAltFire(); function Fire( float Value ) { if (AmmoType.UseAmmo(1)) { GotoState('NormalFire'); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); bPointing=True; PlayFiring(); if ( !bRapidFire && (FiringSpeed > 0) ) Pawn(Owner).PlayRecoil(FiringSpeed); if ( bInstantHit ) TraceFire(0.0); else ProjectileFire(ProjectileClass, ProjectileSpeed, bWarnTarget); if ( Owner.bHidden ) CheckVisibility(); } } simulated function bool ClientAltFire( float Value ) { return true; } function AltFire( float Value ) { if (AmmoType.UseAmmo(1)) { GotoState('AltFiring'); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); bPointing=True; PlayAltFiring(); if ( !bRapidFire && (FiringSpeed > 0) ) Pawn(Owner).PlayRecoil(FiringSpeed); if ( bAltInstantHit ) TraceFire(0.0); else ProjectileFire(AltProjectileClass, AltProjectileSpeed, bAltWarnTarget); if ( Owner.bHidden ) CheckVisibility(); } } simulated function PlayFiring() { //Play firing animation and sound } simulated function PlayAltFiring() { //Play alt firing animation and sound } function Projectile ProjectileFire(class ProjClass, float ProjSpeed, bool bWarn) { local Vector Start, X,Y,Z; local Pawn PawnOwner; PawnOwner = Pawn(Owner); Owner.MakeNoise(PawnOwner.SoundDampening); GetAxes(PawnOwner.ViewRotation,X,Y,Z); Start = Owner.Location + CalcDrawOffset() + FireOffset.X * X + FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = PawnOwner.AdjustAim(ProjSpeed, Start, AimError, True, bWarn); return Spawn(ProjClass,,, Start,AdjustedAim); } 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 } // Finish a firing sequence function Finish() { local Pawn PawnOwner; if ( bChangeWeapon ) { GotoState('DownWeapon'); return; } PawnOwner = Pawn(Owner); if ( PlayerPawn(Owner) == None ) { if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) { PawnOwner.StopFiring(); PawnOwner.SwitchToBestWeapon(); if ( bChangeWeapon ) GotoState('DownWeapon'); } else if ( (PawnOwner.bFire != 0) && (FRand() < RefireRate) ) Global.Fire(0); else if ( (PawnOwner.bAltFire != 0) && (FRand() < AltRefireRate) ) Global.AltFire(0); else { PawnOwner.StopFiring(); GotoState('Idle'); } return; } if ( ((AmmoType != None) && (AmmoType.AmmoAmount<=0)) || (PawnOwner.Weapon != self) ) GotoState('Idle'); else if ( PawnOwner.bFire!=0 ) Global.Fire(0); else if ( PawnOwner.bAltFire!=0 ) Global.AltFire(0); else GotoState('Idle'); } /////////////////////////////////////////////////////// state NormalFire { function Fire(float F) { } function AltFire(float F) { } Begin: FinishAnim(); Finish(); } //////////////////////////////////////////////////////// state AltFiring { function Fire(float F) { } function AltFire(float F) { } Begin: FinishAnim(); Finish(); } //********************************************************************************** // Weapon is up, but not firing 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 ) Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) AltFire(0.0); Disable('AnimEnd'); PlayIdleAnim(); } // // Bring newly active weapon up // Bring newly active weapon up state Active { function Fire(float F) { } function AltFire(float F) { } function bool PutDown() { if ( bWeaponUp || (AnimFrame < 0.75) ) GotoState('DownWeapon'); else bChangeWeapon = true; return True; } function BeginState() { bChangeWeapon = false; } Begin: FinishAnim(); if ( bChangeWeapon ) GotoState('DownWeapon'); bWeaponUp = True; PlayPostSelect(); FinishAnim(); Finish(); } // // Putting down weapon in favor of a new one. // 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(); Pawn(Owner).ChangedWeapon(); } simulated function ClientPutDown(Weapon NextWeapon); function BringUp() { if ( Owner.IsA('PlayerPawn') ) { SetHand(PlayerPawn(Owner).Handedness); PlayerPawn(Owner).EndZoom(); } bWeaponUp = false; PlaySelect(); GotoState('Active'); } function RaiseUp(Weapon OldWeapon) { BringUp(); } function bool PutDown() { bChangeWeapon = true; return true; } function TweenDown() { if ( (AnimSequence != '') && (GetAnimGroup(AnimSequence) == 'Select') ) TweenAnim( AnimSequence, AnimFrame * 0.4 ); else PlayAnim('Down', 1.0, 0.05); } function TweenSelect() { TweenAnim('Select',0.001); } function PlaySelect() { PlayAnim('Select',1.0,0.0); Owner.PlaySound(SelectSound, SLOT_Misc, Pawn(Owner).SoundDampening); } function PlayPostSelect() { } function PlayIdleAnim() { } ]APZ ^AYZ _Af ~UZ:a!A?aS)$.o  aAnyZa&!Ao: f3R _w0TrR *,rR CC*sws*vrsR sR ss3R a* bAg qYYN:s!a%s!Aa&s`>La!K?L= cAdATkY -E'' fAgAq fX@ OANA}j hA@Z XXAa/! K.Z.~-m(f q!v  jAkAfVW lAmA@PnW0g a.A \ HBIBv 2UU<a-Eq!@-m'Yav \,nAKV:-E(c $.f.! pArATEoV,.f.!' eAQAxk f ~A@B+AJV s BC^ n7D' qAvAxAj3{w &[a::$ @ .{?r@ *@ {&*0@ !D  s GB%AAV DCZ VB /PBQBT R-k(=w*-%.Gb:.}%%:.o%+v!7P \JB/7U -E( KBLBT&T0$-m `@?q!@,-E'' f MBNB+"wT s OB%PT TBUBy Qav \ RBSBT R q!@' [7WRP YBZBbPav \ f VBWB+Q s XB%aQ ^BavL-Eq!@ a.r.*w*-%ajaG-Eq!@:a}% Q%8%:ao% P%8+ajq!T ?w*-%waq!Tb:a}%8%:ao%8+q!T f [B\B+P s ]B%P bBcB` L y DB~l ~3rYGR[~r:1[rr[-W 'q%~q,2{qJ[~qJ,[tVqJ[h qJ[&|VACCEPT-w '|VDENY-w (t[~h *M[Jzh [r[-W -w [qttzh r-W -w [qq@-W pppDenied connection for r with IP policy [J-W  C4jetoQ:j:$:j:$ {\ wjD*[ jvVjD[ jvVjDCj vT iT }T }C&-Kii[ Q-KpppAttempted to use illegal skin from package i for [ S .T -K wS *Ij `S 'pppFailed to load T  so load \ {\ S .\ Ij `S (  iBR|tI| .b| o |  Q H G M   V6WQ 6WH 6WG D |  J$tIM D?,k((hM իR?H ?իR?G ?Q 9D h?'Q l| DmuhM ` lmuQ H G  dBeBfBgBhBwBM,m{Gp .bp o p  w{}d  V6Ww6W{6W}D p  JO%dDk'-N%aM, dD  wlBzm oBnBmBym rBpun AC_ F qzB{B|BE4Nwvu V4~} x v~ dtf \F CCECV UA FCGCQ RA' ICcmH@c.-Rc*%!:cf:cf-R(cfcf HCKCm=? }BcLC|9W?$cGgf-X-c ^MC@M)>ea @ h h c $~*Xw*~--%^@ V'PCg a;#a/! g Eg iUr.w.p*r*-%g = W>w*gaqgwg* qg g qUgg XC_D<9r_(Nr_*_!_A'_EEC_!_!q!_T'_!C(q!( d Mo%q)M)N)o)I)b)aQCdtq )d)n$SCs!ps)s!)L!)u)v )}gg_C`CE~7z%a/! ij(xqw*-%hr.nx<w UCTCytYCK"ztu )K")}\C]C^CCcCKl 5 r|* .K Y|Nw* H~a|K Tf-~q!T bCj(fCK ^2><w.K *l%gl,2]l.K bw=l l@ l:w<l,2l.K b!l.K b@  22l,2&bl.K bl.K b@ @ bl ZCk!}v)k!)~)@"))H")J"nkCIg/Y{ UiaI "iQQi++x-pq!dii@i-q'i-z(i ZIV.iV&IV lIV ^I@I-V V DIVQ$V ZS!S x)S!)W!)V!)Y!)\!)^!@ gCQ!By)Q!hCJ!Csz)J!a'pCk}l,:Z:kw*-%Gr*R *aR  }krR *. p}OR r** }k lCXjCiCE  {itCQ KLZ):Q ?,6@6W-T ' B-T (Q ?%6@6@Ga?6@L6@6@6@)\?6@6@6@6@Q 6@6@@?,d6W6WQ  XnCmCs &{ R \wCEN+m%c?rEe.E-p0.E-q.E-z'n.w*x-H.E~ x%(wnEn-V Dn`w * EE.w * EE.rEC*n EV!/n%?EC%**EEaEuEZ'Lr*( NE rCqCu'{ @|C}C~$ % et H0|)t )m )p@xCW L1n})W )V )k)b )j !x~CCe"$ @DADX!$ BDCDa.$ DDEDz# FD{+i#J'w*-%{+A>h L= XIDj tg Jj t o.j Ywo*@?, R-Rro*1o-oz-q-z-pro*>g o-%>g oJ?>?oz?o-L=rj *j h >@g g  NDl,-p-p -S @zCyCP2}#KDQ3} ))S oODPDv\( JQD!JlJ?h Qwr *Pr yg(r Rw{ *O{ yf({ R A'VDPs-T  r* M .wM *VM eM l -f'xDM Z::$ x,-T ' -frM H*. `#3:c %-c(-n wv*CCPw Do-o-o'H$A+H$c $0:c %Rx%PVPw?,?C?Y PwL6WWPd?,?C?Y Pdi*PVPw?,?C?Y Pw?x6WWPd?,?C?Y PdiPV $P^vCPV $;-o(a   VK . x%6K 6"6K 6"xa+K Pa(  k4aC z bPfDf{,HPFw.*r..* Qj_5~)j)n)pWDec6 )e)_XDVT=()V)Z)b0YDNW> )N)U1ZDGX? )G)Q2\DIY@H )I)M3]DGZA #)G)O)T)S)h)k)m5^Dr^B)r)@))x6}4Q:7t yQ'Ft:QNC:N&'H(:q%Q-N  :q&Q-] !:q,Q-^ !:q,Q-` +Q-d ::$DQ-e .::$::$+Q-l ::$(-Gw.Q*.Q-(Qc(Q-s |+Q-B!b(Q-x `(' _Dv_C)v)h)k)H7aDc`D˃)c)n)q)r)h8N] gDGe] r.* w|*.. Y|r*a|. Tf-~q!Tr.@q!T |~jD GglDgpgT FgCqDrDS)tDuDOwD@D yD44J5k*h5:c k*=zc az' E class Decal expands Actor native; // properties var int MultiDecalLevel; var float LastRenderedTime; // native stuff. var const array SurfList; simulated native function Texture AttachDecal( float TraceDistance, optional vector DecalDir ); // trace forward and attach this decal to surfaces. simulated native function DetachDecal(); // detach this decal from all surfaces. simulated event PostBeginPlay() { AttachToSurface(); } simulated function AttachToSurface() { if(AttachDecal(100) == None) // trace 100 units ahead in direction of current rotation Destroy(); } simulated event Destroyed() { DetachDecal(); Super.Destroyed(); } event Update(Actor L); }D~DH cDfe c  @EKrf B*a @AE!K  BEe _CEM%f  )M%)L%GEP bwć n= HE@IEcD]OH| )])`%4K//============================================================================= // SavedMove is used during network play to buffer recent client moves, // for use when the server modifies the clients actual position, etc. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class SavedMove extends Info; // also stores info in Acceleration attribute var SavedMove NextMove; // Next move in linked list. var float TimeStamp; // Time of this move. var float Delta; // Distance moved. var bool bRun; var bool bDuck; var bool bPressedJump; var bool bFire; var bool bAltFire; var bool bForceFire; var bool bForceAltFire; var EDodgeDir DodgeMove; // Dodge info. final function Clear() { TimeStamp = 0; Delta = 0; DodgeMove = DODGE_None; Acceleration = vect(0,0,0); bFire = false; bRun = false; bDuck = false; bAltFire = false; bPressedJump = false; bForceFire = false; bForceAltFire = false; } |//============================================================================= // Keypoint, the base class of invisible actors which mark things. //============================================================================= class Keypoint extends Actor abstract native; // Sprite. #exec Texture Import File=Textures\Keypoint.pcx Name=S_Keypoint Mips=Off Flags=2 F" " " " */?*"F# @汩};+zՖq,Lggdz z[[pȠ,}R#^Ȉz#N;Ȉr;,rr#^r߽ѶʽӽZP8("   ("-87(!.AC{{tk]TC88" "!8:PZ{l]TAA=<-$"" !-8:T]PPCF8 NewClass; Super.PostBeginPlay(); NewClass = class( DynamicLoadObject( "Unreali.Lamp4", class'Class' ) ); if( NewClass!=None ) Mesh = NewClass.Default.Mesh; } function touch(actor other) { if (other == owner) { if ( Owner.IsA('PlayerPawn') ) PlayerPawn(owner).ShowPath(); Destroy(); } } y PEj*& <:rj*7a/! .u a @B! EL@BUnreali.Lamp4 JwB*DBD Q5P\ \D//============================================================================= // Pickup items. //============================================================================= class Pickup extends Inventory abstract native nativereplication; var inventory Inv; var travel int NumCopies; var() bool bCanHaveMultipleCopies; // if player can possess more than one of this var() bool bCanActivate; // Item can be selected and activated var() localized String ExpireMessage; // Messages shown when pickup charge runs out var() bool bAutoActivate; replication { // Things the server should send to the client. reliable if( bNetOwner && (Role==ROLE_Authority) ) NumCopies; } function TravelPostAccept() { Super.TravelPostAccept(); PickupFunction(Pawn(Owner)); } // // Advanced function which lets existing items in a pawn's inventory // prevent the pawn from picking something up. Return true to abort pickup // or if item handles the pickup function bool HandlePickupQuery( inventory Item ) { if (item.class == class) { if (bCanHaveMultipleCopies) { // for items like Artifact NumCopies++; if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Item, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Item, Pawn(Owner)); if ( Item.PickupMessageClass == None ) Pawn(Owner).ClientMessage(item.PickupMessage, 'Pickup'); else Pawn(Owner).ReceiveLocalizedMessage( item.PickupMessageClass, 0, None, None, item.Class ); Item.PlaySound (Item.PickupSound,,2.0); Item.SetRespawn(); } else if ( bDisplayableInv ) { if ( Charge0) ) return; Super.Activate(); } } w'UEVEbXEg} |fw.*-P(.Wr.C.Wr.C.C*w * K.w * K.MwG*.?G%**f.  m*ai+a \KKCw.*.-S-p N% \ JEHIIń )H)^"&4ZE[ERvU  V5_mLD*4w * -o' -Q 'a(((:5o$ z's]E/r( 9_^Eo _y% r+T&Z oT| g.Tmw * E.Tw * E.T-Pr.TC*.TC| /-P-p.T-S| K[rC*.T V!/.T?C%**au @.N| R.T WE\MJ )\)A'4_E{IKW ){)k(4K%gElJ"  S5w vy FdćKz !z !.I c}y ~NIw~*2~-~a/!Ww *w r* ry~y -Kz ~ y z -K2~ y z -K~~MQ `^hE] mEG] R. dEUa}?)}N'w}*}-}a/!Ww *w r* r%v}UyvTS}?UyvTS}?UyvTS}}M ym*/O0//============================================================================= // Ammo. //============================================================================= class Ammo extends Pickup abstract native nativereplication; #exec Texture Import File=Textures\Ammo.pcx Name=S_Ammo Mips=Off Flags=2 var() travel int AmmoAmount; var() travel int MaxAmmo; var() class ParentAmmo; // Class of ammo to be represented in inventory var() byte UsedInWeaponSlot[10]; var ammo PAmmo; // Network replication // replication { // Things the server should send to the client. reliable if( bNetOwner && (Role==ROLE_Authority) ) AmmoAmount; } event float BotDesireability(Pawn Bot) { local Ammo AlreadyHas; if ( ParentAmmo != None ) AlreadyHas = Ammo(Bot.FindInventoryType(ParentAmmo)); else AlreadyHas = Ammo(Bot.FindInventoryType(Class)); if ( AlreadyHas == None ) return (0.35 * MaxDesireability); if ( AlreadyHas.AmmoAmount == 0 ) return MaxDesireability; if (AlreadyHas.AmmoAmount >= AlreadyHas.MaxAmmo) return -1; return ( MaxDesireability * FMin(1, 0.15 * MaxAmmo/AlreadyHas.AmmoAmount) ); } function bool HandlePickupQuery( inventory Item ) { if ( (class == item.class) || (ClassIsChildOf(item.class, class'Ammo') && (class == Ammo(item).parentammo)) ) { if (AmmoAmount==MaxAmmo) return true; if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Item, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Item, Pawn(Owner)); if (Item.PickupMessageClass == None) Pawn(Owner).ClientMessage( Item.PickupMessage, 'Pickup' ); else Pawn(Owner).ReceiveLocalizedMessage( Item.PickupMessageClass, 0, None, None, item.Class ); item.PlaySound( item.PickupSound ); AddAmmo(Ammo(item).AmmoAmount); item.SetRespawn(); return true; } if ( Inventory == None ) return false; return Inventory.HandlePickupQuery(Item); } // This function is called by an actor that wants to use ammo. // Return true if ammo exists // function bool UseAmmo(int AmountNeeded) { if (AmmoAmount < AmountNeeded) return False; // Can't do it AmmoAmount -= AmountNeeded; return True; } // If we can, add ammo and return true. // We we are at max ammo, return false // function bool AddAmmo(int AmmoToAdd) { If (AmmoAmount >= MaxAmmo) return false; AmmoAmount += AmmoToAdd; if (AmmoAmount > MaxAmmo) AmmoAmount = MaxAmmo; return true; } function inventory SpawnCopy( Pawn Other ) { local Inventory Copy; if ( parentammo != None ) { Copy = spawn(parentammo,Other,,,rot(0,0,0)); Copy.Tag = Tag; Copy.Event = Event; Copy.Instigator = Other; Ammo(Copy).AmmoAmount = AmmoAmount; Copy.BecomeItem(); Other.AddInventory( Copy ); Copy.GotoState(''); if ( Level.Game.ShouldRespawn(self) ) GotoState('Sleeping'); else Destroy(); return Copy; } Copy = Super.SpawnCopy(Other); Ammo(Copy).AmmoAmount = AmmoAmount; return Copy; } sqEs g`& wI *MaI s "MQQM++M&s .M--Mfs TMMq! Uq!daMMss .M--M vEx*HVQ ;-z(-x*7-z-z' @[*-e'!c!qc(q!q  ]jh* -A -A'/a8 SFDwSS  D@?@j?@S;FSlDjj&S  ի?S8S;իjpo10-A( Y"MyENSL_!-N(-N' hu5iM8!-sH$i K%|EhN0rh6ah r.hI c-z'w * Eh.w * Eh.;rhC*. hV!/n.%?hC%**hhahuH.h-hZ'r*( Nh ] tEgL X-Tt -wI *}.T YI L}.T Ydr}*33>J~}-%J}-}zJ?>?z?}- o @@aqvjXo ~q.Po qq}qo &o ~q.q }CF Qw" " " " *.V*"F# @W,,O,,dx,dW,_g,},/_n,}O,,W,P_n,}dx,d,SEn,d_g,}O,,͘>d,_n,}dx,d>S_n,}_g,}SSjSEn,d_n,}SSI3>>d,_n,}SN/[SSS>En,dSBRNVcSv/>d,SحSS//?cvvccjvS$,SI,i';cccjj$?$SS'};[gO,eVc/Svvc$IS';pؔec'z/cj/>I,};p',VBOd?vv/IIN',;V/,pؔ,j>SS?N^c>;V6,j/IScc>3O6V?,v/>cVcV6O^NLj$SVcjj;Ov$>VcpN^zNj$VVvVVvvNcjvvSjv$ Y //============================================================================= // VoicePack. //============================================================================= class VoicePack extends Info abstract; /* (exec function to do ServerVoiceMessage, and use in OrdersMenu) (voicepack configuration for players and bots) */ /* ClientInitialize() sets up playing the appropriate voice segment, and returns a string representation of the message */ function ClientInitialize(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageIndex); function PlayerSpeech(int Type, int Index, int Callsign); GFHF\ KF@ W IFJFLFMFNFq//============================================================================= // ScoreBoard //============================================================================= class ScoreBoard extends Info; var font RegFont; var HUD OwnerHUD; function ShowScores( canvas Canvas ); function ShowMiniScores( Canvas Canvas ); function PreBeginPlay() { } vQFOk RFSFy J TFUFC  VF)Y-//============================================================================= // GameReplicationInfo. //============================================================================= class GameReplicationInfo extends ReplicationInfo native nativereplication; var string GameName; // Assigned by GameInfo. var string GameClass; // Assigned by GameInfo. var bool bTeamGame; // Assigned by GameInfo. var bool bClassicDeathMessages; var bool bStopCountDown; var int RemainingTime, ElapsedTime, RemainingMinute; var float SecondCount; var int NumPlayers; var int SumFrags; var float UpdateTimer; var() globalconfig string ServerName; // Name of the server, i.e.: Bob's Server. var() globalconfig string ShortName; // Abbreviated name of server, i.e.: B's Serv (stupid example) var() globalconfig string AdminName; // Name of the server admin. var() globalconfig string AdminEmail; // Email address of the server admin. var() globalconfig int Region; // Region of the game server. var() globalconfig string MOTDLine1; // Message var() globalconfig string MOTDLine2; // Of var() globalconfig string MOTDLine3; // The var() globalconfig string MOTDLine4; // Day var string GameEndedComments; // set by gameinfo when game ends var PlayerReplicationInfo PRIArray[32]; replication { reliable if ( Role == ROLE_Authority ) RemainingMinute, bStopCountDown, GameEndedComments, NumPlayers; reliable if ( bNetInitial && (Role==ROLE_Authority) ) GameName, GameClass, bTeamGame, ServerName, ShortName, AdminName, AdminEmail, Region, MOTDLine1, MOTDLine2, MOTDLine3, MOTDLine4,RemainingTime, ElapsedTime; } simulated function PostBeginPlay() { if( Level.NetMode == NM_Client ) { // clear variables so we don't display our own values if the server has them left blank ServerName = ""; AdminName = ""; AdminEmail = ""; MOTDLine1 = ""; MOTDLine2 = ""; MOTDLine3 = ""; MOTDLine4 = ""; } SecondCount = Level.TimeSeconds; SetTimer(0.2, true); } simulated function Timer() { local PlayerReplicationInfo PRI; local int i, FragAcc; if ( Level.NetMode == NM_Client ) { if (Level.TimeSeconds - SecondCount >= Level.TimeDilation) { ElapsedTime++; if ( RemainingMinute != 0 ) { RemainingTime = RemainingMinute; RemainingMinute = 0; } if ( (RemainingTime > 0) && !bStopCountDown ) RemainingTime--; SecondCount += Level.TimeDilation; } } for (i=0; i<32; i++) PRIArray[i] = None; i=0; foreach AllActors(class'PlayerReplicationInfo', PRI) { if ( i < 32 ) PRIArray[i++] = PRI; } // Update various information. UpdateTimer = 0; for (i=0; i<32; i++) if (PRIArray[i] != None) FragAcc += PRIArray[i].Score; SumFrags = FragAcc; if ( Level.Game != None ) NumPlayers = Level.Game.NumPlayers; } LYFvEl::$$DzG%cE%FEE%F% -H%FDz@%@, @N *@@%/a0 v@, @N v10b*@%N@, Dw@N *mD@N J @ E%mw *D% | @\(!0nO::$utcNHIMD$aL>' F//============================================================================= // Actor: The base class of all actors. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Actor extends Object abstract native nativereplication; // Imported data (during full rebuild). #exec Texture Import File=Textures\S_Actor.pcx Name=S_Actor Mips=Off Flags=2 // Flags. var(Advanced) const bool bStatic; // Does not move or change over time. var(Advanced) bool bHidden; // Is hidden during gameplay. var(Advanced) const bool bNoDelete; // Cannot be deleted during play. var bool bAnimFinished; // Unlooped animation sequence has finished. var bool bAnimLoop; // Whether animation is looping. var bool bAnimNotify; // Whether a notify is applied to the current sequence. var bool bAnimByOwner; // Animation dictated by owner. var const bool bDeleteMe; // About to be deleted. var transient const bool bAssimilated; // Actor dynamics are assimilated in world geometry. var transient const bool bTicked; // Actor has been updated. var transient bool bLightChanged; // Recalculate this light's lighting now. var bool bDynamicLight; // Temporarily treat this as a dynamic light. var bool bTimerLoop; // Timer loops (else is one-shot). // Other flags. var(Advanced) bool bCanTeleport; // This actor can be teleported. var(Advanced) bool bOwnerNoSee; // Everything but the owner can see this actor. var(Advanced) bool bOnlyOwnerSee; // Only owner can see this actor. var Const bool bIsMover; // Is a mover. var(Advanced) bool bAlwaysRelevant; // Always relevant for network. var Const bool bAlwaysTick; // Update even when players-only. var(Advanced) bool bHighDetail; // Only show up on high-detail. var(Advanced) bool bStasis; // In StandAlone games, turn off if not in a recently rendered zone turned off if bCanStasis and physics = PHYS_None or PHYS_Rotating. var(Advanced) bool bForceStasis; // Force stasis when not recently rendered, even if physics not none or rotating. var const bool bIsPawn; // True only for pawns. var(Advanced) const bool bNetTemporary; // Tear-off simulation in network play. var(Advanced) const bool bNetOptional; // Actor should only be replicated if bandwidth available. var bool bReplicateInstigator; // Replicate instigator to client (used by bNetTemporary projectiles). var bool bTrailerSameRotation; // If PHYS_Trailer and true, have same rotation as owner. var bool bTrailerPrePivot; // If PHYS_Trailer and true, offset from owner by PrePivot. var bool bClientAnim; var bool bSimFall; // dumb proxy should simulate fall // Priority Parameters // Actor's current physics mode. var(Movement) const enum EPhysics { PHYS_None, PHYS_Walking, PHYS_Falling, PHYS_Swimming, PHYS_Flying, PHYS_Rotating, PHYS_Projectile, PHYS_Rolling, PHYS_Interpolating, PHYS_MovingBrush, PHYS_Spider, PHYS_Trailer } Physics; // Net variables. enum ENetRole { ROLE_None, // No role at all. ROLE_DumbProxy, // Dumb proxy of this actor. ROLE_SimulatedProxy, // Locally simulated proxy of this actor. ROLE_AutonomousProxy, // Locally autonomous proxy of this actor. ROLE_Authority, // Authoritative control over the actor. }; var ENetRole Role; var(Networking) ENetRole RemoteRole; var const transient int NetTag; // Owner. var const Actor Owner; // Owner actor. var(Object) name InitialState; var(Object) name Group; // Execution and timer variables. var float TimerRate; // Timer event, 0=no timer. var const float TimerCounter; // Counts up until it reaches TimerRate. var(Advanced) float LifeSpan; // How old the object lives before dying, 0=forever. // Animation variables. var(Display) name AnimSequence; // Animation sequence we're playing. var(Display) float AnimFrame; // Current animation frame, 0.0 to 1.0. var(Display) float AnimRate; // Animation rate in frames per second, 0=none, negative=velocity scaled. var float TweenRate; // Tween-into rate. var Animation SkelAnim; var(Display) float LODBias; //----------------------------------------------------------------------------- // Structures. // Identifies a unique convex volume in the world. struct PointRegion { var zoneinfo Zone; // Zone. var int iLeaf; // Bsp leaf. var byte ZoneNumber; // Zone number. }; //----------------------------------------------------------------------------- // Major actor properties. // Scriptable. var const LevelInfo Level; // Level this actor is on. var transient const Level XLevel; // Level object. var(Events) name Tag; // Actor's tag name. var(Events) name Event; // The event this actor causes. var Actor Target; // Actor we're aiming at (other uses as well). var Pawn Instigator; // Pawn responsible for damage. var(Sound) sound AmbientSound; // Ambient sound effect. var Inventory Inventory; // Inventory chain. var const Actor Base; // Moving brush actor we're standing on. var const PointRegion Region; // Region this actor is in. var(Movement) name AttachTag; // Internal. var const byte StandingCount; // Count of actors standing on this actor. var const byte MiscNumber; // Internal use. var const byte LatentByte; // Internal latent function use. var const int LatentInt; // Internal latent function use. var const float LatentFloat; // Internal latent function use. var const actor LatentActor; // Internal latent function use. var const actor Touching[4]; // List of touching actors. var const actor Deleted; // Next actor in just-deleted chain. // Internal tags. var const transient int CollisionTag, LightingTag, OtherTag, ExtraTag, SpecialTag; // The actor's position and rotation. var(Movement) const vector Location; // Actor's location; use Move to set. var(Movement) const rotator Rotation; // Rotation. var const vector OldLocation; // Actor's old location one tick ago. var const vector ColLocation; // Actor's old location one move ago. var(Movement) vector Velocity; // Velocity. var vector Acceleration; // Acceleration. var(Filter) float OddsOfAppearing; // 0-1 - chance actor will appear in relevant game modes. //Editing flags var(Advanced) bool bHiddenEd; // Is hidden during editing. var(Advanced) bool bDirectional; // Actor shows direction arrow during editing. var const bool bSelected; // Selected in UnrealEd. var const bool bMemorized; // Remembered in UnrealEd. var const bool bHighlighted; // Highlighted in UnrealEd. var bool bEdLocked; // Locked in editor (no movement or rotation). var(Advanced) bool bEdShouldSnap; // Snap to grid in editor. var transient bool bEdSnap; // Should snap to grid in UnrealEd. var transient const bool bTempEditor; // Internal UnrealEd. // What kind of gameplay scenarios to appear in. var(Filter) bool bDifficulty0; // Appear in difficulty 0. var(Filter) bool bDifficulty1; // Appear in difficulty 1. var(Filter) bool bDifficulty2; // Appear in difficulty 2. var(Filter) bool bDifficulty3; // Appear in difficulty 3. var(Filter) bool bSinglePlayer; // Appear in single player. var(Filter) bool bNet; // Appear in regular network play. var(Filter) bool bNetSpecial; // Appear in special network play mode. // set to prevent re-initializing of actors spawned during level startup var bool bScriptInitialized; // Editor support. var Actor HitActor; // Actor to return instead of this one, if hit. //----------------------------------------------------------------------------- // Display properties. // Drawing effect. var(Display) enum EDrawType { DT_None, DT_Sprite, DT_Mesh, DT_Brush, DT_RopeSprite, DT_VerticalSprite, DT_Terraform, DT_SpriteAnimOnce, } DrawType; // Style for rendering sprites, meshes. var(Display) enum ERenderStyle { STY_None, STY_Normal, STY_Masked, STY_Translucent, STY_Modulated, } Style; // Other display properties. var(Display) texture Sprite; // Sprite texture if DrawType=DT_Sprite. var(Display) texture Texture; // Misc texture. var(Display) texture Skin; // Special skin or enviro map texture. var(Display) mesh Mesh; // Mesh if DrawType=DT_Mesh. var const export model Brush; // Brush if DrawType=DT_Brush. var(Display) float DrawScale; // Scaling factor, 1.0=normal size. var vector PrePivot; // Offset from box center for drawing. var(Display) float ScaleGlow; // Multiplies lighting. var(Display) float VisibilityRadius;// Actor is drawn if viewer is within its visibility var(Display) float VisibilityHeight;// cylinder. Zero=infinite visibility. var(Display) byte AmbientGlow; // Ambient brightness, or 255=pulsing. var(Display) byte Fatness; // Fatness (mesh distortion). var(Display) float SpriteProjForward;// Distance forward to draw sprite from actual location. // Display. var(Display) bool bUnlit; // Lights don't affect actor. var(Display) bool bNoSmooth; // Don't smooth actor's texture. var(Display) bool bParticles; // Mesh is a particle system. var(Display) bool bRandomFrame; // Particles use a random texture from among the default texture and the multiskins textures var(Display) bool bMeshEnviroMap; // Environment-map the mesh. var(Display) bool bMeshCurvy; // Curvy mesh. var(Display) bool bFilterByVolume; // Filter this sprite by its Visibility volume. // Not yet implemented. var(Display) bool bShadowCast; // Casts shadows. // Advanced. var bool bHurtEntry; // keep HurtRadius from being reentrant var(Advanced) bool bGameRelevant; // Always relevant for game var bool bCarriedItem; // being carried, and not responsible for displaying self, so don't replicated location and rotation var bool bForcePhysicsUpdate; // force a physics update for simulated pawns var(Advanced) bool bIsSecretGoal; // This actor counts in the "secret" total. var(Advanced) bool bIsKillGoal; // This actor counts in the "death" toll. var(Advanced) bool bIsItemGoal; // This actor counts in the "item" count. var(Advanced) bool bCollideWhenPlacing; // This actor collides with the world when placing. var(Advanced) bool bTravel; // Actor is capable of travelling among servers. var(Advanced) bool bMovable; // Actor is capable of travelling among servers. // Multiple skin support. var(Display) texture MultiSkins[8]; //----------------------------------------------------------------------------- // Sound. // Ambient sound. var(Sound) byte SoundRadius; // Radius of ambient sound. var(Sound) byte SoundVolume; // Volume of amient sound. var(Sound) byte SoundPitch; // Sound pitch shift, 64.0=none. // Regular sounds. var(Sound) float TransientSoundVolume; var(Sound) float TransientSoundRadius; // Sound slots for actors. enum ESoundSlot { SLOT_None, SLOT_Misc, SLOT_Pain, SLOT_Interact, SLOT_Ambient, SLOT_Talk, SLOT_Interface, }; // Music transitions. enum EMusicTransition { MTRAN_None, MTRAN_Instant, MTRAN_Segue, MTRAN_Fade, MTRAN_FastFade, MTRAN_SlowFade, }; //----------------------------------------------------------------------------- // Collision. // Collision size. var(Collision) const float CollisionRadius; // Radius of collision cyllinder. var(Collision) const float CollisionHeight; // Half-height cyllinder. // Collision flags. var(Collision) const bool bCollideActors; // Collides with other actors. var(Collision) bool bCollideWorld; // Collides with the world. var(Collision) bool bBlockActors; // Blocks other nonplayer actors. var(Collision) bool bBlockPlayers; // Blocks other player actors. var(Collision) bool bProjTarget; // Projectiles should potentially target this actor. //----------------------------------------------------------------------------- // Lighting. // Light modulation. var(Lighting) enum ELightType { LT_None, LT_Steady, LT_Pulse, LT_Blink, LT_Flicker, LT_Strobe, LT_BackdropLight, LT_SubtlePulse, LT_TexturePaletteOnce, LT_TexturePaletteLoop } LightType; // Spatial light effect to use. var(Lighting) enum ELightEffect { LE_None, LE_TorchWaver, LE_FireWaver, LE_WateryShimmer, LE_Searchlight, LE_SlowWave, LE_FastWave, LE_CloudCast, LE_StaticSpot, LE_Shock, LE_Disco, LE_Warp, LE_Spotlight, LE_NonIncidence, LE_Shell, LE_OmniBumpMap, LE_Interference, LE_Cylinder, LE_Rotor, LE_Unused } LightEffect; // Lighting info. var(LightColor) byte LightBrightness, LightHue, LightSaturation; // Light properties. var(Lighting) byte LightRadius, LightPeriod, LightPhase, LightCone, VolumeBrightness, VolumeRadius, VolumeFog; // Lighting. var(Lighting) bool bSpecialLit; // Only affects special-lit surfaces. var(Lighting) bool bActorShadows; // Light casts actor shadows. var(Lighting) bool bCorona; // Light uses Skin as a corona. var(Lighting) bool bLensFlare; // Whether to use zone lens flare. //----------------------------------------------------------------------------- // Physics. // Options. var(Movement) bool bBounce; // Bounces when hits ground fast. var(Movement) bool bFixedRotationDir; // Fixed direction of rotation. var(Movement) bool bRotateToDesired; // Rotate to DesiredRotation. var bool bInterpolating; // Performing interpolating. var const bool bJustTeleported; // Used by engine physics - not valid for scripts. // Dodge move direction. var enum EDodgeDir { DODGE_None, DODGE_Left, DODGE_Right, DODGE_Forward, DODGE_Back, DODGE_Active, DODGE_Done } DodgeDir; // Physics properties. var(Movement) float Mass; // Mass of this actor. var(Movement) float Buoyancy; // Water buoyancy. var(Movement) rotator RotationRate; // Change in rotation per second. var(Movement) rotator DesiredRotation; // Physics will rotate pawn to this if bRotateToDesired. var float PhysAlpha; // Interpolating position, 0.0-1.0. var float PhysRate; // Interpolation rate per second. var Actor PendingTouch; // Actor touched during move which wants to add an effect after the movement completes //----------------------------------------------------------------------------- // Animation. // Animation control. var float AnimLast; // Last frame. var float AnimMinRate; // Minimum rate for velocity-scaled animation. var float OldAnimRate; // Animation rate of previous animation (= AnimRate until animation completes). var plane SimAnim; // replicated to simulated proxies. //----------------------------------------------------------------------------- // Networking. // Network control. var(Networking) float NetPriority; // Higher priorities means update it more frequently. var(Networking) float NetUpdateFrequency; // How many seconds between net updates. // Symmetric network flags, valid during replication only. var const bool bNetInitial; // Initial network update. var const bool bNetOwner; // Player owns this actor. var const bool bNetRelevant; // Actor is currently relevant. Only valid server side, only when replicating variables. var const bool bNetSee; // Player sees it in network play. var const bool bNetHear; // Player hears it in network play. var const bool bNetFeel; // Player collides with/feels it in network play. var const bool bSimulatedPawn; // True if Pawn and simulated proxy. var const bool bDemoRecording; // True we are currently demo recording var const bool bClientDemoRecording;// True we are currently recording a client-side demo var const bool bClientDemoNetFunc;// True if we're client-side demo recording and this call originated from the remote. //----------------------------------------------------------------------------- // Enums. // Travelling from server to server. enum ETravelType { TRAVEL_Absolute, // Absolute URL. TRAVEL_Partial, // Partial (carry name, reset server). TRAVEL_Relative, // Relative URL. }; // Input system states. enum EInputAction { IST_None, // Not performing special input processing. IST_Press, // Handling a keypress or button press. IST_Hold, // Handling holding a key or button. IST_Release, // Handling a key or button release. IST_Axis, // Handling analog axis movement. }; // Input keys. enum EInputKey { /*00*/ IK_None ,IK_LeftMouse ,IK_RightMouse ,IK_Cancel , /*04*/ IK_MiddleMouse ,IK_Unknown05 ,IK_Unknown06 ,IK_Unknown07 , /*08*/ IK_Backspace ,IK_Tab ,IK_Unknown0A ,IK_Unknown0B , /*0C*/ IK_Unknown0C ,IK_Enter ,IK_Unknown0E ,IK_Unknown0F , /*10*/ IK_Shift ,IK_Ctrl ,IK_Alt ,IK_Pause , /*14*/ IK_CapsLock ,IK_Unknown15 ,IK_Unknown16 ,IK_Unknown17 , /*18*/ IK_Unknown18 ,IK_Unknown19 ,IK_Unknown1A ,IK_Escape , /*1C*/ IK_Unknown1C ,IK_Unknown1D ,IK_Unknown1E ,IK_Unknown1F , /*20*/ IK_Space ,IK_PageUp ,IK_PageDown ,IK_End , /*24*/ IK_Home ,IK_Left ,IK_Up ,IK_Right , /*28*/ IK_Down ,IK_Select ,IK_Print ,IK_Execute , /*2C*/ IK_PrintScrn ,IK_Insert ,IK_Delete ,IK_Help , /*30*/ IK_0 ,IK_1 ,IK_2 ,IK_3 , /*34*/ IK_4 ,IK_5 ,IK_6 ,IK_7 , /*38*/ IK_8 ,IK_9 ,IK_Unknown3A ,IK_Unknown3B , /*3C*/ IK_Unknown3C ,IK_Unknown3D ,IK_Unknown3E ,IK_Unknown3F , /*40*/ IK_Unknown40 ,IK_A ,IK_B ,IK_C , /*44*/ IK_D ,IK_E ,IK_F ,IK_G , /*48*/ IK_H ,IK_I ,IK_J ,IK_K , /*4C*/ IK_L ,IK_M ,IK_N ,IK_O , /*50*/ IK_P ,IK_Q ,IK_R ,IK_S , /*54*/ IK_T ,IK_U ,IK_V ,IK_W , /*58*/ IK_X ,IK_Y ,IK_Z ,IK_Unknown5B , /*5C*/ IK_Unknown5C ,IK_Unknown5D ,IK_Unknown5E ,IK_Unknown5F , /*60*/ IK_NumPad0 ,IK_NumPad1 ,IK_NumPad2 ,IK_NumPad3 , /*64*/ IK_NumPad4 ,IK_NumPad5 ,IK_NumPad6 ,IK_NumPad7 , /*68*/ IK_NumPad8 ,IK_NumPad9 ,IK_GreyStar ,IK_GreyPlus , /*6C*/ IK_Separator ,IK_GreyMinus ,IK_NumPadPeriod,IK_GreySlash , /*70*/ IK_F1 ,IK_F2 ,IK_F3 ,IK_F4 , /*74*/ IK_F5 ,IK_F6 ,IK_F7 ,IK_F8 , /*78*/ IK_F9 ,IK_F10 ,IK_F11 ,IK_F12 , /*7C*/ IK_F13 ,IK_F14 ,IK_F15 ,IK_F16 , /*80*/ IK_F17 ,IK_F18 ,IK_F19 ,IK_F20 , /*84*/ IK_F21 ,IK_F22 ,IK_F23 ,IK_F24 , /*88*/ IK_Unknown88 ,IK_Unknown89 ,IK_Unknown8A ,IK_Unknown8B , /*8C*/ IK_Unknown8C ,IK_Unknown8D ,IK_Unknown8E ,IK_Unknown8F , /*90*/ IK_NumLock ,IK_ScrollLock ,IK_Unknown92 ,IK_Unknown93 , /*94*/ IK_Unknown94 ,IK_Unknown95 ,IK_Unknown96 ,IK_Unknown97 , /*98*/ IK_Unknown98 ,IK_Unknown99 ,IK_Unknown9A ,IK_Unknown9B , /*9C*/ IK_Unknown9C ,IK_Unknown9D ,IK_Unknown9E ,IK_Unknown9F , /*A0*/ IK_LShift ,IK_RShift ,IK_LControl ,IK_RControl , /*A4*/ IK_UnknownA4 ,IK_UnknownA5 ,IK_UnknownA6 ,IK_UnknownA7 , /*A8*/ IK_UnknownA8 ,IK_UnknownA9 ,IK_UnknownAA ,IK_UnknownAB , /*AC*/ IK_UnknownAC ,IK_UnknownAD ,IK_UnknownAE ,IK_UnknownAF , /*B0*/ IK_UnknownB0 ,IK_UnknownB1 ,IK_UnknownB2 ,IK_UnknownB3 , /*B4*/ IK_UnknownB4 ,IK_UnknownB5 ,IK_UnknownB6 ,IK_UnknownB7 , /*B8*/ IK_UnknownB8 ,IK_UnknownB9 ,IK_Semicolon ,IK_Equals , /*BC*/ IK_Comma ,IK_Minus ,IK_Period ,IK_Slash , /*C0*/ IK_Tilde ,IK_UnknownC1 ,IK_UnknownC2 ,IK_UnknownC3 , /*C4*/ IK_UnknownC4 ,IK_UnknownC5 ,IK_UnknownC6 ,IK_UnknownC7 , /*C8*/ IK_Joy1 ,IK_Joy2 ,IK_Joy3 ,IK_Joy4 , /*CC*/ IK_Joy5 ,IK_Joy6 ,IK_Joy7 ,IK_Joy8 , /*D0*/ IK_Joy9 ,IK_Joy10 ,IK_Joy11 ,IK_Joy12 , /*D4*/ IK_Joy13 ,IK_Joy14 ,IK_Joy15 ,IK_Joy16 , /*D8*/ IK_UnknownD8 ,IK_UnknownD9 ,IK_UnknownDA ,IK_LeftBracket , /*DC*/ IK_Backslash ,IK_RightBracket,IK_SingleQuote ,IK_UnknownDF , /*E0*/ IK_JoyX ,IK_JoyY ,IK_JoyZ ,IK_JoyR , /*E4*/ IK_MouseX ,IK_MouseY ,IK_MouseZ ,IK_MouseW , /*E8*/ IK_JoyU ,IK_JoyV ,IK_UnknownEA ,IK_UnknownEB , /*EC*/ IK_MouseWheelUp ,IK_MouseWheelDown,IK_Unknown10E,UK_Unknown10F , /*F0*/ IK_JoyPovUp ,IK_JoyPovDown ,IK_JoyPovLeft ,IK_JoyPovRight , /*F4*/ IK_UnknownF4 ,IK_UnknownF5 ,IK_Attn ,IK_CrSel , /*F8*/ IK_ExSel ,IK_ErEof ,IK_Play ,IK_Zoom , /*FC*/ IK_NoName ,IK_PA1 ,IK_OEMClear }; var(Display) class RenderIteratorClass; // class to instantiate as the actor's RenderInterface var transient RenderIterator RenderInterface; // abstract iterator initialized in the Rendering engine //----------------------------------------------------------------------------- // natives. // Execute a console command in the context of the current level and game engine. native function string ConsoleCommand( string Command ); //----------------------------------------------------------------------------- // Network replication. replication { // Relationships. unreliable if( Role==ROLE_Authority ) Owner, Role, RemoteRole; unreliable if( bNetOwner && Role==ROLE_Authority ) bNetOwner, Inventory; unreliable if( bReplicateInstigator && (RemoteRole>=ROLE_SimulatedProxy) && (Role==ROLE_Authority) ) Instigator; // Ambient sound. unreliable if( (Role==ROLE_Authority) && (!bNetOwner || !bClientAnim) ) AmbientSound; unreliable if( AmbientSound!=None && Role==ROLE_Authority && (!bNetOwner || !bClientAnim) ) SoundRadius, SoundVolume, SoundPitch; unreliable if( bDemoRecording ) DemoPlaySound; // Collision. unreliable if( Role==ROLE_Authority ) bCollideActors, bCollideWorld; unreliable if( (bCollideActors || bCollideWorld) && Role==ROLE_Authority ) bProjTarget, bBlockActors, bBlockPlayers, CollisionRadius, CollisionHeight; // Location. unreliable if( !bCarriedItem && (bNetInitial || bSimulatedPawn || RemoteRole SpawnClass, optional actor SpawnOwner, optional name SpawnTag, optional vector SpawnLocation, optional rotator SpawnRotation ); // // Destroy this actor. Returns true if destroyed, false if indestructable. // Destruction is latent. It occurs at the end of the tick. // native(279) final function bool Destroy(); //============================================================================= // Timing. // Causes Timer() events every NewTimerRate seconds. native(280) final function SetTimer( float NewTimerRate, bool bLoop ); //============================================================================= // Sound functions. // Play a sound effect. native(264) final function PlaySound ( sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch ); // play a sound effect, but don't propagate to a remote owner // (he is playing the sound clientside native simulated final function PlayOwnedSound ( sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch ); native simulated event DemoPlaySound ( sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch ); // Get a sound duration. native final function float GetSoundDuration( sound Sound ); //============================================================================= // AI functions. // // Inform other creatures that you've made a noise // they might hear (they are sent a HearNoise message) // Senders of MakeNoise should have an instigator if they are not pawns. // native(512) final function MakeNoise( float Loudness ); // // PlayerCanSeeMe returns true if some player has a line of sight to // actor's location. // native(532) final function bool PlayerCanSeeMe(); //============================================================================= // Regular engine functions. // Teleportation. event bool PreTeleport( Teleporter InTeleporter ); event PostTeleport( Teleporter OutTeleporter ); // Level state. event BeginPlay(); //======================================================================== // Disk access. // Find files. native(539) final function string GetMapName( string NameEnding, string MapName, int Dir ); native(545) final function GetNextSkin( string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc ); native(547) final function string GetURLMap(); native final function string GetNextInt( string ClassName, int Num ); native final function GetNextIntDesc( string ClassName, int Num, out string Entry, out string Description ); native final function bool GetCacheEntry( int Num, out string GUID, out string Filename ); native final function bool MoveCacheEntry( string GUID, optional string NewFilename ); //============================================================================= // Iterator functions. // Iterator functions for dealing with sets of actors. native(304) final iterator function AllActors ( class BaseClass, out actor Actor, optional name MatchTag ); native(305) final iterator function ChildActors ( class BaseClass, out actor Actor ); native(306) final iterator function BasedActors ( class BaseClass, out actor Actor ); native(307) final iterator function TouchingActors( class BaseClass, out actor Actor ); native(309) final iterator function TraceActors ( class BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ); native(310) final iterator function RadiusActors ( class BaseClass, out actor Actor, float Radius, optional vector Loc ); native(311) final iterator function VisibleActors ( class BaseClass, out actor Actor, optional float Radius, optional vector Loc ); native(312) final iterator function VisibleCollidingActors ( class BaseClass, out actor Actor, optional float Radius, optional vector Loc, optional bool bIgnoreHidden ); //============================================================================= // Color operators native(549) static final operator(20) color - ( color A, color B ); native(550) static final operator(16) color * ( float A, color B ); native(551) static final operator(20) color + ( color A, color B ); native(552) static final operator(16) color * ( color A, float B ); //============================================================================= // Scripted Actor functions. // draw on canvas before flash and fog are applied (used for drawing weapons) event RenderOverlays( canvas Canvas ); // // Called immediately before gameplay begins. // event PreBeginPlay() { // Handle autodestruction if desired. if( !bGameRelevant && (Level.NetMode != NM_Client) && !Level.Game.IsRelevant(Self) ) Destroy(); } // // Broadcast a message to all players. // event BroadcastMessage( coerce string Msg, optional bool bBeep, optional name Type ) { local Pawn P; if (Type == '') Type = 'Event'; if ( Level.Game.AllowsBroadcast(self, Len(Msg)) ) for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.bIsPlayer || P.IsA('MessagingSpectator') ) { if ( (Level.Game != None) && (Level.Game.MessageMutator != None) ) { if ( Level.Game.MessageMutator.MutatorBroadcastMessage(Self, P, Msg, bBeep, Type) ) P.ClientMessage( Msg, Type, bBeep ); } else P.ClientMessage( Msg, Type, bBeep ); } } // // Broadcast a localized message to all players. // Most message deal with 0 to 2 related PRIs. // The LocalMessage class defines how the PRI's and optional actor are used. // event BroadcastLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local Pawn P; for ( P=Level.PawnList; P != None; P=P.nextPawn ) if ( P.bIsPlayer || P.IsA('MessagingSpectator') ) { if ( (Level.Game != None) && (Level.Game.MessageMutator != None) ) { if ( Level.Game.MessageMutator.MutatorBroadcastLocalizedMessage(Self, P, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject) ) P.ReceiveLocalizedMessage( Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); } else P.ReceiveLocalizedMessage( Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); } } // // Called immediately after gameplay begins. // event PostBeginPlay(); // // Called after PostBeginPlay. // simulated event SetInitialState() { bScriptInitialized = true; if( InitialState!='' ) GotoState( InitialState ); else GotoState( 'Auto' ); } // called after PostBeginPlay on net client simulated event PostNetBeginPlay(); // // Hurt actors within the radius. // final function HurtRadius( float DamageAmount, float DamageRadius, name DamageName, float Momentum, vector HitLocation ) { local actor Victims; local float damageScale, dist; local vector dir; 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); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageName ); } } bHurtEntry = false; } // // Called when carried onto a new level, before AcceptInventory. // event TravelPreAccept(); // // Called when carried into a new level, after AcceptInventory. // event TravelPostAccept(); // // Called when a scripted texture needs rendering // event RenderTexture(ScriptedTexture Tex); // // Called by PlayerPawn when this actor becomes its ViewTarget. // function BecomeViewTarget(); // // Returns the string representation of the name of an object without the package // prefixes. // function String GetItemName( string FullName ) { local int pos; pos = InStr(FullName, "."); While ( pos != -1 ) { FullName = Right(FullName, Len(FullName) - pos - 1); pos = InStr(FullName, "."); } return FullName; } // // Returns the human readable string representation of an object. // function String GetHumanName() { return GetItemName(string(class)); } // Set the display properties of an actor. By setting them through this function, it allows // the actor to modify other components (such as a Pawn's weapon) or to adjust the result // based on other factors (such as a Pawn's other inventory wanting to affect the result) function SetDisplayProperties(ERenderStyle NewStyle, texture NewTexture, bool bLighting, bool bEnviroMap ) { Style = NewStyle; texture = NewTexture; bUnlit = bLighting; bMeshEnviromap = bEnviromap; } function SetDefaultDisplayProperties() { Style = Default.Style; texture = Default.Texture; bUnlit = Default.bUnlit; bMeshEnviromap = Default.bMeshEnviromap; } Ls5A" ~% [F@]F@b{5l*0'mo'l G `F j5_M ύ r6*_9"6_i 5#?_L?;mi_?;zaV K mi'rz*imկ58?,#?zaV K im'``rzmV _imկ58?,#?zaV K im'rz* rz6J ;6J ;6J 8zaV K  _?; 'J w./z*./z-[zw.<z*!r*??,6.<z6-P6??,(:6c%6* 6_6-a  ծ?;6;_6o$6a*6* aF@sF}!f+-V(-Z'-['*-[-Z'w} */a0 }}-Sr}Q*}Q} Qr}\ *}\ } \ r}Y*}Y} Yr}` *}` } ` 10Z @ bFj"v cFfF .hFiF0jF1kF2t!@D_ E6hN  @D//============================================================================= // Logs game events for stat collection // // ngLog, ngStats, and ngWorldStats are registered trademarks of // NetGames USA, Inc. at http://www.netgamesusa.com All rights reserved. A // ny and all occurrences of code related to supporting their products and // services appears with their express permission. //============================================================================= class StatLog extends Info native; // Internal var int Context; // State var bool bWorld; // Time var float TimeStamp; // Log Variables var() string LocalStandard; // The standard this log is compliant to. var() string WorldStandard; // The standard this log is compliant to. var() string LogVersion; // Version of the log standard. var() string LogInfoURL; // URL to info on logging standard. var() string GameName; // Name of this game. var() string GameCreator; // Name of game creator. var() string GameCreatorURL; // URL to info on game creator. var() string DecoderRingURL; // URL to log format decoder ring. var() globalconfig string LocalBatcherURL; // Batcher URL. var() globalconfig string LocalBatcherParams; // Batcher command line parameters. var() globalconfig string LocalStatsURL; // URL to local stats information. var() globalconfig string WorldBatcherURL; // Batcher URL. var() globalconfig string WorldBatcherParams; // Batcher command line parameters. var() globalconfig string WorldStatsURL; // URL to world stats information. var() globalconfig string LocalLogDir; var() globalconfig string WorldLogDir; var globalconfig bool bWorldBatcherError; // An error occured last time we tried to process stats. // Object function BeginPlay() { SetTimer(30.0, True); } function Timer() { LogPings(); } // Logging function StartLog() { // Implemented in subclass. } function StopLog() { // Implemented in subclass. } function FlushLog() { // Implemented in subclass. } function LogEventString( string EventString ) { Log( EventString ); } // Batching native final function ExecuteLocalLogBatcher(); native final function ExecuteSilentLogBatcher(); native final static function BatchLocal(); native final function ExecuteWorldLogBatcher(); native static function BrowseRelativeLocalURL(string URL); // Special native final function InitialCheck( GameInfo Game ); native final function LogMutator( Mutator M ); native static function GetPlayerChecksum( PlayerPawn P, out string Checksum ); // Time native final function string GetGMTRef(); // Return absolute time. function string GetAbsoluteTime() { local string AbsoluteTime; local string GMTRef; AbsoluteTime = string(Level.Year); if (Level.Month < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Month; else AbsoluteTime = AbsoluteTime$"."$Level.Month; if (Level.Day < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Day; else AbsoluteTime = AbsoluteTime$"."$Level.Day; if (Level.Hour < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Hour; else AbsoluteTime = AbsoluteTime$"."$Level.Hour; if (Level.Minute < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Minute; else AbsoluteTime = AbsoluteTime$"."$Level.Minute; if (Level.Second < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Second; else AbsoluteTime = AbsoluteTime$"."$Level.Second; if (Level.Millisecond < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Millisecond; else AbsoluteTime = AbsoluteTime$"."$Level.Millisecond; GMTRef = GetGMTRef(); AbsoluteTime = AbsoluteTime$"."$GMTRef; TimeStamp = 0; return AbsoluteTime; } // A less verbose version... function string GetShortAbsoluteTime() { local string AbsoluteTime; AbsoluteTime = string(Level.Year); if (Level.Month < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Month; else AbsoluteTime = AbsoluteTime$"."$Level.Month; if (Level.Day < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Day; else AbsoluteTime = AbsoluteTime$"."$Level.Day; if (Level.Hour < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Hour; else AbsoluteTime = AbsoluteTime$"."$Level.Hour; if (Level.Minute < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Minute; else AbsoluteTime = AbsoluteTime$"."$Level.Minute; if (Level.Second < 10) AbsoluteTime = AbsoluteTime$".0"$Level.Second; else AbsoluteTime = AbsoluteTime$"."$Level.Second; TimeStamp = 0; return AbsoluteTime; } // Return a timestamp relative to last absolute time. function string GetTimeStamp() { local string Time; local int Pos; Time = string(TimeStamp); Time = Left(Time, InStr(Time, ".") + 3); return Time; } // Return a logfile name if relevant. function string GetLogFileName() { return ""; } // Track relative timestamps. function Tick(float Delta) { TimeStamp += Delta; } // Standard Log Entries function LogStandardInfo() { if (bWorld) LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Standard"$Chr(9)$WorldStandard); else LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Standard"$Chr(9)$LocalStandard); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Version"$Chr(9)$LogVersion); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Info_URL"$Chr(9)$LogInfoURL); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Name"$Chr(9)$GameName); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Version"$Chr(9)$Level.EngineVersion); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Creator"$Chr(9)$GameCreator); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Creator_URL"$Chr(9)$GameCreatorURL); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Decoder_Ring_URL"$Chr(9)$DecoderRingURL); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Absolute_Time"$Chr(9)$GetAbsoluteTime()); if (bWorld) { if( Level.ConsoleCommand("get UdpServerUplink douplink") ~= string(true) ) LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_Public"$Chr(9)$"1"); else LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_Public"$Chr(9)$"0"); } } function LogServerInfo() { local string NetworkNumber; NetworkNumber = Level.Game.GetNetworkNumber(); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_ServerName"$Chr(9)$Level.Game.GameReplicationInfo.ServerName); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_AdminName"$Chr(9)$Level.Game.GameReplicationInfo.AdminName); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_AdminEmail"$Chr(9)$Level.Game.GameReplicationInfo.AdminEmail); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_Region"$Chr(9)$Level.Game.GameReplicationInfo.Region); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_MOTDLine1"$Chr(9)$Level.Game.GameReplicationInfo.MOTDLine1); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_MOTDLine2"$Chr(9)$Level.Game.GameReplicationInfo.MOTDLine2); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_MOTDLine3"$Chr(9)$Level.Game.GameReplicationInfo.MOTDLine3); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_MOTDLine4"$Chr(9)$Level.Game.GameReplicationInfo.MOTDLine4); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_IP"$Chr(9)$NetworkNumber); LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_Port"$Chr(9)$Level.Game.GetServerPort()); } final event LogGameSpecial(String SpecialID, String SpecialParam) { LogEventString(GetTimeStamp()$Chr(9)$"game"$Chr(9)$SpecialID$Chr(9)$SpecialParam); } final event LogGameSpecial2(String SpecialID, String SpecialParam, String SpecialParam2) { LogEventString(GetTimeStamp()$Chr(9)$"game"$Chr(9)$SpecialID$Chr(9)$SpecialParam$Chr(9)$SpecialParam2); } native final function string GetMapFileName(); function LogMapParameters() { local string MapName; MapName = GetMapFileName(); LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"Name"$Chr(9)$MapName); LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"Title"$Chr(9)$Level.Title); LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"Author"$Chr(9)$Level.Author); LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"IdealPlayerCount"$Chr(9)$Level.IdealPlayerCount); LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"LevelEnterText"$Chr(9)$Level.LevelEnterText); } function LogPlayerConnect(Pawn Player, optional string Checksum) { if (Player.IsA('PlayerPawn')) LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Connect"$Chr(9)$Player.PlayerReplicationInfo.PlayerName$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$PlayerPawn(Player).bAdmin); else LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Connect"$Chr(9)$Player.PlayerReplicationInfo.PlayerName$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$False); LogPlayerInfo(Player); } function LogPlayerInfo(Pawn Player) { LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"TeamName"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.TeamName); LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Team"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.Team); LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"TeamID"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.TeamID); LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Ping"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.Ping); LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"IsABot"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.bIsABot); LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Skill"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.Skill); } function LogPlayerDisconnect(Pawn Player) { LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Disconnect"$Chr(9)$Player.PlayerReplicationInfo.PlayerID); } function LogKill( int KillerID, int VictimID, string KillerWeaponName, string VictimWeaponName, name DamageType ) { LogEventString(GetTimeStamp()$Chr(9)$"kill"$Chr(9)$KillerID$Chr(9)$KillerWeaponName$Chr(9)$VictimID$Chr(9)$VictimWeaponName$Chr(9)$DamageType); } function LogTeamKill( int KillerID, int VictimID, string KillerWeaponName, string VictimWeaponName, name DamageType ) { LogEventString(GetTimeStamp()$Chr(9)$"teamkill"$Chr(9)$KillerID$Chr(9)$KillerWeaponName$Chr(9)$VictimID$Chr(9)$VictimWeaponName$Chr(9)$DamageType); } function LogSuicide(Pawn Killed, name DamageType, Pawn Instigator) { local int KilledID; local string InstigatorString; if (Killed == None) return; KilledID = Killed.PlayerReplicationInfo.PlayerID; if (Instigator == None) InstigatorString = "None"; else InstigatorString = "Self"; if (Killed.Weapon != None) LogEventString(GetTimeStamp()$Chr(9)$"suicide"$Chr(9)$KilledID$Chr(9)$Killed.Weapon.ItemName$Chr(9)$DamageType$Chr(9)$InstigatorString); else LogEventString(GetTimeStamp()$Chr(9)$"suicide"$Chr(9)$KilledID$Chr(9)$"None"$Chr(9)$DamageType$Chr(9)$InstigatorString); } function LogNameChange(Pawn Other) { LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Rename"$Chr(9)$Other.PlayerReplicationInfo.PlayerName$Chr(9)$Other.PlayerReplicationInfo.PlayerID); } function LogTeamChange(Pawn Other) { LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Teamchange"$Chr(9)$Other.PlayerReplicationInfo.PlayerID$Chr(9)$Other.PlayerReplicationInfo.Team); } function LogTypingEvent(bool bTyping, Pawn Other) { LogEventString(GetTimeStamp()$Chr(9)$"typing"$Chr(9)$bTyping$Chr(9)$Other.PlayerReplicationInfo.PlayerID); } function LogPickup(Inventory Item, Pawn Other) { if (Item.ItemName != "") LogEventString(GetTimeStamp()$Chr(9)$"item_get"$Chr(9)$Item.ItemName$Chr(9)$Other.PlayerReplicationInfo.PlayerID); else LogEventString(GetTimeStamp()$Chr(9)$"item_get"$Chr(9)$Item.Class$Chr(9)$Other.PlayerReplicationInfo.PlayerID); } function LogItemActivate(Inventory Item, Pawn Other) { if ( (Other == None) || (Other.PlayerReplicationInfo == None) || (Item == None) ) return; LogEventString(GetTimeStamp()$Chr(9)$"item_activate"$Chr(9)$Item.ItemName$Chr(9)$Other.PlayerReplicationInfo.PlayerID); } function LogItemDeactivate(Inventory Item, Pawn Other) { LogEventString(GetTimeStamp()$Chr(9)$"item_deactivate"$Chr(9)$Item.ItemName$Chr(9)$Other.PlayerReplicationInfo.PlayerID); } function LogSpecialEvent(string EventType, optional coerce string Arg1, optional coerce string Arg2, optional coerce string Arg3, optional coerce string Arg4) { local string Event; Event = EventType; if (Arg1 != "") Event = Event$Chr(9)$Arg1; if (Arg2 != "") Event = Event$Chr(9)$Arg2; if (Arg3 != "") Event = Event$Chr(9)$Arg3; if (Arg4 != "") Event = Event$Chr(9)$Arg4; LogEventString(GetTimeStamp()$Chr(9)$Event); } function LogPings() { local PlayerReplicationInfo PRI; foreach AllActors(class'PlayerReplicationInfo', PRI) LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Ping"$Chr(9)$PRI.PlayerID$Chr(9)$PRI.Ping); } function LogGameStart() { LogEventString(GetTimeStamp()$Chr(9)$"game_start"); } function LogGameEnd( string Reason ) { LogEventString(GetTimeStamp()$Chr(9)$"game_end"$Chr(9)$Reason); } lF3tF`|4"pp, game_start vFOtS(hc -X+-R(-j-$^wY*BaYlBa iX  uFHD v\3l/a0 Hipppppppp, player, Ping, SHD, SHC10 wFX([e2yX(/{uyppy, uS{nyppy, nw{Pyppy, P{iyppy, ipp, y qF4~FU(K^0]pppppp, item_deactivate, U(}, ST( D ~5vF5yF6}//============================================================================= // Player: Corresponds to a real player (a local camera or remote net player). // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Player extends Object native noexport; //----------------------------------------------------------------------------- // Player properties. // Internal. var native const int vfOut; var native const int vfExec; // The actor this player controls. var transient const playerpawn Actor; var transient const console Console; // Window input variables var transient const bool bWindowsMouseAvailable; var bool bShowWindowsMouse; var bool bSuspendPrecaching; var transient const float WindowsMouseX; var transient const float WindowsMouseY; var int CurrentNetSpeed; var globalconfig int ConfiguredInternetSpeed, ConfiguredLanSpeed; var byte SelectedCursor; const IDC_ARROW=0; const IDC_SIZEALL=1; const IDC_SIZENESW=2; const IDC_SIZENS=3; const IDC_SIZENWSE=4; const IDC_SIZEWE=5; const IDC_WAIT=6; `0@   + C U m          " " #" 4" E" V" g" x" " " " " " " " C C .C CC VC hC zC C C C C C C C d d +d =d Od bd td d d d d d   ! , 9 E W _0@  ' 3B OT[bhm    ) 4 > J V bk '  ''' $' 0' <' G'W' c' o' :  : : #: .: 9:?:F: R:[:j: M  M M $M 0M <M IM UM bM` ` ` %`,` 6`=` AGdUW/0rI*rI * rd* pppppp, item_activate, d}, SI D F6R]/-R-0R-0(R -} R-0wRJ!VRJ!RRfR J RJR J fAdministrator logged out.FR ,gave up administrator abilities. hUGVG%& -L' DGJEOv.l{J}pppppp, item_get, J}, Sa Dpppppp, item_get, VJ, Sa D ^0@     ) 2 ; C K T ] f n w                      %  .  7  @  I  R  [  d  m  s  |                   % . 7 @ H Q Z c l u ~                  & / 8 A J S \ ) 3 m) f3 /3 A ]= 3 ) ) ) B3 ) >= q= N= G= 3 [= {= h= q= ) ) ) Y= ) 3 3 3 O3   ) e 3  3 3 3 3 3 3 x3 ) 3 3 3 3 R) ) v) #= = = [) 5= = 3  )  B3   )   w    )   o3 ) .) ) ) 3 %) f= d) @) ) 7) n ,= = I) GGQ(EJ-Mpppppp, typing, T-Q(, SA% D CGEGJGcVE,rpppppppp, player, Teamchange, Sc D, Rc k xFG6LGGT@4,mpppppppp, player, Rename, G ,, SG D tNGk O/&*" rk * Lk  DDr_**X NonePX Selfwk *pppppppppp, suicide, SL, k }, W~, X  pppppppppp, suicide, SL, None, W~, X  f TGO(\' )dpppppppppppp, teamkill, SO(, P(, S}$, |$, W{$ MGOGEf!Q-)f!)g!)b!RGr!R .K )r!)h!ZGz$]"'`pppppppppppp, kill, Sz$, y$, Sx$, u$, Ww$ TYGvW!h  Wv y3D . ]  XI"d!^ % ?,<6 Bo$ a \GJ> `Gt$z 'Rpppppp, player, Disconnect, St$ D ] XGG `*%** xlGR6w  IG@QHkX#~pppppppp, player, TeamName, SH D, H q'pppppppp, player, Team, SH D, RH kpppppppp, player, TeamID, SH D, SH Apppppppp, player, Ping, SH D, SH Cpppppppp, player, IsABot, SH D, TH -}pppppppp, player, Skill, SH D, UHv  N6 nSG]"[ /#)]")O")A)L")N")A")|bGOS0 )O)N)J^*E[YOE^*pppppp, map, Name, Epppppp, map, Title, Gpppppp, map, Author, o)pppppp, map, IdealPlayerCount, m)pppppp, map, LevelEnterText, v  cG^@1 #)^)])\)Y)X)W)T@v$P p OM::$P $M:P ,2h P :P bP  eG`2 )`)_kGN(d~Cpppppppp, game, N(, M(, q$ @oGp$|6pppppp, game, p$, n$ pxG{G0˂ gGr$h w:r$bE_uw_*^_E._^__ XwG@ rGtMt W pppppp, info, Server_ServerName,  Bupppppp, info, Server_AdminName,  Btpppppp, info, Server_AdminEmail,  Bcpppppp, info, Server_Region, S B`*pppppp, info, Server_MOTDLine1,  BNpppppp, info, Server_MOTDLine2,  BHpppppp, info, Server_MOTDLine3,  BIpppppp, info, Server_MOTDLine4,  BMpppppp, info, Server_IP, tpppppp, info, Server_Port, S b nG@ SntGP<I-Fpppppp, info, Log_Standard, opppppp, info, Log_Standard, hpppppp, info, Log_Version, l$pppppp, info, Log_Info_URL, k$pppppp, info, Game_Name, Ppppppp, info, Game_Version, tpppppp, info, Game_Creator, m$pppppp, info, Game_Creator_URL, j$pppppp, info, Game_Decoder_Ring_URL, i$pppppp, info, Absolute_Time, ] :-F|$1get UdpServerUplink douplinkT'pppppp, info, Server_Public, 1:pppppp, info, Server_Public, 0 hGfS 3A )f)c)ae h$g$'dS g$ sGxT4 #)x)u)t)r)l)j)iuGGI5n -)G)E)D)C)@))})|){}G@ FOHł vGk : EEiijjQ Q O O [ [ Z Z V V ttVV-l(-X(P? WQ6qGr < Sa`rS**SRGwH*S-o$' -dr.n#*#SS [6b$@ |G@ D,Om m}T wmdl BHCHm/k US k k ~k .,k  @FHGH\ bSOOV , bppb.0SV pbppb.SV D , bppb.0SD bppb.SD B , bppb.0SB &bppb.SB `A , bppb.0SA bppb.SA @ , bppb.0S@ bppb.S@ S b k @^Rxb<aRws?R`?R^ [*JH] ` mISOOV , IppI.0SV pIppI.SV D , IppI.0SD IppI.SD B , IppI.0SB &IppI.SB `A , IppI.0SA IppI.SA @ , IppI.0S@ IppI.S@ X, IppI.0SX7IppI.SXr[*IppI.rS I b@P?//============================================================================= // Canvas: A drawing canvas. // This is a built-in Unreal class and it shouldn't be modified. // // Notes. // To determine size of a drawable object, set Style to STY_None, // remember CurX, draw the thing, then inspect CurX and CurYL. //============================================================================= class Canvas extends Object native noexport; // Objects. #exec Font Import File=Textures\SmallFont.bmp Name=SmallFont #exec Font Import File=Textures\MedFont.pcx Name=MedFont #exec Font Import File=Textures\LargeFont.pcx Name=LargeFont #exec Font Import File=Textures\BigFont.pcx Name=BigFont // Modifiable properties. var font Font; // Font for DrawText. var float SpaceX, SpaceY; // Spacing for after Draw*. var float OrgX, OrgY; // Origin for drawing. var float ClipX, ClipY; // Bottom right clipping region. var float CurX, CurY; // Current position for drawing. var float Z; // Z location. 1=no screenflash, 2=yes screenflash. var byte Style; // Drawing style STY_None means don't draw. var float CurYL; // Largest Y size since DrawText. var color DrawColor; // Color for drawing. var bool bCenter; // Whether to center the text. var bool bNoSmooth; // Don't bilinear filter. var const int SizeX, SizeY; // Zero-based actual dimensions. // Stock fonts. var font SmallFont; // Small system font. var font MedFont; // Medium system font. var font BigFont; // Big system font. var font LargeFont; // Large system font. // Internal. var const viewport Viewport; // Viewport that owns the canvas. var const int FramePtr; // Scene frame pointer. var const int RenderPtr; // Render device pointer, only valid during UGameEngine::Draw // native functions. native(464) final function StrLen( coerce string String, out float XL, out float YL ); native(465) final function DrawText( coerce string Text, optional bool CR ); native(466) final function DrawTile( texture Tex, float XL, float YL, float U, float V, float UL, float VL ); native(467) final function DrawActor( Actor A, bool WireFrame, optional bool ClearZ ); native(468) final function DrawTileClipped( texture Tex, float XL, float YL, float U, float V, float UL, float VL ); native(469) final function DrawTextClipped( coerce string Text, optional bool bCheckHotKey ); native(470) final function TextSize( coerce string String, out float XL, out float YL ); native(471) final function DrawClippedActor( Actor A, bool WireFrame, int X, int Y, int XB, int YB, optional bool ClearZ ); native(480) final function DrawPortal( int X, int Y, int Width, int Height, actor CamActor, vector CamLocation, rotator CamRotation, optional int FOV, optional bool ClearZ ); // UnrealScript functions. event Reset() { Font = Default.Font; SpaceX = Default.SpaceX; SpaceY = Default.SpaceY; OrgX = Default.OrgX; OrgY = Default.OrgY; CurX = Default.CurX; CurY = Default.CurY; Style = Default.Style; DrawColor = Default.DrawColor; CurYL = Default.CurYL; bCenter = false; bNoSmooth = false; Z = 1.0; } final function SetPos( float X, float Y ) { CurX = X; CurY = Y; } final function SetOrigin( float X, float Y ) { OrgX = X; OrgY = Y; } final function SetClip( float X, float Y ) { ClipX = X; ClipY = Y; } final function DrawPattern( texture Tex, float XL, float YL, float Scale ) { DrawTile( Tex, XL, YL, (CurX-OrgX)*Scale, (CurY-OrgY)*Scale, XL*Scale, YL*Scale ); } final function DrawIcon( texture Tex, float Scale ) { if ( Tex != None ) DrawTile( Tex, Tex.USize*Scale, Tex.VSize*Scale, 0, 0, Tex.USize, Tex.VSize ); } final function DrawRect( texture Tex, float RectX, float RectY ) { DrawTile( Tex, RectX, RectY, 0, 0, Tex.USize, Tex.VSize ); } I@KHVf$kU= )f$)e$$@PH\6WHK&a$bPy )a$$hmhO0 W -'m |)wN $`$cLp@@DXH@a6L]H3XD  e^Hw.& aA' F`H@D,aH@D,bH@D,cH@D,dH@D,Z$@D,b6c6~VM Z*  d//============================================================================= // SkyZoneInfo. //============================================================================= class SkyZoneInfo extends ZoneInfo native;  //============================================================================= // LocationID - marks and names an area in a zone //============================================================================= class LocationID extends KeyPoint native; var() localized string LocationName; var() float Radius; var LocationID NextLocation; function PostBeginPlay() { local LocationID L; Super.PostBeginPlay(); // add self to zone list if ( Region.Zone.LocationID == None ) { Region.Zone.LocationID = self; return; } for ( L=Region.Zone.LocationID; L!=None; L=L.NextLocation ) if ( L.NextLocation == None ) { L.NextLocation = self; return; } } @jHP!@6r6(]r *6(]r  P6(]r wP*rPg *Pg  PPg O ~'@sl//============================================================================= // Palette: A 256-color Unreal palette. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Palette extends Object native noexport; var native const array Colors; F //============================================================================= // LevelSummary contains the summary properties from the LevelInfo actor. // Designed for fast loading. //============================================================================= class LevelSummary extends Object native; //----------------------------------------------------------------------------- // Properties. // From LevelInfo. var() localized string Title; var() string Author; var() localized string IdealPlayerCount; var() int RecommendedEnemies; var() int RecommendedTeammates; var() localized string LevelEnterText; nH@PoH@PpH@PqHPrHP@Pl//============================================================================= // SpawnNotify - Actor spawn notification. // NB - This happens on the client AND server for replicated actors. //============================================================================= class SpawnNotify expands Actor native; var class ActorClass; var SpawnNotify Next; replication { reliable if( Role == ROLE_Authority ) ActorClass; } simulated function PostBeginPlay() { local SpawnNotify N; for(N = Level.SpawnNotify; N != None; N = N.Next) if(N == Self) return; Next = Level.SpawnNotify; Level.SpawnNotify = Self; } simulated event Destroyed() { local SpawnNotify N; if(Level.SpawnNotify == Self) { Level.SpawnNotify = Next; Next = None; } else { for(N = Level.SpawnNotify; N != None && N.Next != None; N = N.Next) { if(N.Next == Self) { N.Next = Next; Next = None; return; } } } } simulated event Actor SpawnNotification(Actor A) { return A; } uHY*c6Y*  cxH\f!2r~~GG*\~w\*w\G*r\G\GGG* \\GF  @{Hr ! ir ~Cwr *,rr  r r GG~~ B9"@""@"**ZRR"ޙo .c @&&#&&#&&&#&++(,+(+++(+#(*+(+#+#(&+&+&&#&+&#&&+&++#+(++(*(,*(*+*++(*,,%**%,%,,%*%,(%+$+(*(%++*+(+++(++#+#++*(+((((*((,$(*(,(*(*(%%,%%(*,%%.,(*(,(,*,((**++(((*+(((((*(,(*(,(*(*(,*%$%%,%,%%%%*%%,,.,%(,*%,*+,+(+++*+(*(*+,((%%,$,(,(,(,(,%,,%,,%%,%,%%(%%($(,(,*((+,(+*+(+*+(+((*.*%%$,*,(**,(,%%%,%%%,%%,,%,%%%%%*,%*,((,+,*,*(++(((+*+((,%$,$,(*(((*+,%,%,,%%%+(%*%(*%,%(%*(,,,(,,%%,+((+,+((+(*,*,*,(%,,,,(,%,,%%%,%,,,*%%%,,,$%,.,(*%,(*,(,(,*(+*+(*+*(+*%%((%(*,(*(*,(*%,**,%,,,,,,$(,%%%*+%*,*%*,(,(,,*(,,*+((+,(**(*%**(*,%*(%,(*,,*,%%*(,,,%,%,%,%,,%*%%%%,%,%,%*%,,%,*(**+(*(,(($%(,(,,(,,*,,((*,(,,(,***%*%*%,%%*%*%*%**%*,(,%+,(((((+(,*%**%%,(,$%%,*(%(*+,(,*(*,(,,%,%,*%,%,$%*%*(%,%,%,**(,+*((*+,.*%,%,*%,(,,%,,(,,*(,*+(,,*,$,%$,*,*%,%%%%(%,,,*,*,,,%+*(++((,,(*.*,(,,,%*,*,*,*,%,%,+,*(,%,,%*,*%%%,$%%*$,(%%%%,*.,%*,,(+(*+%**(,$,($,$,*%%(,(,,,*,**%%%%*%,%%,$,%*%(,%*%*,$,,*%%,(+(*+(,((,($,*,$(,,,%,,*(%%%,(%,,%,,%,%*(,%%%,*(%,%%,,(,(,,*,,*+*(*(,*,*%%(,,%*,*%,*(,,,,%,%,%,,(,%%*%%%(*$,*,*$%*,%,%*(*(,(,,*.%%*,*,%*%%%,*(,,%*%,%*,%%%*,%%%%$%*,%,%*%,%,(,%,*,*(*%*,*%,%%,%%%,%,,,%,%%,%,%,%,%%%%%%,,%%%%%$(,*.,*,%(*%%*,((,(*(%,%%*,,$%%*%,,,%,%,%,%*%%,,,,,%*$,(%%,%(,%,*%,,$,*,*,*,%$,%*%,,,,%%,%,,,%%,%,%,*,%%,%%%,,$,*,(%,$**(,$,*,*,(*.%,%$,%%*,%%,%*%%*%,,%,%,%,%,,,%,%*%*%*(%,$,*,%(,$**(*%(,%$,,(,%%%,%,%%,%,%,,*%%,,*%,%%*,%%,*,(%,,%,%**,%,,*%%%$*%%%*%%,%,%,%,,%,*,%%,%,,%*%,,%*,$(%,*,%,,(%%,,,%%,*((,$*%,%$,%*%%,*,,(*%,%%,%,,*%,,,$,%,*,%(,%(,%$,$,$*(,(,,*,%$%%%%%,%%,$%%,%,,%,,%,,,%,$,%,%,%%**,.,*(,$,%%,(+(,*((,(%%%*,$%$%,%,%,$,%,%%,%,%,%,%,%*%*,%,%,(%,%(,*,,,,%,%,(*%*,*(%*%,%,%*,,*,%,,%,%*,**,%*,%,%%(*,*,$,,%%,*(%(,*(,*,(*(%%*%%%*%$%,*%%*%%,%,%*,%%,%%,,,%,*%*(,$(,(,$,$,%,,**((,*((+,**%($%*%%%,%%,%,,$,,%,,,%*,*,%$,%$,*+,*(,,%,*.,%*(*%,(+(*(,(%*,%*$,%%%,%**,*%,%%,,%%%,,,$,%,*(,,,,$,%%*,,$,*,(+,,(,+*(,*%*%%%%*%$**%%,,(%%%%,%,,%*,*%*%,$,,*(,(*%,$,%*%,%*(*,*,(+*(,%,$,$%%%%%%%%,$,%,%*%,%,$,,%,%,,%,,$,(%%,%%*%%%%,(*(,%,(,(+,,*.,($,%$*%*,%,%,%,%%%,,%*%*%,$,*%,*%,*,%,%,+,%,*(*,,*(,(*(,(*%,$%%,$,*%*%**,$,*,%,,%,*,%,$,%*%*,(,**,%,,(,,%,(,%%*+,(,%*,%*%*%*$,%*(%,*%,%,%%%,%,*%*%,,%,%,*%,,*(%(,%%*,%,%*,*,,(%,**,$*%,*(*,%%%,%*,%%,$,%,%,,(%,*%%*%*%*,$(,%%%%,%,%*,,(*,,*,,(,,$(,*((,*(,%,%,*,,%,*,%%,%,%*%,%*,%(,,(*%,$,*,,*,*,*,(,(,*(,*,,((,(,(,%*%,$,%,%,%,,%,%*%,*%,$,*(%*%*,,*+,(%,,(,*,(*+%,*(%(*,$,%*,*%,%,%%%*,%,%,*,*,**%,%,$%,*%,*(%%,*((,*,*,*(,+(,(,,*,$(%(*%(%%,%*%%,,%,$,%,%%*(,*%%%,*%*%*%,*%,*%*,*((,(,*(,*,,(%%*%%,*,%*%*,,,,(*,%,%*,%,,%,*,$(,%,%,(,%(,(,(,((*(+,(+,(,$,$,*%,$%%%%%%%%,%*,%**,.*%%%*,(%$,$,,*,,(,*(*,(,,*,,*,*,%*%,$,%,%,*,,(%%,,*,,,,(,%,$,*(%*,*,,$,(%,$(,(,***(,(*(,,$%%,,%,%,,%$,%,%*%,*%*,%(,$,(*%%,*(%,.%(*%,*(,(*(,,*,%,$,%%%*%%%%,%,$%,%,%,,,*%,,*,(,*,*%*(,%,*,%,(*,*(,,((,%*(,,%,%*%,%%%%*,(*,*(%%%,,%*(,,%**((*.,*(,**%,%,%*(%%*.%,**,,(,*,$,%%%%%,*%*%,%%*,%*,(,,%,%%%,%,*(,,(,%%%,$%,,,*,(,,*,(%*,%(,%%*,$,%,%,*%$%,(,(*,,%,%,,*(,,%,,%,*%,*%,,%%(,%,%**,,(,*,*%%%%%%,%*%%,%,%*%,,(%**,*,%,,*,,*%*,$,*%%,*,%,,,%*,*,((%,*%,$(,*%*%,%*%,%,$%(**%,*(,*,*$,(%*%,%,%,%,%,%,*%,%%%,,*,*(,*(,%%%,%,%*,,%*,$,,,(,%(,,(*(,((%,%,%%,%,,%,%*,%,%%*,*%%*,$%**,,(*%$,$,,$,%,%%$,*,,*,(+,+,*,%*,,,%%,*%*,%,*,*,,%,,,**%,(,%,%,%,%*%,,%%,*,((%((+(,++(,,*,%*%,,,%%,,%,%,(*%*%%,%*%((,,%,*%,,%*,%*%,*%,%+*(,(+**%*,%,%,%%%*%,,%*%*%%,,%%,%,*%(,,**%*%,%%,$,%,%,%,%(*(,+*(*(,*,%,%,%%,*,,%%,%,%,$,%***,(,$(%%,%,$,$,%,%%%*,%*,+(*+++(,(,,%**,,*,%,%,%,,%,,%,%,,$*%%*%+(,%$,%,%,,,,$%%*%*+++(++,%(*,,%,*,%,%,%,,%,%,,$,*(,,%%$(*%*%*,%$,*%,%%,,%*,%+((*(,(*,+,%,*%%,%,,$,*,%,%,%%%(,$,*%%,*.,%$%%%%,%%%%,($(+,(,++(***,%,%,*%*,%*%,%%,%,,*(,%%%($(*%,,%,*%*,%%,$,*(,(*+*+(*(*+,%,%,,,*%,*%,%,%%,%,$,%%*%%*(,($%%,%%,%%,$,%,(%,%(,(*(+,,((,%,%%*%,,*%,,*%,%,%,%*(,%,*%,$((,%,,,%*%,%%*,%(+*%(,(+,*((,(,*%,%,*%*,%%%%,($,$(,$,(**,$%,$,(%,*%,,%,%(%%(*,(,*,*,*%%%,%%%%%%%,%,%*,*%(**,(*(%(,%$,%%*,,$*%*(,,$((,*((,,(,,,%,%%,,%,%%,%%(*(,(*$((*(%*%,$,%,%*%,,%%.,(,,(,,,(,(*,%,%%%,%%%%,*.,%*(%%*.,*%,%%%%,%*%%*(,%,*(%(,(*%,(*%,%%,%%%%%,,%,$,*(,*%(*(,(%,%,$%*%%(%%.%,%(,(,(,,,%%,,%%%%%%,%*.,,(%**%%**%%,,%,,,*%,%%%%,%,*,*,(*(*,%%%%%%,%,,$(%%(%,%(,%%,$,%*%%+$%%**%$(,(,(,,%,%%%%,%,*%,$,(,*%**%*%,%%,$,,$%,%,*%*%,(%(,%,(,*,(,%,%,%%%,%,%*,%*%,%%*%*%$,,,*%%%%*%#%*,,$(,(,(,,,(,%%%,%%%%%,%,%%*%%*%*%*%,*,,%%%,*%,((.%%,,%%,*%,*%,%%*%%%%,,(,*(%%%%,%%%,$%,%,,%,%*%*%,*,%*(,,,%%,%%%%%%%,*%%*%,,,$,%%*%$%*%%$(%,,%*,(,*%%,,%%%%%%%,%%%%,,$,%,%,$%$%%%%%,.,,%*%(,,,$(,,$%%%%%%%%%,%,,%$*%*%%$,%%%%,$.,%%$%%*(%,.%,,*%,,,%,*%%%%%%%%%%%%%*%%%%%,%*%,%%%,%,%%$,%(*%,%%,$,(,$%,*,%%%%%%$%$$%*%*%*,%%%%$%%,%,%**%$$%**(%%%,,$,(,,,,$,%%%--%$%%%,*%*%%%%,%%*%%,$$%%%$%%(%*,%*,*(,,$*,*,%,%%-%%%-%%*%,*%*%%$,$,%%,%%,%%.$%%%$%%*($,$,%%,*,%,%(,*%%%%%%%%%%%%%%,$%,$%%%,%%,%,%,%%$%%%%%$%(%*,%,,,*(,%,(,%,%,%%%%%%%$%%%,,,$,*($%*%,%,%%%%$%%%*%$*,%$%%%*,,%*,*($%*%%%-,%,%$,%,**$,%%,%%%%*%%%%%$%*,.,.,%%%%%,,%*(,,$,%,%,%%%$%$%%,**((,$,*%%,%(%%%%%$,%$%*.,.,*,$,*,,(*,%%,$,%%%%%*%%%%%%,$,(%$.,%,$%%%%%%%%$%$%%*%*%,,*,,$,*(*%%*,%%%,%%*%,*(**%(,$,%%(%%%%%%$%$%$%%*,*,%%,$(,,*.,,$,%$%%%%,%%,%*.%(($%*.%,%,,%$%%%$,$,%*%*%,.*%,,%,$,(,(%%*,%,%,$%%%*,%%,.($(*%,%%%%*(,%,%%%$%*%$%(,*(,$%*%,,,*%,%%,%,$,%%$*%,$,$%$(%,(%*,%,*,,%%$%%$,%*%$%%*%,,%,,%,.,$%**%%$,$%%,%*,$,$,.*%(*.,%,%%%%,%%%%$,%%(%*%(,(%,%,*,*%%*%,*%,*%%%$*%*%%%$%*(%%(,*(%%%*%%%$%,$%$*(,%(,,%,%,%(%%%*.,%,$%%*%%,*%*%$,$(*(,*%(%%,%$%$%$%$%,$,$,$%,$(,$(,*,%(,***,%*%*%$,$$*.(*%,*%,%,%$,(,,$%%,%%%,%*%*.,.,,$,(,%,,*%%%%%,%*%*%%%%*%%,$(,*%*%%,$**%%,*%,%,$%$%*.%$,$,,$%*%*%*,*%,%,%,*,(,(%,**,%*%$,*%,%%,%%,,*,%,*%%$%%%%,$%(%,*%%%,(%*%,*,%%,%%,*(*,*$,*%*%%*%$,$,%*,*,$*%%*%(,*%$*%%*,%$*$,$%$,$,%,%*,*,*,%*%,(*((%*%*%$,$,%,(%%*%%,,%,,*,,%*%$%$%%$,$%%%*%*,$,***%(%%,%,*,(,,*,(,%(%*%(%$%,%*,*%(*%,%*%(%(%%%%$%%*%**,**(,,$,,,%%%%,(,(*(,.,%*,*%(%,%,$,($,(%%,,%,%,%%%%*%*(%*$,%*((,$,*%*,%,*(,(,*(**(%%*%**$%,%*(%,(%%,%*,*%%$%%*%,%$,$*%*(*.,*,%%*%,%,%,(*,(,,%,.,$%%%,,%,*%,,$,,%%,$%,%%*%%$%*%$%*$,$,*,%*,*%,%,%*%,*(,,$(*,*%*,%*.%*%,*%%,(%,%,,%%*%*%$%*$,%%%**.,*,%,,$,,%,*(,*((*,%($,$,$,,*%*,*,$,%%,,%,*%%%%$%,$,$,*$,%%((*(,,$%*,*%,%,*,$,*(%*,$,.,%*,.,%,*%,,*%,*,%*$,$*$,$(,$%**%*(,(,%*,%%%,%**(%*(%$(,*.,%,*%(,%,%%,,$,%%%%$%*%$%,$,%,$,**(,+*(,%,%,,%,,,*.,%*,%,,(**%,,$,*%*%,,%,,%$,*%,-*,$%($,*$($,((*(,%,,%,$,*(,*(,*((*(*$,%,$,%,,%,%,,%%,%,%*,%$%**%$($,*,$*%*(%*,,%*,,$,,(,%*,(,,(,*(,%**(%,$,%%*,%,*%,%,%,$%,%%,(,$*%*(%(*,,%%,%*(*(,,*(%*%(%(,$,%,,%,,(,,%,*%%,$,**$*$($*%(,.*,*,$,,%,%,,,,,(,*,$(,%%,$*%,$,$,%%%%%,*,%,%,$,,$,*%,,$%*,$$(.,,(,%%*,$((,*,.%*,*%*%,%%%%,,,,((,%%*,$%%*%$,,$,$,$$(%(,%,,%,,,%,%,*,(,,*%*(%%,%,*%*,%%*,%,*%*,%,*,*,%*,$.%,%($(%,,%*(%*,((%,*,(,,%%%*(%,%,,%%*%,,%,,,*%,,(%***%*(%,,%*.,,((.*.,,%,,%,%*,%,*%*,*%,%,%%,$(%,%*%,(,%,,*(%*,%***%(%,$$($(%.,$,$%(,*(,,$,,$(%,%$*,**,,*%%%(,,%,%,%$,,%*(,(*(*,$(,,%,(*.,%*(%,%(,$,%%%%,,$(%(%%(,%,*,*%,%,**,((*,(*+%%,,%%(%.,(%%%,%%,,,*,,%,,$,%%(%*%,(,*(%,*,,,%,,(,+++(*(*,*%%,%*(%*(*%,%,%%%%*(,%*%$.%**%$,%*%*,%,(,%(,*,%*%%*(,+((*%(%%,*$(*%*,.%$,(%,%,,%,*(%,*%,%,%(,%*,%%*,(,,*(,*%,,*,++(*+(,$**.*%$*..((.,%*(*%,*,*(,%%%,%,*,%*(%,*(,%**,(,,(,*%,*,+*+,**,(,$,.,%($.*(%*(,*,*(,,*,%%$,*%*%,%%(%(,,(((,(+,%,,%*(,(+*(,,(*%$($.$.$($$(,(,,*,*%%(%%%,%,,%,*,$,(,*%(+(,*+**,$,,(,*,*(,(*%*(%*%.$.+%(*(,%(%,(,,,**,$,%*(%*,**+*(,(,,*%,$,,,,,*,%%(%.%$.%(,,,,,%,%,,*,*%,%(%,,(,%*,,%$,(,(+(+**(,*,*%,*%*,,**%(*-$$.$%*%%,*,%*(,%,%%,%,(%,$,%*(*(,+(*+,%*.,(,(*(,,(*(%,(%%%.%,$(%*%%*%(*(%,%,,%,%%%,,((+(*+(,,(*(,$,*,*,(,,*%%,%%-$%*.%%%%,%%*%,*%%%%%%*,$(*%+(*(+,((*(,,**,(%%*,%%*,*%*%%$$%,(%*%%,,%,(%*%,%%%,(%%,*(%*+++((+(,(,*(%*,%,%,**%$,%%%$.%%($,$%%,$,$(,.,,,*,$%(,*(*+(,,+*,((,,,%,,,$(,,**,%*$,$%$*.(,%%,(,(,*%,%%*((+%(,(,(+**((*(,$,%%,$,$(%%%$*.(,.,%%*(,*(,(%,$,%%%%+(%%*+%%(**+(,,*(,,,%%%%*(,,,%*$(%%$,$,$(,,%,%(*,%,%%%%,(,%((,%((*(,(,,,*,$,%,%,,(,,%%-*%%*%,(%%,*(,$,,%*%,%%,%*%*,%,$,((,(,*((,*,%,%%%,*,$.*%..,$(%,$%%%*,,%*%%%%%%+%,%%(,.(,(,*,(,(%,%%%,%,*%*(,.$%*($(%$%%,**,%,,%,,,%,%*%(,%%(,*(((,,(,,,%,%,%,(,%,(%*$*$.($*(,*%*((,,$,%%%%,%%%%(%%,%%,(,(*((*,%%,%***,%,*%(%.(*.,%$%$(,$,,%%,%,%,,%,%%%%%$,*%+,,*+,,%,%,,,%,,**(*,%%%.(*.$%*%(,%,%*%%%*%,%+*%%,(%*(*(,(,*%,%,%%*%,$,%(,$,*%$(.%$%$%%*%%%%%%%%,%%**,$%,*%($,((,(,,(,%%(,,$,,%*%,*%,$$*((%$*%,%,%,%,%%%%,$+%(,*%(,,%,*%,*,,,,*,%*%**,*%,%$*.,$%$%$,%%(,%%%%%,*((%%%*(,*(,,*(,,%,.,$%,%(,,,%*%%(.*$,%%%$,,%,%%,%,%%$%(%($,%*,%,,,(,*(,,$,$%%,%*,*,($%*.,%$%,%%,%%,*%,%%%%%*%$(%*,(%*,,(*%,%,,$,,($(*%,$%$,$%%,*,$,%%%%%%%%%,%%$%(%,%%,*(,,%*,$,%*%*%%,,*.,*(%$%*%$%%%,%%*,%%%%$%%%*.,%,-*%*,,($,,,%,%*%*,($%*$%%%%$%*%,%*%,$%%%%%%%$$%**%*%%,,(,*(,*,,%,$,%,%%*(%(%,(*.,%%,,,%,%%%%%%%%%%%((%%%**(*%(,,%*%*%**%%%$%,%,$%*%,(%%%%*,*%,%%%%%%$%$$%,(%*,,%%,*(,*%*,%*%,%,%%*,$*,(%*(,%,%,%*%%%%-%$%%$%$%%*.$**,,%,*+,(,%%,$%*%$,%%,%*.,%((*%%,**,*,%%%%-%%%%%$%%$%$%(,,*%%,*,*,$(,%*,%$,%%%%,%%,$,,*%%%%,$,,$%,%%%%%$$%*%**%$(%%%%,*(,%,,(,(%,$%%%%%*(,%,%*%,(,,%,$%%%%%%%%$$%,.,(*.,*,*%,,(,*%*%$,%,,,,%*+(%*%%,%%,,(,(*%%,%,%%%%%%,$%$(%*%*%%,(*(*,%%,,*%,$%%$,.*,,$,%,,%%,$,*%*%,$,%%%,%%$*%%%$(,,%,$,(,%*,%%*%*%%,%,$,*(%,**%,,,%*,((*,$%,%*,%%%%$,%%.,%*,$,,*,*(,,*%,,%%,%%(,(,(%,%(%,*.,,(*%%*,%%%%%$*%%*%%%(,(,*%$,,*.,$,,%%,*%,**,.*,$(,%,%,,(,,*,,$,%%*%,%*%%,$%%*%$%%(,*%,,$(,*,(%*%%,,,%,%%,(,%,*,%,$,*,*,($(%%*,%%,%%%$%%,*%$,*(,,%%*,%*%*,%%,$,$,(*(%,$,((%,$%%,$,(,%,%*,%,%%%%%,%%*%**%((,,%%,*((,*%,%,%*,$,(,$*%%*,,%,(%*%*%*%,%*%%*%*%$%(*(,*,*%*(,%,%,%,%%,*,%,(,,%*,%*,,$*,*,$,$,$*,,$,%%%*%,$,$,$$,(*%,,(,,%*%*%%,,$%*,$(,(%,%,%,*%(,%$*(,%%,%*%%$,$,%$,$%*(,$,,%,%,*,,*%,%%%*,%+,%(,,%,.,%*%%,,$*(,%*,(,$,$%*,%*%%$*,**%,$,%$,%*,$,%,,$*%(%,*%*%,,,*%,,(,*(%*%*%,%,$(%,*%%%,.%,*,*(,(*,*.,,%%,*%,%%,*(,,%,$(,%,,%,$*,(*.,%(*%*,%,$,$%**%%*,(*%(%,,*,(,(%*%,,*%,,$,$,%*,%,%,%*(,,**,(,%*,%,%%*%,$,$,(,%,,*%%*,(,%*,%%%(,*(*(,,%*,,*,**,%,%,((,($,*(%*%$%*%*%,*,(*(,**(%*,(,*,*,%%%%,*%(,%,%*%,%(*(%*%,*(*(*(*(,(,,,*%,%*,$%*%*(*,%,*,*(,((,(%,%,*(%*(,%%*(,$,,%,,%,(,+,(,(,(*(,$,$,$$,*.,$,,**%,(,**,*,*,%%%(%,(,%*%,*%,%*,*%*,%*(*(,(*(,(*(,,%*%*%$,$,*,(,(*,*(,(,(,(%%%%,,,%,%,*%%%,*(*(%,,*(,*(,(,((*+%%*(%*,%%*%(%((,(,(,((,*,*,,,%$,(%%,,(+$(%,,*%(,(,****+(*%**,$%**,*(,*(,*,(,%,,*%%%,%*,,*%,%,(,%,,(,,%,(,*,((,(,*+,,%(*,,$,$,(*(*(,,%,$*,,*(,*%,*%,%*(%(,%%%**,%%,,%*,(,%*,*,,%%*,,(,%%*%*$(+(,(*,*,*(,(,$(%%%,$,%(,%%,%%,,*,*%*%,**(%(,*%,*,,$,*$,*$*(,((,*,,(%(,,$,,,%%,*%,$,*(,,$,*,,,,*%%,,,,%*,,,*%(,*.,%*,$,$,%$(%*(,%,%*(,((*,%,$,,*%,,(%,%*(,*%(,*,(*(,(*(,(*(,(,*,$(,.,*(,$,,,*,,,*(*,(%*%*,$,%*%**%*,,%(,,*,,%*(,,,,(*,(%(*(,(,%*%*%(*(%,,(*%,(*(,(*,,$,,$,*%*%,%,%*(,**(,$,(,+(*(,*,*,,+,,,%,$,.,$,,(%(,*(%*,,,*(,*%%*,.,%,%*,%,,(((,(,,(,*,,(%*(%*,(,%*(,,$,$,$%($(*,*,*,,*.,,*(,%,,*,%,*,,(,*(*,,(,*(**(,(,,,*%,(,$,*(,%%,$*.,(,,(*(%(,$(,,*%(,%%%%,*,%*%,$(,,%((*(,*,,,,***,,(%**,%(,*,*%(%*($.*.,%,%(,*,(,*,%$,*,$(%*(%,,%**,(,*(,(*.,(,%%$,*(%,,(,$(%,$,(,(.(.*%%,(%,$(,$,%%*%,,%%,%%,(*,((,,(,,$,,%,%,$%,%,%,(%,$,.,$%,*(%%,$,*%,%,*(,%*,*$,,*,*%(,%(%,*(,%(*,*,$,(%,%,*(,%,%,%(,.,((%,%,%%,,,$,%,,*%%%%,%,,*,*(%,%*,,*(,%,%,%,,*,(,%*%,%%*(%(($**%,,$,$,,*%*%,%,%*,%,%(,,*%*,$,,%(,%*,.,%*(,*,*,$,*(%**'.,(,(*%,%,$(,,,%,*%,%,*%,,,%*%,*,(,*(,*,%*%$,%,%*,,,$,.*$%$,.(($(%,*,*,*%,%,%%*%%,%,,,%,$%,%*%,%,%,,$(,*%,%,%*(,.,*,$,%*.%.*(%*%(,(,$,,%*,*%,,,%%*%%,,%*,,%,$*,$(,,(%$%,%,*,*,,%(*$*.%$.$.$+*(,*%,%%,(,,%,%,,,,%*,,,,$%,,,%*%*,*,%,%*$,(,,(*%(*%%*%$$$(*%,%,*%*,,*%,%,,%%%,,%%,(,%*%%,%,(*%*%,%%,%,,$(,(%,($$%$.($.,,*,$(,%,%*%%$,%,%,%*%,$,%*%%*%*(,(,,%%*,(*,%%,$%%%$$%.,%%%%,,%%**,,,,,,%,%,%%,%,%,%,*,%%,(,*,*%,%*,%,(,*,%,*%%.%,*($,*%$(,,%,.*%*%%,,%,,%,,%*%,$,$,(%*,$,%,,%*(,*(,$%,$,%%$$(*%.%,%,,%*,,%%%,%%,%,%$,$,,*,$,%**(,,%,%%%%,*(%,,*%(%,$,%,.,%,,*%,%*%,%,%,,%,%,%*(*.,%%$(,(%$%%*,,*,,*%*,(,*%$(**,$$,%%,,*,(,$,,%%%%,%%,%(,%,$%,($*(,$,%%,*,*%,%*(,*$,*%*(,(,$%,(%*(%*,%%%,%%%,%,%,*%%*%,%(*(.,%,%,%*((,,%,$(,(*(,*(%*,*,$(,%,(,,%,,,%,%,%,*(,%%%%*((*(**(%,%*,(,,$,$,,(,*(%*(*(,%%**,,*,,(,,%%,%%%%,$*,**%%$((*.,$,(**,*%,,%,(**(,(*((,*(,$,(,*(*,,%%%%%,((,$(%*,*(*(((,*%,%*,*$,*,,(,(,(*(+(,(%,%*(,,(*,%%%%%,%,*.,(,(*((((*(((%(*((,(%,$,(**(,(,*(**,(*(,*%,%,,%%%%,%%(,$,(*$(*(*(**(*(,%(*,%*(%*(,,*(*(*+(%(,*(,(*%%%,%%,*%,*%(%%(((*(%(,(,%*,(*(,%,,,(*((,*,%,*(,(,,%,%%%,%%*.,(%*%**(((*(*(*,%,*%,,*,($%,$,((%%,%,$,%*(,$%%%%%,%,,**%,$*%%*(*(%,%,**(,,%,%*,*,.*,(,*%*.,,(*,%,,%%%%,,*%%*.(,$,(%,,(,**,*(,,(,$,$,,*%,*%((**(,,%(,(*,,%%%%,%,,,,,$,%*(%*$,$,(,%(,*(%,*,(,%*(*(**%(,,$,%$,*(,%%,%%%,,%$*%%*%*%*%.,$,(,*(%,*,,*,(,,,(,,(,,*%,(,(,*,,%*%%%%,(%*,%*%(%**%*(*%(,*(,*,((*(,*,(**%,,*,,,**.,*%%-%%,%*%%%,,*%,*%*,**(,(,%,,,(%*,%(,$,%(%%,%%,,*%%-%%%,%%%*.,(,(,*(,*(*(*(*(,,(%**,,%,(,*,%%*%%%%%%%%%%,%,,*%*%$%%*(,%,*%,(,*(,,,,,,,*%**%*(%,,*,$(%*%,%%%%%%%%*%*%,%%%%,%(,%,$,(%*(,((*(*(,(,%%,*,,%%%*,%,,(,%%%%%-$$%%%*%*%%$%,%*,**%*(,,*(,*(%,%,%,$%%%,*,,%%%$,%%%%%%$%,$,%*%%,$,%,%,*(%(,%%,*%*%*$,%,,,%*(,*,*,%*%%%%%%%%*%*(%,%%%*,%,%*,(,,%**,*(,*%*%*$%*%*(,,%$,$,,%,%%%-%%%%%%-%,%%,%$%$*%%%,,%,%**,$,%,%(,%,%,$%,,,,*.,,$,$%%%%%,%%%%%,$,,$,%%%*%,,,%*%*,*%(,($,*%,$,$(*%,$(,,$,,$,%%%%%%$%%%,$,%***$%,%*%,,%(%,,(%,*,(,,$,,,,*(,*%,*,%%%%%%%%$%%*%%,,*(,$,%(%,%,,%*,*,**,*%(,,(%*%%**%(,%*(%*(,$,%%%%%%%,$%%%%*,%(*.%**%*%*,$(%,(,$,**%*%,%(,,,*(,(,%,%,%%%%%%%%%%%*.*(%%*(%,%,,(,,*,,%*%(,$(,%,,%%*%,(,%,$,$%-%%%%%%*%%%,,%,(%$(*,,*%,%,$,(%*,%,*.,,,%%%*,%*(,*,%*,%%%%%,%%%%*%%$$.*,.%(%,%,%,*,(,**%%,,(*,*,%,(%,*,*%,%,,*%,%%%%,$,%%$,,*,%,%.,*($,%,,%,%%,%(%*%*($,,*%%%%%,,(,(,%%%,%%%,%%*%$%%*%*%*.*%*.%*(%*,%,%**(,*(%,%*((,%,%,,%*,*,%***,$,%,%%%,*%%,*%,%%,%$,$,%($,%*%%,%,(,$,%%$,*.,$,%**,*,*,*%,%,,%,*,%$%%,$%%*$,$,$%($,.*(%*%,,,$,*%,*%%*.,$,$,%,%,%*(*,%,*%**%*%,%%%$%(*,%%*,$,*(,,(,,,%,,*((%,$%%(*(%*(%**,*(,%(,%*,(,*,$,%,%$%,$,%%(*,%,%,%(%$*(*%*,%%,,(,*%%,$(,((%,*%,(*,%*%,%,*,*%(,*%*%%,$%$,$,,%%,$,$,*,(,(,%%%*%*(%*(*,$(**($,*.*%*,*,,*%*(,(*(,,%*$($%%%,%%%,%*((,.*,$,$,*,,(**%(,.,$((,(*(,,(*(,(*%,%,(,*((,**,*%,%,%,%,%,%*(,*((,(,(%,.,*((,$,(*(,(*(*(%.(,%((,%*(,*(,(,*(%*(,%%,%%,%,,%*,%$,*((*(,%*,*%,*,.(*%(*(($,((**,*,(*,%,$,,(*(%*((%,$,$*%,%,*(,(%(*,(%*(,*%(%*%,*$%*.,*.,$(*(,%*,%,,*,(*,(**+,,(,*%%%%%%%%*$(*(*.%,%,%,,%(,*(%,*,(.*((,((*(,((*,%,%*,(*+,*(*,%%%%,%%,(,(*((%,%,*%%%*%*.,*(%$*%%(,*$,$*,*,(,*,$,(,(*((%(*(%%,%,%,,*.,(*,%,%,*,,%,,(,%,(%%**(,*,((,(,%*,(*,(*++*(,(,*,%%%,$*(,(*.,*%,%,%,$,$,$%*%*%*%,%%((,,.**(,,,(,(,(((,$(*%,%%%%,,%,%,.*(,*%,%,%,%,%,*%%*%*%*%$%*,*%,,%%%*,,**((,$,*%,%%%%%%,*%%%%%(%%%%%%,%%%%%%%%,%%"  "         "   !   !      !         !   //              /             /,$,,%%,%%%%*,$,.*., "#&+++(+++*(++(+'&+(&+(+,,,%*,%,%,$,%,*((***$+**+++(((++*+++++#&#(&#&###&&#&&&+#(((*+(*+#*++,*(((*(+(++&+&##+#&&+&&& #&&&&+#+++&+&++#((*+++++&#&&& &&&+#+&+#&++&+#+++(#+&+&&#&&& &&&&&&##+&+#++++&+&#++#&+&&&&&&@>s @@####+####(*,((***((+(+(##+##((((((*((((%%%$%%(*(**((+((((($%*(*(,%%%%%%%%%%$*((*((((((*$*(*((%%%%%%(%%,$%($(,(,*(((*(%(**((**,%*,,%$%%%*%%,,*,,*(((*(%(*%,*(((***%%*%%%$$*%,,(((((($,*,,,*,*,(,*%%**%%$(%%*,%*((((($*$,%,(%,*%%%%%%%%*%%,**%*(((,*%*,$%%*,%%%,%,%%%%%*%*$*%,*(**%%,%%,%%%%%%%%%%%%%(%%*%$%****%%%%,%%%%%%%%,%%%,$*$*****%*%$*%%%%%%%%%,%,,%%*%*,,%%,$*(*$%%%%%$,*%%%,%,%%%*%($%(,*($%*$%%%%,,%%%%,,$%%%%,*%%%,,((*(*%$%%%%%%%%,,%,%,%*(*,,%$%*(,((($%%$%$%,*%%%%%,$%,(,$%%,%***((*%$%%%%%%%%%,,%%%,*%,%%,,(,*((**%$$%*%*%,%,%*%,%%*,**%%*%*,*,***$*(%,%%%%%,,%$%****%%,,***(***(*,**%%%%,%%,**%%$*%*%*%(,*((*,*$%**%%,,%%%,%,*%*%%%*%**(((,**$%$%%%%%%%%,%*%$%***$*,((*****%%%%%%%%%%,$,***%*%*%,**,(,(,%%%%%$,%*%%,%%%*(**%$%%%**%****,%%%%%%%%$,,%,,%*,%,*%%,%,%,***,(%%%%,%%%%***(*$,%%%%%%,%%,%,$*,,%%%,%%%%(*((+(*%,%%%%%,%*,%%$,*%,%%,%%%%((((*,%%%%%%%%%%%%***(%%$%%%$%*(++((,*,,%%%,%%,*%%(%$%%%%%%$((((*,,%,,%*%%%(%%*($%%%,%%*,(((((,%%*,$,%%%%$,%*$(,%%,%%%%%($*(***%%%%%%*$*(($%$%%%%%,((*((,%%%%%%(**$(*%%%%%%$%$%((,*%%%%%$*%*%*%%%,$%%%%**(*%%%,(%*$%%%,%%**%,(,(,(%%%%%%$%%,%%%%,%%%%%,%*%%%%,%%$,%%$%%$%,*,*%%%%,%%%%%%%%%$%(%%*%,,%%%$%$%%%%%%%$%$(%%,*,**%%%%%$%%%%%%%%$$%%$$*%,*%(,%%%%%%%%$*%%%%%%%%$*$%%%%*($%%%%%,*($%%%%%%$%$$$,$,,(%%%%%%%%,*$*$%%%%%%%%%*%,,*($%%%$%,$$$(%%%%%%%%$%$%*,%,,*%%%%$%$$$$$(*%%%%$%$*(,%%,$%$%%%%$$%$$**(%%%%$$$%$%(%*%%%**$%$%$(*%%$*%*%%%%$$*%$*$,,%%,(*$*%%$$%%%%%,*,$%%%*%$$$$*%*,%%,((*%$$%$%*%$%,%%%%%$$$**($,%%((*(*%$*%%(,%%%$%%%%$$$**,,$%%%*****$%$%,%%%%,%%$%$$$$**,$%,*,(*($$$,**%%,%%%$%$%*%**((*%%,%*$%*,(*%*%%%%%%,$$%*$**$$$*%,%,(*(*((%*$%%%*%%%%%$$$($*(*,%%,*(*$*%*$%,%%,%%%%$*%$$$$%%,%%(*,$*%%%%,%,,*,,**$$%%$(($,,%%*,,%*%%%%%%,%,%%*%****$*$$$%(%,*,$%$**,%%%,%%,*(((*%%$$(%%%%,*%%$%$$%$%(,(*%%(((*$$$*$($**%,*%%%%,,*%**(((,%*((*($$$$$$*(**%$%%,%,$%*(((**,*,**%($$(,*%%*,%**%*%**((***,*,*$%$$%$$%*$(%%%%%((((*(****,*%%%$%$%%%*%%%%$%(*(((*(*%%,*,*%$$%$*%%*($%,%((((*((,%%*$%%$$$%$*,(*%%%(%(%(((***%%%*%$$$%$%*,,%%,%%%$((,(,%%%*%%$$($$%**%,%%%%*%,*(*(,%%%***%%($%$$%,%,%%%%*$((,*%%*%,$%*%$$%$$%%%%*$*$*,*,*%,*$%*,%$($%%%%%%%$$%%,,,*(,%%%,*(%%$%,%%%%%%%%$%%*(%,$%$%*$$%$$%%%%$$%$%%*(*,*%$%%$%%$(%%,%%%%%%$%,%***%$%%%%$$%(%%**%%%%%$%$%$*$%%*(%*$%%%%$*%%%*%%%%%%$*$$*,*(,%$%%%$($%%%%**%%%%$%$*%,**,%,%%%$(%*%%%*(*%,%%%$%$%(*%$**$%%,,%(%*%%,***%%%%%%%%$%*(%%*(,%%*,%*(%%%**%$%%%%%$**,**%%,$%*,*%%**%$*%$%%%$$$**$%%*,%%*(%,%%%%,(***%%*%%%$**,**(%%,*,%$,%%*(****%%%$%%*(**%***%%%*(*%$,**%,(((*(,$%*$*(*%******%(%%*%,%,*(((((*%$$*$*((*((**%%%%%,%,(*%*((**(,$*$%$%(*,**,*%%%*%*%*,%,%****,*,(,$$((*****,%%%%(%,%,%,,****,*$*$$(%*,,*((%$,%,*%*%,*,(,*((((*$$*(%%(*****$,$%%%%***(**((**,,*%$$$*(****,(%%*%****((**,*,*****%$$(*(%%***%%**%%%***(**$,%,%,*$%$$((%%%,%*,*%%%%,%(,*,*,%%,*(%%%($(**,%$*,%,%%%%%,***,*$%%%*,*$$$($$***%,%%%%,%,%,%$%*($%**,*$$$$$*,*%,*%,%%%,,%,%%**%%$,*(%$%$$$%%,%*,%%%%%%%%%*%(*,%%(*%*%$%($%$,%*%%%%%,$,$%**%%%*(,%$%$*$%,,*%%%%$*$%(*$%%,*,$(*$*(*$**%*%%%%*%%%((*%%,(*%,((*((%*,*,%(**%(((****,,(((((*%*(*,%%%*$(*(((((*(%****(*,((,%%$*$%(((((%**,,$*((%$,*,%%%%($%$,(*,*(,%,****(,%**%,%,$$$$$*,(*,*(,(**,,,**,%%*%%%$*$*(*,*(***%(%,%*%%%%%*%*,(******$*%%*%*%%$%%$%%%%*%$(,(((*,%%%%*,%%%%%$*%*%%*,*%**$$%%,*%$$%%%%%%%%%$%%,%***%$%%$,**%,%%%$%%,*$%%%%,****,,$%,**(*%%%%%%%*($*%,**,$*$*%%%$(,%*%%%%%$$$*%%%***%,(,%%%,*,%,%%%$%%$%*%$*$,,%$,(%*(,%,**$*,%%$%%$%%$$%(%%%*%%$*$$%,**,***$%%$$%*%%%*$(,,%*($%$($*%*,*,**(*%$$%%%%$(***%***($$((**(((%,((***%%%%%%*$*((%**($((((($***,**(*((*%%%*((*%*,%**$*((*(**(,%*(((*%%%*((%%%%%**%*%***((*,((((*(,%%%%((*,%%%*%$$$%%(%%$%%%                 *((,,((((((,%,%,%,%##&#(+(#+(((+##&####+###+##& Nw @#+((((%,%,*(((++((***,%%%%%%**(((*****,*,,%%*,,(((*,,,*,%,%%,,,((*%%%,%,,%%**,,*%%%%%%%%%,%**,%**%%%%,%%,%%,*%%*(*%%%,%,,,,*,,**(*$%,,%%,,,,%,******,%%%,,%*,,,(**%%%%%,,,,,,,**,%%%%%,,,**,%****%%%%,,**,,%,,,*,%%%%*((,%%%,%,,*%%%%(((,,,,%%*$*%%%,((*,%%%%%**(%%%%*(*%%%%**%%,%%,**%%,%%%%%%%,*%%%%%%%%%*%*,%%%%%$%%%%%$%,,,%%%%**%%%%%%*%,*%%%%*(%%%%%$*%,%%%%$$,%%%$%$*,%**%$,%%,%%%$**,%**$*%*%,%%%$*,,%***%,,,%%%$***,%****,%%,%$***%,***%%%,,,*****,,,%%%,%,,*(*%$*,,*%%%,*(*,**$$$*,,%,,%*(****%%$%,,%%$(((,%*%$$%,*%,*((*%%,$$$%*%%%%%*(*%,**$$$%%%%%*,*,%*,$%%%%%%%%*,,%%$%$,%%%%%%*,*%%%*,%%%%%**,*%%%*%%*$%%%%%*%*%,,*%,,,%%%%$*,,%%,,%%,**%%$$***%%*,%*,(*,%$****%%,%,*,(**,$*(**,%*%,,,**,*,*%,**,,,******,*$***%,%,***,,,*$**,,,%%,,**,%,*%(**,,,%%,,*,%**$$$,,,%%%,,*,%,,%$*,,,%%%,%**%*,**(**,,**(**,*(*,*%%%**(**,,**,*%%,%$**,**,,,%%%%%*****%,,%%%%%%%%,***%**,%%%%*$%,**,%,,%%%%%%$*,%*,*%***,%%%%$*,,*%*,*****%%%******(**,*((%%**,,****%%,*,%%%%%%     &++++#&&@^x @+((%%*(+(***,%,**%%%%%*,($%,,,*,**,%,,,,*%%,,*,**%%**,,,*%%(*,%,*%%*,,%%%%,%%%%%%$,,%%*%%$,*$$,%$*,**,,%**,**%,***,,%,(**$,%%*(%*$*%%**%*$%%%%**%$%%%$**,*,%%%*,,,,*%$**,,,***,*,******,,,*%*$*,%%*,***,%*(***,%%****%%%$,*,*%%%*,*****%*,*(,,*%%% x @(*,(*%,**,,****,%,%%%$,%%*****,,**%%**%%*,***,***%**,%***%**x ****$%***%**%*%%x ***%x **y *_@G 1@OXGRZIT]MV_NYaNYbQ\cQYcT^eS[eVafS]fW`gU^hZbhWciXbjZdkZak]el[cl^fm\en^in\go_eoajp^hp`gpbjq`iqckrans^msakscjsemtcktfhtjnudqvaluhnvfrwbjvjmvhqweowgnwiqxgtydkxmoxjqyitygpyktzgmyorzjqzls{ju{ir{mp{ou|kw}ir|ot}mw}kp}rt}ox~lv~ns~qwnupymtrvpxots{mwrzoypvt|nxrzq|owuyt|q{rwv~pzt}r|s~qyw|t~syxr|vt~uzys}wuv{zt~xwu|{x~zwuy~|wz}ywz{~zx{z}y|~{}|~}|~|}~ìǰε@k@    +++  ///373333'/3#3##7#';'';'777/#7;7+C+ ' /3';;;;?;7;7+C++G++K+ + 7;/;?//K/7C3;sg[K?3'?K#O 7 73O3C ; C ? ? G#W#;K;GGCCCC3O33S3#[# C '_#?GGGGKGK G OCKKK7W7 G SWO[K K GOOO7[7;_;KKSSSSSSKSK O _SWcSWWWWW+ '[+_[[[//g'#_##c______33gkccc k ggggggkkkooo{{{CC''++__CC++++++//++//////////ccGGCCGG33// GGGGKKKKkkccggKKKKOOKKKKookkkkwwoowwoo{{oosswwsssswwssoooooo@   #+/3 7 ; C GKOSW_#c#g'k'o+w+{+//3377;#;#;#?#?'C'C'G'G+G+K+K+O/S3W3[7_?cCgCoKsOwS{W[_cgks@     !&!    $!*',&).)  ,2+.5-/9-&0 3%9# 2:1"7*@&$ ,-C*'>$ %6>64>352+I' *6A59E82G/ ?$E &G":< 0 8U52Y-BF#O@ K>ETCAR?@X<:X65_0,]&3d-%WPTTG IWGGZEDYAE]B@_<;^7;d66h0,b%L Ca?.g&O J`GBd>Af;>i7IwBAz9D=8y/:~0:0>41&mZtVO~IoU~POGF=@51&.#*$~'7,!|0#vz+ ),' !#1#%+ #"&`x]njc^hdsnWQaYYRI@NEE:WLB6M@G:;/;,7)G89)<,?/2!3"+6#*$/;)%zvmfd[^QL=Q@I7(zj^*bTR?9$A-**{qm`I4D/)T?-}seS<%/vk[5ъue' ӛsQ//============================================================================= // Player start location. //============================================================================= class PlayerStart extends NavigationPoint native; #exec Texture Import File=Textures\S_Player.pcx Name=S_Player Mips=Off Flags=2 // Players on different teams are not spawned in areas with the // same TeamNumber unless there are more teams in the level than // team numbers. var() byte TeamNumber; var() bool bSinglePlayerStart; var() bool bCoopStart; var() bool bEnabled; function Trigger( actor Other, pawn EventInstigator ) { bEnabled = !bEnabled; } function PlayTeleportEffect(actor Incoming, bool bOut) { if ( Level.Game.bDeathMatch && Incoming.IsA('PlayerPawn') ) PlayerPawn(Incoming).SetFOVAngle(135); Level.Game.PlayTeleportEffect(Incoming, bOut, Level.Game.bDeathMatch ); } IDIKRJ -lKa/! .K j C )RK-V* -l gGIHI-s-s |H6qImSIIsS[" " " " * *߷"F# @mooomoqmmttqttqtmottottttoommq060# # ##88 6`m068 0  8660086 0 688806686 0888888888888888668888686888 n6//============================================================================= // Spectator. //============================================================================= class Spectator extends PlayerPawn; var bool bChaseCam; function InitPlayerReplicationInfo() { Super.InitPlayerReplicationInfo(); PlayerReplicationInfo.bIsSpectator = true; } event FootZoneChange(ZoneInfo newFootZone) { } event HeadZoneChange(ZoneInfo newHeadZone) { } event PainTimer() { } exec function Walk() { } exec function BehindView( Bool B ) { bBehindView = B; bChaseCam = bBehindView; if ( ViewTarget == None ) bBehindView = false; } function ChangeTeam( int N ) { Level.Game.ChangeTeam(self, N); } exec function Taunt( name Sequence ) { } exec function CallForHelp() { } exec function ThrowWeapon() { } exec function Suicide() { } exec function Fly() { UnderWaterTime = -1; SetCollision(false, false, false); bCollideWorld = true; GotoState('CheatFlying'); ClientRestart(); } function ServerChangeSkin( coerce string SkinName, coerce string FaceName, byte TeamNum ) { } function ClientReStart() { //log("client restart"); Velocity = vect(0,0,0); Acceleration = vect(0,0,0); BaseEyeHeight = Default.BaseEyeHeight; EyeHeight = BaseEyeHeight; GotoState('CheatFlying'); } function PlayerTimeOut() { if (Health > 0) Died(None, 'dropped', Location); } exec function Grab() { } // Send a message to all players. exec function Say( string Msg ) { local Pawn P; if ( bAdmin && (left(Msg,1) == "#") ) { Msg = right(Msg,len(Msg)-1); for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.IsA('PlayerPawn') ) { PlayerPawn(P).ClearProgressMessages(); PlayerPawn(P).SetProgressTime(6); PlayerPawn(P).SetProgressMessage(Msg,0); } return; } if ( Len(Msg) > 63 ) Msg = Left(Msg,63); if ( !Level.Game.bMuteSpectators ) BroadcastMessage( PlayerReplicationInfo.PlayerName$":"$Msg, true ); } //============================================================================= // functions. exec function RestartLevel() { } // This pawn was possessed by a player. function Possess() { bIsPlayer = true; DodgeClickTime = FMin(0.3, DodgeClickTime); EyeHeight = BaseEyeHeight; NetPriority = 2; Weapon = None; Inventory = None; Fly(); } function PostBeginPlay() { if (Level.LevelEnterText != "" ) ClientMessage(Level.LevelEnterText); bIsPlayer = true; FlashScale = vect(1,1,1); if ( Level.NetMode != NM_Client ) ScoringType = Level.Game.ScoreboardType; } //============================================================================= // Inventory-related input notifications. // The player wants to switch to weapon group numer I. exec function SwitchWeapon (byte F ) { } exec function NextItem() { } exec function PrevItem() { } exec function Fire( optional float F ) { ViewPlayerNum(-1); bBehindView = bChaseCam; if ( ViewTarget == None ) bBehindView = false; } // The player wants to alternate-fire. exec function AltFire( optional float F ) { bBehindView = false; Viewtarget = None; ClientMessage(ViewingFrom@OwnCamera, 'Event', true); } //================================================================================= function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { } FNIOI  kTIUI+t )-J(#* I|!.' PIQIRISIhVIWI% --J-T+r#*-J( W'YIG  EI64[!ZIWb  BoS\I^@  XI16v$^IA F-'T>T:5x@**t ^(_I| z a(`Id[c1"-0zd&#dd}d&kNwk*ka/! .km.k k@.k ld%kkMF }d,?dd,?  -sFpp ,:d' k(cIz \ [I128e!dIqV*%0*!O  R!eIBLE #'#55:5q!Y y(fIgI`G D&jIt=(Aa(((-L'q!YB BhI@iI@a kIJ9| HlI`5[ s(mId16 Bm nIoIi- TpIJ(W(  WJ( s%rII(y :/-J-I(-T-J-r#*-J( G7@B&tIh   BP7p uIg J vIwIR F xIyIT ~Td ~ -o' C//============================================================================= // MapList. // // contains a list of maps to cycle through // //============================================================================= class MapList extends Info; var(Maps) config string Maps[32]; var config int MapNum; function string GetNextMap() { local string CurrentMap; local int i; CurrentMap = GetURLMap(); if ( CurrentMap != "" ) { if ( Right(CurrentMap,4) ~= ".unr" ) CurrentMap = CurrentMap; else CurrentMap = CurrentMap$".unr"; for ( i=0; i ArrayCount(Maps) - 1 ) MapNum = 0; if ( Maps[MapNum] == "" ) MapNum = 0; SaveConfig(); return Maps[MapNum]; } W}ICeb#{e7|e,.unreeJepe.unrA %A , |eA WNA A QNN, &N%zNWN%bNW uE1)Ee@hp7Say -` 'q!l ~IgI!7TeamSay -` 'q!l IfX X &%, b(//============================================================================= // Logs game events for stat collection // // Logs to a file. //============================================================================= class StatLogFile extends StatLog native; var bool bWatermark; // Internal var int LogAr; // C++ FArchive*. // Configs var string StatLogFile; var string StatLogFinal; // File Manipulation native final function OpenLog(); native final function CloseLog(); native final function Watermark( string EventString ); native final function GetChecksum( out string Checksum ); native final function FileFlush(); native final function FileLog( string EventString ); // Logging. function StartLog() { local string FileName; local string AbsoluteTime; SaveConfig(); AbsoluteTime = GetShortAbsoluteTime(); if (!bWorld) { FileName = LocalLogDir$"/"$GameName$"."$LocalStandard$"."$AbsoluteTime$"."$Level.Game.GetServerPort(); StatLogFile = FileName$".tmp"; StatLogFinal = FileName$".log"; } else { FileName = WorldLogDir$"/"$GameName$"."$WorldStandard$"."$AbsoluteTime$"."$Level.Game.GetServerPort(); StatLogFile = FileName$".tmp"; StatLogFinal = FileName$".log"; bWatermark = True; } OpenLog(); } function StopLog() { FlushLog(); CloseLog(); } function FlushLog() { FileFlush(); } function LogEventString( string EventString ) { if( bWatermark ) Watermark( EventString ); FileLog( EventString ); FlushLog(); } // Return a logfile name if relevant. function string GetLogFileName() { return StatLogFinal; } function LogPlayerConnect(Pawn Player, optional string Checksum) { if( bWorld ) { if( Player.PlayerReplicationInfo.bIsABot ) Checksum = "IsABot"; if (Player.IsA('PlayerPawn')) LogEventString( GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Connect"$Chr(9)$Player.PlayerReplicationInfo.PlayerName$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$PlayerPawn(Player).bAdmin$Chr(9)$Checksum ); else LogEventString( GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Connect"$Chr(9)$Player.PlayerReplicationInfo.PlayerName$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$False$Chr(9)$Checksum ); LogPlayerInfo( Player ); } else Super.LogPlayerConnect( Player, Checksum ); } function LogGameEnd( string Reason ) { local string Checksum; if( bWorld ) { bWatermark = False; GetChecksum( Checksum ); LogEventString(GetTimeStamp()$Chr(9)$"game_end"$Chr(9)$Reason$Chr(9)$Checksum$""); } else Super.LogGameEnd(Reason); } ECJVm^\ h[-F-Z(Q*Rppppppp, game_end, V, RfEV QHJuAMp-F2u -}Z IsABotua/! pppppppppppp, player, Connect, u ,, Su D, T.u-0, Z bpppppppppppp, player, Connect, u ,, Su D, T(, Z kuQuZ  @@Jh0X X &%, T7L] au EJJdJx h$KJLJ@HHV GJLcYLxK `$NJJ?'-ZW$JV$J| @JJOeOR _$RJ|:YX$ V'//============================================================================= // NavigationPoint. //============================================================================= class NavigationPoint extends Actor native; #exec Texture Import File=Textures\S_Pickup.pcx Name=S_Pickup Mips=Off Flags=2 //------------------------------------------------------------------------------ // NavigationPoint variables var() name ownerTeam; //creature clan owning this area (area visible from this point) var bool taken; //set when a creature is occupying this spot var int upstreamPaths[16]; var int Paths[16]; //index of reachspecs (used by C++ Navigation code) var int PrunedPaths[16]; var NavigationPoint VisNoReachPaths[16]; //paths that are visible but not directly reachable var int visitedWeight; var actor routeCache; var const int bestPathWeight; var const NavigationPoint nextNavigationPoint; var const NavigationPoint nextOrdered; var const NavigationPoint prevOrdered; var const NavigationPoint startPath; var const NavigationPoint previousPath; var int cost; //added cost to visit this pathnode var() int ExtraCost; var() bool bPlayerOnly; //only players should use this path var bool bEndPoint; //used by C++ navigation code var bool bEndPointOnly; //only used as an endpoint in routing network var bool bSpecialCost; //if true, navigation code will call SpecialCost function for this navigation point var() bool bOneWayPath; //reachspecs from this path only in the direction the path is facing (180 degrees) var() bool bNeverUseStrafing; // shouldn't use bAdvancedTactics going to this point var bool bAutoBuilt; // placed during execution of "PATHS BUILD" var bool bTwoWay; // hacked here to fix CTF problems post release (used by Botpack.AlternatePath) native(519) final function describeSpec(int iSpec, out Actor Start, out Actor End, out int ReachFlags, out int Distance); event int SpecialCost(Pawn Seeker); // Accept an actor that has teleported in. // used for random spawning and initial placement of creatures event bool Accept( actor Incoming, actor Source ) { // Move the actor here. taken = Incoming.SetLocation( Location + vect (0,0,20)); if (taken) { Incoming.Velocity = vect(0,0,0); Incoming.SetRotation(Rotation); } // Play teleport-in effect. PlayTeleportEffect(Incoming, true); return taken; } function PlayTeleportEffect(actor Incoming, bool bOut) { Level.Game.PlayTeleportEffect(Incoming, bOut, false); } [$TJx4 |R* s6^$V$cw $b\\ -FcppppppppZ$/P.h.\.S bFpc.tmpVpc.logcppppppppY$/P.o.\.S bFpc.tmpVpc.log-Z'T$ VOUOC} MJTuTRR VJYzTYF S7_ a  [J~$[ZM A=o=du>Tu>X='A[oZX#?z~?::$I~'$"*~'$" h|JP M\-sH$P  ^7_7V& FX//============================================================================= // Event. //============================================================================= class Triggers extends Actor native; l"//============================================================================= // Counter: waits until it has been triggered 'NumToCount' times, and then // it sends Trigger/UnTrigger events to actors whose names match 'EventName'. //============================================================================= class Counter extends Triggers; #exec Texture Import File=Textures\Counter.pcx Name=S_Counter Mips=Off Flags=2 //----------------------------------------------------------------------------- // Counter variables. var() byte NumToCount; // Number to count down from. var() bool bShowMessage; // Display count message? var() localized string CountMessage; // Human readable count message. var() localized string CompleteMessage; // Completion message. var byte OriginalNum; // Number to count at startup time. //----------------------------------------------------------------------------- // Counter functions. // // Init for play. // function BeginPlay() { OriginalNum = NumToCount; } // // Reset the counter. // function Reset() { NumToCount = OriginalNum; } // // Counter was triggered. // function Trigger( actor Other, pawn EventInstigator ) { local string S; local string Num; local int i; local actor A; if( NumToCount > 0 ) { if( --NumToCount == 0 ) { // Trigger all matching actors. if( bShowMessage && CompleteMessage != "" ) EventInstigator.ClientMessage( CompleteMessage ); if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Other, EventInstigator ); } else if( bShowMessage && CountMessage != "" ) { // Still counting down. switch( NumToCount ) { case 1: Num="one"; break; case 2: Num="two"; break; case 3: Num="three"; break; case 4: Num="four"; break; case 5: Num="five"; break; case 6: Num="six"; break; default: Num=string(NumToCount); break; } S = CountMessage; while( InStr(S, "%i") >= 0 ) { i = InStr(S, "%i"); S = Left(S,i) $ Num $ Mid(S,i+2); } EventInstigator.ClientMessage( S ); } } } gaJN,/M:^%:^%E-D {CZ  C+!/a0 |+|N,Z10-D {{^ $ione- $itwo- $ithree- $ifour- $ifive- $isix- iR^-z{~z%i%[~z%izppz[iz[,8Z  z lJk " ^z WJ\a\F[ cJ^b ^K dJb`[bK?a eJv_ # gv%Zv,@vxvR!vF*vKvR fJjc!{BSD?S&?,@a a &,@&SRfR@e SxBSFjSKFR ~ g 'A&Fg 7P^PPg ^__P^PPg ^Rg  e %e  jJiJXOb( e^w2 z^ kJkR( F" " " " *:I#*"F# @Ic>v>$V/Ӧ>$>$ڀ>$cҘN$u' ΦS<Ęҋ/,S$v6z+jSccSSI>NcjcjjvSSccjvIIIISIIII>>?>SSSSII>cĮcS/'>>/ScjjS//3vڋ''$>vvS'vVc'-3ڀ$'$ٸj  / IIv  v''vc'> '%Ě lI!)j~3f €ct 2>"%23<3 2:B)2  '-  :BMa  u L//============================================================================= // InventorySpot. //============================================================================= class InventorySpot extends NavigationPoint native; var Inventory markedItem; w0//============================================================================= // Projectile. // // A delayed-hit projectile moves around for some time after it is created. // An instant-hit projectile acts immediately. //============================================================================= class Projectile extends Actor abstract native; #exec Texture Import File=Textures\S_Camera.pcx Name=S_Camera Mips=Off Flags=2 //----------------------------------------------------------------------------- // Projectile variables. // Motion information. var() float Speed; // Initial speed of projectile. var() float MaxSpeed; // Limit on speed of projectile (0 means no limit) // Damage attributes. var() float Damage; var() int MomentumTransfer; // Momentum imparted by impacting projectile. var() name MyDamageType; // Projectile sound effects var() sound SpawnSound; // Sound made when projectile is spawned. var() sound ImpactSound; // Sound made when projectile hits something. var() sound MiscSound; // Miscellaneous Sound. var() float ExploWallOut; // distance to move explosions out from wall // explosion decal var() class ExplosionDecal; //============== // Encroachment function bool EncroachingOn( actor Other ) { if ( (Other.Brush != None) || (Brush(Other) != None) ) return true; return false; } //============== // Touching simulated singular function Touch(Actor Other) { local actor HitActor; local vector HitLocation, HitNormal, TestLocation; if ( Other.IsA('BlockAll') ) { HitWall( Normal(Location - Other.Location), Other); return; } if ( Other.bProjTarget || (Other.bBlockActors && Other.bBlockPlayers) ) { //get exact hitlocation HitActor = Trace(HitLocation, HitNormal, Location, OldLocation, true); if (HitActor == Other) { if ( Other.bIsPawn && !Pawn(Other).AdjustHitLocation(HitLocation, Velocity) ) return; ProcessTouch(Other, HitLocation); } else ProcessTouch(Other, Other.Location + Other.CollisionRadius * Normal(Location - Other.Location)); } } simulated function ProcessTouch(Actor Other, Vector HitLocation) { //should be implemented in subclass } simulated function HitWall (vector HitNormal, actor Wall) { if ( Role == ROLE_Authority ) { if ( (Mover(Wall) != None) && Mover(Wall).bDamageTriggered ) Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), ''); MakeNoise(1.0); } Explode(Location + ExploWallOut * HitNormal, HitNormal); if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) ) Spawn(ExplosionDecal,self,,Location, rotator(HitNormal)); } simulated function Explode(vector HitLocation, vector HitNormal) { Destroy(); } simulated final function RandSpin(float spinRate) { DesiredRotation = RotRand(); RotationRate.Yaw = spinRate * 2 *FRand() - spinRate; RotationRate.Pitch = spinRate * 2 *FRand() - spinRate; RotationRate.Roll = spinRate * 2 *FRand() - spinRate; } {ZN*uJ] ^" a @e7vJM$JWL sJ@mJiV(-y'_  yJxJjZL) [bw7R *~,'V V?,oR  zJ^O`){1.z':1.g:$^E^f xu^x :1.g:$1.-_x :1.g:$x{M:1.g:$xy:1.g:$xv:1.g:$xu{x^V $^E^tu^x i7@Kiy_]'D,(w_H*w.n _*'( BKCKm7DKpSbSGK}Jl u^-{l -l(l aZ[rl 2VJ?,[?,`?,r?,l aZ( q7HB//============================================================================= // Fragment. //============================================================================= class Fragment extends Projectile; var() MESH Fragments[11]; var int numFragmentTypes; var bool bFirstHit; function PostBeginPlay() { if ( Region.Zone.bDestructive ) Destroy(); else Super.PostBeginPlay(); } simulated function CalcVelocity(vector Momentum, float ExplosionSize) { Velocity = VRand()*(ExplosionSize+FRand()*150.0+100.0 + VSize(Momentum)/80); } simulated function HitWall (vector HitNormal, actor HitWall) { Velocity = 0.5*(( Velocity dot HitNormal ) * HitNormal * (-2.0) + Velocity); // Reflect off Wall w/damping speed = VSize(Velocity); if (bFirstHit && speed<400) { bFirstHit=False; bRotatetoDesired=True; bFixedRotationDir=False; DesiredRotation.Pitch=0; DesiredRotation.Yaw=FRand()*65536; DesiredRotation.roll=0; } RotationRate.Yaw = RotationRate.Yaw*0.75; RotationRate.Roll = RotationRate.Roll*0.75; RotationRate.Pitch = RotationRate.Pitch*0.75; if ( (speed < 60) && (HitNormal.Z > 0.7) ) { SetPhysics(PHYS_none); bBounce = false; GoToState('Dying'); } else If (speed > 50) { if (FRand()<0.5) PlaySound(ImpactSound, SLOT_None, 0.5+FRand()*0.5,, 300, 0.85+FRand()*0.3); else PlaySound(MiscSound, SLOT_None, 0.5+FRand()*0.5,, 300, 0.85+FRand()*0.3); } } auto state Flying { simulated function timer() { GoToState('Dying'); } simulated function Touch(actor Other) { if (Pawn(Other)==None) Return; if (!Pawn(Other).bIsPlayer) Destroy(); } simulated singular function ZoneChange( ZoneInfo NewZone ) { local float splashsize; local actor splash; if ( NewZone.bWaterZone ) { Velocity = 0.2 * Velocity; splashSize = 0.0005 * (250 - 0.5 * Velocity.Z); if ( Level.NetMode != NM_DedicatedServer ) { if ( NewZone.EntrySound != None ) PlaySound(NewZone.EntrySound, SLOT_Interact, splashSize); if ( NewZone.EntryActor != None ) { splash = Spawn(NewZone.EntryActor); if ( splash != None ) splash.DrawScale = 4 * splashSize; } } if (bFirstHit) { bFirstHit=False; bRotatetoDesired=True; bFixedRotationDir=False; DesiredRotation.Pitch=0; DesiredRotation.Yaw=FRand()*65536; DesiredRotation.roll=0; } RotationRate = 0.2 * RotationRate; GotoState('Dying'); } if ( NewZone.bPainZone && (NewZone.DamagePerSec > 0) ) Destroy(); } simulated function BeginState() { RandSpin(125000); if (RotationRate.Pitch>-10000&&RotationRate.Pitch<10000) RotationRate.Pitch=10000; if (RotationRate.Roll>-10000&&RotationRate.Roll<10000) RotationRate.Roll=10000; Mesh = Fragments[int(FRand()*numFragmentTypes)]; if ( Level.NetMode == NM_Standalone ) LifeSpan = 20 + 40 * FRand(); SetTimer(5.0,True); } } state Dying { simulated function HitWall (vector HitNormal, actor HitWall) { Velocity = 0.5*(( Velocity dot HitNormal ) * HitNormal * (-2.0) + Velocity); // Reflect off Wall w/damping speed = VSize(Velocity); if (bFirstHit && speed<400) { bFirstHit=False; bRotatetoDesired=True; bFixedRotationDir=False; DesiredRotation.Pitch=0; DesiredRotation.Yaw=FRand()*65536; DesiredRotation.roll=0; } RotationRate.Yaw = RotationRate.Yaw*0.75; RotationRate.Roll = RotationRate.Roll*0.75; RotationRate.Pitch = RotationRate.Pitch*0.75; if ( (Velocity.Z < 50) && (HitNormal.Z > 0.7) ) { SetPhysics(PHYS_none); bBounce = false; } else If (speed > 80) { if (FRand()<0.5) PlaySound(ImpactSound, SLOT_None, 0.5+FRand()*0.5,, 300, 0.85+FRand()*0.3); else PlaySound(MiscSound, SLOT_None, 0.5+FRand()*0.5,, 300, 0.85+FRand()*0.3); } } function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { Destroy(); } simulated function timer() { if (!PlayerCanSeeMe()) Destroy(); } simulated function BeginState() { SetTimer(1.5,True); SetCollision(true, false, false); } } PKQKKM*aKtt 1RKDa?'a'(( LSK  ba d TKVKa M*dMz  ? dd y -hy?-h(-{'-z(6r%6rD?6r%69D?69@?69D?69@?69D?69@?.6 ?,26d333?o$-K(y?,Pz?ab$?? CY?>aa$?? CY?> x7WKXKYKZKkKG$x1 F$CBG$?,P LKWe.W-]WVW,\ \WwWd?q-[ u q WOWR%Wm ?R`?WVW?a[J`?W[ WZ J`I% X %W IRu D`?II%Wm WVW\ q J?I?WV?u W\ q J?I?X %Wm WV?W W#\ q ?X ?u W ?WVJ?X ?W W#\ q ?X ?u W ?Wm R%P WO W \KvP F4 R&D?S&,@?,@x(>7z Lz a &gD?S,@,z &?,@vEvf gR![gR!Mv3aШpgF,:gx\Wvagx\W4W?%W@ DWX? W?%vV@? vEvf gR![gR!Mv*aѨpgF,:gx( vagx(z > |IFQ)FbKjG O*$GE6969'69'6969'69'DD?J$I$::$A?,(a@' qeKZ~HqDZ-S L> fo:?,?6 ::$wZY*aZY$fwZQ*gaZQwg*gC@f*-h-h(-{'-z(6r%6rD?6r%9a L>9q!KoZ-EZa%a "UKFy7 ~ M$iKM&>/0r.M* ..M-a h[ 0=7q! TL8 q!K rgKp 50>v-` -` ('t:p , :p :p ~:p `7p7:p L%' @I$! A%6(]-Ca#@ mKZ{7ZAr//============================================================================= // Trigger: senses things happening in its proximity and generates // sends Trigger/UnTrigger to actors whose names match 'EventName'. //============================================================================= class Trigger extends Triggers native; #exec Texture Import File=Textures\Trigger.pcx Name=S_Trigger Mips=Off Flags=2 //----------------------------------------------------------------------------- // Trigger variables. // Trigger type. var() enum ETriggerType { TT_PlayerProximity, // Trigger is activated by player proximity. TT_PawnProximity, // Trigger is activated by any pawn's proximity TT_ClassProximity, // Trigger is activated by actor of that class only TT_AnyProximity, // Trigger is activated by any actor in proximity. TT_Shoot, // Trigger is activated by player shooting it. } TriggerType; // Human readable triggering message. var() localized string Message; // Only trigger once and then go dormant. var() bool bTriggerOnceOnly; // For triggers that are activated/deactivated by other triggers. var() bool bInitiallyActive; var() class ClassProximityType; var() float RepeatTriggerTime; //if > 0, repeat trigger message at this interval is still touching other var() float ReTriggerDelay; //minimum time before trigger can be triggered again var float TriggerTime; var() float DamageThreshold; //minimum damage to trigger if TT_Shoot // AI vars var actor TriggerActor; // actor that triggers this trigger var actor TriggerActor2; //============================================================================= // AI related functions function PostBeginPlay() { if ( !bInitiallyActive ) FindTriggerActor(); if ( TriggerType == TT_Shoot ) { bHidden = false; bProjTarget = true; DrawType = DT_None; } Super.PostBeginPlay(); } function FindTriggerActor() { local Actor A; TriggerActor = None; TriggerActor2 = None; ForEach AllActors(class 'Actor', A) if ( A.Event == Tag) { if ( Counter(A) != None ) return; //FIXME - handle counters if (TriggerActor == None) TriggerActor = A; else { TriggerActor2 = A; return; } } } function Actor SpecialHandling(Pawn Other) { local int i; if ( bTriggerOnceOnly && !bCollideActors ) return None; if ( (TriggerType == TT_PlayerProximity) && !Other.bIsPlayer ) return None; if ( !bInitiallyActive ) { if ( TriggerActor == None ) FindTriggerActor(); if ( TriggerActor == None ) return None; if ( (TriggerActor2 != None) && (VSize(TriggerActor2.Location - Other.Location) < VSize(TriggerActor.Location - Other.Location)) ) return TriggerActor2; else return TriggerActor; } // is this a shootable trigger? if ( TriggerType == TT_Shoot ) { if ( !Other.bCanDoSpecial || (Other.Weapon == None) ) return None; Other.Target = self; Other.bShootSpecial = true; Other.FireWeapon(); Other.bFire = 0; Other.bAltFire = 0; return Other; } // can other trigger it right away? if ( IsRelevant(Other) ) { for (i=0;i<4;i++) if (Touching[i] == Other) Touch(Other); return self; } return self; } // when trigger gets turned on, check its touch list function CheckTouchList() { local int i; for (i=0;i<4;i++) if ( Touching[i] != None ) Touch(Touching[i]); } //============================================================================= // Trigger states. // Trigger is always active. state() NormalTrigger { } // Other trigger toggles this trigger's activity. state() OtherTriggerToggles { function Trigger( actor Other, pawn EventInstigator ) { bInitiallyActive = !bInitiallyActive; if ( bInitiallyActive ) CheckTouchList(); } } // Other trigger turns this on. state() OtherTriggerTurnsOn { function Trigger( actor Other, pawn EventInstigator ) { local bool bWasActive; bWasActive = bInitiallyActive; bInitiallyActive = true; if ( !bWasActive ) CheckTouchList(); } } // Other trigger turns this off. state() OtherTriggerTurnsOff { function Trigger( actor Other, pawn EventInstigator ) { bInitiallyActive = false; } } //============================================================================= // Trigger logic. // // See whether the other actor is relevant to this trigger. // function bool IsRelevant( actor Other ) { if( !bInitiallyActive ) return false; switch( TriggerType ) { case TT_PlayerProximity: return Pawn(Other)!=None && Pawn(Other).bIsPlayer; case TT_PawnProximity: return Pawn(Other)!=None && ( Pawn(Other).Intelligence > BRAINS_None ); case TT_ClassProximity: return ClassIsChildOf(Other.Class, ClassProximityType); case TT_AnyProximity: return true; case TT_Shoot: return ( (Projectile(Other) != None) && (Projectile(Other).Damage >= DamageThreshold) ); } } // // Called when something touches the trigger. // function Touch( actor Other ) { local actor A; if( IsRelevant( Other ) ) { if ( ReTriggerDelay > 0 ) { if ( Level.TimeSeconds - TriggerTime < ReTriggerDelay ) return; TriggerTime = Level.TimeSeconds; } // Broadcast the Trigger message to all matching actors. if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Other, Other.Instigator ); if ( Other.IsA('Pawn') && (Pawn(Other).SpecialGoal == self) ) Pawn(Other).SpecialGoal = None; if( Message != "" ) // Send a string message to the toucher. Other.Instigator.ClientMessage( Message ); if( bTriggerOnceOnly ) // Ignore future touches. SetCollision(False); else if ( RepeatTriggerTime > 0 ) SetTimer(RepeatTriggerTime, false); } } function Timer() { local bool bKeepTiming; local int i; bKeepTiming = false; for (i=0;i<4;i++) if ( (Touching[i] != None) && IsRelevant(Touching[i]) ) { bKeepTiming = true; Touch(Touching[i]); } if ( bKeepTiming ) SetTimer(RepeatTriggerTime, false); } function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { local actor A; if ( bInitiallyActive && (TriggerType == TT_Shoot) && (Damage >= DamageThreshold) && (instigatedBy != None) ) { if ( ReTriggerDelay > 0 ) { if ( Level.TimeSeconds - TriggerTime < ReTriggerDelay ) return; TriggerTime = Level.TimeSeconds; } // Broadcast the Trigger message to all matching actors. if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( instigatedBy, instigatedBy ); if( Message != "" ) // Send a string message to the toucher. instigatedBy.Instigator.ClientMessage( Message ); if( bTriggerOnceOnly ) // Ignore future touches. SetCollision(False); } } // // When something untouches the trigger. // function UnTouch( actor Other ) { local actor A; if( IsRelevant( Other ) ) { // Untrigger all matching actors. if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.UnTrigger( Other, Other.Instigator ); } } |v///============================================================================= // Teleports actors either between different teleporters within a level // or to matching teleporters on other levels, or to general Internet URLs. //============================================================================= class Teleporter extends NavigationPoint native; #exec Texture Import File=Textures\Teleport.pcx Name=S_Teleport Mips=Off Flags=2 //----------------------------------------------------------------------------- // Teleporter URL can be one of the following forms: // // TeleporterName // Teleports to a named teleporter in this level. // if none, acts only as a teleporter destination // // LevelName/TeleporterName // Teleports to a different level on this server. // // Unreal://Server.domain.com/LevelName/TeleporterName // Teleports to a different server on the net. // var() string URL; //----------------------------------------------------------------------------- // Product the user must have installed in order to enter the teleporter. var() name ProductRequired; //----------------------------------------------------------------------------- // Teleporter destination flags. var() bool bChangesVelocity; // Set velocity to TargetVelocity. var() bool bChangesYaw; // Sets yaw to teleporter's Rotation.Yaw var() bool bReversesX; // Reverses X-component of velocity. var() bool bReversesY; // Reverses Y-component of velocity. var() bool bReversesZ; // Reverses Z-component of velocity. // Teleporter flags var() bool bEnabled; // Teleporter is turned on; //----------------------------------------------------------------------------- // Teleporter destination directions. var() vector TargetVelocity; // If bChangesVelocity, set target's velocity to this. // AI related var Actor TriggerActor; //used to tell AI how to trigger me var Actor TriggerActor2; var float LastFired; //----------------------------------------------------------------------------- // Teleporter destination functions. replication { reliable if( Role==ROLE_Authority ) bEnabled, URL; reliable if ( bNetInitial && (Role == ROLE_Authority) ) bChangesVelocity, bChangesYaw, bReversesX, bReversesY, bReversesZ, TargetVelocity; } function PostBeginPlay() { if (URL ~= "") SetCollision(false, false, false); //destination only if ( !bEnabled ) FindTriggerActor(); Super.PostBeginPlay(); } function FindTriggerActor() { local Actor A; TriggerActor = None; TriggerActor2 = None; ForEach AllActors(class 'Actor', A) if ( A.Event == Tag) { if ( Counter(A) != None ) return; //FIXME - handle counters if (TriggerActor == None) TriggerActor = A; else { TriggerActor2 = A; return; } } } // Accept an actor that has teleported in. simulated function bool Accept( actor Incoming, Actor Source ) { local rotator newRot, oldRot; local int oldYaw; local float mag; local vector oldDir; local pawn P; // Move the actor here. Disable('Touch'); //log("Move Actor here "$tag); newRot = Incoming.Rotation; if (bChangesYaw) { oldRot = Incoming.Rotation; newRot.Yaw = Rotation.Yaw; if ( Source != None ) newRot.Yaw += (32768 + Incoming.Rotation.Yaw - Source.Rotation.Yaw); } if ( Pawn(Incoming) != None ) { //tell enemies about teleport if ( Role == ROLE_Authority ) { P = Level.PawnList; While ( P != None ) { if (P.Enemy == Incoming) P.LastSeenPos = Incoming.Location; P = P.nextPawn; } } Pawn(Incoming).SetLocation(Location); if ( (Role == ROLE_Authority) || (Level.TimeSeconds - LastFired > 0.5) ) { Pawn(Incoming).SetRotation(newRot); Pawn(Incoming).ViewRotation = newRot; LastFired = Level.TimeSeconds; } Pawn(Incoming).MoveTimer = -1.0; Pawn(Incoming).MoveTarget = self; PlayTeleportEffect( Incoming, false); } else { if ( !Incoming.SetLocation(Location) ) { Enable('Touch'); return false; } if ( bChangesYaw ) Incoming.SetRotation(newRot); } Enable('Touch'); if (bChangesVelocity) Incoming.Velocity = TargetVelocity; else { if ( bChangesYaw ) { if ( Incoming.Physics == PHYS_Walking ) OldRot.Pitch = 0; oldDir = vector(OldRot); mag = Incoming.Velocity Dot oldDir; Incoming.Velocity = Incoming.Velocity - mag * oldDir + mag * vector(Incoming.Rotation); } if ( bReversesX ) Incoming.Velocity.X *= -1.0; if ( bReversesY ) Incoming.Velocity.Y *= -1.0; if ( bReversesZ ) Incoming.Velocity.Z *= -1.0; } // Play teleport-in effect. return true; } function PlayTeleportEffect(actor Incoming, bool bOut) { if ( Incoming.IsA('Pawn') ) { Incoming.MakeNoise(1.0); Level.Game.PlayTeleportEffect(Incoming, bOut, true); } } //----------------------------------------------------------------------------- // Teleporter functions. function Trigger( actor Other, pawn EventInstigator ) { local int i; bEnabled = !bEnabled; if ( bEnabled ) //teleport any pawns already in my radius for (i=0;i<4;i++) if ( Touching[i] != None ) Touch(Touching[i]); } // Teleporter was touched by an actor. simulated function Touch( actor Other ) { local Teleporter Dest; local int i; local Actor A; if ( !bEnabled ) return; if( Other.bCanTeleport && Other.PreTeleport(Self)==false ) { if( (InStr( URL, "/" ) >= 0) || (InStr( URL, "#" ) >= 0) ) { // Teleport to a level on the net. if( (Role == ROLE_Authority) && (PlayerPawn(Other) != None) ) Level.Game.SendPlayer(PlayerPawn(Other), URL); } else { // Teleport to a random teleporter in this local level, if more than one pick random. foreach AllActors( class 'Teleporter', Dest ) if( string(Dest.tag)~=URL && Dest!=Self ) i++; i = rand(i); foreach AllActors( class 'Teleporter', Dest ) if( string(Dest.tag)~=URL && Dest!=Self && i-- == 0 ) break; if( Dest != None ) { // Teleport the actor into the other teleporter. if ( Other.IsA('Pawn') ) PlayTeleportEffect( Pawn(Other), false); Dest.Accept( Other, self ); if( (Event != '') && (Other.IsA('Pawn')) ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Other, Other.Instigator ); } else if ( Role == ROLE_Authority ) Pawn(Other).ClientMessage( "Teleport destination for "$self$" not found!" ); } } } /* SpecialHandling is called by the navigation code when the next path has been found. It gives that path an opportunity to modify the result based on any special considerations */ function Actor SpecialHandling(Pawn Other) { local int i; local vector Dist2D; if ( bEnabled && (Other.RouteCache[1] != None) && Other.RouteCache[1].IsA('Teleporter') && (string(Other.RouteCache[1].tag)~=URL) ) { if ( Abs(Location.Z - Other.Location.Z) < CollisionHeight + Other.CollisionHeight ) { Dist2D = Location - Other.Location; Dist2D.Z = 0; if ( VSize(Dist2D) < CollisionRadius + Other.CollisionRadius ) Touch(Other); } return self; } if (TriggerActor == None) { FindTriggerActor(); if (TriggerActor == None) return None; } if ( (TriggerActor2 != None) && (VSize(TriggerActor2.Location - Other.Location) < VSize(TriggerActor.Location - Other.Location)) ) return TriggerActor2; return TriggerActor; } d sKv+-K :G:$?v+F wY *yV ?%e$T V  T $+!/a0 @+@Y Y 10{QY &  Q-n a( ~ jKWEs?-` (^:W:$+L%L%TB{77T^q!L%{8WNk':N:$(:W:$ L%L%{7R%c*(>7!BD?U?,j 7Umm4Ul,lU,&T77}1Tc*~ErrorsExecCore!Bc*!B^q!L%:W:$&UlD?U?,j 77D?U?,j L%h:W:$(D?U?,j 7VUm7D?U?,j ^7L%:W:$!L,@L,@&:W:$"L%L%:W:$ :W:$%}7%77}7&L%' qKCG(-S '1. l-S  Lu+oZy-o(d%ed,[wdk*:dk-o'&dkdw-oaq( rKJG3-S (1. l-S ^ ]KDO X8Dm cw1. *'1. o D 1.-_-S ap(>7_DEDf DaaVGD#V@`?RG?&D aa(e %81.-_1.-TySb%1b, y%'{yxyKyKF yR![bd pVyF:yx bd yxbyny%DEDf b%b, {,bd D(V@@?, y?, [Da,bd VGDa,bd (GA[yb\ wK~ |H:D:$(Wr1. *$r1. x*(1. xO|DL%' yK J zKJcJ vKuKlH~KK@wAL~ D JGr1. *$r1. x*(1. xOD C L%' GLI: -K(G @$w.I*.I- q$w.I*:.Ir:$ $aIw+ $' $w.tI*.tIpF  |K{K[fJKLLLL@G e8G `K tA*i */a0 G qpG +QIw.kG *0 brA*AG pi G 0 10 OLPLNL@gML -K( NLTLULO@@gQL(-~-K-K'&-~Q SLHL~XLm NgVL -K-K-KQ WLYLl Qa Al %?l ,5wl k*&l kl  V[L^LU> -n  -q*>:G:$^-*-KZrD*`grD**wj *Cj   ^  D  ^  j DZ:G:$^-l r^**^_^-g'^`^}$^o$^:^x %x ,rx k^&^x o rtL:t, :t:t~:t`:t 7p7:tL%w1. *$w1. x*1. x J7' aLs `@tD*j */a0 s qps +QIw.ks *0 brD*Ds pj s 0 10 ~ ZLB 5N:H :$(Wr1. *$r1. x*(G 1. x:B :$L%L%{77q![G p L%3:B :$ L%L%0{7G D77q![L%:B :$ :B :$%u}7%77}7&L%G J7' \LQ!Console entering MenuTyping ]LJR Console leaving MenuTyping ELCL\Kx @G!0?-K`7:G:$-R(-i'G$@ r8I JnN\-U (I %ZI ,PwI k*I ka/!-U 'I  F" " " " *-=*"F#>W@Ic>v>$V/Ӧ>$>$ڀ>$cҘN$u' ΦS<Ęҋ/,S$v6z+jSccSSI>NcjcjjvSSccjvIIIISIIII>>?>SSSSII>cĮcS/'>>/ScjjS3)'  '    '        !''      '%    !''   '%'.   "%)=J)2   )=JMa   u VnQ2L,y rK*r2=Kwe *rKT*$J?,2Pe J$e w.|2F* w.|2Fk *$.|2F~ | 2$.|2FQ?,rKT*D62  62F  2;D62  62F  2;D62  62F  28.|2FQ$2P.|2Fk .|2Fk a K  Fa*Kp¯6 62  ¯6 62  6 8g"62  282`?6 862  28?pqq:K:$2-*2P*Ar.|2F*Jh)4wJ*Ja/!j.|J~ | ;62  6J  2;;62  6J  2;;62  6J  28IJ4JJK*ArI*K ]2K{ *r2PKr2P*2P2P eLuc gROO]hLyc %8x.ԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXԝXQS>S8TgJqPY"{qSD?S&?,@a a &,@&SR!.R@e SxqSF*SKFR nPQaPuF PnaNa-M"{NwH *av!&av!Iya  aa/! Y.a Ya "a;ya  YH a:ya  Y aa/!.a-n -r#aa y::$zNwz*rzpaz ma  zzML6Y%.a Y.abyY.am q!g .aa yaa+Yau!&au!I jLu}RbPOg -\ 6mLT%u o> Y> Y> Y> Y> Y> Y> Y> Y> YIR@G> Y> YUr\(S^w1. *$w1. x*1. xK:\:\L%q![ ~ nLY0"T:T :$^w1. *$w1. x*1. x"K:YW O :Y,L%q![' pL=U qLJAU VlQKL wrK=~ w~*p6  6K  K8KbKP*K rP K  ~ ]KrKP~rKP*KP~KP _L^L[)RAlRvLt@2 uL'LAPtpttttttttttttt> YtԝX ttԝX ԝXtt IRuNwLE@XQRnX 8NwN*N-::$/a0 pV+  VU%Nq!Na'((N-L(N_VNo$ND?NvN-x 'N~~10 tLrL]BUxLh ZJV'-n-g -h o%p yLoSW -[  -[ '-x' zLp[W -[  -[ (C {LKCikXK1.~AK$Y p ZA?%@m@?z AupSz E!BA ~ Biw Bf _B@r .1.  uu-nlppppppppppppB@ Unreal 1.t, , Bi Min, , Bf  Max, , Ql oNj} d5j&s,^,bjs^ j, s, ^,bjs j, s, ^,b s^ j, s, ^, b j, s, ^, bjs^ j, s,  ^,TestOptionalOut ok! |L|u V[|1.~;-ypo-y(-x-x(Y |$p h Y _ Y z %w %if o v|$h v?p v_ |$w %h |$ z w |$_ ?&o?w |$_ i?% oiioof f ow %_ |$h |$ pCQPjC-k"w.P*.P-P-L'P-x (.P*%Pa'''Po$P~*Pa/! Pq!B t @~Laq P`aEM!6at=,6at=,6at=,_B?z 1.~$Y p }K!BoaaC |a0VawC >adaaaa}C |a7VawC >ad|aa} u//============================================================================= // Console: A player console, associated with a viewport. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Console extends Object native noexport transient; // Imports. #exec Texture Import NAME=ConsoleBack File=Textures\Console.pcx #exec Texture Import File=Textures\Border.pcx // Internal. var private const int vtblOut; // Constants. const MaxBorder=6; const MaxLines=64; const MaxHistory=16; const TextMsgSize=128; // Variables. var viewport Viewport; var int HistoryTop, HistoryBot, HistoryCur; var string TypedStr, History[16]; var int Scrollback, NumLines, TopLine, TextLines; var float MsgTime, MsgTickTime; var string MsgText[64]; var name MsgType[64]; var PlayerReplicationInfo MsgPlayer[64]; var float MsgTick[64]; var int BorderSize; var int ConsoleLines, BorderLines, BorderPixels; var float ConsolePos, ConsoleDest; var float FrameX, FrameY; var texture ConBackground, Border; var bool bNoStuff, bTyping; var bool bNoDrawWorld; // Timedemo var bool bTimeDemo; var bool bStartTimeDemo; var bool bRestartTimeDemo; var bool bSaveTimeDemoToFile; var float StartTime; var float ExtraTime; var float LastFrameTime; var float LastSecondStartTime; var int FrameCount; var int LastSecondFrameCount; var float MinFPS; var float MaxFPS; var float LastSecFPS; var Font TimeDemoFont; var localized string LoadingMessage; var localized string SavingMessage; var localized string ConnectingMessage; var localized string PausedMessage; var localized string PrecachingMessage; var localized string FrameRateText; var localized string AvgText; var localized string LastSecText; var localized string MinText; var localized string MaxText; var localized string fpsText; var localized string SecondsText; var localized string FramesText; //----------------------------------------------------------------------------- // Input. // Input system states. enum EInputAction { IST_None, // Not performing special input processing. IST_Press, // Handling a keypress or button press. IST_Hold, // Handling holding a key or button. IST_Release, // Handling a key or button release. IST_Axis, // Handling analog axis movement. }; // Input keys. enum EInputKey { /*00*/ IK_None ,IK_LeftMouse ,IK_RightMouse ,IK_Cancel , /*04*/ IK_MiddleMouse ,IK_Unknown05 ,IK_Unknown06 ,IK_Unknown07 , /*08*/ IK_Backspace ,IK_Tab ,IK_Unknown0A ,IK_Unknown0B , /*0C*/ IK_Unknown0C ,IK_Enter ,IK_Unknown0E ,IK_Unknown0F , /*10*/ IK_Shift ,IK_Ctrl ,IK_Alt ,IK_Pause , /*14*/ IK_CapsLock ,IK_Unknown15 ,IK_Unknown16 ,IK_Unknown17 , /*18*/ IK_Unknown18 ,IK_Unknown19 ,IK_Unknown1A ,IK_Escape , /*1C*/ IK_Unknown1C ,IK_Unknown1D ,IK_Unknown1E ,IK_Unknown1F , /*20*/ IK_Space ,IK_PageUp ,IK_PageDown ,IK_End , /*24*/ IK_Home ,IK_Left ,IK_Up ,IK_Right , /*28*/ IK_Down ,IK_Select ,IK_Print ,IK_Execute , /*2C*/ IK_PrintScrn ,IK_Insert ,IK_Delete ,IK_Help , /*30*/ IK_0 ,IK_1 ,IK_2 ,IK_3 , /*34*/ IK_4 ,IK_5 ,IK_6 ,IK_7 , /*38*/ IK_8 ,IK_9 ,IK_Unknown3A ,IK_Unknown3B , /*3C*/ IK_Unknown3C ,IK_Unknown3D ,IK_Unknown3E ,IK_Unknown3F , /*40*/ IK_Unknown40 ,IK_A ,IK_B ,IK_C , /*44*/ IK_D ,IK_E ,IK_F ,IK_G , /*48*/ IK_H ,IK_I ,IK_J ,IK_K , /*4C*/ IK_L ,IK_M ,IK_N ,IK_O , /*50*/ IK_P ,IK_Q ,IK_R ,IK_S , /*54*/ IK_T ,IK_U ,IK_V ,IK_W , /*58*/ IK_X ,IK_Y ,IK_Z ,IK_Unknown5B , /*5C*/ IK_Unknown5C ,IK_Unknown5D ,IK_Unknown5E ,IK_Unknown5F , /*60*/ IK_NumPad0 ,IK_NumPad1 ,IK_NumPad2 ,IK_NumPad3 , /*64*/ IK_NumPad4 ,IK_NumPad5 ,IK_NumPad6 ,IK_NumPad7 , /*68*/ IK_NumPad8 ,IK_NumPad9 ,IK_GreyStar ,IK_GreyPlus , /*6C*/ IK_Separator ,IK_GreyMinus ,IK_NumPadPeriod,IK_GreySlash , /*70*/ IK_F1 ,IK_F2 ,IK_F3 ,IK_F4 , /*74*/ IK_F5 ,IK_F6 ,IK_F7 ,IK_F8 , /*78*/ IK_F9 ,IK_F10 ,IK_F11 ,IK_F12 , /*7C*/ IK_F13 ,IK_F14 ,IK_F15 ,IK_F16 , /*80*/ IK_F17 ,IK_F18 ,IK_F19 ,IK_F20 , /*84*/ IK_F21 ,IK_F22 ,IK_F23 ,IK_F24 , /*88*/ IK_Unknown88 ,IK_Unknown89 ,IK_Unknown8A ,IK_Unknown8B , /*8C*/ IK_Unknown8C ,IK_Unknown8D ,IK_Unknown8E ,IK_Unknown8F , /*90*/ IK_NumLock ,IK_ScrollLock ,IK_Unknown92 ,IK_Unknown93 , /*94*/ IK_Unknown94 ,IK_Unknown95 ,IK_Unknown96 ,IK_Unknown97 , /*98*/ IK_Unknown98 ,IK_Unknown99 ,IK_Unknown9A ,IK_Unknown9B , /*9C*/ IK_Unknown9C ,IK_Unknown9D ,IK_Unknown9E ,IK_Unknown9F , /*A0*/ IK_LShift ,IK_RShift ,IK_LControl ,IK_RControl , /*A4*/ IK_UnknownA4 ,IK_UnknownA5 ,IK_UnknownA6 ,IK_UnknownA7 , /*A8*/ IK_UnknownA8 ,IK_UnknownA9 ,IK_UnknownAA ,IK_UnknownAB , /*AC*/ IK_UnknownAC ,IK_UnknownAD ,IK_UnknownAE ,IK_UnknownAF , /*B0*/ IK_UnknownB0 ,IK_UnknownB1 ,IK_UnknownB2 ,IK_UnknownB3 , /*B4*/ IK_UnknownB4 ,IK_UnknownB5 ,IK_UnknownB6 ,IK_UnknownB7 , /*B8*/ IK_UnknownB8 ,IK_UnknownB9 ,IK_Semicolon ,IK_Equals , /*BC*/ IK_Comma ,IK_Minus ,IK_Period ,IK_Slash , /*C0*/ IK_Tilde ,IK_UnknownC1 ,IK_UnknownC2 ,IK_UnknownC3 , /*C4*/ IK_UnknownC4 ,IK_UnknownC5 ,IK_UnknownC6 ,IK_UnknownC7 , /*C8*/ IK_Joy1 ,IK_Joy2 ,IK_Joy3 ,IK_Joy4 , /*CC*/ IK_Joy5 ,IK_Joy6 ,IK_Joy7 ,IK_Joy8 , /*D0*/ IK_Joy9 ,IK_Joy10 ,IK_Joy11 ,IK_Joy12 , /*D4*/ IK_Joy13 ,IK_Joy14 ,IK_Joy15 ,IK_Joy16 , /*D8*/ IK_UnknownD8 ,IK_UnknownD9 ,IK_UnknownDA ,IK_LeftBracket , /*DC*/ IK_Backslash ,IK_RightBracket,IK_SingleQuote ,IK_UnknownDF , /*E0*/ IK_JoyX ,IK_JoyY ,IK_JoyZ ,IK_JoyR , /*E4*/ IK_MouseX ,IK_MouseY ,IK_MouseZ ,IK_MouseW , /*E8*/ IK_JoyU ,IK_JoyV ,IK_UnknownEA ,IK_UnknownEB , /*EC*/ IK_MouseWheelUp ,IK_MouseWheelDown,IK_Unknown10E,UK_Unknown10F , /*F0*/ IK_UnknownF0 ,IK_UnknownF1 ,IK_UnknownF2 ,IK_UnknownF3 , /*F4*/ IK_UnknownF4 ,IK_UnknownF5 ,IK_Attn ,IK_CrSel , /*F8*/ IK_ExSel ,IK_ErEof ,IK_Play ,IK_Zoom , /*FC*/ IK_NoName ,IK_PA1 ,IK_OEMClear }; //----------------------------------------------------------------------------- // natives. // Execute a command on this console. native function bool ConsoleCommand( coerce string S ); native function SaveTimeDemo( string S ); //----------------------------------------------------------------------------- // Exec functions accessible from the console and key bindings. // Begin typing a command on the console. exec function Type() { TypedStr=""; GotoState( 'Typing' ); } exec function Talk() { TypedStr="Say "; bNoStuff = true; GotoState( 'Typing' ); } exec function TeamTalk() { TypedStr="TeamSay "; bNoStuff = true; GotoState( 'Typing' ); } // Size the view up. exec function ViewUp() { BorderSize = Clamp( BorderSize-1, 0, MaxBorder ); } // Size the view down. exec function ViewDown() { BorderSize = Clamp( BorderSize+1, 0, MaxBorder ); } //----------------------------------------------------------------------------- // Member Access Functions. function string GetMsgText( int Index ) { return MsgText[Index]; } function SetMsgText( int Index, string NewMsgText ) { MsgText[Index] = NewMsgText; } function name GetMsgType(int Index) { return MsgType[Index]; } function SetMsgType(int Index, name NewMsgType) { MsgType[Index] = NewMsgType; } function PlayerReplicationInfo GetMsgPlayer(int Index) { return MsgPlayer[Index]; } function SetMsgPlayer(int Index, PlayerReplicationInfo NewMsgPlayer) { MsgPlayer[Index] = NewMsgPlayer; } function float GetMsgTick(int Index) { return MsgTick[Index]; } function SetMsgTick(int Index, int NewMsgTick) { MsgTick[Index] = NewMsgTick; } //----------------------------------------------------------------------------- // Functions. // Clear messages. function ClearMessages() { local int i; for (i=0; i ConsoleDest ) ConsolePos = FMax(ConsolePos-Delta,ConsoleDest); // Update status message. if( ((MsgTime-=Delta) <= 0.0) && (TextLines > 0) ) TextLines--; } // Called before rendering the world view. event PreRender( canvas C ); // Called when video settings change (resolution, driver, color depth). event VideoChange(); event NotifyLevelChange() { bRestartTimeDemo = True; ClearMessages(); } event ConnectFailure( string FailCode, string URL ); function DrawLevelAction( canvas C ) { local string BigMessage; if ( (Viewport.Actor.Level.Pauser != "") && (Viewport.Actor.Level.LevelAction == LEVACT_None) ) { C.Font = C.MedFont; BigMessage = PausedMessage; // Add pauser name? PrintActionMessage(C, BigMessage); return; } if ( (Viewport.Actor.Level.LevelAction == LEVACT_None) || Viewport.Actor.bShowMenu ) { BigMessage = ""; return; } else if ( Viewport.Actor.Level.LevelAction == LEVACT_Loading ) BigMessage = LoadingMessage; else if ( Viewport.Actor.Level.LevelAction == LEVACT_Saving ) BigMessage = SavingMessage; else if ( Viewport.Actor.Level.LevelAction == LEVACT_Connecting ) BigMessage = ConnectingMessage; else if ( Viewport.Actor.Level.LevelAction == LEVACT_Precaching ) BigMessage = PrecachingMessage; if ( BigMessage != "" ) { C.Style = 1; C.Font = C.LargeFont; PrintActionMessage(C, BigMessage); } } function PrintActionMessage( Canvas C, string BigMessage ) { local float XL, YL; C.bCenter = false; C.StrLen( BigMessage, XL, YL ); C.SetPos(FrameX/2 - XL/2, FrameY/2 - YL/2); C.DrawText( BigMessage, false ); } // Add localization to hardcoded strings!! // Called after rendering the world view. event PostRender( canvas C ) { local int YStart, YEnd, Y, I, J, Line, iLine; if(bNoDrawWorld) { C.SetPos(0,0); C.DrawPattern( Texture'Border', C.ClipX, C.ClipY, 1.0 ); } if( bTimeDemo ) { TimeDemoCalc(); TimeDemoRender( C ); } // call overridable "level action" rendering code to draw the "big message" DrawLevelAction( C ); // If the console has changed since the previous frame, draw it. if ( ConsoleLines > 0 ) { C.SetOrigin(0.0, ConsoleLines - FrameY*0.6); C.SetPos(0.0, 0.0); C.DrawTile( ConBackground, FrameX, FrameY*0.6, C.CurX, C.CurY, FrameX, FrameY ); } // Draw border. if ( BorderLines > 0 || BorderPixels > 0 ) { YStart = BorderLines + ConsoleLines; YEnd = FrameY - BorderLines; if ( BorderLines > 0 ) { C.SetOrigin(0.0, 0.0); C.SetPos(0.0, 0.0); C.DrawPattern( Border, FrameX, BorderLines, 1.0 ); C.SetPos(0.0, YEnd); C.DrawPattern( Border, FrameX, BorderLines, 1.0 ); } if ( BorderPixels > 0 ) { C.SetOrigin(0.0, 0.0); C.SetPos(0.0, YStart); C.DrawPattern( Border, BorderPixels, YEnd - YStart, 1.0 ); C.SetPos( FrameX - BorderPixels, YStart ); C.DrawPattern( Border, BorderPixels, YEnd - YStart, 1.0 ); } } // Draw console text. C.SetOrigin(0.0, 0.0); if ( ConsoleLines > 0 ) DrawConsoleView( C ); else DrawSingleView( C ); } simulated function DrawConsoleView( Canvas C ) { local int Y, I, Line; local float XL, YL; // Console is visible; display console view. Y = ConsoleLines - 1; MsgText[(TopLine + 1 + MaxLines) % MaxLines] = "(>"@TypedStr; for ( I = Scrollback; I < (NumLines + 1); I++ ) { // Display all text in the buffer. Line = (TopLine + MaxLines*2 - (I-1)) % MaxLines; C.Font = C.MedFont; if (( MsgType[Line] == 'Say' ) || ( MsgType[Line] == 'TeamSay' )) C.StrLen( MsgPlayer[Line].PlayerName$":"@MsgText[Line], XL, YL ); else C.StrLen( MsgText[Line], XL, YL ); // Half-space blank lines. if ( YL == 0 ) YL = 5; Y -= YL; if ( (Y + YL) < 0 ) break; C.SetPos(4, Y); C.Font = C.MedFont; if (( MsgType[Line] == 'Say' ) || ( MsgType[Line] == 'TeamSay' )) C.DrawText( MsgPlayer[Line].PlayerName$":"@MsgText[Line], false ); else C.DrawText( MsgText[Line], false ); } } simulated function DrawSingleView( Canvas C ) { local string TypingPrompt; local int I, J; local float XL, YL; local string ShortMessages[4]; local int ExtraSpace; // Console is hidden; display single-line view. C.SetOrigin(0.0, 0.0); // Ask the HUD to deal with messages. if ( Viewport.Actor.myHUD != None && Viewport.Actor.myHUD.DisplayMessages(C) ) return; // If the HUD doesn't deal with messages, use the default behavior if (!Viewport.Actor.bShowMenu) { if ( bTyping ) { TypingPrompt = "(>"@TypedStr$"_"; C.Font = C.MedFont; C.StrLen( TypingPrompt, XL, YL ); C.SetPos( 2, FrameY - ConsoleLines - YL - 1 ); C.DrawText( TypingPrompt, false ); } } if ( TextLines > 0 && (!Viewport.Actor.bShowMenu || Viewport.Actor.bShowScores) ) { J = TopLine; I = 0; while ((I < 4) && (J >= 0)) { if ((MsgText[J] != "") && (MsgTick[J] > 0.0) && (MsgTick[J] > MsgTickTime) ) { if (MsgType[J] == 'Say') ShortMessages[I] = MsgPlayer[J]$":"@MsgText[J]; else ShortMessages[I] = MsgText[J]; I++; } J--; } J = 0; C.Font = C.MedFont; for ( I = 0; I < 4; I++ ) { if (ShortMessages[3 - I] != "") { C.SetPos(4, 2 + (10 * J) + (10 * ExtraSpace)); C.StrLen( ShortMessages[3 - I], XL, YL ); C.DrawText( ShortMessages[3 - I], false ); if ( YL == 18.0 ) ExtraSpace++; J++; } } } } //----------------------------------------------------------------------------- // State used while typing a command on the console. state Typing { exec function Type() { TypedStr=""; gotoState( '' ); } function bool KeyType( EInputKey Key ) { if ( bNoStuff ) { bNoStuff = false; return true; } if( Key>=0x20 && Key<0x100 && Key!=Asc("~") && Key!=Asc("`") ) { TypedStr = TypedStr $ Chr(Key); Scrollback=0; return true; } } function bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { local string Temp; bNoStuff = false; if( Key==IK_Escape ) { if( Scrollback!=0 ) { Scrollback=0; } else if( TypedStr!="" ) { TypedStr=""; } else { ConsoleDest=0.0; GotoState( '' ); } Scrollback=0; } else if( global.KeyEvent( Key, Action, Delta ) ) { return true; } else if( Action != IST_Press ) { return false; } else if( Key==IK_Enter ) { if( Scrollback!=0 ) { Scrollback=0; } else { if( TypedStr!="" ) { // Print to console. if( ConsoleLines!=0 ) Message( None, "(>" @ TypedStr, 'Console' ); // Update history buffer. History[HistoryCur++ % MaxHistory] = TypedStr; if( HistoryCur > HistoryBot ) HistoryBot++; if( HistoryCur - HistoryTop >= MaxHistory ) HistoryTop = HistoryCur - MaxHistory + 1; // Make a local copy of the string. Temp=TypedStr; TypedStr=""; if( !ConsoleCommand( Temp ) ) Message( None, Localize("Errors","Exec","Core"), 'Console' ); Message( None, "", 'Console' ); } if( ConsoleDest==0.0 ) GotoState(''); Scrollback=0; } } else if( Key==IK_Up ) { if( HistoryCur > HistoryTop ) { History[HistoryCur % MaxHistory] = TypedStr; TypedStr = History[--HistoryCur % MaxHistory]; } Scrollback=0; } else if( Key==IK_Down ) { History[HistoryCur % MaxHistory] = TypedStr; if( HistoryCur < HistoryBot ) TypedStr = History[++HistoryCur % MaxHistory]; else TypedStr=""; Scrollback=0; } else if( Key==IK_PageUp ) { if( ++Scrollback >= MaxLines ) Scrollback = MaxLines-1; } else if( Key==IK_PageDown ) { if( --Scrollback < 0 ) Scrollback = 0; } else if( Key==IK_Backspace || Key==IK_Left ) { if( Len(TypedStr)>0 ) TypedStr = Left(TypedStr,Len(TypedStr)-1); Scrollback = 0; } return true; } function BeginState() { bTyping = true; Viewport.Actor.Typing(bTyping); } function EndState() { bTyping = false; Viewport.Actor.Typing(bTyping); //log("Console leaving Typing"); ConsoleDest=0.0; } } //----------------------------------------------------------------------------- // State used while in a menu. state Menuing { function bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { if ( Action != IST_Press ) return false; if ( Viewport.Actor.myHUD == None || Viewport.Actor.myHUD.MainMenu == None ) return false; Viewport.Actor.myHUD.MainMenu.MenuProcessInput(Key, Action); Scrollback=0; return true; } function BeginState() { //log("Console entering Menuing"); } function EndState() { //log("Console leaving Menuing"); } } state EndMenuing { // pass all key events, not just presses function bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { if ( Viewport.Actor.myHUD == None || Viewport.Actor.myHUD.MainMenu == None ) return false; Viewport.Actor.myHUD.MainMenu.MenuProcessInput(Key, Action); Scrollback=0; return true; } } //----------------------------------------------------------------------------- // State used while typing in a menu. state MenuTyping { function bool KeyType( EInputKey Key ) { if( Key>=0x20 && Key<0x100 && Key!=Asc("~") && Key!=Asc("`") && Key!=Asc(" ") ) { TypedStr = TypedStr $ Chr(Key); Scrollback=0; if ( (Viewport.Actor.myHUD != None) && (Viewport.Actor.myHUD.MainMenu != None) ) Viewport.Actor.myHUD.MainMenu.ProcessMenuUpdate( TypedStr ); return true; } } function bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { local Menu PlayerMenu; if( Action != IST_Press ) return false; if( Viewport.Actor.myHUD==None || Viewport.Actor.myHUD.MainMenu==None ) return false; PlayerMenu = Viewport.Actor.myHUD.MainMenu; if( Key==IK_Escape ) { if( Scrollback!=0 ) Scrollback = 0; else if( TypedStr!="" ) TypedStr=""; else GotoState( 'Menuing' ); PlayerMenu.ProcessMenuEscape(); Scrollback=0; } else if( Key==IK_Enter ) { if( Scrollback!=0 ) Scrollback = 0; else { if( TypedStr!="" ) PlayerMenu.ProcessMenuInput( TypedStr ); TypedStr=""; GotoState( 'Menuing' ); Scrollback = 0; } } else if( Key==IK_Backspace || Key==IK_Left ) { if( Len(TypedStr)>0 ) TypedStr = Left(TypedStr,Len(TypedStr)-1); Scrollback = 0; PlayerMenu.ProcessMenuUpdate( TypedStr ); } return true; } function BeginState() { log("Console entering MenuTyping"); } function EndState() { log("Console leaving MenuTyping"); } } //----------------------------------------------------------------------------- // State used while expecting single key input in a menu. state KeyMenuing { function bool KeyType( EInputKey Key ) { ConsoleDest=0.0; if( Viewport.Actor.myHUD!=None && Viewport.Actor.myHUD.MainMenu!=None ) Viewport.Actor.myHUD.MainMenu.ProcessMenuKey( Key, Chr(Key) ); Scrollback=0; GotoState( 'Menuing' ); } function bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { if( Action==IST_Press ) { ConsoleDest=0.0; if( Viewport.Actor.myHUD!=None && Viewport.Actor.myHUD.MainMenu!=None ) Viewport.Actor.myHUD.MainMenu.ProcessMenuKey( Key, mid(string(GetEnum(enum'EInputKey',Key)),3) ); Scrollback=0; GotoState( 'Menuing' ); return true; } } function BeginState() { //log( "Console entering KeyMenuing" ); } function EndState() { //log( "Console leaving KeyMenuing" ); } } //----------------------------------------------------------------------------- // Timedemo functions exec function TimeDemo(bool bEnabled, optional bool bSaveToFile) { bSaveTimeDemoToFile = bSaveToFile; if(bEnabled) StartTimeDemo(); else StopTimeDemo(); } function StartTimeDemo() { if(bTimeDemo) return; bTimeDemo = True; bStartTimeDemo = True; } function StopTimeDemo() { if(!bTimeDemo) return; bTimeDemo = False; PrintTimeDemoResult(); } function PrintTimeDemoResult() { local LevelInfo Entry; local float Avg; local float Delta; local string AvgString; local string Temp; Entry = Viewport.Actor.GetEntryLevel(); Delta = Entry.TimeSeconds - StartTime - ExtraTime; if(Delta <= 0) Avg = 0; else Avg = FrameCount / Delta; AvgString = string(FrameCount)@FramesText@FormatFloat(delta)@SecondsText@MinText@FormatFloat(MinFPS)@MaxText@FormatFloat(MaxFPS)@AvgText@FormatFloat(Avg)@fpsText$"."; Viewport.Actor.ClientMessage(AvgString); Log(AvgString); if(bSaveTimeDemoToFile) { Temp = FormatFloat(Avg) $ " Unreal "$ Viewport.Actor.Level.EngineVersion $ Chr(13) $ Chr(10) $ FormatFloat(MinFPS) $ " Min"$ Chr(13) $ Chr(10) $ FormatFloat(MaxFPS) $ " Max"$ Chr(13) $ Chr(10); SaveTimeDemo(Temp); } } function TimeDemoCalc() { local LevelInfo Entry; local float Delta; Entry = Viewport.Actor.GetEntryLevel(); if( bRestartTimeDemo ) { StopTimeDemo(); StartTimeDemo(); bRestartTimeDemo = False; } if( bStartTimeDemo ) { bStartTimeDemo = False; StartTime = Entry.TimeSeconds; ExtraTime = 0; LastFrameTime = StartTime; LastSecondStartTime = StartTime; FrameCount = 0; LastSecondFrameCount = 0; MinFPS = 0; MaxFPS = 0; LastSecFPS = 0; return; } Delta = Entry.TimeSeconds - LastFrameTime; // If delta time is more than a half of a second, ignore frame entirely (precaching, loading etc) if( Delta > 0.5 ) { ExtraTime += Delta; LastSecondStartTime = Entry.TimeSeconds; LastSecondFrameCount = 0; LastFrameTime = Entry.TimeSeconds; return; } FrameCount++; LastSecondFrameCount++; if( Entry.TimeSeconds - LastSecondStartTime > 1) { LastSecFPS = LastSecondFrameCount / (Entry.TimeSeconds - LastSecondStartTime); if( MinFPS == 0 || LastSecFPS < MinFPS ) MinFPS = LastSecFPS; if( LastSecFPS > MaxFPS ) MaxFPS = LastSecFPS; LastSecondFrameCount = 0; LastSecondStartTime = Entry.TimeSeconds; } LastFrameTime = Entry.TimeSeconds; } function TimeDemoRender( Canvas C ) { local string AText, LText; local float W, H; C.Font = TimeDemoFont; C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; AText = AvgText @ FormatFloat(FrameCount / (Viewport.Actor.GetEntryLevel().TimeSeconds - StartTime - ExtraTime)); LText = LastSecText @ FormatFloat(LastSecFPS); C.TextSize(AText, W, H); C.SetPos(C.ClipX - W, 0.3*C.ClipY); C.DrawText(AText); C.TextSize(LText, W, H); C.SetPos(C.ClipX - W, 0.3*C.ClipY+H); C.DrawText(LText); } final function string FormatFloat( float f) { local string s; local int i; s = string(f); i = InStr(s, "."); if(i != -1) s = Left(s, i+3); return s; } ^+ARBR@ ]% b%Ab,{bU ubbob,zbU b%ubU Y XEMDMsOIMJ[ @XORU 8~#MNwM*lM-Ma/! .M _EMMM  GMFMJM mNji TestContinuej%uj,piteration Sjdj, j,  j,k...jDoneContinue KMm[NOMg e QQ'aNvwa*_a-n r6(a ]-t'PaaaM-tq! MMmF*Xv #6X@6X@@6X@ &X#@@@@ '6X?, (6X?, )6X?, PM RMmSM TMmUMzP!VMWM XMqrO@!~3n @!-So$^-b xN6 C?,;{q!B6(U-S6 ?,q!B7\ 6\8@MaD!N\ (wM*q!B7u!a333?(v!o$ YM[Mz\Mze]QYwhvjY pY pY pY! pY!% pYYA ]M_MANAp/ }TestContinueApiteration SAXA, A,  A,_...A,DoneContinue `MAsRdMr@cM#APt> Yt> Y}qugFRGR#~-y#@N{w@*d@a/! .@hi BIT@@MJ.x#rJ* Jhi BIT-#a(((v! bMe CNdQ'ptime=U$} HH* S#?@@@g#@@@ #Sg $Sg %S#?@@@ &g#@@@ '#?@@S (S?,g )Sg?, +H@H@ ,H@?, -zTimTim .{TimBob /#?@@@#?@@@ 1zsxxTim 2{ppp123 3zbogusMY 5zxnum345xnum999 7M 8M :-~ ' ;-} ( <-s ' =-q ( ?-~ ' @-} ( A-s ' B-q ( D O-~ ' E O-} ( F O-s ' G O-q (f Jf-~ ' Kf-} ( Lf-s ' Mf-q (v POv-~ ' QOv-} ( ROv-s ' SOv-q ( UM X,{fX,{OvX,{-yx  [-y(Av All tests passed eMgMhMA|RERe@jM\sAPԝX CRiMkMApR|N\@mMAPԝXlM=nMoMpMqMrM=[_ ~ jH_ %@_ ,_ e"b_ &k#_ ~  sMuMe MPKQ'&\ ::$ru*/a0 R R Ha/!ouR ywm*uGmpAttached to player VR 10rm*/a0 inmnwu*uGm10wu* wm*v!'v!' vM=xM=u+I & G:I i+!/a0 RhgRp+RI I &10{QI &  Q-n a( yM=XN}MIB@Xg#<m8A =g#a/!  {]kwA *A 0*^A    {M=~M=M=LMz uf mTestContinue[z ,piteration Sz Qz , z , X...DoneContinue @N=hNR RTimF,F %% (? 5,-w '? (? -w R [ (z lxyzzy (z -w (z -w testswitch succeeded BN=DN=ENFN=GNHN=H$zMCI$kki:Ci+!/a0 FhgFp+FjCC&10 IN=KNqQG`3C/a0 AG@?G+o ph"G0 10 LN NN ON aMLr aTestContinue/a0 LNpactor VLFr.c L*1N...10DoneContinue PN RN ^MNntp-b"A-NA-Nz%A-Nz SN UN VN MRYNL5B@Xs0]x8S=sa/!  {]s0}#SS  #^ WN okLT7oT5Ta/!.T-n ( ZN \N d0//============================================================================= // Texture: An Unreal texture map. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Texture extends Bitmap safereplace native noexport; // Subtextures. var(Texture) texture BumpMap; // Bump map to illuminate this texture with. var(Texture) texture DetailTexture; // Detail texture to apply. var(Texture) texture MacroTexture; // Macrotexture to apply, not currently used. // Surface properties. var(Texture) float Diffuse; // Diffuse lighting coefficient. var(Texture) float Specular; // Specular lighting coefficient. var(Texture) float Alpha; // Alpha. var(Texture) float DrawScale; // Scaling relative to parent. var(Texture) float Friction; // Surface friction coefficient, 1.0=none, 0.95=some. var(Texture) float MipMult; // Mipmap multiplier. // Sounds. var() sound FootstepSound; // Footstep sound. var() sound HitSound; // Sound when the texture is hit with a projectile. // Surface flags. !!out of date var bool bInvisible; var(Surface) editconst bool bMasked; var(Surface) bool bTransparent; var bool bNotSolid; var(Surface) bool bEnvironment; var bool bSemisolid; var(Surface) bool bModulate; var(Surface) bool bFakeBackdrop; var(Surface) bool bTwoSided; var(Surface) bool bAutoUPan; var(Surface) bool bAutoVPan; var(Surface) bool bNoSmooth; var(Surface) bool bBigWavy; var(Surface) bool bSmallWavy; var(Surface) bool bWaterWavy; var bool bLowShadowDetail; var bool bNoMerge; var(Surface) bool bCloudWavy; var bool bDirtyShadows; var bool bHighLedge; var bool bSpecialLit; var bool bGouraud; var(Surface) bool bUnlit; var bool bHighShadowDetail; var bool bPortal; var const bool bMirrored, bX2, bX3; var const bool bX4, bX5, bX6, bX7; // Texture flags. var(Quality) private bool bHighColorQuality; // High color quality hint. var(Quality) private bool bHighTextureQuality; // High color quality hint. var private bool bRealtime; // Texture changes in realtime. var private bool bParametric; // Texture data need not be stored. var private transient bool bRealtimeChanged; // Changed since last render. var private bool bHasComp; // Whether a compressed version exists. // Level of detail set. var(Quality) enum ELODSet { LODSET_None, // No level of detail mipmap tossing. LODSET_World, // World level-of-detail set. LODSET_Skin, // Skin level-of-detail set. } LODSet; // Animation. var(Animation) texture AnimNext; var transient texture AnimCurrent; var(Animation) byte PrimeCount; var transient byte PrimeCurrent; var(Animation) float MinFrameRate, MaxFrameRate; var transient float Accumulator; // Mipmaps. var private native const array Mips, CompMips; var const ETextureFormat CompFormat; X_N`NaN bN `dNeN UfNX}LWH7.-RW-RW-R-R } //============================================================================= // Bitmap: An abstract bitmap. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Bitmap extends Object native noexport; // Texture format. var const enum ETextureFormat { TEXF_P8, TEXF_RGB32, TEXF_RGB64, TEXF_DXT1, TEXF_RGB24 } Format; // Palette. var(Texture) palette Palette; // Internal info. var const byte UBits, VBits; var const int USize, VSize; var(Texture) const int UClamp, VClamp; var const color MipZero; var const color MaxColor; var const int InternalTime[2]; qHOkNiPOX 6 O,{ M  y O,+  lNQNf"b'f"?,MM,NN nNpNqNrNsN@zHMvNFe @XPRbG "8LL~~ tN@zwN@z]xN@zVMNBL' 51r6(B ]o o PB yN@gMHR@D M!/a0 AD MFA c"10D ,D M!-i"D %a((( q//============================================================================= // Engine: The base class of the global application object classes. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class Engine extends Subsystem native noexport transient; // Drivers. var config class GameRenderDevice; var(Drivers) config class AudioDevice; var(Drivers) config class Console; var(Drivers) config class NetworkDevice; var(Drivers) config class Language; // Variables. var primitive Cylinder; var const client Client; var const renderbase Render; var const audiosubsystem Audio; var int TickCycles, GameCycles, ClientCycles; var(Settings) config int CacheSizeMegs; var(Settings) config bool UseSound; var(Settings) float CurrentTickRate; JKSQ~NzyJhDG LSR| 6Nuó> YUe:cC L*($A)$B~dY rRV@O2w4 o"@mR}PT 6AO!3Ht{$?U$ En$gh($PB)$HB55'N 6 :>8'6lN 6r?%(N 6l6r6lN 6l6l6r6l6l6r'l ;(' iOSOq pgOi'j9 _wF*FCFi'FLK-[|?V|u!' wQOrJ {{9_ aD$E$}?{}'w_ *_ -i-w_ a/!._ rr{h {n?GVbh z{}-ww.V*.Vrr{z::$: q,-J wV* h G G?&rV*h GVbh z{}rV*|}{z6|6V  >V8P|} YOu}o$aN [O_OsEz @h^Of Mz-sH$f  XOw${"poc AL>oL>du>Tu>'Apoozw@::$Iw'$"*w'$" ]O@$z')@$)u#)_#;|O~Ole puw#y&=)w#)t#)J#:[7zL `Oyv!a_> LbO y?66(]-S ::$q!B7v! bZMl9*^r]y z '{ u ]'?%-b]'?%%6'?%6-b6(]-S x| 6 C?,;{q!B cOt$zujio AL>o=du>Tu>X=hAjoiX#?9-_e6 6 6 6 `i]?e@$6`]?eA$^"zt@::$Ith$a=^"*th$a=^"-f( haOu Mnt-sH$u  R{8iԮ B gl#v# _wF*FCFl#FLK-[|V|?u!' a'Aa2 A%%h Ab pAM]wb * h %h b C h M]b b k3h  lOjOpo @gs#h JwF*FCFs#FL|?u!' ]oOmOQa @gd'ZHwF*FCFd'FL|u!' kOhoPpOqSr@gf#LHwF*FCFf#FL|?u!' b`PaP*_[B--R-f6G"?%F'# [uOL7l"LG!H!Z'L?%Qa%s!}-O'_L>Wda%s!}-O'aL>L |MtOHLq @XNRI, 8c'aE hzO{OVkW)-t[6 F-Q'H6(]-So$Uq!B7 RTOr 6P ]q#g %-`-q# goDR&a#q!i  O!Z i{fN-QF ? AZ z::6 6^ ?&F l5F G 8:G :G G 86^ 6 `:G :G SF  AZ z33>?-Q(::?&F 5lF `e`e``@fff?Z `e``fff?Z `e`e?, `eL-] sZ ?'sfff?sfff?eBsB?*C tPuPBV |*u^# T ^#\#-[# OT=dw6*uT"6T%a+T58-Q(-f(-R(-S (v!7`  -I' CPJc-R( -I( wOb#F$ F&'-`t m #x =b#h?e e66(k j#T[ k6(k n#e e ?,x [ [ ?,x 6gh6gt ?, x rTrm ?, x t m #[6g"{?6g?g6g#???6r㥛<6r6r㥛<6r6r㥛<6r v*}OY#Z\S Y#X#Z# @P\SB )ayz z \GC ?%C =ľs C \C ?%C L>l@?&s 66-6D?, q=\-6?6??qd6?6ff??q6Dff??q-(?,\--v6D?, q=\-6'?6???qV6#?6?ff??q6D?ff??q-'vv?,\--_l6666%6%D?6?6, =\_6D?6, =\_66% d!DPAjc*A aLPi!`b.55,-S a8`i!j! hS#M _52pV invalid state%-sH$S# zRyQV FPM**w4s$/D xQ@EPR#$ 675::$IR##$" u*APW#XR W#Q#P#O# o9U#u 4ge-Oa%s!oH-U#Ea%s!H_=eea%s!Ha= m v(x av(333?L> XbRPl!Cb$"au!78Cl!m!n! B+HPN#? !Q N#M#K#T#G# L#c <70.:K:$I'#q!l J3E)hJ,z.F)E)G)H)I)J)K)L) H#NPEI 7@E!*,w*T!Eq!l hqOD"MfC\#*-sH$D" WPR$_du>Tu>Ra A?% o?% #?e #R"zR?a+R::$IR $"*R $"-f( qPPI#~ 8 I#-So$q!s GSvQ[TPGw4U$@Ey@[SPm7 ^9-O(:K:$w-Qn-D76 6 6 6 ?{twma%s6 6 6 6 ?m!Hd-O'_L>V-VMm!H m!w m!o m!}} =-O'SNm!H m!w m!o m!}-O'v=uP wME#T PyECwu*:u:$u E#C#-@# HQPt!oV^~8ot!u!v!-w!-x!-y!-z!-{!-|!-}!~!!6",6", B[PVPB#S VS DBwu*:u:$uZB#"~" ]PhUPD#V =E8VD#;:\:$\$m =C\$ \Pn [) >q-Q :K:$ "WcA#p:n :$ ի?[W cc*:n :$ ի[W cc*:n :$ ի?[c WW**:n :$ ի[c WW6  CZD$?'HD?b n \$o$ b^Px"*A AQ''z"-D?6{"x"?b:E :$ :K:$\$:E :$ :E :$[E -fH :K:$a%s![-Q:C%-Q'{:C%Q#-Q(v=]-QZ-O `?%a%s!w'#a%s!Ha%s!oa%s!}-O'v=ZZ6 6 6 6 ?a%s!o<a%s!H9-D `?%-O'CZZ-D-O'_L>Q#'#w-D'# `={ ePFO]ZQ$::$ *%q!K O-S u!755-S '_  G"JOt"Q b NLwu*:u:$u?t"s"r"q"p" dPhhfPjPVEYC(::$a\$>(HD?3-t F-Q' [lP77XB::$ $*%q!K q!B!CA Bd9Vo$ PnPL/@X kP}"y # }", M +  _Ql"mR |"l" m hPXPi3qX E9C9G r*(!aq ZBr!!*Or!*(`r*A~w!TZ% B/kpPqP+*X -R' e SRm"'-k|m"F Xk?k?v!'UwF*FCkkv!'wF*FC-j"RCkX|?% k?& k?%R$RCX hrPsP%%W -R' qU"~#W U"-So$q!s JPGPP 6 vPJzV`#-Q( wPPUgrD*V`#\$-Q(-D(-f(W:K:$o$ead x:M$ OJ["m{_"A>o>du>Tu>\Amo{6\:\:$L $L $T:\:$g\\$-i-c \$-l-} \$-z-v \$7-}-u \$S:\:$\g:\:gmT?ML \:\:$mMm33\$mT:\:$ :\:$mMm?%\$mT@a%sm:K:$ @![-C  :I%x-L6b M-~ 66666D?6?&?, 1=M?6?6%v6 6 6 6 j-_VMv{-_|``?&?AMF"zM?-f @![-N'-f(-N(*::$IM\L a=F"L*M\L a=F"-f-N w:F" " " " *4E*"F#*@汩 };+zՖq,Lggdz z[[pȠ,}R#^Ȉz#N;Ȉr;,rr#^r߽ѶʽӽZP8("   ("-87(!.AC{{tk]TC88"  "!8:PZ{l]TAA=<-$ "-8:T]PPCF8SSc/!288 -/<38/jڮ7-.|j "-8 $- I$A Z---"$PÙ "|A "߇  ! . :8  ә ZK  FZ % Zlfltt~ʓѽ k"hw" " " " *6H *"F#/@汩};+zՖq,Lggdz z[[pȠ,}R#^Ȉz#N;Ȉr;,rr#^/r߽ѶʽӽZP8("   (""-7(CCTC88"--A=<-""ͦv8<--$""Į 3-/"F>$ Ħ  -$jvޘc"ҦĀ('v޸jf v ""jSҀj/Ҁvj"c/cjvjIS $jf">/cSj/jc Scv/c  jccc$Ivvc/$Ztfltt~ʓ mO a Ph{PhAQhBQh@ h@DQ!6_@ eUwe/a0 p@ Q:9@ UU&:10Vw@ *@ t/a0 ptQtUU&10rt*/a0 ptQtU%10wt*t@  FQMC GQ@EQIQe l aQR H S! \S-( bCM{R w]* Y  OQYZ i!~u/%]*H *g]S/a0 RH fe|WH |#u wH f10  aSQz@r@~ 3.14UQ"Tim"VQ vect(1,2,3)^QMY.4 O S#?@@@  @YQ[Q!5!!BEGINS#@@@@ 8S#@@@@Y :S#?@@@FWQFWQFptest WQ ?a/!_ @a/!N Aa/!A Ba/!- Ca/! !!END \QZQAL L-6er( M-6^r( N-6Zr(-6er' Q-6er' R-6^r( S-6Zr(-6^r' V-6er' W-6^r' X-6Zr(-6Zr' [-6er' \-6^r' ]-6Zr'-6er(-6^r(-6Zr( TN`Qx { -d"'( @vJgQovd[Wua JfQiQkz\Wy i#i#kQnh#W @~ !Z)~ !/a0 /~~ ((10Rw!/a0 Mk wQQ10@ @| !@| !/a0 /K| Ka*KF K  Kc!uppWarning: VK is BumpOpenTimed. Bots don't understand this well - use StandOpenTimed instead!10P!/a0 Me P10@ p@o !"o ]&`@ tQuQ[[vF#OF#?9"v V#V F" " " " *c*"F#;@,E,+;xi+;2K\Biiiy˥}X;, LikQiӬ;;;;,zyXdL;;;LzS̐B,,܊^EB;;Bz,aՊdOB;;;;iXL}}}zd^OL;6,\\,zz}zgzd\;;,,#iO }zzgddzdO^dir6izggdz;r}z'#O,OOOd,#d#Lzr^E,EO;;O;##  vwQO V#?,9"v F" " " " *i *"F#b@@ 'Ӈa \՗VjIv<vήvvk/jƦecƮ/qϱ*~}L}}'v*Ie}g}} i컡tjR }_}HRR  |Ql}Ql~Ql]#LQvm#OiB p#o#?,9"/a0 H]#m#9910v dZOO+nd{]%F],;{]U ]C],l]% zuu%U  NQF" " " " *7F!*"F#E@Ic>v>$V/Ӧ>$>$ڀ>$cҘN$u' ΦSĘҋ/,S$v6z+jSccSSI>NcjcjjvSSccjvIIIISIIII>>?>SSSSII>cĮcS/'>>/ScjjS3)' j' 禮$'ڦަͮ '-$/ " '$  v2    :J)2   22BMa   u a#yOi !v!\%y\,o\o!a\`#/a0 _\on_ &10\u! \ei w<ri *i z:-c#B=,I=, x#c"F" " " " *8F*"F#K@Ic>v>$V/Ӧ>$>$ڀ>$cҘN$u' ΦSĘҋ/,S$v6z+jSccSSI>NcjcjjvSSccjvIIIISIIII>>?>SSSSII>cĮcS/'>>/ScjjS^EL3/O)b' }Y  ' g  '  .nY "  }Y "%'    sn!' kf.  "%%'O9 %%'.  }R '%)=B)2$YH )=JMa   m txXM)c'~#LN[" " " " **"F#O@ `` `` ` ` ` `mo`oooo`0 o # o0 0   6% 0 06  6 0 8 8 eF wUv!'X<R5-[k?|?Kk|G$ LI :Ue#v!UF |?aF ( \Rm]Rmmo+A$_Ry?A$h'  @aRgbRggH//============================================================================= // ZoneTrigger. //============================================================================= class ZoneTrigger extends Trigger; // // Called when something touches the trigger. // function Touch( actor Other ) { local ZoneInfo Z; if( IsRelevant( Other ) ) { // Broadcast the Trigger message to all matching actors. if( Event != '' ) foreach AllActors( class 'ZoneInfo', Z ) if ( Z.ZoneTag == Event ) Z.Trigger( Other, Other.Instigator ); if( Message != "" ) // Send a string message to the toucher. Other.Instigator.ClientMessage( Message ); if( bTriggerOnceOnly ) // Ignore future touches. SetCollision(False); } } // // When something untouches the trigger. // function UnTouch( actor Other ) { local ZoneInfo Z; if( IsRelevant( Other ) ) { // Untrigger all matching actors. if( Event != '' ) foreach AllActors( class 'ZoneInfo', Z ) if ( Z.ZoneTag == Event ) Z.UnTrigger( Other, Other.Instigator ); } } B//============================================================================= // WarpZoneMarker. //============================================================================= class WarpZoneMarker extends NavigationPoint native; var WarpZoneInfo markedWarpZone; // AI related var Actor TriggerActor; //used to tell AI how to trigger me var Actor TriggerActor2; function PostBeginPlay() { if ( markedWarpZone.numDestinations > 1 ) FindTriggerActor(); Super.PostBeginPlay(); } function FindTriggerActor() { local ZoneTrigger Z; ForEach AllActors(class 'ZoneTrigger', Z) if ( Z.Event == markedWarpZone.ZoneTag) { TriggerActor = Z; return; } } /* SpecialHandling is called by the navigation code when the next path has been found. It gives that path an opportunity to modify the result based on any special considerations */ /* FIXME - how to figure out if other side actor is OK and use intelligently for all dests? */ function Actor SpecialHandling(Pawn Other) { if (Other.Region.Zone == markedWarpZone) markedWarpZone.ActorEntered(Other); return self; } /* if ( markedWarpZone.numDestinations <= 1 ) return self; if ( markedWarpZone.OtherSideActor is OK ) return self; if (TriggerActor == None) { FindTriggerActor(); if (TriggerActor == None) return None; } return TriggerActor; } */ _N//============================================================================= // WarpZoneInfo. For making disjoint spaces appear as if they were connected; // supports both in-level warp zones and cross-level warp zones. //============================================================================= class WarpZoneInfo extends ZoneInfo native; //----------------------------------------------------------------------------- // Information set by the level designer. var() string OtherSideURL; var() name ThisTag; var() bool bNoTeleFrag; //----------------------------------------------------------------------------- // Internal. var const int iWarpZone; var const coords WarpCoords; var transient WarpZoneInfo OtherSideActor; var transient object OtherSideLevel; var() string Destinations[8]; var int numDestinations; //----------------------------------------------------------------------------- // Network replication. replication { reliable if( Role==ROLE_Authority ) OtherSideURL, ThisTag, OtherSideActor; } //----------------------------------------------------------------------------- // Functions. // Warp coordinate system transformations. native(314) final function Warp ( out vector Loc, out vector Vel, out rotator R ); native(315) final function UnWarp( out vector Loc, out vector Vel, out rotator R ); function PreBeginPlay() { Super.PreBeginPlay(); // Generate the local connection. Generate(); // Setup destination list. numDestinations = 0; While( numDestinations < 8 ) if (Destinations[numDestinations] != "") numDestinations++; else numDestinations = 8; // Generate URL if necessary. if( numDestinations>0 && (OtherSideURL == "") ) OtherSideURL = Destinations[0]; } function Trigger( actor Other, pawn EventInstigator ) { local int nextPick; if (numDestinations == 0) return; nextPick = 0; While( (nextPick < 8) && (Destinations[nextPick] != OtherSideURL ) ) nextPick++; nextPick++; if ( (nextPick > 7) || (Destinations[nextPick] == "") ) nextPick = 0; OtherSideURL = Destinations[nextPick]; ForceGenerate(); } // Set up this warp zone's destination. simulated event Generate() { if( OtherSideLevel != None ) return; ForceGenerate(); } // Set up this warp zone's destination. simulated event ForceGenerate() { if( InStr(OtherSideURL,"/") >= 0 ) { // Remote level. //log( "Warpzone " $ Self $ " remote" ); OtherSideLevel = None; OtherSideActor = None; } else { // Local level. OtherSideLevel = XLevel; foreach AllActors( class 'WarpZoneInfo', OtherSideActor ) if( string(OtherSideActor.ThisTag)~=OtherSideURL && OtherSideActor!=Self ) break; //log( "Warpzone " $ Self $ " local, connected to " $ OtherSideActor ); } } // When an actor enters this warp zone. simulated function ActorEntered( actor Other ) { local vector L; local rotator R; local Pawn P; //if ( Other.Role == ROLE_AutonomousProxy ) // return; // don't simulate for client players Super.ActorEntered( Other ); if( !Other.bJustTeleported ) { Generate(); if( OtherSideActor != None ) { // This needs to also perform a coordinate system transformation, // in case the portals aren't directionally aligned. This is easy to // do but UnrealScript doesn't provide coordinate system operators yet. Other.Disable('Touch'); Other.Disable('UnTouch'); L = Other.Location; if( Other.IsA('PlayerPawn') ) R = PlayerPawn(Other).ViewRotation; else R = Other.Rotation; UnWarp( L, Other.Velocity, R ); OtherSideActor.Warp( L, Other.Velocity, R ); if( Other.IsA('Pawn') ) { Pawn(Other).bWarping = bNoTelefrag; if ( Other.SetLocation(L) ) { //tell enemies about teleport if ( Role == ROLE_Authority ) { P = Level.PawnList; While ( P != None ) { if (P.Enemy == Other) P.LastSeenPos = Other.Location; P = P.nextPawn; } } R.Roll = 0; Pawn(Other).ViewRotation = R; Pawn(Other).ClientSetLocation(L, R ); Pawn(Other).MoveTimer = -1.0; } else { // set up to keep trying to teleport GotoState('DelayedWarp'); } } else { Other.SetLocation(L); Other.SetRotation( R ); } Other.Enable('Touch'); Other.Enable('UnTouch'); // Change rotation according to portal's rotational change. } } } event ActorLeaving( actor Other ) { Super.ActorLeaving(Other); If ( Other.IsA('Pawn') ) Pawn(Other).bWarping = false; } State DelayedWarp { function Tick(float DeltaTime) { local Pawn P; local bool bFound; For ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( P.bWarping && (P.Region.Zone == Self) ) { bFound = true; ActorEntered(P); } If ( !bFound ) GotoState(''); } } N//============================================================================= // TriggerMarker. //============================================================================= class TriggerMarker extends NavigationPoint native; // OBSOLETE - to be removed f=//============================================================================= // TriggerLight. // A lightsource which can be triggered on or off. //============================================================================= class TriggerLight extends Light; //----------------------------------------------------------------------------- // Variables. var() float ChangeTime; // Time light takes to change from on to off. var() bool bInitiallyOn; // Whether it's initially on. var() bool bDelayFullOn; // Delay then go full-on. var() float RemainOnTime; // How long the TriggerPound effect lasts var float InitialBrightness; // Initial brightness. var float Alpha, Direction; var actor SavedTrigger; var float poundTime; //----------------------------------------------------------------------------- // Engine functions. // Called at start of gameplay. simulated function BeginPlay() { // Remember initial light type and set new one. Disable( 'Tick' ); InitialBrightness = LightBrightness; if( bInitiallyOn ) { Alpha = 1.0; Direction = 1.0; } else { Alpha = 0.0; Direction = -1.0; } DrawType = DT_None; } // Called whenever time passes. function Tick( float DeltaTime ) { Alpha += Direction * DeltaTime / ChangeTime; if( Alpha > 1.0 ) { Alpha = 1.0; Disable( 'Tick' ); if( SavedTrigger != None ) SavedTrigger.EndEvent(); } else if( Alpha < 0.0 ) { Alpha = 0.0; Disable( 'Tick' ); if( SavedTrigger != None ) SavedTrigger.EndEvent(); } if( !bDelayFullOn ) LightBrightness = Alpha * InitialBrightness; else if( (Direction>0 && Alpha!=1) || Alpha==0 ) LightBrightness = 0; else LightBrightness = InitialBrightness; } //----------------------------------------------------------------------------- // Public states. // Trigger turns the light on. state() TriggerTurnsOn { function Trigger( actor Other, pawn EventInstigator ) { if( SavedTrigger!=None ) SavedTrigger.EndEvent(); SavedTrigger = Other; SavedTrigger.BeginEvent(); Direction = 1.0; Enable( 'Tick' ); } } // Trigger turns the light off. state() TriggerTurnsOff { function Trigger( actor Other, pawn EventInstigator ) { if( SavedTrigger!=None ) SavedTrigger.EndEvent(); SavedTrigger = Other; SavedTrigger.BeginEvent(); Direction = -1.0; Enable( 'Tick' ); } } // Trigger toggles the light. state() TriggerToggle { function Trigger( actor Other, pawn EventInstigator ) { if( SavedTrigger!=None ) SavedTrigger.EndEvent(); SavedTrigger = Other; SavedTrigger.BeginEvent(); Direction *= -1; Enable( 'Tick' ); } } // Trigger controls the light. state() TriggerControl { function Trigger( actor Other, pawn EventInstigator ) { if( SavedTrigger!=None ) SavedTrigger.EndEvent(); SavedTrigger = Other; SavedTrigger.BeginEvent(); if( bInitiallyOn ) Direction = -1.0; else Direction = 1.0; Enable( 'Tick' ); } function UnTrigger( actor Other, pawn EventInstigator ) { if( SavedTrigger!=None ) SavedTrigger.EndEvent(); SavedTrigger = Other; SavedTrigger.BeginEvent(); if( bInitiallyOn ) Direction = 1.0; else Direction = -1.0; Enable( 'Tick' ); } } state() TriggerPound { function Timer () { if (poundTime >= RemainOnTime) { Disable ('Timer'); } poundTime += ChangeTime; Direction *= -1; SetTimer (ChangeTime, false); } function Trigger( actor Other, pawn EventInstigator ) { if( SavedTrigger!=None ) SavedTrigger.EndEvent(); SavedTrigger = Other; SavedTrigger.BeginEvent(); Direction = 1; poundTime = ChangeTime; // how much time will pass till reversal SetTimer (ChangeTime, false); // wake up when it's time to reverse Enable ('Timer'); Enable ('Tick'); } } p//============================================================================= // TestObj: A purely scripted object for internal testing. //============================================================================= class TestObj extends Object; function Test() { log( "TestObj.Test" ); } uk//============================================================================= // For internal testing. //============================================================================= class TestInfo extends Info; var() bool bTrue1; var() bool bFalse1; var() bool bTrue2; var() bool bFalse2; var bool bBool1; var bool bBool2; var() int xnum; var float ppp; var string sxx; var int MyArray[2]; var vector v1,v2; var string TestRepStr; //var string[32] teststring; const Pie=3.14; const Str="Tim"; const Lotus=vect(1,2,3); var struct STest { var bool b1; var int i; var bool b2; var bool b3; } ST; function TestQ() { local vector v; v.x = 2; v.y = 3; v.z = 4; assert(v==vect(2,3,4)); assert(v.z==4); assert(v.y==3); assert(v.x==2); } static function test() { class'testinfo'.default.v1 = vect(1,2,3); } function PostBeginPlay() { local object o; local actor TempActor; log("!!BEGIN"); default.v1=vect(5,4,3); assert(default.v1==vect(5,4,3)); test(); assert(default.v1==vect(1,2,3)); BroadcastMessage(Tag); BroadcastMessage(string(Tag)); BroadcastMessage("test "$string(Tag)); assert(IsA('Actor')); assert(IsA('TestInfo')); assert(IsA('Info')); assert(!IsA('LevelInfo')); assert(!IsA('Texture')); //o=dynamicloadobject( "UnrealShare.AutoMag.Reload", class'object' ); //assert(o!=None); //assert(o==None); log("!!END"); } function TestStructBools() { assert(ST.b1==false); assert(ST.b2==false); assert(ST.b3==false); ST.b1=true; assert(ST.b1==true); assert(ST.b2==false); assert(ST.b3==false); ST.b2=true; assert(ST.b1==true); assert(ST.b2==true); assert(ST.b3==false); ST.b3=true; assert(ST.b1==true); assert(ST.b2==true); assert(ST.b3==true); ST.b1=false; ST.b2=false; ST.b3=false; } function BeginPlay() { local testobj to; local object oo; to = new class'TestObj'; to = new()class'TestObj'; to = new(self)class'TestObj'; to = new(self,'')class'TestObj'; to = new(self,'',0)class'TestObj'; to.Test(); TestStructBools(); } function TestX( bool bResource ) { local int n; n = int(bResource); MyArray[ int(bResource) ] = 0; MyArray[ int(bResource) ]++; } function bool RecurseTest() { bBool1=true; return false; } function TestLimitor( class c ) { local class NewClass; NewClass = class( c ); } static function int OtherStatic( int i ) { assert(i==246); assert(default.xnum==777); return 555; } static function int TestStatic( int i ) { assert(i==123); assert(default.xnum==777); assert(OtherStatic(i*2)==555); } function TestContinueFor() { local int i; log("TestContinue"); for( i=0; i<20; i++ ) { log("iteration "$i); if(i==7||i==9||i==19) continue; log("..."); } log("DoneContinue"); } function TestContinueWhile() { local int i; log("TestContinue"); while( ++i <= 20 ) { log("iteration "$i); if(i==7||i==9) continue; log("..."); } log("DoneContinue"); } function TestContinueDoUntil() { local int i; log("TestContinue"); do { i++; log("iteration "$i); if(i==7||i==9||i>18) continue; log("..."); } until( i>20 ); log("DoneContinue"); } function TestContinueForEach() { local actor a; log("TestContinue"); foreach AllActors( class'Actor', a ) { log("actor "$a); if(light(a)==none) continue; log("..."); } log("DoneContinue"); } function SubTestOptionalOut( optional out int a, optional out int b, optional out int c ) { a *= 2; b = b*2; c += c; } function TestOptionalOut() { local int a,b,c; a=1; b=2; c=3; SubTestOptionalOut(a,b,c); assert(a==2); assert(b==4); assert(c==6); SubTestOptionalOut(a,b); assert(a==4); assert(b==8); assert(c==6); SubTestOptionalOut(,b,c); assert(a==4); assert(b==16); assert(c==12); SubTestOptionalOut(); assert(a==4); assert(b==16); assert(c==12); SubTestOptionalOut(a,b,c); assert(a==8); assert(b==32); assert(c==24); log("TestOptionalOut ok!"); } function TestNullContext( actor a ) { bHidden = a.bHidden; a.bHidden = bHidden; } function TestSwitch() { local string s; local int i; local bool b; s="Tim"; i=2; switch( i ) { case 0: assert(false); break; case 2: b=true; break; default: assert(false); break; } assert(b); switch( s ) { case "": assert(false); break; case "xyzzy": assert(false); break; default: b=false; break; } assert(!b); log("testswitch succeeded"); } function Tick( float DeltaTime ) { local class C; local class TC; local actor a; log("time="$Level.TimeSeconds); TestOptionalOut(); TestNullContext( self ); TestNullContext( None ); TestSwitch(); v1=vect(1,2,3); v2=vect(2,4,6); assert(v1!=v2); assert(!(v1==v2)); assert(v1==vect(1,2,3)); assert(v2==vect(2,4,6)); assert(vect(1,2,5)!=v1); assert(v1*2==v2); assert(v1==v2/2); assert(Pie==3.14); assert(Pie!=2); assert(Str=="Tim"); assert(Str!="Bob"); assert(Lotus==vect(1,2,3)); assert(GetPropertyText("sxx")=="Tim"); assert(GetPropertyText("ppp")!="123"); assert(GetPropertyText("bogus")==""); xnum=345; assert(GetPropertyText("xnum")=="345"); SetPropertyText("xnum","999"); assert(xnum==999); assert(xnum!=666); assert(bTrue1==true); assert(bFalse1==false); assert(bTrue2==true); assert(bFalse2==false); assert(default.bTrue1==true); assert(default.bFalse1==false); assert(default.bTrue2==true); assert(default.bFalse2==false); assert(class'TestInfo'.default.bTrue1==true); assert(class'TestInfo'.default.bFalse1==false); assert(class'TestInfo'.default.bTrue2==true); assert(class'TestInfo'.default.bFalse2==false); TC=Class; assert(TC.default.bTrue1==true); assert(TC.default.bFalse1==false); assert(TC.default.bTrue2==true); assert(TC.default.bFalse2==false); C=Class; assert(class(C).default.bTrue1==true); assert(class(C).default.bFalse1==false); assert(class(C).default.bTrue2==true); assert(class(C).default.bFalse2==false); assert(default.xnum==777); TestStatic(123); TC.static.TestStatic(123); class(C).static.TestStatic(123); bBool2=RecurseTest(); assert(bBool2==false); TestStructBools(); TestQ(); log( "All tests passed" ); } function f(); function temp() { local int i; local playerpawn PlayerOwner; local name LeftList[20]; for( i=0; i<20; i++ ) PlayerOwner.WeaponPriority[i] = LeftList[i+1]; temp(); } state AA { function f(); } state BB { function f(); } state CCAA extends AA { function f(); } state DDAA extends AA { function f(); } state EEDDAA extends DDAA { function f(); } c kRojRvc %8x.yB b//============================================================================= // A directional spotlight. //============================================================================= class Spotlight extends Light; v;//============================================================================= // SpecialEvent: Receives trigger messages and does some "special event" // depending on the state. //============================================================================= class SpecialEvent extends Triggers; #exec Texture Import File=Textures\TrigSpcl.pcx Name=S_SpecialEvent Mips=Off Flags=2 //----------------------------------------------------------------------------- // Variables. var() int Damage; // For DamagePlayer state. var() name DamageType; var() localized string DamageString; var() sound Sound; // For PlaySoundEffect state. var() localized string Message; // For all states. var() bool bBroadcast; // To broadcast the message to all players. var() bool bPlayerViewRot; // Whether player can rotate the view while pathing. //----------------------------------------------------------------------------- // Functions. function Trigger( actor Other, pawn EventInstigator ) { local pawn P; if( bBroadcast ) BroadcastMessage(Message, true, 'CriticalEvent'); // Broadcast message to all players. else if( EventInstigator!=None && len(Message)!=0 ) { // Send message to instigator only. EventInstigator.ClientMessage( Message ); } } //----------------------------------------------------------------------------- // States. // Just display the message. state() DisplayMessage { } // Damage the instigator who caused this event. state() DamageInstigator { function Trigger( actor Other, pawn EventInstigator ) { Global.Trigger( Self, EventInstigator ); if ( Other.IsA('PlayerPawn') ) Level.Game.SpecialDamageString = DamageString; Other.TakeDamage( Damage, EventInstigator, EventInstigator.Location, Vect(0,0,0), DamageType); } } // Kill the instigator who caused this event. state() KillInstigator { function Trigger( actor Other, pawn EventInstigator ) { Global.Trigger( Self, EventInstigator ); if ( Other.IsA('PlayerPawn') ) Level.Game.SpecialDamageString = DamageString; if( EventInstigator != None ) EventInstigator.Died( None, DamageType, EventInstigator.Location ); } } // Play a sound. state() PlaySoundEffect { function Trigger( actor Other, pawn EventInstigator ) { Global.Trigger( Self, EventInstigator ); PlaySound( Sound ); } } // Play a sound. state() PlayersPlaySoundEffect { function Trigger( actor Other, pawn EventInstigator ) { local pawn P; Global.Trigger( Self, EventInstigator ); for ( P=Level.PawnList; P!=None; P=P.NextPawn ) if ( P.bIsPlayer && P.IsA('PlayerPawn') ) PlayerPawn(P).ClientPlaySound(Sound); } } // Place Ambient sound effect on player state() PlayAmbientSoundEffect { function Trigger( actor Other, pawn EventInstigator ) { Global.Trigger( Self, EventInstigator ); EventInstigator.AmbientSound = AmbientSound; } } // Send the player on a spline path through the level. state() PlayerPath { function Trigger( actor Other, pawn EventInstigator ) { local InterpolationPoint i; Global.Trigger( Self, EventInstigator ); if( EventInstigator!=None && EventInstigator.bIsPlayer && (Level.NetMode == NM_Standalone) ) { foreach AllActors( class 'InterpolationPoint', i, Event ) { if( i.Position == 0 ) { EventInstigator.GotoState(''); EventInstigator.SetCollision(True,false,false); EventInstigator.bCollideWorld = False; EventInstigator.Target = i; EventInstigator.SetPhysics(PHYS_Interpolating); EventInstigator.PhysRate = 1.0; EventInstigator.PhysAlpha = 0.0; EventInstigator.bInterpolating = true; EventInstigator.AmbientSound = AmbientSound; } } } } } @//============================================================================= // Scout used for path generation. //============================================================================= class Scout extends Pawn native; function PreBeginPlay() { Destroy(); //scouts shouldn't exist during play } <oRjBnRu<G o"_//============================================================================= // ScaledSprite. //============================================================================= class ScaledSprite extends Decoration; Y //============================================================================= // RoundRobin: Each time it's triggered, it advances through a list of // outgoing events. //============================================================================= class RoundRobin extends Triggers; var() name OutEvents[16]; // Events to generate. var() bool bLoop; // Whether to loop when get to end. var int i; // Internal counter. // // When RoundRobin is triggered... // function Trigger( actor Other, pawn EventInstigator ) { local actor A; if( OutEvents[i] != '' ) { foreach AllActors( class 'Actor', A, OutEvents[i] ) { A.Trigger( Self, EventInstigator ); } if( ++i>=ArrayCount(OutEvents) || OutEvents[i]=='' ) { if( bLoop ) i=0; else SetCollision(false,false,false); } } } U //============================================================================= // PatrolPoint. //============================================================================= class PatrolPoint extends NavigationPoint; #exec Texture Import File=Textures\Pathnode.pcx Name=S_Patrol Mips=Off Flags=2 var() name Nextpatrol; //next point to go to var() float pausetime; //how long to pause here var vector lookdir; //direction to look while stopped var() name PatrolAnim; var() sound PatrolSound; var() byte numAnims; var int AnimCount; var PatrolPoint NextPatrolPoint; function PreBeginPlay() { if (pausetime > 0.0) lookdir = 200 * vector(Rotation); //find the patrol point with the tag specified by Nextpatrol foreach AllActors(class 'PatrolPoint', NextPatrolPoint, Nextpatrol) break; Super.PreBeginPlay(); } e//============================================================================= // PathNode. //============================================================================= class PathNode extends NavigationPoint native; d//============================================================================= // MusicEvent. //============================================================================= class MusicEvent extends Triggers; // Variables. var() music Song; var() byte SongSection; var() byte CdTrack; var() EMusicTransition Transition; var() bool bSilence; var() bool bOnceOnly; var() bool bAffectAllPlayers; // When gameplay starts. function BeginPlay() { if( Song==None ) { Song = Level.Song; } if( bSilence ) { SongSection = 255; CdTrack = 255; } } // When triggered. function Trigger( actor Other, pawn EventInstigator ) { local PlayerPawn P; local Pawn A; if( bAffectAllPlayers ) { A = Level.PawnList; While ( A != None ) { if ( A.IsA('PlayerPawn') ) PlayerPawn(A).ClientSetMusic( Song, SongSection, CdTrack, Transition ); A = A.nextPawn; } } else { // Only affect the one player. P = PlayerPawn(EventInstigator); if( P==None ) return; // Go to music. P.ClientSetMusic( Song, SongSection, CdTrack, Transition ); } // Turn off if once-only. if( bOnceOnly ) { SetCollision(false,false,false); disable( 'Trigger' ); } } M//============================================================================= // MessagingSpectator - spectator base class for game helper spectators which receive messages //============================================================================= class MessagingSpectator expands Spectator abstract; function PostBeginPlay() { Super.PostBeginPlay(); bIsPlayer = False; } p//============================================================================= // The light class. //============================================================================= class Light extends Actor native; #exec Texture Import File=Textures\S_Light.pcx Name=S_Light Mips=Off Flags=2 I//============================================================================= // LiftExit. //============================================================================= class LiftExit extends NavigationPoint native; var() name LiftTag; var Mover MyLift; var() name LiftTrigger; var trigger RecommendedTrigger; var float LastTriggerTime; function PostBeginPlay() { if ( LiftTag != '' ) ForEach AllActors(class'Mover', MyLift, LiftTag ) break; //log(self$" attached to "$MyLift); if ( LiftTrigger != '' ) ForEach AllActors(class'Trigger', RecommendedTrigger, LiftTrigger ) break; Super.PostBeginPlay(); } /* SpecialHandling is called by the navigation code when the next path has been found. It gives that path an opportunity to modify the result based on any special considerations */ function Actor SpecialHandling(Pawn Other) { if ( (Other.Base == MyLift) && (MyLift != None) ) { if ( (self.Location.Z < Other.Location.Z + Other.CollisionHeight) && Other.LineOfSightTo(self) ) return self; Other.SpecialGoal = None; Other.DesiredRotation = rotator(Location - Other.Location); MyLift.HandleDoor(Other); if ( (Other.SpecialGoal == MyLift) || (Other.SpecialGoal == None) ) Other.SpecialGoal = MyLift.myMarker; return Other.SpecialGoal; } return self; } _://============================================================================= // LiftCenter. //============================================================================= class LiftCenter extends NavigationPoint native; var() name LiftTag; var mover MyLift; var() name LiftTrigger; var trigger RecommendedTrigger; var float LastTriggerTime; var() float MaxZDiffAdd; //added threshold for Z difference between pawn and lift (for lifts which are at the end of a ramp or stairs) var() float MaxDist2D; var vector LiftOffset; function PostBeginPlay() { if ( LiftTag != '' ) ForEach AllActors(class'Mover', MyLift, LiftTag ) { MyLift.myMarker = self; SetBase(MyLift); LiftOffset = Location - MyLift.Location; if ( MyLift.InitialState == 'BumpOpenTimed' ) log("Warning: "$MyLift$" is BumpOpenTimed. Bots don't understand this well - use StandOpenTimed instead!"); break; } // log(self$" attached to "$MyLift); if ( LiftTrigger != '' ) ForEach AllActors(class'Trigger', RecommendedTrigger, LiftTrigger ) break; Super.PostBeginPlay(); } /* SpecialHandling is called by the navigation code when the next path has been found. It gives that path an opportunity to modify the result based on any special considerations */ function Actor SpecialHandling(Pawn Other) { local float dist2d; local NavigationPoint N, Exit; if ( MyLift == None ) return self; if ( Other.base == MyLift ) { if ( (RecommendedTrigger != None) && (myLift.SavedTrigger == None) && (Level.TimeSeconds - LastTriggerTime > 5) ) { Other.SpecialGoal = RecommendedTrigger; LastTriggerTime = Level.TimeSeconds; return RecommendedTrigger; } return self; } if ( (LiftExit(Other.MoveTarget) != None) && (LiftExit(Other.MoveTarget).RecommendedTrigger != None) && (LiftExit(Other.MoveTarget).LiftTag == LiftTag) && (Level.TimeSeconds - LiftExit(Other.MoveTarget).LastTriggerTime > 5) && (MyLift.SavedTrigger == None) && (Abs(Other.Location.X - Other.MoveTarget.Location.X) < Other.CollisionRadius) && (Abs(Other.Location.Y - Other.MoveTarget.Location.Y) < Other.CollisionRadius) && (Abs(Other.Location.Z - Other.MoveTarget.Location.Z) < Other.CollisionHeight) ) { LiftExit(Other.MoveTarget).LastTriggerTime = Level.TimeSeconds; Other.SpecialGoal = LiftExit(Other.MoveTarget).RecommendedTrigger; return LiftExit(Other.MoveTarget).RecommendedTrigger; } SetLocation(MyLift.Location + LiftOffset); SetBase(MyLift); dist2d = square(Location.X - Other.Location.X) + square(Location.Y - Other.Location.Y); if ( (Location.Z - CollisionHeight - MaxZDiffAdd < Other.Location.Z - Other.CollisionHeight + Other.MaxStepHeight) && (Location.Z - CollisionHeight > Other.Location.Z - Other.CollisionHeight - 1200) && ( dist2D < MaxDist2D * MaxDist2D) ) { return self; } if ( MyLift.BumpType == BT_PlayerBump && !Other.bIsPlayer ) return None; Other.SpecialGoal = None; // make sure Other is at valid lift exit if ( LiftExit(Other.MoveTarget) == None ) { for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) if ( N.IsA('LiftExit') && (LiftExit(N).LiftTag == LiftTag) && (Abs(Other.Location.X - N.Location.X) < Other.CollisionRadius) && (Abs(Other.Location.Y - N.Location.Y) < Other.CollisionRadius) && (Abs(Other.Location.Z - N.Location.Z) < Other.CollisionHeight) ) { Exit = N; break; } if ( Exit == None ) return self; } MyLift.HandleDoor(Other); MyLift.RecommendedTrigger = None; if ( (Other.SpecialGoal == MyLift) || (Other.SpecialGoal == None) ) Other.SpecialGoal = self; return Other.SpecialGoal; } [ //============================================================================= // InterpolationPoint. //============================================================================= class InterpolationPoint extends Keypoint native; // Sprite. #exec Texture Import File=Textures\IntrpPnt.pcx Name=S_Interp Mips=Off Flags=2 // Number in sequence sharing this tag. var() int Position; var() float RateModifier; var() float GameSpeedModifier; var() float FovModifier; var() bool bEndOfPath; var() bool bSkipNextPath; var() float ScreenFlashScale; var() vector ScreenFlashFog; // Other points in this interpolation path. var InterpolationPoint Prev, Next; // // At start of gameplay, link all matching interpolation points together. // function BeginPlay() { Super.BeginPlay(); // Try to find previous. foreach AllActors( class 'InterpolationPoint', Prev, Tag ) if( Prev.Position == Position-1 ) break; if( Prev != None ) Prev.Next = Self; // Try to find next. foreach AllActors( class 'InterpolationPoint', Next, Tag ) if( Next.Position == Position+1 ) break; if( Next == None ) foreach AllActors( class 'InterpolationPoint', Next, Tag ) if( Next.Position == 0 ) break; if( Next != None ) Next.Prev = Self; } // // Verify that we're linked up. // function PostBeginPlay() { Super.PostBeginPlay(); //log( "Interpolation point" @ Tag @ Position $ ":" ); //if( Prev != None ) // log( " Prev # " $ Prev.Position ); //if( Next != None ) // log( " Next # " $ Next.Position ); } // // When reach an interpolation point. // function InterpolateEnd( actor Other ) { if( bEndOfPath ) { if( Pawn(Other)!=None && Pawn(Other).bIsPlayer ) { Other.bCollideWorld = True; Other.bInterpolating = false; if ( Pawn(Other).Health > 0 ) { Other.SetCollision(true,true,true); Other.SetPhysics(PHYS_Falling); Other.AmbientSound = None; if ( Other.IsA('PlayerPawn') ) Other.GotoState('PlayerWalking'); } } } } r//============================================================================= // InternetInfo: Parent class for Internet connection classes //============================================================================= class InternetInfo extends Info native transient; function string GetBeaconAddress( int i ); function string GetBeaconText( int i ); T//============================================================================= // HomeBase. //============================================================================= class HomeBase extends NavigationPoint; #exec Texture Import File=Textures\Flag1.pcx Name=S_Flag Mips=Off Flags=2 var() float extent; //how far the base extends from central point (in line of sight) var vector lookdir; //direction to look while stopped function PreBeginPlay() { lookdir = 200 * vector(Rotation); Super.PreBeginPlay(); } Z//============================================================================= // Effects, the base class of all gratuitous special effects. //============================================================================= class Effects extends Actor; var() sound EffectSound1; var() sound EffectSound2; var() bool bOnlyTriggerable; T//============================================================================= // Dispatcher: receives one trigger (corresponding to its name) as input, // then triggers a set of specifid events with optional delays. //============================================================================= class Dispatcher extends Triggers; #exec Texture Import File=Textures\Dispatch.pcx Name=S_Dispatcher Mips=Off Flags=2 //----------------------------------------------------------------------------- // Dispatcher variables. var() name OutEvents[8]; // Events to generate. var() float OutDelays[8]; // Relative delays before generating events. var int i; // Internal counter. //============================================================================= // Dispatcher logic. // // When dispatcher is triggered... // function Trigger( actor Other, pawn EventInstigator ) { Instigator = EventInstigator; gotostate('Dispatch'); } // // Dispatch events. // state Dispatch { Begin: disable('Trigger'); for( i=0; i Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { RepReceiveLocalizedMessage( Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); } //==== Called during demo playback ============================================ simulated function Tick(float Delta) { local PlayerPawn p; local GameReplicationInfo g; // find local playerpawn and attach. if(Level.NetMode == NM_Client) { if(PlaybackActor == None) { foreach AllActors(class'PlayerPawn', p) { if( p.Player.IsA('Viewport') ) { PlaybackActor = p; if(PlaybackGRI != None) PlaybackActor.GameReplicationInfo = PlaybackGRI; Log("Attached to player "$p); break; } } } if(PlaybackGRI == None) { foreach AllActors(class'GameReplicationInfo', g) { PlaybackGRI = g; if(PlaybackActor != None) PlaybackActor.GameReplicationInfo = PlaybackGRI; break; } } if(PlaybackActor != None && PlaybackGRI != None) Disable('Tick'); } else { Disable('Tick'); } } simulated function RepClientMessage( coerce string S, optional name Type, optional bool bBeep ) { if(PlaybackActor != None && PlaybackActor.Role == ROLE_Authority) PlaybackActor.ClientMessage( S, Type, bBeep ); } simulated function RepTeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type ) { if(PlaybackActor != None && PlaybackActor.Role == ROLE_Authority) PlaybackActor.TeamMessage( PRI, S, Type ); } simulated function RepClientVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID) { if(PlaybackActor != None && PlaybackActor.Role == ROLE_Authority) PlaybackActor.ClientVoiceMessage(Sender, Recipient, messagetype, messageID); } simulated function RepReceiveLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if(PlaybackActor != None && PlaybackActor.Role == ROLE_Authority) PlaybackActor.ReceiveLocalizedMessage( Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); } replication { reliable if ( bDemoRecording ) RepClientMessage, RepTeamMessage, RepClientVoiceMessage, RepReceiveLocalizedMessage; } B //============================================================================= // DamageType, the base class of all damagetypes. // this and its subclasses are never spawned, just used as information holders //============================================================================= class DamageType extends Actor abstract; // Description of a type of damage. var() localized string Name; // Description of damage. var() localized string AltName; // Alternative description. var() float ViewFlash; // View flash to play. var() vector ViewFog; // View fog to play. var() class DamageEffect; // Special effect. static function string DeathMessage() { if( FRand() < 0.5 ) return Default.Name; else return Default.AltName; } N//============================================================================= // A camera, used in UnrealEd. //============================================================================= class Camera extends PlayerPawn native; // Sprite. #exec Texture Import File=Textures\S_Camera.pcx Name=S_Camera Mips=Off Flags=2 L//============================================================================= // ButtonMarker. //============================================================================= class ButtonMarker extends NavigationPoint native; // OBSOLETE - TO BE REMOVED JBSxASFJhDjh//============================================================================= // BlockPlayers prevents players from passing, but allows monsters and projectiles to cross. //============================================================================= class BlockPlayer extends Keypoint; JDSNCS\+JhD<dk//============================================================================= // BlockMonsters prevents monsters from passing, but allows players and projectiles to cross. //============================================================================= class BlockMonsters extends Keypoint; JFSz ES6!JhD<djk//============================================================================= // Blocks all actors from passing. //============================================================================= class BlockAll extends Keypoint; L //============================================================================= // Ambushpoint. //============================================================================= class AmbushPoint extends NavigationPoint; var vector lookdir; //direction to look while ambushing //at start, ambushing creatures will pick either their current location, or the location of //some ambushpoint belonging to their team var byte survivecount; //used when picking ambushpoint var() float SightRadius; // How far bot at this point should look for enemies var() bool bSniping; // bots should snipe from this position function PreBeginPlay() { lookdir = 2000 * vector(Rotation); Super.PreBeginPlay(); } JISfHSTZJhD |PB@@O//============================================================================= // Ambient sound, sits there and emits its sound. This class is no different // than placing any other actor in a level and setting its ambient sound. //============================================================================= class AmbientSound extends Keypoint; // Import the sprite. #exec Texture Import File=Textures\Ambient.pcx Name=S_Ambient Mips=Off Flags=2 YTestObj.Test  //============================================================================= // ClipMarker. // // These are markers for the brush clip mode. You place 2 or 3 of these in // the level and that defines your clipping plane. // // These should NOT be manually added to the level. The editor adds and // deletes them on it's own. // //============================================================================= class ClipMarker extends Keypoint native; #exec Texture Import File=Textures\S_ClipMarker.pcx Name=S_ClipMarker Mips=Off Flags=2 #exec Texture Import File=Textures\S_ClipMarker1.pcx Name=S_ClipMarker1 Mips=Off Flags=2 #exec Texture Import File=Textures\S_ClipMarker2.pcx Name=S_ClipMarker2 Mips=Off Flags=2 #exec Texture Import File=Textures\S_ClipMarker3.pcx Name=S_ClipMarker3 Mips=Off Flags=2 w" " " " *}*Z"F#@nnnnnnnnnn w" " " " *z*Z"F#5 @nnnnnnnnnn w" " " " * y*Z"F#@nnnnnnnnnn w" " " " * y*Z"F#@nnnnnnnnnn uaRaHaB3aD3aC3E cap2ao2aE3E naaaF3aA3C3Pua@3aQE3J4aPC3H3C3G3@3aE3H4aoaRE3z3E a]RaP!aORJR@4acaE A3{aw2aVR~3F3C4F3U!F3v3E {a\aSamaWa[RA4aTaL!aRa`aa!R3aV!E |3ag!E Uk'}_fh-^NTl jz ~yy ^Jwn!Aeoe"~X zKL^F G!V e X|t }#p {.@ etP X,RD XZYV  o l~ S%O  ^ v] a&l XR\z `& V b.c NQEs Zlx C#d T.r E,@ xP i$ ` k Lm "{ F!K F#[ udi yM .\ u!j o/y _I n BW Z" Y of &gt ?gB P M/ ^ F1j ]0 z )G s W @1g (v ^VE y3[ J , k v x !E  A' a p&n |.| |-K U'Z ([)h gv gD k" S R&` \n _0 ~ _#K Y%Y XNNg L2u B C >P i2 _ /[)l K4z K4H I3V Aad /x(E KS H(a |$o z"} K f3L V Z s g +gt k" B ON r \ j i R! v C \` y _Fs 8y b K g[ mi Pfw i ] h'j m x OM)E F S Z&b -~&p ! N ~ /M*K )F,Y : lh w$v N E jWR N i x v /r(C CR k b _o e~ cM f3] A-k ]{ ~ I gfV ar| I*n | APX d-h XcOw eF gT G b `0 o j | a,I H,X ^ D /_ Q N_ Y,m ~ { ) N H /U*U gc gq `"  AI3L gZ M h D-u zC /M  R v g_ yf3m ^{ R,J m"X w3 f Q,s <\^B Q1` JhEn Ks iA z2 Q S^^ j1| OSJ Js]] d0 z u3 G }% T O!a (h! o O1| fJ ngZ w3 h Yiu R ^ ~-m I3} x# K UO&CX l[ g i P v \2 C 3gP s^ pO. n 7D{ j! I gV p#d Ns OC)A V O W\ `ks u.^ U[ l n#G y U u3 b g" o g | m0 I |!V }d  t w3 B k yO N ] p3 j v D-w e1 E MR |!p d+~ (D4 L xY Y& g xs B.A u O s \ [3i =U! w s D N4DR U'V Nd s L3 r .  wK k NY O! g K4 t : NA gO R! ] L3 j )N w ]k D  k Q A N ^ D-k \"y D-G  G U &r3c Q q m~ 7e L /b  Y /i) f ?g s k @ e0 M s Z ^gg \0 u dA |&O I^  b! m rz ZH N W ! p3 d =I3 q g} d3 K J. X Ce$ e n q _p3 @ wM  j F z k OK O.Y =O! g h-t c B K L3O  G  ] tn~j w! h w3 u V'B ~ P X! ] gj I3x D2 F b1 S X#_ p/m 5 b! { >RH jN V dN c l p P  } N2 J aSW R1j Bx P!G f0U kc /y(t m B m O /d  \ f'i \x U H .O. U `! b P& o hR| sK%N T'\ V# j R+w ]% G e T +v3a `  o r | e I Ra$ U j a G&m R { op  H  U fb p(  {u( L x(Y ug  h%u O C E$P _N ^ t k  x 5gE A"S r& b O- n D# { hBH \"V c d w3 p N | v OI NW E4 e Or M4 @ /k M a. ] /T*i w3 w M*C F G  Q j ^ q k v x J" E x R  z _ gl T z g0 G b[. T ~a s( q Q3} K-K v @(Z i0 h ] n& u Y A D- N r [ G3h Qx3 v /K C BQ  J3_ 5r3m B[{ I3V f'd b! s ON@ /] N H3n Es#| T'J p X J. f gs %A Lw3 O [![ k j ~%w T*E ~0 T pXa bX.y _G  `%U ^ c gp P ~ y% K XB.X ]`%f P- t X/A U# O |B. \ 3 N i ?{* v _C ?r  Q  E' ^ ik M*z h. H d S U d,h Xw gE X S [1` xn IN | [1 I N N V l0 c c p b0 } E4 J Y n& V J c V p ^' } g5VJ k ` A m 7z jw3 V ^ b Mo D- ~ m K  u3 X Fw3 d [# p w3 } R1 I < D- V L%c %|r _'n G g | +|I n% E k ^ R E _ q o n. | ~I / g e s |&@ v-O fI3] p I3 l Fy @G } U v b Q o O| |I*J D- X dO! e aw3 r e ~ LgK _ Y @f U  t m A . {& N j0 [ n0 h Y q& u XC. B OvO /I ] ] f )J3s SDA A p3 E J%R D- ` P,m L{ n' Y i( e ^S)q L) @ {3L N Z nT g K) t @# A o0 N T2 [ *#h J. K g X J) e fc)r OD)B /r P |0 \ w  i c. v X' C -UP N ^ l' k k' x p E G' R `b, _  l RY$y I' I Ut2CV B, Y +J3f +N t F& A _.N W/] `k sn y p$ F o$ S n$ ` b" m l$ z m G h$ T Z a R^$m Oh$ ~ h K gX /@  f d) s r @ p!M UZ\ OZ v n]+ B nk O D- \ Yi k$ x q E K4R F" ` e m h z q#G s  V M!c y0 q c2~ J$L X.p O1 ~ G K Q1 X S# e |"r Y. C ' X P _ ] ' e k w3 x J D H.Q r _ bm l O|(y 8r3G OzU Oe c gp u$ ~ {0 K P% X Xyde d[  I c V m# b Oz(o Ox} y K dX {w3 g N s t @ mw3 M eY (G0g ]h%u e C q/P {!` w3 o K N | b- I m gV E}%d w3 r B" cN { m c z R`$F F T c1 b k0 o 0E | F2 H E2 U |Tb Gv nX S tw3 _ q0 l L, y QBF SRT h1 f a0 s V@ C. N x" Z N g ^0 t }3 A X$N ~,\ lH <r* W |&d ?gs ]m A O! N BE4 [ p h `'v 5 Q D M Q &] z0 z w3 G J. S \&` ^o gM Y L3[ /[ i ]Z. w ~ C /c  P /A  ] g j O! w m D #w3 Q N ] D- j 7lw e,F W!T /g)b i( p G3| `f3J _+X K f N- s x@ N' N W'[ Y p& i kW! v s0 C kD-P [ M& ^  Nj }% x ?u  E ?A+ R m ^ K/k y 'V }0 s o# @ mM _ [ [  i A' v w B XkZO ]' i w% v w0 B Q2 O s\ pgk { y v X# F }1R O' ` w3 l dp3 x Y" E z% R ^O. _ Z"l a" { A H }Y, U oe b \' o  w% | H/I lW ov f Ps H3A  B' O ^ \ {3i L" w =p D is! R v _ J l B, y r E |  R p._ Z% n E { RsH B# { R/ G G xT K b y  o = O!| ~ J e Y G.f c't LB h P  l% ] e j _'+py O,i M' w cf"D I' S |e _  `%n iC| @   P*L J. [ | h wu c" C h P Q" ] R" j U! w g C X]]P w3 m /e y H*H S" V |H*c y q q ~ }D J |&W AK4 f A J%s e L& A Y O M l1Z Wx h zgv sD CR /m  ` lm T { C2 G { T B2 ` wNm J { i, H /s U h, b /[go h0 V Y,c Y/ q i"} ["K B! Y ? e f Nr , E4 @ /l L g\ T" j  H(w v" E /L  R M _ x0 l jy A.G pU I3c iq Dt y s w3 @ sM v.[ \'%pk _" [ d1 h k Yu /yC z R y _ w3 l w.y /C  I /a  V   c H3 p <p1 } <M J gW t. e T r nW ~ c0 K n' X k S e /\) r O! x M n Z nV g _ t Ee#A cO IE4] ~k P# | @+I 0RW VEi On {# | X( I Q+ U UF'Cb 7ye [m s /C @ [&M _ [ g h <z* u f/A e#O e] N { ^/H y'V ]d ]&B WU Vc g. A /j N I/ ^ jk _/ I ?t  V h@$ c /T p +G+ ~ jV$K h{# Y <q* f jg s ?|* @ ^T, M M$Z /W w mE x S sl% ` o& m Pg$z O$ H if! U iI-b iF-q k, @ X" M g Z f3g dR$ u v/ B /~)O j] Iw3 q c  ~ K K _'[ jd$i jMw jcE V1 U GE4a Gw3 o /]) | DI w3 W Cd x2 r x CM sO. [ g1 h ?X# u SB CP W&^ {# o @$ | jI KY sh i Xv Z0 E [0 R  g_ p, m ez g, H U ] s U% @ <q1 M >M Z Gf t0 t u0 A }N v] At1 l As1 x eE Ar1 a Bw3 n M{bz cd"\ gk U$ y { F P R P_ w& m c}z dNI CH(W O! e mx,r V) @ 5cM y! [ b h zP u D B g O (L0 \ 7w3h Ev (K0 D I.Q N1 _ (H0l k" z R_$F ? T xa ? o Xp| bFl ]y r o%  gL V Z 7_&g BVPv P" F [' S w` O" o vO|| gcx x% [ a' h z  t NA E  Q l! ^ i' k g w g'D k  R _+ _ N" l P(y x gG K" U H& b G Q# o 7c& | y H W.U Ugc  H" q nd)~ 7b&L aK, Z ao' g e- t G.A ^3 O as \ aM, j 7z w aJ, D m' Q ^ ] e j >mw {3 E M R L' _ Q@$ l Q{# y aI,F ag T K' a Zs# n G3{ b&I acW G{3 g )xt u I k e V q(c X q o(} f) K yX H3f G3t El#B Es P m, ] P j ECw `# E ee.R b#@ M-P e _  h%l  fz e H  l% U  e% b Q/ n 7H3{ j,I ogW e e S r S  nU L h3 Y y# e l2 r o( r e M _Z G3k ) O y Y F Q S g$` N n @$ { O! H ad$U X" c x3p j% ~ WqK )K4 | V& I w3 V q$ b | Q o k% { m% H ^1U A1d T E4 r a*  U! L e X b*e T w3 s u2  DL : n Z [ g zu `3 E O R H(_ x m Wz < { H ^nW U0/E % D- t dA dO x3] C1k P } O* J Q/ W O d Lq p)  RL k a[ G y'i q(w _1E z!T dlc <s* O Y w3 \ qh N v Q/ C oQP R a s n ` { -{ H w T t a P n <o*{ E4 I k n V [c $O! q O! ~ rK /B*j R x ^&E/|)U/B  ds' KLqg}}%KO! Y Jf<v*uk1 E e& RG*_G$m/ |gI_* Wc cgoAkg}M NdF ry gLY/;DZGF+^ t, l g% y c  FO!Sy aG n^* {P+ GH3T<x*bExrc@ g Nf [s h= Put C F P<w*]m mr. z f% GDTR6dG CZID+ hG luG `C x& Q} ^| k V$xe/ FIF+S. }& aqmIO!}. |& Kc<fkX;C-@ `H3l d$ z MGcU Ucpx' |& U' {& b }& o |& { {& H @ U E b C'oGD+ }GO!Jl Xgexs<p*ALO! Oj\<y*z ~ I?H+ V H' bCoc- }G3J b! Xee@sH3Ad>OPMFr[L@MS. Mv%ZlVfha3 NL3 [ x&h gv-Df-Sa+ b@!6oueXD. tm @[2 MXA.ZcfJhrr K Pb$ ] Q' iF. v o# C @% Ptf]y C!Q* PA ]NHjxrM}@\f3}@!*K.gug C|^P/V n v%|o3 Ka/ W~cN/ q^2 ~cfeKW p7G3|wC4Jjx,X&O* fdsT0AgOOC" ]WT, i7X u|J*BDPO~( ^OB) k}gxW F Z' R g _Allk | XO! e Y' rK4 `, LK4 YN* fg sld@@"dK* sg @D MU! ZI3 gw3 sJ*@|K* NE4 Z K gcqt G3D H3RO! `?t+m S' {A.HOWv[JWS5_2p5m~v L\ Yg f~  sg @f3Mt" [k jh vo DM# QG3^ol<~  ziFv0 TH3aG3o e' }i J|&WgfW W[t j OI% \Z/ ia1v: j EB1 Rn- _ O! kn, x I DO! Q {%^tn m @a1M] \h) i O! v c CS  Pne ]T jq wg Fa1S k. bL# nS({x.c Oq~  k Ko' X L3 er H3r L3 @r G3Mi1 [o' g gtx N3 Bx f3OW"]z/my/|]! KV" X I eV/ rP  }%Lm E4 Z*W g|/sh( C@c PK# \\ iyun Cn' OQ n [g gD0 tS/AG O!OZ]G3ku, y|FO! T!aH3pC" ~{$ JN r3 Wp3 dOqs,mAMj NW [ilhi`-xG/ HV.TE"diq!uimEg ULbnZ+Y/ N]$!sZI Mn\+YQ# g ntf B)G,O W ]{ iaL, ua} B{mOag( |an' Ho' U1 { bim!nP~ i%NW\VkB {@2 HA2 U]i%bB pt! }D Iq V Q c<p|@A#Nr" ]: h ih" vC" Ch&O J uf"B mQYo_$ Nm [cfhe N I4 [ghz1v^"I5RWw3 fn sL/ @&b MOj,Z<RFG3TZ}%bZCpj$ ~\% K5 U" Xh&dH  rt% xMy[O/ i5 ~ v0|&CH3RG3`.|&n},}| KgXd2f E4 uO! B[OvO&^s DnO!Q X"_ nmoO! {B%HR2 Wn' dY-qPmrlH  ^)p3 jl" vng k HPT|bCoT1n$B&|W3 J W#W$I&e!_t Y# BsA% OaU! \aiiJhRP`sH% nsm {8o HG{ Ue b i% o M|R Y# JN Z# WMdg2 B k OaO![f2 iLvk SU g_ gm_U!{8i ICU7{ r$J& dKrhWO! E_Rq `HO3 m$K& z B0GCU_c I# q/x" ~/X/KdYcg; k uC AC Ng \" [}s4hg z.\n K& j: k wJO!CIQU3 oJU!|`AJh+ K#NX t g]  t^  A@ N#i# [n( gk! tn AxN w ]#_kt( yn F#q2 S#g#`C&nk# TL a!Nn}Q[z X# yz W#E Z# Sb' `| ljxv G~ X# Tn' ` W m~ Y#y[ Q& G J! T }2 aOmD{ L,MYP2 gF fs@{ Y E4 fO2 sO!@'p N W#\_Gj!w qb' eK H Zd' gx3 tj' A@}3 N8{ Zn' go' t_'AS2 O^' [n' hyto' RG>_3 { ]n2 i@ v^#HP2 WV2 c!q2 pU2 }MJI! XOem sx @H3 MC! ZG3 gO2 tS! AJ!NO!o8k } k JP2 VR bZ2oqD }Y2JX2XK! f{ s_ @N MH3 ZC=gG3 d!g# q y ~ Y,K xY mg m uW %AP fP r\! 1K ]# i i% v MCE4 QRd! ]L j G3w H3E P Sr! `Mvk e a p0 m 0zsH[ V ]# c B0p p0 ~H3 K 0WG3 ei"rH3 TG3 `H3 mG3 y ]# FlS~ a_'nN|b2 K7o WFdZra2 Pg# ] J j ]w @E lS jb f pq2 }_JXO@X@&-go T e a|E4 nE4 {NG} V J# cn pW1 }n IxV W dn pf}S&\Z1 u/W/An O/Q/ \D irLItUn rU+]1 Tn ajnn |iI5W/g`1 un A5X/N> e \5Q/ hr3 u5x" AD"NiK \X"ie#wie3 Es R__e m3gzHHn J& VP bIo| } J~ Wm d] qe ~N J"yWle d+t} Be Oy\7k jn B&vH# DnWQ{hNFr3 UNbn I&q'r3 @ K L_ YNf6B u0D B_ OGr"\~/~\1L_ [NhCw EZ d_DYRsR`r0 rx b+ MO Y?fZ EMQl_d mr P zD1G[ 'Uwe |O HM Ue byod }{ J[# W W.d L" r ["I M W.Zr3 h L" tw MA ["N d+\R j|&wNFO T I aY nz- z J Ga1T|&c FrTD @ @Da1R C aRon C ]l( jP wQDN4DRe V_2 be o O |0a1I ~ XE ep rM }}L o I q VX cUCTQ l_Qn } |K IP VLcNqe 9o1 K9E  W jdL r/E ~KJk XEu#ePsg{A-o# |t Ik& VI ce pD|q J\ WH3dPry@~  N G3[\ im vZBC H3QU _ P lZxyl GTx SH3`P nTm {d H{ TTaZoBW }_i]JN( gRrBS@RS P av ng {jHY! Wv d l,qWE@q2 ERRJ4 `>m ljxg Gn' Tq2 `A7mB"q/dn2 So' `M2 mm yx FRS k a cn y |J4 H>y TB e a^' mYzJ I]V@dC rC t L~ Yo fq s} @lMj\g jd' wq.D]re Od[%kyPq2 ^^7kJ4 bA nj' {s Hx3 Uo' bJ1 ojP|\#LPX\C,t2B ` y2mK,{%g^XL E4d N! r __'MWU![7Pi z wbxCr3 QD]O}( ktd)xO! FL*SM*am|o(I0}c,K+I3Y/e hby tn)RA"d$ S"M`"V$n"g |"cIW. Ye fL" re ["LyZZh+g$v)w3 D[  QE4 ]R$ jP vX"C[  QC ^E4 kG&x d$ FISB rv3  V$LcZ g w cDW. TL" a["ne |e H MT T& bG& nG.{E4 IX"V[  dR$ q[  }m*JE4 Xv3 ejy,rD @e Mc{,Z5,h(J0vgD}gR\W`JOj-}Fjte) ygEg*SF$aG&ph*~U! LR[$Xgfc$tc$B CPg#^dDlcu z m G gTRZ$b5yrID@c|,Ng#\{jgx,\. FxRC`C0 nmz^IWH/@0_/A0 n D"{ D* Iy &tV{/J I( XZud G/ Y H(e G/ s^ Y/ ZFfAEDdj h LxY G/ v`!dBwf|C"`~ B |"NC e" ]L3 j Y/ w NCM Q@!]E ~F KH Xs eG rb/ J+ Ks" Xu" ew3q c# g K~" XA jem Om/ [}" h{" um B~" Nm/ [D  h B% unS Bg O f& \piiM4HiJ- Wit, diG-qiN@ i Osg\\NcjB}+MBD, [d/ hi uiBoP b! ^ _ k ^ x/h EJzqQ/g B/h Q/i `-w o-x }-p  KY,X ef/h) uy BD Og\W jgwT ED RW _ gk F4 ygEgSF4 agmW {D GW Tg`W ny )z W cgos U! }D I y VU! c x'onZ}K B4 K*N3X*f3f&xt&m B*gOh @]&O]tyk)U! d&pq#b! #S' K#YX g g`t d& OX F4 \\ hV( uI3BG. Pu ] p% jQ E4 wmDxRm `[(l^ zr3 GY,TR$ br3 o[  {E4 HX"UV3c~ qG.}~ K[  WU! dR$ pU! }p3 IV3VedG.sd$AMOV$]g kcxE4 HV3TG.b2 pW }0 d' IM W V0 b' b0 _'oL- }V E4 J e VE4 c`Ho0  w}sKCa-NH3 \G3 i0 n' v s2 C0 j' PW ]0 x3 iW vD BU! O0 G3 [U! h0 H3 t= U! A0 o' M7 U! Z F. f8 U! s9 U! aEKG UPBeZ-t]-Dk^' R%_kP!|kH3 J+W# _' t}9A" P! zD GgT* e b" n' oge |OIgW" o' eg- rG.% Z M]x\U jO w{-D' U! SKd_ W C] O1I  ^b,ky-W E4 e/ur]*gfw~!Sq2c\*q E4 A[*N e#^ C* lN yw/F u T E* ` ClpU! znr3 Fn_ Rn^+ _b/ ls" y{" F}" S{ ` T m F" zg Gf3T q% b)Zo` } g& J| W Wi_!cic r].RA| IS^ ~ \ c% h[Gu b% |J/ I' & V' }& cy. ox. |H I U" V[/ cz 2o[  a E& n S {n Hw U G' b W odu| U q Y ~ { K Z W U& d`Rq I CI%PK3 ^}k9 K {9 K H A T9 b+ a9 [+n) B, | ] HfUf"cd"qm}Mq[qivxd. F f S u%` q o r% |f.IB/W/n e { n s {e. H wU | c } p/f |W\! L} X/U( e/P p/O /j)N { ] s jV% w { D s Qg^X%lgz/A) H ] U q' br$ o X |Z IUr3 Vm B( cImoIE+ }IC+JGmXGE+ fIB+s<t*CZ ~ RGB+^F%ne}N% X~2e@ s^S. @mP! Mm^' ZmH3 gmG3 toUAOpVF"k^,zk Z H^*Uv)fRRtN*/MkFxMjqnj[m2 EBR_q_( LR$ Yh# fCI( s ~+ s K4O!Yg( gotXfZP. _ j\w"Siz"aQ# qii! } { J o W s d x q u ~ r Kn`XOg f:F4 s hj/ NM I  [C hC uG ByOl]Z l\ XByYZ{{. Nvqu/ E ["R L" ` W.mX S{S3 Ni`!ZP/ i R$ v{ Ba?8O' b! G & T R$ a E4 m cz g J V$W Me d$ sh/ @ R' M/Q Z/ziY w}D0 c# Sd"_| S n y { m H^% TTaz# peD }d }JZ h'GL<0Ug-E' F r7g ~' H3K OYK M(gi aui ^Ci ]Qi [ _`lx-@ WN^ ` \kP' hkG3 u" ^' BgpO_  @.Ly &Y[" ^' tI d! @y &oMy |f,IX3 X b! eU rF.  d% L5 M Y5 s f5 K sB  , ~ L, wY, U" h QtD C p' P[% ] gjY*x I( HT% T@% ac/ng~^ Lv  YL fp sI @M3 MA! Zh2 gp t\ AO# N[ [e2 hy u t3 At3 MF Z{ gI t3 tg@r _^lS Gi=TVoQG# @{M\HT# WA'dj#K{"Y]0{U4kX{24V_M1ut3 CG1 O_%\JAHPf"_qAHH^{24Rcfj2 xk2 Ek w3 R ^ _t# kXtRwh M0I#y[Jx! [\-hK t3 vEBR1RMNqh W [BghvV-Dj R]2 aP$nQ$|Jx1X@ fG sUPU- ^YsIkK F !t_, Uy+ b~5o^) dJ  q@~f#ZW h/ euv1 DjQu1{F  IVXV{( nd# {Q- Hn1Up 0cn m ANLNfZt$ iv$ vx$Co R`_X1n}$ |~$ I@"VtIxp@Anc AC"N{p gC%Md [D%hvvE% DM% Q D ]afj^cPK1s_% AE"NvRp){24F0B)A H } h{24b uj 'W(\m~(c mk(_by(f D [(l5h(g%](N&RB(l ET( [, Y(C1 f( cs( g C(F{/P( xr(~ :q(h M0k()A[({by( p3 [( r3 h()Ft(L1R(R#`(nn(H1|(H o>J(E1H(I1 V()ec(W"K-A( Hn( v&|()GIJ(C-S(X a(G"n(W P(U t3 ](E-i( t3 w(8 t3 C( t3 O(K\(H ow{(L%r( t3 W(P%d(RI( xIh(Sq(T"C-L(V5y(: t n(T{(X" eW(L #|( e% _(]l( C |(Q I(~ tV(nOyJ(U C( $P( t3 O)V[) t3 z) f F)d S) o R) |_) t3m)W{)p t3 W)B-c) t3q)`2)k t M)n]Z)nyx) e U)nA b)nK@) e ^) |j) } x) G4 E)nJQ)nDo)w# M)nhZ) s+ w)R C)}3 P)nR \)QNy)wc G)h %Nj)k +$x) t3 \)|# h)~#u)A$F) t3 W) t3 c)n~o)n`+})nNK)B$Y)nbg)nau)C$C)nf+R)G O0`){24w"P)LxG)@!F)YE)Z"`)DB)H$R)^b)kfN})oUK)v`)I$n)A|)1t3 J)hfV)h %r|)lgn)l U)}!d)ct)f4C)G" w)U1CC)~F)w1ET)y1EY-~1E^1{1Ec3{24dh;S (L<tt<| S<b=_<eD\<c*`<m1RJ<B<\<eVX<{24Hfn<G OvW%h>G(v>|5^>HBS>1["U>v qc>nHT> M" \>p0h>u0X>W. H> goU>L" D>["Q> |K_>G.j>(G. x>(W.E> t3 S>EnF`> gf>)o  t> |& T>c m a><[- m>l z>QfX>/~> r[m> a1 H>byOU>$d> T WH> N _> D- l> O y>c_W>=N v>bHC>L,K>b7w>x^n> t3 L> nXX>Rt3 p> ve|> Z, a> t3 n> XHz> D-B>$P>t $t>[D- X>`ce> t3H> t3 V>YTc>`t3 w>TYD> Jc]> t3 @>i]aL>xQ1m> M ^> ek>uZy>x S>P-q>]JX^>F" pv> /f> t3 U>)XGa>Blh>)w T> t3r>:y @>u jM> [+w> b+ E>)cR> t3 p> a^}>V$[>bM>w3 L>t3 X>d3e> d$X>uf>:xC>:Y,Q> q 2_>l!Q> k r>m!~> k _> $Sk>n~>`R\> V$n>] M{|> U `w? b! W? t3 d? e \p?v'L? Ms? X, A?q%M? wB r? t3 t? X"@? 9LN?_%Z?s&? ee?t!s?$ m T?) m `?| l?+ m J? m V? nJc? U, m?@z? V, X?~ d? fB? t3 P? sa]? x~? CL?lgZ? L4 A?)GM?){ k? QNI?tW?3 L4 u?^^A? e _?s%l?A %Q?5 t3 v? V|B?C %~?G t3c?`q?MGN?)XU?4 W s?B e @? jM?t3 j?DBw?:m y?:mE? dKS?)wr^?y P? b}]?HZ?y!y?OZ?E w?IT?{s? bNP?J^?J?}?Y,|?M t3 h? D~t? t3 r?[S?a r R? Fm_?Y t3 L?\Y? t3 v?I C?e m a?e y n?a{?[YY?L r? W O?] t3 k?d.x?uhf? X YN?g t3 g? mGs?)A, z? t3 G?aN,S?r p a?$No? Z k}?f%h?FdM?"r% k?"q w?"f D?~,Q? I }?k+$J?R%n? J S?7t3 `? }%m?m i{? C Z?)C,g?)D x? t E?Z R? Un_?7l M? t3 Z?)[f? ~ t?XGA?FaH?n{24S4i@ e |@)d) I@n^mV@mYC@W \@ t3 h@ C&t@ D& D@UQ@ H p@ q }@ I J@VDeW@m |@xI@{24f*W@}@b "[@f \}@ t3 Y@t"e@%g G@ @, T@%n' a@%p( n@nNG{@u GB@ g I@n| DV@ V$Z@ Mh@ t3 v@u!C@Xd@I% C@f P@l ]@W/j@ t3 x@ w+ E@t !R@ C#s@ g A@ V$N@ j( \@ t3 i@vu@ g S@ V$`@ Mn@ d$|@ t3 J@\( V@ ec@ o' q@np ~@ s+ [@ g g@ V$t@ MB@ d$ P@]( ]@^( j@`( w@a( D@nwQ@c(n@d( ~@f( K@` X@sCu@nfS@W 2p@t3 bAbb oAt3QAvm _Avm lA G*yA t3 GAg+SAF*~A ^ LAP LXAnN vAnK TA t3 rAf ~AnO KA5 iAnG vA3 TAs)aAt) oA t3 |Au) HAnH UAw)sAnUAAy)OAz)]A{) kA~xAd FAlTA[W 7!cA) DAy QAZ ^Av2 kAr2 xAncDAVLoRAy &JAAvxKAvy YAyfA9{24~CAwm AAwxNA t3\A]jAg^EAwy cAt3 pAm |At3IAIRUWAglAT$ zADGAP$Zc UAd xA/t3 EAreRAY2wAS$ iAovAe TAt`Ae ~AYJA { hALNtA3m BA3ONAk +$\A5t3 @AP fsMAt3 @A`* MA@!>ZAsXAt3 uAX*BAW*RPA{24obAT+QDH4|Dd_pDv!OD_(^DY,FDb6TD-%JDp.oDg ]Dd(jDJ$ RDU._DZxXD>Y,fDG9tD[t3 mDphyDC"]aD'C DHMLD{KYDXVdDF9zDt3sD. O ADw+NDe yDR (FDynDz|mDmiDbt3wDo ^!EDxfDY,tDy BDeeODU mDt3 KDZ. XDFdDrW BD t3 ODq e\DzU zD}'GD }& UDtaD }& DAKDe iDgvDYDDt3 RDM^De {DgHDYVDt3 dDX/ pDQ\}DL,YDi EDt3 RD`_D\t3 mDFyDZ9WDQX/ PDQi ]D.t3jDffxDQ`^Do!lD}(ME[ W uEx AEs)NEL 4wEm kEt3xEOFEQrTEU0sE{24jQEMm 5{KJ'RpKc!BKN YPKe!iKp yKL "FK t3 hKDXuKw" MKr ZKE# gKa# tKv#AKXt3 PKxh(]KD$ EKhM0RKo ^!BKO ,cK{%OKq etKt3 RKD ^KQ%kKW yKO%FK {24\TKR- pPX- }P_-JP|ZPj-iPp xPm- EPJ RPo- _Pp-lPq-|Pr-JPs-YPt- gPu-tPw-BPF t3 PPz]PakPH-RyP{24c KPbnQn |QZ3IQT3WQaeQK,zQP3fQY3 uQ R3 BQ{24x`OQe}GQvMDQZ)QQL 6aQCWQyHZQGIbQOkQK(zQJ?bQ$NaQhM0oQp _Qt3 mQkKyQA !DQw=eQ})bQu*KQeFuQt3 {QqDGQfFKRC (QRu]yRb*.VR_%DR"Z iRt3 vRQ8BR"lzR"e IR@ |VRh%8RRmhJRRrRr  ORvoR^5LR:XARgYRx&gRt3 uRy8ARbyRR%HRxYR t3 jRX^wRG L3 UR t3 bR~?nRtmRs%|RdMR~jRt3 {R|>HRY FRNdWRt3{RX IRz8ZRt3RRA&aRz;rRUNmRZ {RwAHRTW5IRW ~RluJRN>RR9}Rk+6vRxh9lROweR&t3 \Rx5hRY }!]RK t3 ~RY H(KR*t3 YR_5eR0t3 ZRk5fR5t3 [RegR d 2ERvOwR9e URBbR<{24n_tRY<;YbS \ 7{S| rS[S@PSBaST rS:gS<TEMS^  RS<cX_S a $wSI [S@ hSW uS|2 BS@m OSN  \S@giSo  wSZ* DSL QS W_^Sv }SX JSY WSJD-dSlrSJt3 AS[  MSN+ZS`<pzjS} dS}%tS@! BSc+ OSG \Sg+ iSg<HvSe+ ~SD! KSq<~oXSegGSd$ USl<VVbSE! xSy ESL RSH! _S<_lSk~* JS<`WSp}* uS<n*BSrg RS<u* _S{24Y%lSWPESKHUSx8]S^! USxJ aSxI ~S]+xW[S~W+ rS~G S~l% MSMYS[+ygSX DS}- dS}. qS m ~S~. KS Y,XS xfSy tSY,ASxOSm]Sm kSS!wSr3 XSO! eSt3 rSR~Sy \SXf6hSg ^S]0kSO! [S]" hSK+uSL+DSM+SSO+ aSd)nSI+R|Sn{24xNTnv'FTnaVT t3 dTnbpTnH~Tn}MTn|\TnfjTnq3yTngGT/{24iUT/g F~W/JDDWwMHWj"UWn"cWo" qWp" ~Wb]gKWq"rWk/@Wy" NWo [W\3gW/`PuWgEWt3 SWO0 _WN# lWs3yWt3 GW/uDSWCC0WWF/ GW}L$SWp;WwWW$ NWi/]e[Wf$ @We  MW{ ZWa% gWe tWb]EAWK FWV SWt3 `W/rGlWp;UsWb]\HWl& dWm& qWt3 ~W/q@JW!JWISkWpjC~Ws& AWg7NWgEWD SWb]&`WJiFWkoWw ,LWt3 xW/pDW!CWpjRdWgKvW}MAWx 1NWb]&WF(eWC%MW1G.rWt3 @W/m DLWgjPWb]&zWl `W m @Wt& LWu& YW1L" fWt3 sWd /?W"~WgF`Wy& fWb]&sW S {YWCVTW1W.jWt3 xW M" DWz&PWg_W {@|Wx|WmJWm XW/vWdW@' {WD' HWg UWQ bWN0 oWM0 |Wt3 IW/FAVWp!WW@/!pfWe/wTVWRt3 jWmvW/pqUWv3 FWKSWt3 rWM%~Wt3 cWP"oW!t3 QW/qA]WR^W't3 }WTIW(L" hW,t3 uW/BOAW g PW/CF]WVcWj BW/Er`WS^RWp/jDpWXtW/fGSW+gZWYhW[GW1z- fW \'rW t3@W9ONWV/Lj\W]FX^%eX`(JXp0rXFPX t3 mX}yXn :WXCt3 QX/e| ]Xa"YX5t3 {XDt3 HXbTXcpXGt3 OXdevXcUXftXgOXnX?t3 KXL/qXXeg IXrVX9m sXog @X JMX/BkXo /zX/@)iX/(wX/I) EX/X RX/Y `X/\ nX{24P|XPL[Yi[f FF[n(L[_Lt[g Z@[T&Z[q "@[bt3 b[}n[@UL[c`, a[fn[e L[@LX[hw d[v Xq[j?I[jT7H[x[f j+][gD {[nt3 H[^  T[&}& t[gg@[D N[g[[M i[Cv[ t3 D[C P[B ][w ]j[s j%G[g d[p}& q[Z }[s}& Z[ L3 f[g s[g @[9x M[~}& Z[T`f[l"F[lTDh[f l+l[t3 J[s l%V[W s[W [y @K[T%K[[7 p[t3 P[b@\[f +\[s %z[W W[W c[vKo[f +z[s %X[W u[W A[` M[~k[ YLI[evU[|oK[gz[xH[CV[G3d[H3r[P @[mpM[g }[g J[g W[g d[zq[t3 O[g\[yj[t3 H[gT[g b[0g o[u|[_ Y[t3 v[D C[m P[m\[xj[Dx[N!F[} %g[t3L[\[[s}& x[st3 E[V Q[Q  n[mBN[}& P[t3 ][mi[y F[c|4S[^McG[V'aPj[t3 z[t3 G[D}S[o.P[t3 ~[t"K[t3 m[p+y[t3d[`/ r[Ex[yw[z"S[t3 u[\/ B[]/ O[D-\[lKj[t3 u[m B[~  N[^y[[}.T[t3 B[ngWN[S0e[BU[t3 t[C@[a'}h_[t3 G[bS[Eb[t3~[KQL[J][s k[t3I[\NCW[uZ\t3 x\~D\H%b\ t3 G\L+S\t3 ~\eK\` i\Xu\e S\a$`\e D\z$Q\t3 u\iYA\t3 Z\XtDf\6 m j\t3 v\l;B\ t3 }\PI\Q"e\t3 G\v T\J!}t\t3 q\A'sq }\t3 n\ z\t3 X\' t3 d\PfJq\_%{\c"`\T%B\W"g\8 k I\X"U\Y"w\Z1Y\^(J\ :Gr\_(y\Jt3 a\`+n\ t3 Y\Wt3 f\] Ggs\r Z\`.g\i.u\j.D\l.R\m.`\o. n\q.{\s. I\.V\@/d\A/r\C/@\D/N\E/\\y j\fw\T/E\U/ S\ hF_\"{24P e\"Hu\c"f&S\<J3 y\"K/F\@"!!u\"e V\"f "q\"\ S\= E4`\w&n\Bt3 T\"z+ a\"^-n\H^- |\r#"H\{24Vj\{24G@\Q!RG\V {24L Y\y V &Ee\@V !Rj\P|\_t3 Y\{24gDf\w'b-M]gSz]\TKRM]C"_]RA]Q_]z'/,p]Xg \]at3 i]_Z&v]r+Z&A\]\,"]]}e ]L$"L]ln]wL]FGi]st3p]T t3 ~]bl/ K]bt3 X]] G*d]amN]d k {]K t3 G]D-S]i/ a]{24Z0n]sg]H^HCe^[:h^hrb^z_'T^pt3b^S3p^hM0c^qt3 S^K%NX_^gw^vt3 U^Xtza^t3 [^yt3 h^8t3 t^v`@^|t3 `^r/m^s/ |^n/RI^y{24d [^y\^y@ ]^[  z^n G^w T^G.`^["n^L" |^l) I^{24|V^vOR^yp^C N^e l^v(y^e G^w( T^i{24d-a^Li}E^@i!mB^{24Ro^W, AcL "NcA pc~ }cb*.Jcv, xcz, EcM O RcS- ac@ !~ncjlcT- IcW- Vci- ccl- ocS,|c+Cc|+Jci{Qclacik-pc{24Pc{+Oe`7Vev OpMeD u}e[frex+XeKh_e7I% Gev+Teu+[e{24HbeIO@jeRO@yfUMHf ]DUfh%$YfEx}fVO@ufK2 DgEZPgJ2 jgowgVzEg7f g7W/LgTtZgRNgOI\gXeg\psgI2 cgH2 pg{ W }gQ%IgR "ng]lPgTW5|gW qgD%}gI"^8bga J Zgzazg] G+[gxw Fg7i egW rg b3 ~gkeKg |%pg[ 1@gS%qg[sVg@1IgY/ zgp WFg"]gdSg t3 Rg|H^gp0fgh pDg b tgMF Ag d Ggt3TgPn cgS %Qge '&vgT1\gI7Mg b DgFQgk xngWrBfgOhg ` vg a Cg X&Pg},`g>Lg( t3 Jg\ MVgt3 chxJphw% zh] jFht3 ph{24[?}hx Xht3 eh n! rhn!hk"Mh t3 ohy {hY,HhmVhbdh lChmO'QhwxhcShm nh j& zh F Gh i& Sh g `hL!mhew'NhI" uhD Bh^. OhB \hA ih@ vhi Ch~"Ph%t3 rhP{24o~h{24J mh@!LwhH,Ch{24wQh{24Q HhnYhZghr$uhs$Cht$Qhu$ _h{24wlhc"cicfaEit3 fi4t3 si@!h@iS0chi[ Kk}XkU0 ikUk3CukU]3CxkUi3C{lUj3C~lUn3CAl{24\DlIR|`lg)\lV0El n' LlS*YlDghlDD vlhClR*RQl{24y6clF\mk+6zmMy pmMY,}mMxKmMmYmMm gmh%>smNW qmW'G  }mTW ]mW0im[!W qmo^!QmX0rmZW zmv$A KGm^(|  Rma([srmk(z  emY0 Em|t3 Nme!q/ZmR!BOImy(`!XmD&t>ymeK wmeb+ Dme[+ Qma J ^mH` ~ms(d ^mm i~mTW5]mm{ Rms%y A^m j( _mB&h  lm} Lmp gYmJ RwmF TVmuF um~d.BmvE$ pm {24N}m CKm1Jm{t3 hmp1umg5fmf,[m{24m(GmEmotmQAOcmt3 rmh,~mL!jmd&Kmh$@#qmt3 Tmc)`m`$7Imt3 @me&Lm_$|"rmt3 Tmh( am{24a'mm[$x&Nni tn^$wvAnC,wnu)cnz&Lnt3 rn_ ~nW $N[nhW M0inVYnU1 wn{24cDn{24w"gnga^nk $nt3 cna)onb&Xn`*~n_ hhncIPnw3 YnI3 en'BrnXtnew%Rnkwnq,RTn!{24Wfn{24B1}no)o] !Mo~ nol zoxGoC UoWboH' @oi'Mojtop RobW *<`oOS\o2 oog|ox Joi]AWof1 Xoe1 dou3 qoA1~o }/ Low3 Yot3 forrox/@oH3 Oou{\ox)Wo/{24SBeo/K,xo/t,do+PoL({od !coM*MfDoW joE0 woY,DoxRom`om no/xFzoeN @oP nNp M |pQIpM hprupq~sgp}) ZpFW gpM$&?Dpt3 Cph[ &Opt3 upL!Bpr}cp@/!7`p@*WpA*ep{24Lrsp{24Gwqd IFr~ p Or6rLuurwm jrJ@wrO t wrt3 krM wr~ IDrMrJirl,Frxrrm@rm Nr w3 [rt3 hrM tr~ {Ar:v|r[,rrt3 ^rL,jrt3 Vr`rcrt3 UrN,arg#Mr gpr D ~rO,Krg 9wrgprM ~rDKrm +Yrg3DrgwrD ErQLRrVLd^rr4MBr`rOr~ 4JAr4;Kr4J;Fr\,Art3mr@!L{r.t3 Gr-JcSr],Rvrt3 HrVLBTr|&Vrc ]ferPFKr0t3 QrnRP@]r0M ]ruOUjrr8Irt3 Hs~ 8aTs8us8JQsV|Ljns[,XsAtmDs5E,qsX6i]s],FsZ9rso2ksp2]sCTOsO} Ocsu mrspjm_sBt3 Lsq zYs{24ASs^+RDTvG' Xv~'dvJA( rv'~v5J,MvXHyyvA(rvC( AvOiUNvD(cvRg ,qve N'@]vE(]vOv {kvF(fvG(tvK(CvL(Qv}`vO( pvQ( }vR( Jvq~gWvS( ~vT(KvW(YveOwggvY( NvZ( [vOpMhve( uvAr\Bvgcs^vk( Qve O'B ^vm( `vN) mvO) zvAegGvR) nvW) {vA\cHvI kvY) xvZ) Ev_) Rv`) _va) lvO~ Ryvb) Kvk) Xve -'qevm) Vvq) cvu+&Kpvr) {v5I,HvX|ftvL ZvV* gvS+ tvOuAAvT+ BvO kOvV+ zvX+ GvY+ Tvi+ avj+ nvk+ {vH$IfHv nvl+ {v`NHvm+Vvn+dvS rvOrrvV qve ~vOn=KvD4 Hvg Uvi bv5L,ovXo[wo+JwoRDXwp+\wq+jw{24o0xw? gw?tw?Bw? Pw? ]w?jw?xw?Fw?r+UwOH>dw?{24H bw E. jw K. ww L. DwOXJQw M. [wOb9hw faw N.ow `}w o!Kw g!Yw5F,iwX2Uw P.Gw BWw Q.hwVLCxw R.{wgmJw {24|IwJQaEw|AfwV_gwTLFwWWRw[Wiw\]@w_f ]wX_ZCw h]w fkwm yw-R TEwxYwmdgwmKwk=Yw(r,VwgcBwla\ew(q,AwpjemwwJ_Rx-qxs,^x t3 JxhM0Vx$pFxRz%vxl,[xp GxRy%Ux[7 zx1ZxLHKxb*pSx$KCxhM0NxBC ~xiKx]t3 ixgcvxaBYx(p,[xgRGxZYx(Q,gxgPSxlcx(q,rxgP^xb*Pnx[7D~x5H,BxX*nxhVZXxRr"rxg)Tx(C }xgj)JxO!iNsxC AxB,Nx|*- .zxthxJ/\xFDKxv*-Z.OxS] }xd!A,Zxa`=Fxh4MECxV gHx4$Koxu*-X1zxm kxu owxx 0fxbC6VxB+-?3LxL#cBxh