*D @= ! ,]+,KS/Q= None miniMTL233CoreEngineDeusExSystem MultiSkins LevelValues DXMTL152b1 ExtensionPostBeginPlay TakeDamage RemoteRoleFireMiniMTLSetVisibility OldAugClassAugmentationName smallIcon toReplace replaceToMPConflictSlotmpAugsIcon EnergyRate PlayerPawn ManagerIndexProcessTraceHitAugmentationLocationUserTick TrackWeaponSelectiveSpawnEffectsSetTileColorRGBClientMessagePawn DeusExPlayer GetManagerSetTextColorRGBGetAugLevelValueMesh DrawScale miniMTLCTFGetSkillLevelValueConsoleCommandRobotMover DescriptionExplodeDeactivateActionResetNonCustomizableOptions PlayerClassActivateAction mapIndexMPInfoGetSkinClassIndex RandomPitchIndexesSpawnBloodFromWeapon SkillCostsCRBroadcastMessage ffrtolerance ClientFireArePlayersAlliedAugDeactivateflagMsg NormalFiregetPRIDrawStaticText PreBeginPlayDefSpecPosAndRotFlagSpawnPointProjectileClass flagEventShowNotificationGetWeaponSkillFutzComputeProjectileStart SpectatingWeaponDamageTypeClientSpawnShellCasingIsCBPbCBPDrawNameAndScore MapSpecsSpawnTracerFromWeapon FinishFireFlagSpawnPointsTearGasbHiddenV68Color SpectateSetSkinTimerbCustomizable PoisonGas NetPriorityMMTeamBalancerPlayBeepSound GetPlayerGetVisionTargetStatusSpec AmmoName IsAugActiveatBaseDeusExDecorationIsAllowedFlagAug setMobile withPlayerMMNotifications S_MenuButtonMultiplayerTick GetItemNameNumAugsActive NextPlayer TickAction DrawWindowSoundsUseAmmo NanoVirusSpawnBloodFromProjectile flagTakeHandleDeathNotificationGetSkillLevelAutoTurretGunPlayerWalking flagDrop spawnFlag LoudNoise DistressEMP ButtonNamesCTFRewardTeamAugsUpdateSettingsCTFRewardTeamSkills CTFRewardFlagDisabledAugsRefreshScoreArrayShowServerInfo ComposeTime DrawHeadersFlyingInvokeMenuScreenLocalGetTeamTotalsXSetSpectatedPlayerNamesSkillWeaponValues GetAIVolumeadjustToPlayerSkillEnviroValuesSkillTechValues setCarrierMultiplayerNotifyMsgSkillMedValuesDropDecorationSkillCompValuesSpawnInitialInventoryClassGetNextSpecPlayerSkillSwimValuesNotifyGameStatusNewChangeTeamClientSetTeam AugPrefsGetClassLevelSV_drop flagCapture flagReturn RadiationsetAugsDisabled getCTFGame ProcessTouchbuttonDefaults SetPlayerUpdateAugIconStatusServerConditionalNotifyMsg TraceFire TraceShotactionButtonsSetDefenseAugStatusspawnWeaponClassS_ActionButtonDefaultGetColorScaled WeaponFire AdjustAim DeusExWeaponBuySkillSound DeathMessageNetUpdateFrequencyminiMTLPlayer CL_escapePlayerSwimming ServerTravel AugsWithFlagV17 InitGame InitWindowCompressAccel PlayFiringV18ReplaceMapItem ResetSkinsNewGetEnergyRate ToggleStatus SetSkinsToggleBehindViewProjectileFire PlaySimSound GrantAugs AutoShot TeamDMGameCreateKillerProfileProjectileNames StreakStringRestartPlayerSetClientStartTime CL_captureIdle GetAutoTeamCheckVictoryConditions ChangeOptionGetSkillClassNameByClassCL_dropGetSkillClassNameByIndex AugActivate SwapPlayers SwapPlayerIDToPRI UpdateSkin CL_return PrintToAllPlayerIsClientIsHeatSourceSpecSetPlayerNetSpeed FixInventoryNewGetAugFromStringName SpectateXPlaceUpdateBeltTextCL_takeSV_takeSetSpectatorVariablesAtEndSetSpectatorVariablesActivateAllHUDElements PlaceGrenade DrawLevelCanSpectateEnemyFindAugmentationSetVisionAugStatus AmmoNamesFixNameSetTargetingAugStatus Deactivate PoisonEffectSecurityCameraPlaySelectiveFiringPlayFiringSoundActivateAugByKeySpawnShellCasingClientSpawnTracerFromWeapon AutoTurretSkillDemolitionValuesPlayerIsListenClientrefreshItemName ParseOptionAddAugmentationDisplayGetTeamNameForScoreboard GetTeamList WeaponRifleGetWinningPlayer ProcessMoveAnimEnd EndState HUD_drawText Destroyed FormatStringGetWeaponName GetNextMapCBPmpHitDamage CancelScreenResetCrosshair KillShadowModifyNetParam FireTooFastGetNumberOfPlayers LoadNextMapSortTeamScores OpenMenu SpeedFixSendServerTimeDeusExCarcass IncLevelClearAugmentationDisplay CreateShadowPlayTakeHitSoundGetInfo MOTDTextSetServerLoad ClientFlashSpawnFleshFragmentsClientPingFuncServerPingFuncAddAug NewAddIcon SimUseAmmoNewFindAugWindowByKeyAttemptBuySkill2GenerateTotalHealthIgnoreDefaultSkinGetTargetReticleColor2GetSkinForTeamPlayerGetSkinForDMPlayer SpawnEffects SpawnBlood2 SpawnSparkDrawNotificationTextDrawRemoteInventoryDrawVisionAugmentationSpecDrawRemotePlayerSkillsGetSkinDrawPlayerNameGetDisplayNameNameAllViewedPlayersBump distanceCost BeginState initFlagsdrawHUDHUD_CTF_drawMyFlagHUD_CTF_drawHQHUD_CTF_drawFlag FacingActorHUD_CTF_drawHQTextureHUD_CTF_drawCarrierTextureHUD_CTF_drawMiniFlagTextureHUD_CTF_drawFlagTexturecustomizeFlagSetRespawnTimePoison SetMOTDTextSetIconFlamed _generateUID GetTopWindowPrintToPlayer BalanceTeams MessageBox CheckBalanceGetSpectatorStartPoint MessageTime StaticTick HalonGas AugToggleLogin PreLogin PostLogin PopWindowSetButtonText SetCrosshairDeactivateCTFAugs GetTeamSkinsReplacerClassScoreBoardInfoNewGivePlayerAugmentation!GetAugLevelValueWithIgnoredStateBurnedDeusExProjectileServerLagoMeter SkillUseIsPurchasePossibleGetSkillGroupByClassSkillPointsAddHUDType CBPmpDamageRefreshAugDisplay IsHUDVisibleClientSpawnTurretEffectsGetWallMaterial2ClientSpawnSparkSparkPlayHitSoundClientSpawnFleshFragmentsShowVictoryConditions"ClientSpawnSniperTracerFromWeaponDisconnectPlayerClientSpawnBloodFromProjectileClientSpawnBloodFromWeaponCreateColorThemeManagerSpawnSniperTracerFromWeaponbOnlyOwnerSee PlayerMoveSetupAbilities RefreshKeyRefreshSystemsAltFireUpdateAnimRateAddDamageDisplayDied PlayerHasWonShowDMScoreboard LightRadiusToggleFreeModeShowTeamDMScoreboardLightSaturationDrawLagometerSV_CountEnemiesProcessServerTravelWillDisplaySkillMessageForeverLogout CreateSkillsMultiplayerTickSpecFixElectronicDevicesDrawRemotePlayersAugsDrawRemotePlayersAugIcon bEnabledCreateAugmentations SV_returnFindNearestProjectileclientStopFiringReplicateMoveSetSpectatorStartPointClientUpdatePositionDyingSetCrosshairColor ChangeTeam logSoundFindAugWindowByKeyAddLagometerValue SetKeyNum ResetSkills flagEscapeLightBrightness ServerMove SV_captureGetSkillInfoFromProjGetMPHitLocationMultiplayerDeathMsgCTF AmINewPlayerServerReportNewPlayerClientSetLocation InitMMFixes ContinueMsgClearLagometer SkillMessage DrawHUDIconHandlePlayerCloakDrownedHandleNintendoEffectSetRootWindow SortScoresRewardCreateMenuButtonsbAlwaysRelevant ScoreKillKilled PlayerInfoAddCBPMutator LifeSpaninFieldDeactivateAllFindPlayerStartMMAugmentationManagerMMSkillManagerMMWeaponRifle bAlwaysTick LocalLogGameReplicationInfoClass SoundEyePain HitSound3_MMSomeFixes1 SoundDrown PlayIdleAnim_MMConsoleCheckerDefaultPlayerClassMMWeaponStealthPistolMMWeaponShurikenMMWeaponSawedOffShotgun SoundGaspMMWeaponPlasmaRifleMMWeaponPistolMMWeaponNanoSwordMMWeaponMiniCrossbow MMWeaponLAW MMWeaponLAMMMWeaponGEPGunMMWeaponGasGrenadeMMWeaponFlamethrowerMMWeaponEMPGrenadeMMWeaponCombatKnifeMMWeaponAssaultShotgunSkinMMWeaponAssaultGun MMTracer AdminLogin MMSpeedFixMMSpectatorStartPointsMMSparkMMSniperTracer MMSmokeTrail bSpawnBlood MMShurikenMMShellCasingSilentMMShellCasing MMRocketLAW MMRocket MMRockchipMMPRIHandleWalking bPushable MMNextMap FragType MMNetSpeedMMMultiplayerMessageWinMMMPlayerTrackMMMOTDMMMenuScreenAugSetupMMLAM MMLagoMeterMMHUDObjectSlotMMHUDObjectBeltMMHUDMultiSkillsMMHUDLogDisplayMMHUDActiveItemsDisplayMMHUDActiveAugsBorderMMHUDActiveAugMMHECannister20mmMMGRI MMGasGrenade OwnerJumpedMMFrobDisplayWindowMMFleshFragment MMFireball MMEscWindowSetMovementPhysics MMEMPGrenade MMDeusExHUD MMDartPoison MMCarcass MMBloodSpurt MMBloodDropMMBeam MMAutoTurret MMAugVision MMAugTarget MMAugStealth MMAugSpeed MMAugShieldMMAugRadarTrans MMAugPower MMAugMusclebSpawnTracersMMAugmentationDisplayWindow MMAugLight MMAugHealing MMAugEnviro MMAugEMP MMAugDummy MMAugDrone MMAugDefense MMAugCombat MMAugCloakMMAugBallisticViewPlayerNumMMAugmentationMMAugAqualung MMAmmoShell MMAmmo762mm MMAmmo3006 MMAmmo10mmminiMTLWaltonSimonsminiMTLUNATCOminiMTLTracerTongminiMTLThugMaleminiMTLSmuggler AddMutatorminiMTLSettingsminiMTLRiotCopminiMTLReplacer miniMTLNSF miniMTLMJ12miniMTLMechanicminiMTLJosephminiMTLJCDenton miniMTLHUDVirtualKeyPressed bSpawnFleshMessagingSpectatorDeleteInventoryAddLogdamageAttitudeToFocusLeftDescendantButtonActivatedBoxOptionSelectedMutatePostDrawWindowminiMTLDoctorminiMTLDMPlayerminiMTLCustomSkinminiMTLCTFFlagminiMTLCTFAlarmGiveTominiMTLBumMaleminiMTLBasicCTFSuicide miniMTLTeamCBPTeamminiMTLDeathmatchbSpawnShellCasingsminiMTLBasicTeam CBPBasicTeamminiMTLBasicDM CBPBasicDMminiMTLAdvTeam CBPAdvTeam miniMTLAdvDM CBPAdvDMminiMTLAdvCTF CBPAdvCTFbSpawnOtherVisualEffectsBecomeViewTarget PlayInAirbDisplayAugMessagesbDisplayPickupMessagesenemyCaptureSound TestFontfriendlyCaptureSoundenemyDropSound Spectator flagStringswapTimeSinceCloak KillsStringMatchEnd2String ActivateBeltShowGoalsWindowShowInventoryWindow ToggleWalkreconstructTimelastDroneTimeParseRightClickActivateAllAugsAugAdd DualmapF12 DualmapF11 DualmapF10 DualmapF9 DualmapF8 DualmapF7 DualmapF6 DualmapF5 DualmapF4 DualmapF31 colLtGreen colLtRedBioelectricCell AugCloakExplosionLightFleshFragmentSetServerTimeDiffCreateKeyRingUpdateTranslucencyDeathMatchGameAutoTurretSmallIsHighlighted DroneExplode BuySkillsMutatorTakeDamageDXReduceDamagePlayDXTakeDamageHitIncreaseClientFlashLengthGiveInitialInventoryForceDroneOfffriendlyDropSound PastLMVarsenemyReturnSoundfriendlyReturnSoundCreateAugButtonsVictoryConString2TimeLimitString1CalcBehindView HidePlayerAnimalSetTeamAugFamiliarNameLastLagometerUpdateTimeCalcTeamScores AlarmHeard ScopeToggleServerGenerateBullet IsSkilled AddSkill AddAllSkills ActivateAllCalcEnergyUsefriendlyTakeSoundflagTakeStringLagometerUpdateIntervalflagCaptureStringflagReturnStringSetObjectNumberflagDropStringDrawHUDBackground LagTextureLagometerBackRefreshDisplay CreateSlots OverrideBeltLastSpecChangeTimebColoredTalkMessagesCreateContainerWindows CreateIconsDrawTargetAugmentation TraceLOSSwitchToBestWeaponbAllowBehindViewMedKit Multitool LockpickCreatePlayerTrackerChunkUpMass dropFlag SoundRadiusResetAugmentationsbGameRelevantClientAdjustPosition explodedUpdateRotationshotbEscapeSavesSettingsInitializeSubSystemsbTravel netspeedGasp ForceAltFireComputerSecurity AugBallistic AugHealing AugSpeed ForceFireReset HitArmLeftHitHead HitTorso HitArmRight HitLegLeftWaterHitTorsoBackWaterHitTorso HitLegRight HitHeadBack HitTorsoBack BoostAugsAddDefaultAugmentationsSetExactViewRotation LightType SoundVolume DoSomeFixes LightHue BehindViewPickupOpenDoJumpRepairInventory UpdateAugmentationDisplayStatus StopZoom CanBeLiftedGetLogTimeoutForceDisconnect FixName2 FixName3 FixName4 StartPoison PlayDeathHitProcessCustomMenuButtonCollisionRadiusCollisionHeight LightEffectDrawDropShadowBoxbVisionImportant CatchFire SetFillColor BuoyancyDrawInvulnShield ScaleGlow checkTime AmbientGlowEvaluatePlayerStartDumpAllNetActors CustomRecord ModLoginPlayDyingSound ModLogoutbUsesHelpWindowActivateAugmentation CBPSpeed MaxLevel colWhiteTempBan ForceName LagoMeterGlass mpStatusCBPTargetingLevelUsingChargedPickupSetLogTimeoutSpectatingPlayerIDBreakableGlassCBPPowerRecLevelCBPVisionValue ScriptedPawnTeam0PlayerClassTeam1PlayerClass FEV_EscapeResetScaleGlow TeamTalkPostNetBeginPlayTalk CarcassTypeSpawnNotification FEV_Capture bInvincible FEV_Return PostRender BeginPlay WeaponLAM DeusExMover KilledByFEV_DropOnPurposePossessRestrictInput ClientWidthPlayerCalcView ClientHeightAugsPerCaptureInvokeUIScreen SaveSettings AugsPerScoreAugsPerReturn InventoryflagEscapeTimeWeaponGasGrenadeStunned MessageDelayWeaponEMPGrenade MessagesFixedRespawnTimebSwapNewPlayersFirstMaxDifferencebRespawnIntervalsRespawnIntervalCheckTotalScoreRespawnThreshold PtsPerKill PtsPerScore _Initalize_clientGiveConsoleInfo_serverValidateConsolePtsPerCapture PtsPerReturn_CheckWeaponsNewPlayerTitlefriendlyFlagBiasTitleNewPlayerContentNewPlayerContentAugfriendlyFlagRandomBiasRespawnString1ProcessActionRespawnString2 FEV_DropFEV_TakeFromField HealPlayer colBlue1 colGreen1ReattachDecalThrownProjectilecolRed1All PlayerTick FEV_Take KnockedOut GetLevelInfo IsLeaning CreateLabel escapeTimecarrierAdjustHeight GainedChild dropTakeTime SpawnBlood HasOptionPlayerReplicationInfoClass HQString teamStringbUpdateBaseLocalarm PlayUseAnimGivePlayerAugmentation carrierID CustomSkins AmbientSoundHumanFastFireRateTolerancebForceNetSpeedcolAugDisabled MinNetSpeed MaxNetSpeed ScreenType ModVersion SetHelpTextResetToDefaults HUD_modeKick ClearBeltCTFFLAG MegaFutz buttonWidth CheckTicksHackableDevices Tolerance ShowMainMenuRefreshMultiplayerKeysUpperTimeDilationProcessMenuActionSimFinishFireCBPDeathmatchGetSkillFromClass0SoundWaterDeath EMPHitPoints borderWidthbIgnoresNanoDefenseminDamageThresholdbBlood bPenetrating fuseLength proxRadius SkillName skillClassescolBackground IsActive bHandToHandEnviroEffectivefontButtonText NoiseLevel LoopSoundcolText SkilledToolParticleGenerator AreaOfEffectGoverningSkill HitPoints DeusExMPGame ShotTime HitDamageAccurateRange texBorders bAutomatic maxRangeAugmentationManager SkillManagerDeusExLevelInfo sViewInfo SpyDrone GM_Trench MechanicTex3 bBreakable MechanicTex2 MechanicTex1 DoctorTex1 DoctorTex0TerroristTex2TerroristTex1TerroristTex0UNATCOTroopTex3UNATCOTroopTex2UNATCOTroopTex1MenuUIChoiceButtonMJ12TroopTex4MJ12TroopTex3MJ12TroopTex2MJ12TroopTex1 RiotCopTex3colRed borderHeight RiotCopTex2 RiotCopTex1 ThugMaleTex3 SkillsTotal ThugMaleTex2 ThugMaleTex1 ThugMaleTex0Invoke colGreen BumMaleTex2 BumMaleTex0 MiscTex1 SkinTex4 SkinTex1 LabCoatTex1TrenchShirtTex1 SkillsAvail PantsTex5 InitialAugs PantsTex4 PantsTex1 GogglesTex1 LensesTex5 LensesTex2 LensesTex1 FramesTex4WeaponFlamethrowerHUDObjectSlot FramesTex1WaltonSimonsTex2WaltonSimonsTex1sizeWaltonSimonsTex0TracerTongTex2TracerTongTex1TracerTongTex0 bPickable doorStrengthSkillsPerKill AugsPerKill JCDentonTex3 JCDentonTex2 JCDentonTex1 JCDentonTex0JosephManderleyTex2JosephManderleyTex1JosephManderleyTex0 SmugglerTex2 RiseRate ejectSpeed SmugglerTex1 SmugglerTex0PuffDeusExCharacters FlagPoleTex5 SmokeTrail AugVision FlagPoleTex4 AugShield AugStealth FlagPoleTex2AugEMP AugPower FlagPole AugAqualung AugDefensecolSelectionBorderKeyNotBoundString DeusExDeco Fireball SmokePuff1 GasGrenade EMPGrenade LAM3rdTex1LAM PinkMaskTex BlackMaskTexTracer RocketLAWcolBlueHECannister20mmRocketAdaptiveArmor ShellCasing FlatFXTex34WeaponAssaultGun colItemIcon FlatFXTex30 FlatFXTex29Smoke AmmoShell Ammo3006 Ammo20mm Ammo10mm Ammo762mmSkins DeusExItemsCloakUp CloakDown LevelString fillMode AugDefenseOn Augmentation ProdFire PistolFire GEPGunLock itemNeededWeapons LogNoteAddedLogGoalCompletedparticleDrawScale LogGoalAdded Menu_CancelmsgNoneSpiderBotWalk titleString hackStrengthEMPZapGrayPainLarge GrayIdle2BodyHit MaleGaspMaleWaterDeath MaleDrown MaleCough MaleLaugh MaleEyePainMalePainLarge GreenColor RedColorMPSkillStartLevel msgLockedSpark2marginArmorRicochet Ricochet4 Ricochet3 Ricochet2 Ricochet1Genericmpnsf DeusExSounds cameraIndex Mpunatco texFlags AugLightmissionNumberBeam DartPoison FontTinyFontMenuSmall_DSFontMenuSmallFontMenuTitleWeaponStealthPistolWeaponSawedOffShotgunWeaponMiniCrossbow WeaponLAWWeaponAssaultShotgunKillerProfileFontMenuExtraLargeConWindowBackgroundmpNoScopeMult SwingOffset msgToolsmsgTool msgPicksmsgPick msgHackedmsgInf msgHackStr msgDoorStr msgLockStr msgUnlocked ammocrateBeltIconMultitool AugCombat AugDrone AugEnviroAugmentationDisplayWindowHUDBaseWindow AugMuscleAugRadarTrans AugTargetAutoTurretGunSmall BarkManagerBeltIconMedKit BulletHole ColorThemeColorThemeManagerBeltIconLockPick NAStringMenuUIClientWindowPressEndStringDeusExBaseWindowDamageHUDDisplay DeusExHUDDeusExRootWindowFrobDisplayWindowinfoX HUDActiveAugHUDActiveItemBaseHUDActiveAugsBorderHUDActiveItemsBorderBaseHUDActiveItemsBorderHUDActiveItemsDisplayHUDAmmoDisplay BeltIconLAMHUDCompassDisplayHUDHitDisplayHUDLogDisplayHUDMultiSkillsHUDObjectBeltSkillPointsString ToExitString InvulnSphereSkillsAvailableString colAugActiveMenuUIScreenWindowmenuscreenaugsetupMenuUIBorderButtonWindowMenuUIMenuButtonWindow MenuUIWindowMenuUISmallLabelWindowMultiplayerMessageWin RockchipShellCasingSilentSkillComputerSkillDemolitionSkillLockpickingSkillSwimming SkillTech snipertracer SpawnPoint msgScanning2msgLegs msgRightLeg msgWeaponWeaponCombatKnife msgLeftArm msgTorsomsgHead msgPercentmsgLow msgMediumWeaponNanoSwordmsgRangeUnitsmsgHighWeaponPlasmaRifleBeltIconGasGrenade msgScanning1 WoodFragmentSkillPointsTotalSkillPointsAvailEnergy msgRightArm msgLeftLeg msgOverallbBeltIsMPInventory msgDisabledRunSilentValuecolAugInactive PressString LastKeyNumbHelpMessages HeadString TorsoStringWithTheString WithString PoisonString BurnString NoneString MPDamageMultDetail1StringUpdateTimePlayedBeltIconEMPGrenadeBeltIconBioCellAugIconVision_SmallAugIconTarget_SmallAugIconSpeedJump_SmallAugIconShield_SmallAugIconRunSilent_SmallAugIconRadarTrans_SmallAugIconPowerRecirc_SmallAugIconMuscle_SmallDetail2String skillStringAugIconLight_SmallAugIconHealing_SmallAugIconEnviro_Small colBorder slotNumberX slotNumberYEnemiesString AlliesStringTeamNsfStringTeamUnatcoString ScoreElementfFriendlyFireMultAugIconEMP_SmallAugIconDrone_SmallAugIconDefense_Small AugActivated HotKeyNumSuccessMessageNoSkillMessage bGravitybParticlesUnlitAugIconCombat_SmallAugIconCloak_SmallAugIconBallistic_Small bodyPartmsgNotWorking MinSpreadAcccorner msgRange msgNoImage barLength FirstKeyNummpTurretRangempTurretDamagempGroundSpeed mpWaterSpeed gunDamage gunAccuracyConversationPackageslotFillHeightslotFillWidthAugIconAquaLung_Small EscapeStringNewMapSecondsString PlayerString DeathsStringAugIconVision ScoreToWinVictoryCondition NoAugInSlotNoToolMessageparticleTexture CostString bHackable slotIconX slotIconYTooManyPlayers GoldColorbSpawnEffects lockStrength bHasSilencer bHasScope msgHealthAugIconTarget screenWidthMultitoolString blinkRate screenHeightAugDeactivated colObjectNumchunkdoordxMover dxPlayerOffsetdiffbValidRootbLocked destActorevpctdstnewLog objectNum spawnLoc TimeLimitbNewMapbClientNewMap NewMapTimeAugIconSpeedJump bDisabledbFreezeScores scoreArrayPlayerXKillsXDeathsXStreakXPointToEvaluate OtherPlayer NotifyDeathPlayerToRewardlpritmpritmpSEseyoffsetw2xoffsetkillcxdeathcx streakcxbarLen TeamScore NumUNATCOCurTeam thisPlayer methodStrAllies numTeamList curPlayer nsfScore unatcoScorexlenylen bLocalPlayerallyCntfakeSEteamStriSkinwinnerbMultiPlayerMap activeWeapon activeSkillnumActiveAugsbProximityKilled healthLow healthMid healthHigh remainingBiobodyLoc killerLocmyNumActiveAugs bKilledSelfSPgennewLocbInitorigRot scaleFactor CameraTagdmg curTarget TurrettagppViewsPlayerTrackergunshell attackerhole AugsLeft CurrentAugNumAugsPriorityIndexsndbCrosshairVisible ThemeManagerbCompassVisiblebAmmoDisplayVisiblebDone bVisiblespyDroneLevelbDoIt bForceDuckAugmentationSystem SkillSystem EnergyDrainEnergyDrainTotalbZoomedbLasingAmbientbFiringcurrentAccuracyKlaxon MPHitLoc bodyStringdxwfdst origHealthbDamageGotReduced bPlayAnim wShortStringaugCntdecProjpkillervalid skillClassprojmmw killerMethod killedSelf bClientReady numSlugs augIndex lastHealTimedevicebStuckbAggressiveExplodedbProximityTriggeredbArmedproxCheckTime skillTime skillAtSet bDamaged bDoExplode skillDiffproxRelevancepassInAttachedPlayer myPlayer bRandomEject OrigLifeSpan OrigScale FirstSkillhit skillIndex TestLevel aNewSkill FirstAugbBoostEnabled augBoosting augClass findClass giveClass energyMultbDefenseActivedefenseSoundTimedefenseSoundDelayminproj bValidProj defenseLeveldefenseTarget LevelValuecurrentHUDThemecurrentMenuTheme scorePlayersbSilentNewTeamteamSENumNSF fillColor itemText itemTextPosYcolHeaderText PlayerCount teamSECnt enemyCntnewIconactiveSkillLevel activeAugsbTurretKilled bProjKilled bBurnKilledbPoisonKilled myActiveAugsmyActiveSkillmyActiveWeaponmyActiveSkillLevel keyIndex bKeyHandledkeyTalk keyTeamTalkAliasswbuttonPressed CurInventoryAugIconShieldAugIconRunSilent buttonIndexcurrentWindow safeTarget EMenuActions winClient lockoutTimeturret winButtons ChosenAugs btnAugChoice ChoiceNames iButtonIndex bShiftRightCurAugAugStringNameauganAug aWantedAug LastTarget beepTime energyUse gunClassKilleeMethod bValidMethodanItemsTimeNintendoImmunityTimeLeftbNintendoImmunityServerTimeLastRefreshbKilledbDisplayProgresscurDetailKeyNameDXGamebObjectBeltVisible bObjectNames invulnSph killProfile myKillermyTurretKiller myProjKiller ShieldStatus ShieldTimerbHUDShowAllAugsbAugDisplayVisiblebHitDisplayVisibleNextMap mpMsgFlagsbKillerProfilespyDroneLevelValue bBuySkillsaDronebSpyDroneActive swimTimer swimDuration BleedRateinHandLastRefreshTime oldSkins FrobTargetwinZoombTargetActive targetLevellastTargetTimebVisionActive visionLevelvisionLevelValue activeCountdamageeVisionBlinderVisionTargetStatustargetPlayerNametargetPlayerHealthStringtargetPlayerLocationStringtargetPlayerTimetargetRangeTimetargetPlayerColortargetOutOfRange keyDropItemboxCXboxCYboxTLXboxTLYboxBRXboxBRYboxWboxHadjmulxcolor safePlayerbDMbTeamDM SightDistbUseOldTarget crossColorown AimLocation AimBodyPart BrightDot DrawGlow RadianView OldFlash NewFlashOldFogNewFog PlayerTarget TeamGame winIcons iconCount iconWindow foundWindowaugItemwinAugsContainerwinItemsContainer skillListX skillListY skillMsgY skillCostX skillLevelX levelBoxSizebNotifySkills timeToNotifycurSkillPoints curKeyNamecostStrcostxlevelx winSlotsobjects winRadiobelt mp_jumpsuit MPCharactersstrInfo frobDisplaydamageDisplay augDisplaycompassmsgLog activeItemshmsinfoYinfoWinfoH centerLoc numTools bNearWallbDestroyOnFinishlosspClass sndVolumebListenClientdegradetempvecpWtWAugIconRadarTrans CBPMutatorCBPAugmentationDisplayWindowCBPAugmentationManager CBPBloodDropCBPBloodSpurt CBPCarcassCBPFleshFragmentCBPHUDObjectSlotCBPMenuScreenAugSetupCBPMenuSettings CBPShurikenCBPSkillManagerCBPWeaponGEPGunCBPWeaponPistolCBPWeaponRifleCBPWeaponShurikenMTLTeamMTLDeathMatchMTLGRI MTLPlayerMTLMOTDMTLPRIV6BAugIconPowerRecircV7CV91V92V9BAugIconMuscleV9DV9EV9FVA0VA1VA2VA3VA4VA5VA6VA7VABVACVAEVB2VB3S30VBEVBFVC0VC1VC5VC6VCAVD3Z12Z14Z15Z20Z21Z39Z3DZ52IDXPINGX AugIconLightPInfoZ5CZ5DZ5FZ61Z63AugIconHealingAugIconEnviro AugIconEMP AugIconDroneZ9ENet CTFItems100 HUD_flagAugIconDefenseAugIconCombat AugIconCloakAugIconBallisticAugIconAquaLungUserInterfaceIcons DeusExUIlinecol bDragging bIsVisible hotKeyString bOneCheck parentPawn VisionBlueSolidcolbRepeat leaveWindow buttonNumber bHandledbNewVisibilityboxbButtonPressedFlagGCPlayerPawnExtRadioBoxWindow RootWindow TileWindow ButtonWindowViewportWindowExtensionObject FrequencySparkk bDeleteMeOther DeltaTime HitNormalWidthRadiusDamage MomentumSizeYSizeXCurYCurX SpawnClassHYStartActionIdMapNameDirNum SpawnSound AmountNeeded AmmoAmount NumCopies texGroupVolumeScore AccuracybWarn ProjClassDistanceFromPlayerOwnerPbBeep AdjustedAim Misc1SoundKeyRot bPointing AmmoType ReloadCountdistbeltDescriptionKeyNumDeActivateSoundActivateSound bBehindView bHeldItembActiveZone bCountJumpsPNameTarget Instigator CrosshairBaseRegionStandingCount bWasCarriedCameraLocationcost ownerTeamEnemy ViewRotation EyeHeight Rotationv2v1ReducedDamagePctReducedDamageType Velocity Acceleration nextPawn HitSound2 HitSound1bRunbFire bAltFire KillerName foundStartaPlayerExitingInTeam NewPlayer StartSpotPortal InPassword FailCodeAddressKeyShadowcarriedDecoration BindNameDamageMutator BaseMutatorbOnFirebFoundminDist PawnListNetModespeedPauserSecondMinuteHourDay MeshType SkinClasses notfMSG_Text notfMSG_TimenotfMSG_EndTimenotfMSG_ColorPlayerMOTDWindow FreeSpecModeClientFreeSpecModeSpecPlayerChangedTimeView_RotPitch View_RotYawTargetView_RotPitchTargetView_RotYaw TargetAugs bTargetAliveTargetSkillsAvail TargetSkillsTargetBioCellsTargetMedkitsTargetMultitoolsTargetLockpicks TargetLAMs TargetGGs TargetEMPsTargetWeapons bSpecEnemies bExitingbCTFWantsToPlayCTFRespawnTimebDisplaySkillMessageForeverbAugsDisabledMonthYear TimeSecondsInv bWaterZone NewRotation instigatedBy NextMoveCurPawnDeltaaPawnIPbPerformZoomOnRightClick KickString bModeratorLMActorbFirstTimeReportedSFActorbForceWhiteCrosshairGame EndTrace SettingsRef StartTraceStreak bIsSpectatorbFeigningDeath PacketLossDeaths PlayerID PlayerName PRIArray friendlyMult NumPlayers bTeamGame HitActor HitLocationTextpointbOwned projSpeedRelevantRadiustimesec bAlreadyDead SpecLocationrotrlocset actualDamageNKillerLocacttexNameflagsMsg bNetOwnerfpvmmdxhud bNetRelevantcsturrBaseRotctfgameBasePosKeyPosmmprndtgmMindexa smanager amanager prevvelocityhmodeprevloc AccelNormoldtdm BuildAccel NetMoveDelta LastMovegdmOldMove enemyspecNewMove Password SavedRadiusAdjPCol TotalTimePTarget invclass ViewActorCameraRotation EDodgeDir OldDodgeMoveBaseEyeHeightOldBasebleederSkillViewYawLastPainSoundUnderWaterTimesc maxPitchbDuck OldTimeStampnormspar OldAccel OldTimeDelta ViewTargetmyHUD demoname ReflDamage NextState mmsettingsView DodgeMove SwapStringDxPrgbTPbForceAltFirePRIonoff InstantFlash mmaugmanagertmp Captures bForceFirebDead NewTargetDesiredFlashFog bAltFired InitialTeamReplMaxPlayers InstantFogSBInfoSpecCountUNATCO SpecCountNSFSpectatedPlayerIDSpectatedPlayerNamebFlagADMINX_OFFSETSPECTX_OFFSET CallDestroybFired NextMapTextbReflectiveDamage TempBanAddrresNewbJumpStatus Team0Skin Team1Skin cskinloader mmplayer NewbDuckNewbRunbAdminnumber_of_specs CntNoSpecItemltime ClientLoctmpPIInAccelSkillsPerCaptureSkillsPerScoreSkillsPerReturn TimeStampPrev EInputKeyTeamSkillsPerCaptureTeamSkillsPerScoreTeamSkillsPerReturnTeamAugsPerCaptureTeamAugsPerScoreTeamAugsPerReturnCurrentNetSpeedbAugsWithFlag bShowScores bNetInitial bPressedJumpbUpdatePositionNextRespawnTime bJustFiredbJustAltFired bJumpStatus SavedPawn newAccel OldbDuckFlagFlashCountOldbRun Location0 Location1NewbPressedJump ViewPitchflagTextureNumgriLocDiffxlocylocAccel DeltaRot clientErrDesiredFlashScaleaTurn ClientRoll JumpSoundaLookUpaUp flagSpawn SavedMoves FreeMovesfriendlyFlagBonusbestFriendlyFlagBonus bFromBase bOnPurpose PendingMoveskillsaugsptsCurrentTimeStampLastUpdateTimeServerTimeStampNextPlayerClass TimeMarginTargetEyeHeightTargetWeaponViewOffsetinClassURLaStrafebCountSpectatorsMinPlayerCountMaxPlayerCountbInt LoadingTimeForcedNextMap playermm aForwardnumpoldnm localNextMapbItemsClientUpdateTimeMoveAutonomousMaxTimeMarginTeam0Team1GetPlayerNetworkAddress SkinToCheckbSpectateEnemyGetEntryLevelPing GetFreeMove MaxSpeed ModPasswordSetPos bSpeedFix ServerLoad RepRespTime bCleared PingSendTimebPingComplete WhiteColor ItemNametmppingBorder tickrate aimerror ServerNamenw PlayerToModbUnlitClearbPlayerSideLogging TimeDilationcTime MaxPlayers Difficultyddil IPBannedHealthArmRight hitplayerHealthArmLeftcarrierHealthLegRightbaseLocHealthLegLeft HealthTorso HealthHead lastTakeTimecarrierLastLocMaps lastCarrier lastDropTimeHealth FovAngle bEscaping flagEvent_eJumpZ WaterSpeed GroundSpeed ItemArticlePlayerViewOffset bIsPlayerPlayOwnedSound DrawRect bDetectable RotationRatemobile PointRegion LocationTeampwnStyle DrawColor RespawnTimeActiveType VisibilitybFixedRotationDirTransientSoundVolumebStasisAmmobCollideWorldEffectsPhysics LagoMeterX LagoMeterYCounterSLoadLMVarsFbBlockPlayers DamageType bBlockActorsNext DrawTypebStaticValue lastShotTimeindex lastTooFaststrABC SkillLevelsYZPitchWYawRollKeyName ScriptTextRsclassjiPicskillsindextSG DummyAug ReturnValueVAlphaLastDefenseTime LightBeam1 LightBeam2augcenabledDXCrossMaxfaugSprintfTime bHasPowerAug bPowerAugOnMutatorLodMeshWeapon LevelInfo GameInfomanager Projectile ZoneInfo PlayerStartHUD SavedMove Decoration LightBeamaugval AugAffectedCarcassNavigationPointPlayerReplicationInfotTimeiMsg nextTimeInfo RotSlopeGameReplicationInfoDecalCanvasFontLevel bDoBalanceActorNSFUNATCOPlayerNetConnectionRemainingToSwap MaxFragsClientFragsSwappedWindowCountHeight TextToSayuplink Settings _checkUID_foundConsole_bCheckPassed _bInitalizedOptions FireTexturecheckIDSoundconStrrootStrTextureUID _bFixedLevel_WeaponShotTimesMessageRedisspec IsExitingErrorConsoleRolebShowAugWarningbAugsConfiguredTag mmaugsetupMapClassoldlockoutTimePackage keyFreeModekeyPersonView keyMainMenu keySkillsConstRotVectDieCamera viewenemy TextBuffer sameteamObjectEnum FunctionStateRotatorxoffyoffytoffcolGoldtmpVisionLeveltmpVisionLevelValueVectory_ratiobigStructNamebdifftcolorFirstDisplayTime bMenuOpenedforever StrPropertyStructPropertyClassPropertyFKey NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty ByteProperty bReadyToFire}*z$|d ::$::$-::$- ::$::$-- ::$::$::$::$::$::$::$-::$ 7R .yjyjyjyjyjyjyjyjyjyjyjyjyjyj R~kJR~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~kJR~R~R~R~R~R~R~=ĮkJ>І>І>І>Ѝ6>І>ПR~>І>І>І>І>І>І>ПR~R~R~R~R~>І>ПR~R~ R~R~R~R~R~R~R~R~kJR~R~R~R~R~R~R~R~R~R~R~R~R~R~R~R~=Į=ĮkJkJkJkJ kJ X՘kJyj͓kJkJкIkJкIkJUB3-3-X՘]K;kJkJ;kJkJkJUB{ Y:7 Y:7UB{9h=l{9h9h9hUB+wkJkJw]wkJ>І>І>Ѝ6>Ѝ6>ЇkJkJ>І>І>Ѝ6>Ѝ6>Ѝ66zT\+gkJкIyyyyzT\+g>ЇkJ>І>І>Ѝ6++kJkJQkJkJhn݇kJkJQkJkJhn݆>І>kJкI6kJkJQkJkJhn;^;^kJкI6kJkJQkJQ>ЇkJQkJkJkJкIkJкI1pkJkJkJkJ^Pe(?e(?^P6kJkJkJ;kJkJkJkJ3-3-kJkJkJkJkJkJX՘X՘/X/XY/X/XYOLOLOLOLOLOLX՘¶¶¶¶ՄX՘TX՘ X՘X՘wtwtwtwtwtI}I}I}I}I}I}I}I}H%]K]K]KLJkJyyyy^P6^Py^Py^PUB9h^P9hy9h=lyyyy"_h"3-yi%ʑ3-yyyyUB9h9hy9h=lyy^P6y^Py^Py^Py^Pyyy^Pyyy`yyy`y^Py ɠy^Pi%ʠyyyyyyyyytsyysyt|yi%ʠyyytt y  yy3-y^P"_h"3-y^Pi%ʑ3-yykJkJ>І>Ѝ6>ЇkJkJkJ>ЄX՘>Ѝ6kJ>І>І>Ѝ6>Ѝ66>ЇkJQ;^kJX՘>X՘X՘kJQ1]Й҇kJe(?66+bnbnbnbnkJ]K n]KQ]K!]KM]K93p%]Kα7:p%]K3p%]K3-]K9h9h9h9h=l"_h""_h""_h">ЇkJQ;^kJhn;^kJ>ЄX՘X՘kJ>І>І>І>І>І>Ь=Į>І>І>ЇkJkJ6kJкI6kJкI6kJкI66kJкIkJкIkJkJkJ0&Rf0&RfkJkJ>Ѝ6>Ѝ66kJkJkJX՘X՘+y{D(+y{D(+y{D(+y{DΤ+y{DΤ+y{DιUB6666]Kߵ[]KǤ+y{DBkJkJкI6^^^ղ`y`y`y+bn"8,9h9h=l=lbnΓ=l=l"8,"8,"8,"8,qа,ݤ++kJkJkJ/XkJUBUBi%ʼi%ʹUBUBUBi%ʼi%ʼi%ʇkJ]K]KǑ3-3-3-3-3-3-3-3-3-@@@y2߇kJTKF++y{D+++y{D+y{Df,vЙЙҍ6Й ɖ ɖ ɖ ɖ6 ɖ ɖ ɖ ɖ ɖ6 ɖ ɖ6 ɖUB{{kJkJUB]KǠyy+@Q)@Q)@Q)@Q)@Q)@Q))v6666kJкI6kJkJhn݇kJkJQ;^;^;^ RQT^[qdG ] h k l m o p _ a b u v M%s took the %sx ]%s captured the %sy ]%s returned the %s{ ]%s dropped the %sB $yC p wy v(~"K$!::$-::$2c9h4{=l=l=lkJkJQkJkJhnݓ=l=l^P^P=lkJ0&Rf0&RfkJ0&Rf ɖ=l=l=lA >OȐ=l^P=l=l=l=l=l=l^P^P+y{Dc^P=lA >OȐ+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*+y{Dȶ*aHfzLVRPD S x r ^ JeP| T` a $f $ ?g $zD| $Z Sb$ff?s*[Z =::$::$6IQ+e|;^^P6^P6NŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN“;^NŒN‡kJkJkJkJ^PNŒNŒN…^P6N…^P6^P6NŒNŒN…^P6NŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN…^P6NŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN…^P6NŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN…^P++Й+Й҆>І>Ѝ6>Ѝ6>Ѝ6^P^Pt>Ѝ6>І>І>Ѝ6>Ѝ6>Ѝ6^PykJ>І>Ѕ^P^P>Ѝ6>Ѝ6>Ѝ6^Py>Ѕ^Py>Ѝ6>Ѝ6>Ѝ6>Ѝ6^Py>Ѝ6>Ѝ6^P^P>Ѝ6>Ѝ6^Py1pkJ>Е++6+6>Ѕ^P6^P6^P^P>Е+6666{Hb1p>kJкI-+ ;^kJkJNŒNŒNŒNŒNŒNi jj Khr T]StreakspPY G!rx ::$2 =d "J)kq3 =l{^P^P{{^PUB^P^P^P^PUB^P^P^P{{^P9h9h9h9h^P9h^Pd+\)\ 5::$::$6Phn(?;^>Ѝ6>Ѝ6>Ѝ6>Ѝ6>Ѝ6kJ>Ѝ6kJNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN“;^NŒN‡kJkJkJkJ^PNŒNŒN…^P6NŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN…^P6NŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN…^P++Йҍ6666666666+Й҅^P6^P^P>Е+6666{Hb{Hb1pkJкI-+ kJkJNŒNŒNŒNŒNŒN33E3V3h3b3L3c3d3m3 K3 K3 [hr T]StreakWDspPY(f+n(T (8J::$::$-::$ a!mI- B2N ɖ kJ ɖkJ6kJkJ6kJ>>Ѝ6>Ѝ66>kJ0&Rf0&Rf0&Rf0&Rf0&Rf0&RfkJ>6666666666>@"| { ] US Armyr ]flagz -HQv $pBt $ @s "s |zS h()$@?N $?P BNS E $ AF $+)Bq G  mt QNO $ BL $AI b$@sCJ@k @v*_}6;^U[D$uV$=V>V ?V33s?Y$?Y?Y@Y@@[$>[>[?[@^$?^?^?^@;";;;;;;;;; b$33?C_DA(F+K >VF] @A=i+[$*C* ::$6H0&RfQ>Ѕ^P>Ѝ6>Ѝ6>Ѝ6^P^Pt>Ѝ6>І>І>Ѝ6>Ѝ6>Ѝ6^PykJ>І>Ѕ^P^P>Ѝ6>Ѝ6>Ѝ6^Py>Ѕ^Py>Ѝ6>Ѝ6>Ѝ6>Ѝ6^Py>Ѝ6>Ѝ6^P^P>Ѝ6>Ѝ61pkJ^P^P>ЇkJ^P^P>Ѕ^P^P^P6^P666 ɖ9h66Y6666 ɖ>І>Ѝ6kJ>Ѕ^Pyim> ɖ ɖyim ɖ ɖyim ɖ ɖ@@@@@ ɖ ɖ ɖ ɖ ɖkJkJNŒNŒNŒN6 ɖNŒN ɖ, ɖ, ɖNŒNŒN ɖ ɖ ɖ ɖ6 ɖ ɖN ɖ6 ɖ6N ɖ ɖ ɖNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNY6Y6^PY6 ɖ ɖ>Ѕ^Py^Py^PyIaIfIeIP@ "C "D "F "L $ AO P $AR $@S "T " X "Y "\ $?` $ AXZH'DXMP_Smuggleri5ġAk4bDgQDXH+DXMP_Area51BunkerJy*FE Cڌ@D8<ĕ9XH# DXMP_Silos7D Y#DaqDXH" DXMP_Cmd>DaDdOٗEXH-DXMP_Cathedral_GOTYdDksμKEQ‹3XH.DXMP_Paris_CathedraldDksμKEQ‹3XH(DXMP_CathedraldDksμKEQ‹3d ] captures wins the match.e ]87Objective: Score the most captures before the clock ( T]Poweru ]Scorev M capturing theE\JLRf@u Z X^ D @6l_[ w @iZ@tB @^ [ /Vf@JIPb jnuSZ4cn E[RQ5A q %],U&bny{Dx(^P΅^P ̅^Px^P~U ^P^PB^P~U B( x~U B+Bȶ*ȶ*Zνzz^P M"S {y{\DD l cd| T&Z2mU -  ܸmQN{$pAyPRnyv|N@J@mLK W, ,@hGY jO3O)~#+JLn9h F*\RT\k MO @s mp L$a LE ::$6Y6 y T d wvy&y$\3^jG =l9h^P9h9h^P"   ]Vision Enhancement/mkBy bleaching selected rod photoreceptors and saturating them with metarhodopsin XII, the 'nightvision' present in most nocturnal animals can be duplicated. Subsequent upgrades and modifications add infravision and sonar-resonance imaging that effectively allows an agent to see through walls.|n|nTECH ONE: Nightvision.|n|nTECH TWO: Infravision.|n|nTECH THREE: Close range sonar imaging.|n|nTECH FOUR: Long range sonar imaging.6]iWhen active, you can see enemy players in the dark from any distance, and for short distances you can see through walls and see cloaked enemies. Energy Drain: ModerateCHD"r'J~fvX @j_ HUBoW H O:k @"pj q D&W+WB2wt N>VWms~~mE+k@V#Z#4b[   H\#1f   n w8oFmX [KGZ @M_ @el]H}#@Pn N @'_mqlsWObk@y"E,C::$::$2 wU[ڕ+piGN+kJkJkJ Cb$@@y Lb XLvh![(~2"@Q)jɅ^P^P^P^P ez-^P ez-^PkJ^P^P^P^PkJ^PkJNŒNŒNŒN…^P^Py^PyNŒN…^PkJ a ]! Respawning... you have to wait c ] seconds.}m_\as0G{ZY@.@uSI AOof Q_SB&]U@ ~U @g|W#L @}sb Ai[@n)yVo i`ojBPaP A[ xEVe+u*S 3{HbU[A P  g S pHmS gf A {wzGf b}kr~Gkrw%':%c }G:~%c c rb:~wrbwc [ Gw& [ ,0 [ ,9 :& [ ,A [ ,FwwrbGppGr@Grbwf bwf %GGr}@r~Gk1f  z J+@V  XLittb |t& w p zgn @ [Yg W  h@KXDjK^@L ^  [np u M$` @@`R N@ f M  EN~F NKH@UGTSuViZWMA @dhZ AS`uh@o#b`h Cq g gCcnuh X E TO Iz@@pfq|OgMEB @[N{ @`jD!I i  m o  D*xt2W.,DL*zv2X9e)՟>>ЄX՘X՘X՘>ЇkJkJ3-3-X՘X՘H%H%XN L Q{Yxc F\l  XO m  ,@bje y+^lpiLczv L a&c6lzT\+gX՘kJkJкI>І>>Ѕ^P^P0^P0^P^P AN^P AN666kJкIyyyykJkJкI>І>>Ѝ6>Ѝ6>Ѝ6>Ѝ6>Ѝ6>Ѝ6>ЇkJkJкI>І>Ѝ6>Ѝ6>Ѝ6>Ѝ6>Ѝ6>Ѝ6>Ѝ6>ЇkJkJкI>І>Ѝ6>Ѝ6>Ѝ6>Ѝ6>ЇkJkJкI>І>Ѝ6>Ѝ6>Ѝ6>ЇkJ\M O $pAN "\$@Z{$?Cx@r @mt 0nFx u@LdCbJ@c`A"yr q s_Cd M~Umgb@H&_F@xli@V+D(E 6$piGNi 6+y{DkJkJwwwaaaaaaaaaaaaaaaaaaaaaaaan k $yw $L=} ~ @qEvI@g@W\"V'A2BC $ ^P^P^P^P{^P^PkJ^P^P^P{9h9h=l{9h=l{9h=l9h9h=lˮT7~=l{~=l~=l~=l~~=l{~=l{ ba bN b_ b` G|uG YJ \yj!X@usT W oZ j@xe @svd c U*pgX@}Z\Q G*Fu2l YÜІ>ЄX՘X՘X՘>ЇkJkJ3-3-X՘X՘H%H%l'^eCs v R@D V(b3| ֻ=l"$ ]Power Recirculator/mLPower consumption for all augmentations is reduced by polyanilene circuits, plugged directly into cell membranes, that allow nanite particles to interconnect electronically without leaving their host cells.|n|nTECH ONE: Power drain of augmentations is reduced slightly.|n|nTECH TWO: Power drain of augmentations is reduced moderately.|n|nTECH THREE: Power drain of augmentations is reduced.|n|nTECH FOUR: Power drain of augmentations is reduced significantly.6]WUReduces the cost of other augs. Automatically used when needed. Energy Drain: None$fff?L??ff&?"Z(H vJ @|@IDV"_p @I@] ROa fQ V  X\  Xaw U  XYVg X^ O T { h RY  XHC ,}k K @Kpt c L@u @GB i  XZbQe)}$j2A >OȐ{=l9h G @@LC } M @bTg @L kQ lB*Ds2S G{A~  Xl@R ZaoI USa IzwtjGK ^ ]}tTMp y*|,2r w-+ X՘X՘X՘X՘X՘X՘X՘]K]KǬ=ĮX՘X՘`y`yX՘X՘X՘1p     pk EZjavwP G w m M HnPJSG$@i| F,fx Bas o"F @*@#wQ@G @*J @*oK @*P @*I KE@*CskJu@qoxFYZ [H"mP+i ARfu+Vh s%K(R2"l n!'+bnbnbn++^P+ˮT7nnnˮT7&J&J&J++C $++^P^PЙ҅^P^P6 D] Join UNATCOD  Join NSFD  Auto-assignD  SpectateR"kZo  JOIN_UNATCOko  JOIN_NSFko JOIN_AUTOko SPECTATE[ ]New player detected^ ]EServer has detected, that you are playing DeusEx Multiplayer for the first time. Would you like to configure your augmentations now?_ ]zAugmentations are very important part of the gameplay. You have to use them in order to be competitive against other players. Open settings menu and configure controlling keys for them.qZt DisconnectDISCqt SettingsSETqtCancelCANCELqtAugmentationsAUGS] ]Welcome to MiniMTL Server} " "W SX SIXmDu v t+ @xFeR@cdYEx} r{IlDH  QJ wo S Q c  @Vf _ \ Y [ L@ e ecnUU  @ u%b']6-k F#툄X՘X՘X՘X՘>І>ЇkJkJ>ЇkJkJkJk FX՘X՘X՘^PUBX՘^PX՘X՘X՘X՘X՘kJkJkJ^PkJkJkJkJQ;^kJkJhn;^>$uІ>ЇkJkJ>ЇkJkJkJM+XX՘X՘X՘^PUBX՘^PX՘X՘X՘X՘X՘kJkJkJgl ~ZSgef p#Q,IV F"8,qГ=lLn=lLnLnLnLnLnLnqLn,q E[ [v]R ^be#U,HcV F  R&Y"2dFY. ޖg t[@rI^#tj   @P#oNFOP@oa'lY6 v f8PN .^PkJkJkJkJQ;^kJkJhn;^>$uІ>ЇkJkJ>ЇkJkJkJE%X՘X՘X՘^PUBX՘^PX՘X՘X՘X՘X՘kJkJkJ^PkJkJkJkJQ;^kJkJhn;^kJkJQkJkJhn>$uІ>ЇkJkJ>ЇkJkJkJZkX՘X՘X՘^PUBX՘^PX՘X՘X՘X՘X՘kJkJkJ^PkJkJkJkJQ;^kJkJhn;^>$u$u$u>ЇkJ\\$@I $AK ] WelcomeZ{$?{ NOkS#Ne6P%3p%$p%p%^PX՘^PkJX՘^P^P;>ЇkJX՘+>p%p%p%p%INhE#Up!VWaT w]^Y z#N"r,}A C @I#@j{M#B%Ac6nα7:p%p%p%^PX՘^PkJX՘^P^P;>ЇkJX՘+>p%p%p%p%IBm_qqq# |#TBt u TUOa .FaKa za K-EO-U yM Q}@~@uPEMs  H@JF%R"a6Hqg93p%p%p%^PX՘^PkJX՘^P^P;>ЇkJX՘+>p%p%p%p%IiKY%G @MNo%b_6 P)vS[^PkJkJkJkJQ;^kJkJhn;^>$u$u$u<|%N%l{ n@{| sB@j@jgizN@[my%d @&^ V#2D3 Y AkJkJQkJkJhnt$Aa  K&X2F1)o %\ _'X#Z6GX ^PUBX՘^PX՘X՘X՘X՘X՘kJkJkJ^PkJkJkJkJQ;^kJkJhn;^>$u|Ionic polymeric gel myofibrils are woven into the leg muscles, increasing the speed at which an agent can run and climb, the height they can jump, and reducing the damage they receive from falls.|n|nTECH ONE: Speed and jumping are increased slightly, while falling damage is reduced.|n|nTECH TWO: Speed and jumping are increased moderately, while falling damage is further reduced.|n|nTECH THREE: Speed and jumping are increased significantly, while falling damage is substantially reduced.|n|nTECH FOUR: An agent can run like the wind and leap from the tallest building.6]WUWhen active, you move twice as fast and jump twice as high. Energy Drain: Very High$?33??@"P@i f@k's^ @j@k@n@@A`l@C B(SQ@qx @ryuf| ,yABzi !L@FGV)@]ZZ)M@yg hAU \ ~pZC]]F@\_WD VMr){#l3*e=l9h^PkJ9h^PkJ^PkJ9h^P9h^PkJ9h^Pt9h^Pttt^P9h9h9h9h9h9h^PkJ^Ptt^P^Pe(?tt^Pt"$ B ]Aggressive Defense System$ CCCC" w)j#n3 f2=l^P^P^P]KDž^P^P^P "$ B ]Cloak$?zT?(??"O @jO P J!bw @s @[rN@r@v]sa|g{ X_*~@j GIHrEH Rt ~*@  6Kj[L ()${n?D@} XQ@U@HE @@DNQk+]a~ p+O^ 6aKQ`Sx+i)` 6cthn`S\,Ub 6dQ`S`,d)d 6eWpGhn`SghB ,QkM0a,p$f 6mpP0&Rf`SBpM@@szI, @@ y @S @{[l+W  6  [()$u?   g+U 2Aou GZ G$@Q Kr BP]+w$R  6 D$ Z+Q  6Eo [()$u?     Y+s d#:, a O JTL+D  6Kl [()$u?    F+C  6L딯 [()$u?    @OQ M@P@TyS@B+B  6VF ()${n?  XY{P@@+A  6[ ()${n?  ]^M@)`w*~ 6bJ" ()${n?t*{ 6cv [()$u? q*z 6di [()$u?n*f TN:%CwC*xC- wC|Cf'CC)( k*@eu@ euuE-kF, u, _F, u,_g F,u|p$$Fg ,u|P$$g F, u|c$$Fg ,u|C$$F, u|! d*y 6h02 ()${n?  f*[*x 6jt ()${n?g ]*P*w 6m| [()$u?    Q@lupqS@uU m @}G@})o3z2=l"$B ]Ballistic Protection$L?ff&???"[ DTt o@In e d z t r k CEu)m3D=T=l"$A ]Combat Strength$???@"y HQ } l)E$k3J@z=l^P9h^PkJ^P^PkJ9h^P^PkJ9h^P^P^P^P{ $A" $A ] Spy Drone$ AA BB" j)Nz@A Q`)i3Prh=l"$@ = EMP Shield/m~|Nanoscale EMP generators partially protect individual nanites and reduce bioelectrical drain by canceling incoming pulses.|n|nTECH ONE: Damage from EMP attacks is reduced slightly.|n|nTECH TWO: Damage from EMP attacks is reduced moderately.|n|nTECH THREE: Damage from EMP attacks is reduced significantly.|n|nTECH FOUR: An agent is nearly invulnerable to damage from EMP attacks.6]QOWhen active, you only take 5% damage from EMP attacks. Energy Drain: Very Low$@??>L="E ])h3R3=l"$A ]Environmental Resistance/mrpInduced keratin production strengthens all epithelial tissues and reduces the agent's vulnerability to radiation and other toxins.|n|nTECH ONE: Toxic resistance is increased slightly.|n|nTECH TWO: Toxic resistance is increased moderately.|n|nTECH THREE: Toxic resistance is increased significantly.|n|nTECH FOUR: An agent is nearly invulnerable to damage from toxins.6]~When active, you only take 10% damage from poison and gas, and poison and gas will not affect your vision. Energy Drain: Low$@??>="[)K$g3Sm/I=l9h^PkJ9h^PkJ^P^P^P9h^PkJ" $B ] Regeneration/mecProgrammable polymerase automatically directs construction of proteins in injured cells, restoring an agent to full health over time.|n|nTECH ONE: Healing occurs at a normal rate.|n|nTECH TWO: Healing occurs at a slightly faster rate.|n|nTECH THREE: Healing occurs at a moderately faster rate.|n|nTECH FOUR: Healing occurs at a significantly faster rate.6]_]When active, you heal, but at a rate insufficient for healing in combat. Energy Drain: High$@pAA A"X)_$f3+T_S=l9h9h9h9h9h9hmU -9h9hmU -9h9hmU -9h9hmU -9h^P^P9h9h9h^P^P9h9hmU -9hmU -^P^P^P^P^P^P^P^PmU -^PmU -mU -"$ AZ " ]Light/]trBioluminescent cells within the retina provide coherent illumination of the agent's field of view.|n|nNO UPGRADES$D" Js Dva`E^_ae B)p*e2od qu^P^P3-3-X՘^P3-3-NŒNŒNŒNŒNŒNŒNŒNŒNŒN„X՘^PkJ^PkJX՘X՘X՘X՘X՘X՘X՘^PkJX՘X՘^P^P^PX՘ vX՘ vNŒNŒNŒNŒNŒN„X՘X՘X՘ X՘tX՘X՘X՘׎N„X՘^PNŒN„X՘>І>ЄX՘  X՘X՘X՘>І>І>І>І>І>І>І>І>І>І>І>ЌNŒNŒNŒN„X՘>ЄX՘>Ь=ĮNŒN„X՘׎NŒNŒN…^PkJ^PkJNŒN…^P+y{Dx^PX՘^P^P^PX՘^Pe(?^P^P^P^P^PX՘^P^Pe(?X՘^P6^P^P^P^PX՘3-X^PkJ^PkJX՘^P6X՘X՘X՘X՘| | `y`y^P6^P6^PkJX՘^^Յ^P6^Յ^P6X՘Dž^P6Dž^P6^PkJNŒNNŒNNNŒNŒNŒNŒNŒNŒNŒN…^P6^jG ^jG ^jG ^jG 9h+66Й+6++NŒNŒNŒNt`e(?0&Rf^PkJNŒNŒNŒNŒNŒNNŒNNŒNNŒNNŒNNŒNN3-NŒNNŒNNŒNŒNŒNX՘>Ѕ^PX՘^PkJX՘X՘X՘X՘^PkJ^PkJN…^PkJX՘>ЌN>Ѕ^PkJN…^PkJX՘>>ЄX՘>ЄX՘>Ѕ^P^P^P^P^PN…^PkJX՘^Pe(?X՘X՘X՘X՘`y`y^PкI`y^PкI>Ѝ6`y>Ѝ6`yX՘Dž^PкI>Ѝ6^PкI>Ѝ6X՘X՘X՘X՘X՘X՘NŒNŒNZZNŒNŒN“ZN“ZNŒNŒN“ZNŒN“ZNŒN“ZNŒNŒN -쀓D竌NŒNŒN“ZNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN“ZZNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNX՘66666Й6>І>І>Ѕ^P^P g *\[ *\h *\K *\k *\L *\hmcBiz uXvX] m(c$c3r=l^P^P^P^P " $A ]Microfibral Muscle/mDBMuscle strength is amplified with ionic polymeric gel myofibrils that allow the agent to push and lift extraordinarily heavy objects.|n|nTECH ONE: Strength is increased slightly.|n|nTECH TWO: Strength is increased moderately.|n|nTECH THREE: Strength is increased significantly.|n|nTECH FOUR: An agent is inhumanly strong.6]?>When active, you can pick up large crates. Energy Drain: Low$???@" @ }}w~o {xa(w ` ~Anvp_w^(@v| IJAFvG(e$a3L3=l"$A  ]Radar Transparency/mFRadar-absorbent resin augments epithelial proteins; microprojection units distort agent's visual signature. Provides highly effective concealment from automated detection systems -- bots, cameras, turrets.|n|nTECH ONE: Power drain is normal.|n|nTECH TWO: Power drain is reduced slightly.|n|nTECH THREE: Power drain is reduced moderately.|n|nTECH FOUR: Power drain is reduced significantly.6]~|When active, you are invisible to electronic devices such as cameras, turrets, and proximity mines. Energy Drain: Very Low$?zT?(??"u@S(zS2 OD`X՘3-3-Z NN@N(t&V::$::$2R=ׄX՘^P6^P^P+6^P ez-^PkJkJZiC@W @'`3Vp=l"$A  ]Energy Shield/mYPolyanilene capacitors below the skin absorb heat and electricity, reducing the damage received from flame, electrical, and plasma attacks.|n|nTECH ONE: Damage from energy attacks is reduced slightly.|n|nTECH TWO: Damage from energy attacks is reduced moderately.|n|nTECH THREE: Damage from energy attacks is reduced significantly.|n|nTECH FOUR: An agent is nearly invulnerable to damage from energy attacks.6]ZXWhen active, you only take 50% damage from flame and plasma attacks. Energy Drain: Low$L??>?"E@Q b|'@ZO[s']r ^]Zr .e r e?]?[r fZr f(r  w'Yv'p @[@j'LN:2a!~ a!~2- -K  d@g_ @G^ @@flnd'l^jhw:A*l%hl,ll:A l" oqro\@c@W'vJ'm$^3x&=l^P^P^PUB^P^P " $A  = Run Silent/mSThe necessary muscle movements for complete silence when walking or running are determined continuously with reactive kinematics equations produced by embedded nanocomputers.|n|nTECH ONE: Sound made while moving is reduced slightly.|n|nTECH TWO: Sound made while moving is reduced moderately.|n|nTECH THREE: Sound made while moving is reduced significantly.|n|nTECH FOUR: An agent is completely silent.6]CAWhen active, you do not make footstep sounds. Energy Drain: Low$@??>" {&y Z -F=y .ry * x .y Frx * ;x  h Zf& { pf, w a jf% Pf, k f, Gf, vf, Ef,  ;x fgy ,disconnect ~ @}@ASW 68Vz~s}S~S|P}S|}Engine.Console-Q'ConsoleChecker -- Received invalid client answer from. @B@V /HNppV.|V.@ j&U !a_::$ ::$_w.*sUAs-R'a A( n&@wd&r@b&GY&a*[™28JXq`y| | | kJ| | | | kJkJ| | | | kJkJX՘kJX՘kJ^PX՘X՘X՘X՘kJkJ>>>kJkJ>LX B v%lT32,NN NɅkJkJ^P^P6^P6^P^Pi%ʇkJkJkJ>Ѕ^P6^P^P6^PUB^P^P^Pi%ʅ^Pi%ʆ>NN111111111111sPPRX@}@TUXV@Y\@Z@|y @cZe]@cj r r@ O%\ Q32cXJE jxkJkJQkJkJhnt$@d%de@KhliGq@k5^%`6mZCkIf pl  $P"2q 2d s@Ljv|i\ E%b6w2&F9SEIEj$_,O2Myz^P^PX՘kJ)u)u)u)u)u)u)uDŽX՘X՘X՘X՘X՘X՘X՘X՘X՘NŒNŒNŒNŒNŒNŒNŒNŒNŒN„X՘ު ު ު ު ު NŒNު NŒNŒNު Nު NŒNު ު NŒNު NŒNŒNŒNŒNŒNŒNު ު ު ^Pi%ʌN„X՘ DIDIDI NŒNDINŒNŒNDINDINŒNDINŒNŒNŒNŒNŒNŒNDIDIDI^Pi%ʌN„X՘^PX՘^PX՘X՘]KDŽX՘^PX՘tX՘X՘NŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN„X՘^P"_h"3-NŒNŒNŒNŒNŒNŒNŒNŒNŒNŒNŒN ]\qQih$b$V ,N LJ Z$A M32,Bv |ckJkJ^P^P6^P6^P^Pi%ʇkJkJkJ>Ѕ^P6^P^P6^PUB^P^P^Pi%ʅ^Pi%ʆ>NN111111111111snD mM@CI$Ir @$IkDI!?^  ^ GI&q!O !r #W K#2NЅ^P6^P^P6^PUB^P^P^Pi%ʅ^Pi%ʆ>ЇkJkJ111111111111sHj"["f"-D_ - -M (F-\.FF?&Fr-F r-*F?%w.\*.\-F?&-M 'r-*-F--F-ppppp-(S-) killed F\~w~*~a/!$.~-.~{Oppppp-(S-) killed F\~~|\None=ppp- killed F.(!zz=ppp- killed F\(!zw-F @.F.--?%-?&.-X.-, %-?&-?&@-Z-F\-'-M (-M {-F-M {-F -FtC-F H  rsQ"M J"i_A"P2XWVX%XX6XW6XV6XX( t!XADE@b!@CQ!M!F!KI@S@ m w"2R) %i Q@p BUVW | j#2Y[ a ZX\]G yZ c  K O u#2fJ YL X՘X՘X\ hD t"2jDH% ~ k@ xs"2mc!M k l va r#2 oYM  %?X՘X՘kJkJQkJkJhnY $mDsvPd Aprokp2wɣɸOL bo#2ynѰ ^n2z?{kOT j|y!@*ABM~~{GHAHDLm NO@QHR@S| lmidf^`h\cda?;-w.*w.(a e_ `heh?i?h e_ e Mw.*i.ODw.*i.]D kg Mw.*f.ODw.*f.]Dw.*.-q9w.*.-YD[ gZ `dgd?f?d gZ hhX?!;-w.*w.(X uY?;-w.*w.(Y k^+ zw^*U?s-w.*U. ' sUU?UL[Pw^*^-Y.wY*Y b!M$sr^^a/!.N::$^4 D?U.QzDj[ Qb^?Uzzw^ w^::$^4 D?U.QzDj[- Qb^?Uz::$w.^*z-^a/!#^a/!-.^:Qbw.*w.^*.?U.  aclass MMSpeedFix extends Info config(MiniMTL); var config int CheckTicks; var config float Tolerance; var config bool bPlayerSideLogging; var config float UpperTimeDilation; var float cTime; var int counter; replication { reliable if (Role == ROLE_Authority) SendServerTime, bPlayerSideLogging, UpperTimeDilation; } simulated function PostBeginPlay() { log("MiniMTL: Speed fix init."); } simulated function Tick(float DeltaTime) { cTime += DeltaTime; if (Role == ROLE_Authority) { if (CheckTicks < 10) { CheckTicks = 10; SaveConfig(); } counter++; if (counter >= CheckTicks) { if (Tolerance > 0.500) { Tolerance = 0.500; SaveConfig(); } else if (Tolerance < 0.001) { Tolerance = 0.001; SaveConfig(); } SendServerTime(cTime, Tolerance); counter = 0; cTime = 0.0; } } } simulated function SendServerTime(float STime, float t) { if (Role < ROLE_Authority) { if ((STime > (cTime + t)) || (STime < (cTime - t))) SpeedFix(STime / cTime); cTime = 0; } } simulated function SpeedFix(float ddil) { ddil = FClamp(ddil, 0.1, 10.0); Level.TimeDilation *= ddil; Level.TimeDilation = FClamp(Level.TimeDilation, 0.05, UpperTimeDilation); if (bPlayerSideLogging) log("MiniMTL: Time dilated to: " $ Level.TimeDilation); } }rjP}bh]^k.Y``wk*h?\ka   p{ l <M{ .YKw{ *& &{ a % %{ a  viOo BW "%i @ =&i @  tU{V `l\lQ>n?l \V  wk{`F -^rkkwk*ka/!|-_.k-i-^-_(.kTrk-^-_.k .k~  PlL YL::$A-t~l>~C~rL~u l  yoRA=%;w.*.-z '(  Tw  T. UTnn Uի>TmիL?n6n 6mZ ..w.* .-] *w.*wZ **Z  =Z -.!Q n '.!Q n ( w] *]  ծ?,?,ZTկ?, ?,U6]  '( \ Mw.*n.ODw.*n.]D n qbN)ob0e^?,]?, A@ b+e^?,]@A  }[Mt[0eZ?,Y?, @@ [0eZ?,Y?, ?@  ~ULnU+eT?,R`A@ U/eT?&R?,@PA  vIMMm %-'*vMN-Owv*a:%w&}%-'w.*.mv JK;J0eD?,~?,@@  tV'/-{Bt[jt}RBt[jtuzt[h(::$t ]E n EoRA=%;w.*.-z '(  Iw  I. MKqW Mի>KoիL?q6W 6os ..w.* .-} *sws **s  =s -.!Q W '.!Q W (w} *}  ծ?,?,ZKկ?, ?,M6}  '( {W KG /==@w.*@--(q!C-'a!l = -za/!$.E{"::${@"a/!$. #<- -z.-(-'-(-( ::$ ::$ ::$6-w.*. "-N${Dq!X ;-::$ -z-(-(q!C-'/a/!.E~ N k-a:.%%Ww.*8 ^q!Whq!W- :%% LJC(sS8%a 6%a I `@Mm %-'*I @A-BwI *I a!w r:%w&%-'w.*.mI  R2 B@-%%%, %,b Q 3E !Y E !a E !g DE !x ::$E !C-a $ D-'|a  "@w|*|>|@|>|-'| A|-(|-'|?| A| | |a* -'wv*avv09 vF]2 TE X2 NL-,,&b E class MMSpectatorStartPoints extends Actor; struct MapIndex { var string MapName; var int index; }; struct DefSpecPosAndRot { var vector Location; var int RotSlope; }; var MapIndex Indexes[10]; var config DefSpecPosAndRot MapSpecs[7]; static function bool GetSpectatorStartPoint(string map, out vector vect, out rotator rot) { local int i; for (i = 0; i < arrayCount(default.Indexes); i++) { if (default.Indexes[i].MapName ~= map) { vect = default.MapSpecs[default.Indexes[i].index].Location; rot.Pitch = (-3200) * default.MapSpecs[default.Indexes[i].index].RotSlope; return true; } } return false; } PI ?I  ::$I 0- r*.::$::$-'+w*w.*+w..*:.-'++.--'i-i-I ?%>>dD@@@?%I ?%-'-(RDR>R>R ARARR?,iRr*/a6 k?,wkl k l ?%k + ? A10ii::$::$OiwO*-S(ROa/!|k.Ourk-S'k--S'w.k* :k-S'k c ,-S'm-Soa}|k 'ero*r.okm-S'R-Sl k Rl R?%pk + p?p@? @R?k + @?@@OO$I @?j=?j>j?  jdD??'-09=-  a@?j=?j>j?::$ ::$::$ jj?   F[2 k@gZf k>5wO*pp\mod\miniMTLOE < BK PWK d K d$K eEFQPtE?,NpFK ePNEFQ ~!class MMSpark extends Spark; pc] /==@w.*@--(q!C-'a!l = -}a/!$.E~"::$~@"a/!$. #<- -}.-(-'-(-( ::$ ::$ ::$6-w.*. "-N$~Dq!X ;-::$ -}-(-(q!C-'/a/!.E~ N k-a:.%%Ww.*8 ^q!Whq!W- :%% /class MMSniperTracer extends SniperTracer; naC(of 3R !Y R !a R !g DR !x ::$R !C-a $ D-'ua  "@wu*u>u@u>u-'u Au-(u-'u?u Au u ua* -'wl*all09 l |mJh rm*%L %o%o-z+6o:m8-z+6o:mL oL  oSL &oL  iR Cff(d&-xBekf@Bekf~b::$f de n+class MMSmokeTrail extends SmokeTrail; eV @V ::$V 0- r*.::$::$-'+w*w.*+w..*:.-'++.--'--V ?%>>dD@@@?%V ?%-'-(UDU>U>U AUAUU?,Ur*/a6 o?,woPo P?%o + ? A10l::$::$QiwQ*-V(RQa/!$o.Quro-V'o--V'w.o* :o-V'o c ,-V'm-V_auro 'er_*r._om-V'R-VPo RPR?%`o + `?`@? @R?o + @?@@QQ$/a6 W ?,wW *W ?,(wW PW  P?%?10V -@?d =cX?d >cd ?d dD??-09 }sS8%a 6%a WMclass MMSkillManager extends SkillManager; var byte SkillLevels[11]; var const float SkillWeaponValues[4]; var const float SkillDemolitionValues[4]; var const float SkillEnviroValues[4]; var const float SkillTechValues[4]; var const float SkillMedValues[4]; var const float SkillCompValues[4]; var const float SkillSwimValues[4]; var const int SkillCosts[11]; replication { //variables server to client reliable if ((Role == ROLE_Authority) && (bNetOwner)) SkillLevels; reliable if (Role < ROLE_Authority) IncLevel; } static function int GetSkillGroupByClass(class sclass) { local int i; for (i = 0; i < 10; i++) if (default.skillClasses[i] == sclass) return ((i + 1) % 10); return -1; } simulated function bool IsPurchasePossible() { local int skillIndex; for(skillIndex=0; skillIndex= SkillCosts[skillIndex]) return true; } return false; } simulated function string GetSkillClassNameByIndex(byte index) { if (index >= ArrayCount(skillClasses)) return ""; if (index == 7) return class(skillClasses[index]).default.MultitoolString; else return skillClasses[index].default.SkillName; } simulated function string GetSkillClassNameByClass(class cskill) { if (class(cskill) != none) return class(cskill).default.MultitoolString; else return cskill.default.SkillName; } function IncLevel(byte sindex) { if (sindex >= ArrayCount(SkillLevels)) return; if (SkillLevels[sindex] < 3) { if (player.SkillPointsAvail >= SkillCosts[sindex]) { player.SkillPointsAvail -= SkillCosts[sindex]; SkillLevels[sindex]++; if (sindex == 5) SkillLevels[10]++; // if enviro, upgrade swimming too } } } function CreateSkills(DeusExPlayer newPlayer) { FirstSkill = None; player = newPlayer; ResetSkills(); } function bool SkillUse(class sclass) { local bool bDoIt; bDoIt = True; if (sclass.default.itemNeeded != None) { bDoIt = False; if ((Player.inHand != None) && (Player.inHand.Class == sclass.default.itemNeeded)) { SkilledTool(Player.inHand).PlayUseAnim(); // alert NPCs that I'm messing with stuff if (Player.FrobTarget != None) if (Player.FrobTarget.bOwned) Player.FrobTarget.AISendEvent('MegaFutz', EAITYPE_Visual); bDoIt = True; } } return bDoIt; } simulated function bool IsSkilled(class SkillClass, int TestLevel) { local int skillIndex; for(skillIndex=0; skillIndex= TestLevel) { Player.ClientMessage(SuccessMessage); return True; } else Player.ClientMessage(Sprintf(NoSkillMessage, skillClasses[skillIndex].default.SkillName, GetItemName(String(skillClasses[skillIndex].default.itemNeeded)))); } else Player.ClientMessage(Sprintf(NoToolMessage, GetItemName(String(skillClasses[skillIndex].default.itemNeeded)))); break; } } return False; } simulated function Skill GetSkillFromClass(class SkillClass) { return none; } simulated function float GetSkillLevelValue(class SkillClass) { local int skillIndex; for(skillIndex=0; skillIndexv@v>v-'v Av-(v-'v?v Av v va* -'w^*a^^09 ^ J dThd}6vdeGa}I` q=>deIa Ga}]6v?%}00deGa}` ?G?deGa}}pSD6vde~a}I}G?~deIa ~a})6v?%de~a|` ?~?}pSD6vde~a}I|G?~deIa ~a}6v?%de~a{` +?~?}pSD6vde~a}I{G?~deIa ~a} ~` j Ul&::$U} nB @ za @a ::$a 0- r*.::$::$-'+w*w.*+w..*:.-'++.--'--a ?%>>dD@@@?%a ?%-'-(WDW>W>W AWAWW?,Wr*/a6 p?,wpRp R?%p + ? A10l::$::$SiwS*-Z(RSa/!$p.Surp-Z'p--Z'w.p* :p-Z'p c ,-Z'm-ZUaihp 'erU*r.Upm-Z'R-ZRp RRR?%Wp + W?W@? @R?p + @?@@SS$/a6 d ?,wd *d ?,(wd Rd  R?%?10a -@?\ =cX?\ >c\ ?\ dD??-09 F W-class MMShellCasing extends ShellCasing; C G H W R {Mi `x{eRMNJq=>{eN{RM{eRMIDNJGa>{eN{RMID{eRMNJ?{eN{RM{eRMNJ?{eN{RM{eRMNJ+?{eN{RM{eRMPingNJp=?{eN{RMPing{ !,,,{NeGa>J{MNRGa>J??  S class MMRocketLAW extends RocketLAW; auto simulated state Flying { simulated function ProcessTouch (Actor Other, Vector HitLocation) { if (bStuck) return; if ((Other != instigator) && (DeusExProjectile(Other) == None) && (Other != Owner)) { damagee = Other; Explode(HitLocation, Normal(HitLocation-damagee.Location)); if (Role == ROLE_Authority) { if (bBlood && miniMTLPlayer(damagee) != none) miniMTLPlayer(damagee).SpawnBloodFromProjectile(HitLocation, Normal(HitLocation - damagee.Location), Damage); } } } } mclass MMTeamBalancer extends Actor config(MiniMTL); var() config bool bEnabled; var() config bool bSwapNewPlayersFirst; var() config float CheckTime; var() config int MaxDifference; var() config float MessageTime; var bool bDoBalance; var bool bInit; function PostBeginPlay() { if (bInit) return; bInit = true; bDoBalance = false; if (MaxDifference < 0) MaxDifference = 1; if (CheckTime < 0) CheckTime = 15.0; log("TeamBalancer is active.", 'miniMTL'); SaveConfig(); SetTimer(CheckTime, True); } function Timer() { local int Diff; local string Text; if (DeathMatchGame(Level.Game) != None) return; if (bEnabled == false) return; // check balance Diff = CheckBalance(); if (Diff == 0) { bDoBalance = false; return; } // if bDoBalance is true if (bDoBalance == true) { // do balancing BalanceTeams(Diff); // change bDoBalance to false so next time we only check teams bDoBalance = false; } else { Text = "Auto balancing teams in "$int(CheckTime)$" seconds."; PrintToAll(Text, false); // just change bDoBalance to true, so we balance teams next time bDoBalance = true; } } function int CheckBalance() { local int NSF, UNATCO, i; local Pawn P; NSF = 0; UNATCO = 0; // count number of UNATCO and number of NSF players P = Level.PawnList; while (i < Level.Game.NumPlayers) { if (P.IsA('PlayerPawn')) { if (!P.PlayerReplicationInfo.bIsSpectator) { if (P.PlayerReplicationInfo.Team == 0) UNATCO++; else if (P.PlayerReplicationInfo.Team == 1) NSF++; } i++; } P = P.nextPawn; } // equal teams or 1 player on server, return 0 if (UNATCO == NSF || (UNATCO + NSF) == 1) return 0; // if MaxDifference == 0 and number of NSF and UNATCO players // differs for 1, do balance depending on team scores //else if (MaxDifference == 0 && ((UNATCO + 1) == NSF || (NSF + 1) == UNATCO)) // return CheckTotalScore(UNATCO - NSF); //// greater difference than UNATCO +-1 == NSF, so we need to switch some players //else if (MaxDifference == 0) // return ((UNATCO - NSF) / 2); // depending on MaxDifference in number of players on each side if (MaxDifference > 0 && ((NSF + MaxDifference) < UNATCO || (UNATCO + MaxDifference) < NSF)) return ((UNATCO - NSF) / 2); // other unknown combination??? else return 0; } function int CheckTotalScore(int N) { local int NSFScore, UNATCOScore, i; local Pawn P; NSFScore = 0; UNATCOScore = 0; // count NSF and UNATCO total scores P = Level.PawnList; while (i < Level.Game.NumPlayers) { if (P.IsA('PlayerPawn')) { if (P.PlayerReplicationInfo.Team == 0) UNATCOScore += int(P.PlayerReplicationInfo.Score); else if (P.PlayerReplicationInfo.Team == 1) NSFScore += int(P.PlayerReplicationInfo.Score); i++; } P = P.nextPawn; } // equal scores, no balancing needed if (UNATCOScore == NSFScore) return 0; // if unatco has higher score and more players else if (UNATCOScore > NSFScore && N > 0) return 1; // if nsf has higher score and more players else if (NSFScore > UNATCOScore && N < 0) return -1; // other combination, dont do balancing! else return 0; } function BalanceTeams(int D) { local int RemainingToSwap, i, MaxFrags, sw; local Pawn P; // D can be negative, but we need positive RemainingToSwap if (D > 0) RemainingToSwap = D; else if (D < 0) RemainingToSwap = (D)*(-1); else // should never happen return; if (bSwapNewPlayersFirst) { // check for new players and swap them sw = SwapPlayers(D, 0); RemainingToSwap -= sw; if (D > 0) D -= sw; else if (D < 0) D += sw; } if (RemainingToSwap == 0) return; // find top player, so we dont swap him P = Level.PawnList; MaxFrags = 0; i = 0; while (i < Level.Game.NumPlayers) { if (P.IsA('PlayerPawn')) { if (!P.PlayerReplicationInfo.bIsSpectator) { if (D > 0 && P.PlayerReplicationInfo.Team == 0) { // assign new MaxFrags if we find player with higher score if (P.PlayerReplicationInfo.Score > MaxFrags) MaxFrags = int(P.PlayerReplicationInfo.Score); } else if (D < 0 && P.PlayerReplicationInfo.Team == 1) { // assign new MaxFrags if we find player with higher score if (P.PlayerReplicationInfo.Score > MaxFrags) MaxFrags = int(P.PlayerReplicationInfo.Score); } } i++; } P = P.nextPawn; } // security check (in case of map begins and all players have score 0 // set MaxFrags to 1 and just swap first appropriate player(s) if (MaxFrags == 0) MaxFrags = 1; // swap other players RemainingToSwap -= SwapPlayers(D, MaxFrags); // ooops, not all players could be swapped if (RemainingToSwap > 0) log("TeamBalancer: Failed to swap all needed player(s).", 'miniMTL'); } function int SwapPlayers(int N, int Frags) { local int i, Swapped; local Pawn P; local MMPRI mmp; Swapped = 0; i = 0; P = Level.PawnList; while (i < Level.Game.NumPlayers && N != 0) { if (P.IsA('PlayerPawn')) { mmp = MMPRI(P.PlayerReplicationInfo); if (mmp != none && !mmp.bIsSpectator && mmp.Flag == none) { if (Frags > 0 || (P.PlayerReplicationInfo.Score == 0 && P.PlayerReplicationInfo.Deaths == 0)) { // if N > 0: swap to NSF // if N < 0: swap to UNATCO if (N > 0 && P.PlayerReplicationInfo.Team == 0 && (P.PlayerReplicationInfo.Score < Frags || Frags == 0)) { SwapPlayer(P, 1); Swapped++; N--; } else if (N < 0 && P.PlayerReplicationInfo.Team == 1 && P.PlayerReplicationInfo.Score < Frags || Frags == 0) { SwapPlayer(P, 0); Swapped++; N++; } } } i++; } P = P.nextPawn; } return Swapped; } function SwapPlayer(Pawn P, int T) { local NavigationPoint startSpot; local bool foundStart; local miniMTLPlayer DxP; local string Text, TP; DxP = miniMTLPlayer(P); Text = "TeamBalance: Swapping player " $DxP.PlayerReplicationInfo.PlayerName$ " ("$DxP.PlayerReplicationInfo.PlayerID$") to "; TP = "You have been swapped to "; if (T == 0) { Text = Text$"UNATCO side."; TP = TP$"UNATCO side."; } else { Text = Text$"NSF side."; TP = TP$"NSF side."; } PrintToAll(Text, true); DxP.PlayerReplicationInfo.Team = T; UpdateSkin(DxP, T); DxP.ClientSetTeam(T); startSpot = Level.Game.FindPlayerStart(DxP, 255); if (startSpot != none) { foundStart = DxP.SetLocation(startSpot.Location); if (foundStart) { DxP.SetRotation(startSpot.Rotation); DxP.ViewRotation = DxP.Rotation; DxP.Acceleration = vect(0,0,0); DxP.Velocity = vect(0,0,0); DxP.ClientSetLocation(startSpot.Location, startSpot.Rotation); } } PrintToPlayer(DxP, TP); } static function bool UpdateSkin(DeusExPlayer P, int NewTeam) { local int iSkin; if (NewTeam == 0) { for (iSkin = 0; iSkin < ArrayCount(P.MultiSkins); iSkin++) { P.MultiSkins[iSkin] = class'mpunatco'.Default.MultiSkins[iSkin]; } P.Mesh = class'mpunatco'.Default.Mesh; return true; } else if (NewTeam == 1) { for (iSkin = 0; iSkin < ArrayCount(P.MultiSkins); iSkin++) { P.MultiSkins[iSkin] = class'mpnsf'.Default.MultiSkins[iSkin]; } P.Mesh = class'mpnsf'.Default.Mesh; return true; } else return false; } function PrintToAll(string TextToSay, bool uplink) { local int i; local Pawn P; local miniMTLPlayer mmp; local color rgb; rgb.G = 255; // print text to all clients P = Level.PawnList; while (i < Level.Game.NumPlayers) { if (P.IsA('PlayerPawn')) { if (uplink) P.ClientMessage(TextToSay, , true); else { mmp = miniMTLPlayer(P); if (mmp != none) mmp.ShowNotification(TextToSay, MessageTime, rgb); } i++; } P = P.nextPawn; } } function PrintToPlayer(DeusExPlayer dxp, string Message) { local miniMTLPlayer mmp; local color rgb; rgb.G = 255; mmp = miniMTLPlayer(dxp); if (mmp != none) mmp.ShowNotification(Message, MessageTime, rgb); } M class MMRocket extends Rocket; auto simulated state Flying { simulated function ProcessTouch (Actor Other, Vector HitLocation) { if (bStuck) return; if ((Other != instigator) && (DeusExProjectile(Other) == None) && (Other != Owner)) { damagee = Other; Explode(HitLocation, Normal(HitLocation-damagee.Location)); if (Role == ROLE_Authority) { if (bBlood && miniMTLPlayer(damagee) != none) miniMTLPlayer(damagee).SpawnBloodFromProjectile(HitLocation, Normal(HitLocation - damagee.Location), Damage); } } } } yegR-!e$? E P NMX j - wX r.X * wX X 0R R  ::$-w.*.'yR R   [ d+zwd*W?s-w.*W. ' sWW?WLGPwd*d-H.wH*H b!M$srdda/!.N::$d4 D?W.{zDOG {Cd?Wzzwd wd::$d4 D?W.{zDOG- {Cd?Wz::$w.d*z-da/!#da/!-.d:{Cw.*w.d*.?W.   d C]PA]Se%QeC&SeNe&NCt6N6SSN6N6S#6N6SSNN2BSS SeS e eBe e T NGN j - wN r.N * wN N 0L L  ::$-w.*.'yL L   N V D- . X NYF j - wF r.F * wF F 0} }  ::$-w.*.'y} }   U dbr.|L%xL, nwL*nLd.LL* _ c?!Q;-w.*w.(c b hw.*.-q9w.*.-Yb wSHBdKSVWb{x[PSppx[ xwVW a lw.*.-q9w.*.-Ya f ` `yXy>w?y X` D hw.*.-q9w.*.-YD D ` b N#dn j - wn r.n * wn n 0k k  ::$-w.*.'yk k   Lt OK8Y8OeDNPingO !,,,TG p=?DGa>G O2eGa>G I T?? I _WpppppppServer: 6Qb Map: 6Mb Players: S6Ob/S6NbO &,,,OeDNWTTD?,O*eG Ga>TI DNWI N?,WpppMiniMTL version:  E  Current time: LOeDNWO*eG Ga>TI DNW  Y F{ / Q.wQ*JwQ*QeQ.Qe bQFQe$$Fa fF] X Mw.*w.ODw.*w.]D V] uG_m m ,Pm %m ,7ud$u !,,,uAe[?, ?,ZL?BBBB  h hF`|N.hOwN*wNX*GD`avwN*N-vh-ioppStarting to play... Wait SDhm h seconds.D &,,,Dd DejfoJ`?j?Naff&?DeJNjfo/a0 dy:hdTDdDd2da!i2_ed XJNHDdhJNx_ed JNIDdhJN10 k pzz$A h'M-IBA ppA-IBA pp*-I::$a A::$p nA  nB!P r#DX* yN'class MMRockchip extends Rockchip; ;TqJP %BP , 8rP TD?P &?, P   wi SB9B#QwSQ-::$ED-t~rO~u P a@n s p'@YR %UR , &K:R ;,R B'R ( R _!q L'+X!, a0)aappaS:o, apa0apaSa r X ^4ZS:X ,;:X ,:X  Q:X  e GM 1 Ga TG @u @\<n8'w@*@ 6@ v NK:2>t MCI[NII B @x UbB:U,  ::U;,:UB:UB:U;:U,, ; #class MMTracer extends Tracer; { PWQ*Pk o PEK$Initializing CTF flags...!/a0 QQ!PQ !]%A@%Q Q !J &A@&Q 10P%P,rPA*IVsI~I.P%P,|6QPXs^P%PA@P6RPXPA@P6SPXPrPA*ERROR: Not enough flag spawn points set!! n(P%PA[UNATCOPA[NSFPATEOPAPPAFCTF: %s = %sVPAPA!P } HoZ-e 'wH*-e (w*(rH. ~ w*- b!Q$-e '-e  Aclass MMWeaponAssaultGun extends WeaponAssaultGun; var float lastShotTime; var float ffrtolerance; //var float clientLastShotTime; //var float clfiredelay; var bool lastTooFast; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; } /*simulated state ClientFiring2 { Begin: Sleep(clfiredelay); ClientReFire(0); } simulated function ClientReFire( float value ) { local float diff; diff = Level.TimeSeconds - clientLastShotTime; if (diff < ShotTime) { clfiredelay = ShotTime - diff; GotoState('ClientFiring2'); return; } super.ClientReFire(value); } simulated state ClientFiring { simulated function AnimEnd() { bInProcess = False; if (bAutomatic) { if ((Pawn(Owner).bFire != 0) && (AmmoType.AmmoAmount > 0)) { if (PlayerPawn(Owner) != None) ClientReFire(0); else GotoState('SimFinishFire'); } else GotoState('SimFinishFire'); } } simulated function float GetSimShotTime() { local float mult, sTime; if (ScriptedPawn(Owner) != None) return ShotTime * (ScriptedPawn(Owner).BaseAccuracy*2+1); else { // AugCombat decreases shot time mult = 1.0; if (bHandToHand && DeusExPlayer(Owner) != None) { mult = 1.0 / DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } sTime = ShotTime * mult; return (sTime); } } Begin: clientLastShotTime = Level.TimeSeconds; if ((ClipCount >= ReloadCount) && (ReloadCount != 0)) { if (!bAutomatic) { bFiring = False; FinishAnim(); } if (Owner != None) { if (Owner.IsA('DeusExPlayer')) { bFiring = False; if (DeusExPlayer(Owner).bAutoReload) { bClientReadyToFire = False; bInProcess = False; if ((AmmoType.AmmoAmount == 0) && (AmmoName != AmmoNames[0])) CycleAmmo(); ReloadAmmo(); GotoState('SimQuickFinish'); } else { if (bHasMuzzleFlash) EraseMuzzleFlashTexture(); IdleFunction(); GotoState('SimQuickFinish'); } } else if (Owner.IsA('ScriptedPawn')) { bFiring = False; } } else { if (bHasMuzzleFlash) EraseMuzzleFlashTexture(); IdleFunction(); GotoState('SimQuickFinish'); } } Sleep(GetSimShotTime()); if (bAutomatic) { SimGenerateBullet(); Goto('Begin'); } bFiring = False; FinishAnim(); bInProcess = False; Done: bInProcess = False; bFiring = False; SimFinish(); } simulated function SimGenerateBullet() { if ( Role < ROLE_Authority ) { if ((ClipCount < ReloadCount) && (ReloadCount != 0)) { if ( AmmoType != None ) AmmoType.SimUseAmmo(); if ( bInstantHit ) TraceFire(currentAccuracy); else ProjectileFire(ProjectileClass, ProjectileSpeed, bWarnTarget); SimClipCount++; clientLastShotTime = Level.TimeSeconds; ServerGenerateBullet(); } else GotoState('SimFinishFire'); } }*/ // ugly fix!!! need to repair this one day in future function bool FireTooFast() { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 0.10 - (ffrtolerance / 2); //log("diff: " $ diff); if (diff < 0.0) { if (lastTooFast) { //log("too fast fire"); return true; } lastTooFast = true; } else lastTooFast = false; lastShotTime = Level.TimeSeconds; return false; } function Fire(float Value) { if (FireTooFast()) return; super.Fire(value); } function ServerGenerateBullet() { if (FireTooFast()) return; super.ServerGenerateBullet(); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } simulated function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local float mult; local name damageType; local DeusExPlayer dxPlayer; if (Other != None) { // AugCombat increases our damage if hand to hand mult = 1.0; if (bHandToHand && (DeusExPlayer(Owner) != None)) { mult = DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } // skill also affects our damage // GetWeaponSkill returns 0.0 to -0.7 (max skill/aug) mult += -2.0 * GetWeaponSkill(); // Determine damage type damageType = WeaponDamageType(); if (Other != None) { if (Other.bOwned) { dxPlayer = DeusExPlayer(Owner); if (dxPlayer != None) dxPlayer.AISendEvent('Futz', EAITYPE_Visual); } } if ((Other == Level) || (Other.IsA('Mover'))) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); } else if ((Other != self) && (Other != Owner)) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); if (bHandToHand) SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); if (Role == ROLE_Authority && miniMTLPlayer(Other) != none) { if (bPenetrating && Other.IsA('Pawn') && !Other.IsA('Robot')) miniMTLPlayer(Other).SpawnBloodFromWeapon(HitLocation, HitNormal); } } } if (DeusExMPGame(Level.Game) != None) { if (DeusExPlayer(Other) != None) DeusExMPGame(Level.Game).TrackWeapon(self,HitDamage * mult); else DeusExMPGame(Level.Game).TrackWeapon(self,0); } } simulated function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local Rotator rot; local actor Other; local float dist, alpha, degrade; local int i, numSlugs; local float volume, radius; // make noise if we are not silenced if (!bHasSilencer && !bHandToHand) { GetAIVolume(volume, radius); Owner.AISendEvent('WeaponFire', EAITYPE_Audio, volume, radius); Owner.AISendEvent('LoudNoise', EAITYPE_Audio, volume, radius); if (!Owner.IsA('PlayerPawn')) Owner.AISendEvent('Distress', EAITYPE_Audio, volume, radius); } GetAxes(Pawn(owner).ViewRotation,X,Y,Z); StartTrace = ComputeProjectileStart(X, Y, Z); AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False); // check to see if we are a shotgun-type weapon if (AreaOfEffect == AOE_Cone) numSlugs = 5; else numSlugs = 1; // if there is a scope, but the player isn't using it, decrease the accuracy // so there is an advantage to using the scope if (bHasScope && !bZoomed) Accuracy += 0.2; // if the laser sight is on, make this shot dead on // also, if the scope is on, zero the accuracy so the shake makes the shot inaccurate else if (bLasing || bZoomed) Accuracy = 0.0; for (i=0; i 0) && (Level.NetMode != NM_Standalone) && !(bHandToHand)) if (Accuracy < MinSpreadAcc) Accuracy = MinSpreadAcc; // Let handtohand weapons have a better swing if ((bHandToHand) && (NumSlugs > 1) && (Level.NetMode != NM_Standalone)) { StartTrace = ComputeProjectileStart(X,Y,Z); StartTrace = StartTrace + (numSlugs/2 - i) * SwingOffset; } EndTrace = StartTrace + Accuracy * (FRand()-0.5)*Y*1000 + Accuracy * (FRand()-0.5)*Z*1000 ; EndTrace += (FMax(1024.0, MaxRange) * vector(AdjustedAim)); Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); // randomly draw a tracer for relevant ammo types // don't draw tracers if we're zoomed in with a scope - looks stupid // DEUS_EX AMSD In multiplayer, draw tracers all the time. if ( ((Level.NetMode == NM_Standalone) && (!bZoomed && (numSlugs == 1) && (FRand() < 0.5))) || ((Level.NetMode != NM_Standalone) && (Role == ROLE_Authority) && (numSlugs == 1)) ) { if ((AmmoName == Class'MMAmmo10mm') || (AmmoName == Class'MMAmmo3006') || (AmmoName == Class'MMAmmo762mm')) { if (VSize(HitLocation - StartTrace) > 250) { rot = Rotator(EndTrace - StartTrace); if ((Level.NetMode != NM_Standalone) && (Self.IsA('WeaponRifle'))) Spawn(class'SniperTracer',,, StartTrace + 96 * Vector(rot), rot); else { if (Role == ROLE_Authority && miniMTLPlayer(Owner) != none) miniMTLPlayer(Owner).SpawnTracerFromWeapon(StartTrace + 96 * Vector(rot), rot); } } } } // check our range dist = Abs(VSize(HitLocation - Owner.Location)); if (dist <= AccurateRange) // we hit just fine ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); else if (dist <= MaxRange) { // simulate gravity by lowering the bullet's hit point // based on the owner's distance from the ground alpha = (dist - AccurateRange) / (MaxRange - AccurateRange); degrade = 0.5 * Square(alpha); HitLocation.Z += degrade * (Owner.Location.Z - Owner.CollisionHeight); ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); } } // otherwise we don't hit the target at all } e d!Ohg"U-|-OSSwS*z SSS&   Lp t8 B%B, rBLoBk:B;K "'@"BqVB,"qVBB( Qd,class MMWeaponAssaultShotgun extends WeaponAssaultShotgun; var float lastShotTime; var float ffrtolerance; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; } function Fire(float Value) { local float diff; //log("shot time: " $ Level.TimeSeconds); diff = Level.TimeSeconds - lastShotTime; diff -= 0.39 - ffrtolerance; //log("diff: " $ diff); if (diff < 0.0) { //log("too fast fire"); return; } lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } simulated function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local float mult; local name damageType; local DeusExPlayer dxPlayer; if (Other != None) { // AugCombat increases our damage if hand to hand mult = 1.0; if (bHandToHand && (DeusExPlayer(Owner) != None)) { mult = DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } // skill also affects our damage // GetWeaponSkill returns 0.0 to -0.7 (max skill/aug) mult += -2.0 * GetWeaponSkill(); // Determine damage type damageType = WeaponDamageType(); if (Other != None) { if (Other.bOwned) { dxPlayer = DeusExPlayer(Owner); if (dxPlayer != None) dxPlayer.AISendEvent('Futz', EAITYPE_Visual); } } if ((Other == Level) || (Other.IsA('Mover'))) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); } else if ((Other != self) && (Other != Owner)) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); if (bHandToHand) SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); if (Role == ROLE_Authority && miniMTLPlayer(Other) != none) { if (bPenetrating && Other.IsA('Pawn') && !Other.IsA('Robot')) miniMTLPlayer(Other).SpawnBloodFromWeapon(HitLocation, HitNormal); } } } if (DeusExMPGame(Level.Game) != None) { if (DeusExPlayer(Other) != None) DeusExMPGame(Level.Game).TrackWeapon(self,HitDamage * mult); else DeusExMPGame(Level.Game).TrackWeapon(self,0); } } Blclass MMPRI extends MTLPRI; var int SpectatingPlayerID; var miniMTLCTFFlag Flag; var bool bDead; var bool bModerator; replication { reliable if (Role == ROLE_Authority) SpectatingPlayerID, Flag, bDead, bModerator; } C!I!\ * J!H!J+ c%c, rcJc 3% 7& <, T,:c;^ l,:c;] ,:c;\ , ,:c;X ,:c;W , :c;V , :c;U c? m!Mon =- -SF H b!v$F H b!A$F H a/!b!B$F H . VIKuNVIK. w$tIuD0@(( ::$F,'F&L- -ML>kk--MB%;BFB%::$ -MM;- F&::$uNVIKuu?F,Bj uիM?I?իM?K?j D?9`.pGNj u9::$$- F& ?2::$ ::$ F&9r X r l  r W9Gu?,UPj u::$a/!Ka  u?,`9UU99::$w.*.Vu?,`9UUz G z ?`GN9IK11z ?dz ??c?d6Gc6 `GN9IKBr c}class MMNotifications extends Actor config(MiniMTL); var() config bool bEnabled; var() config float MessageTime; var() config float MessageDelay; var() config string Messages[64]; const tTime = 1.0; var bool bInit; var int iMsg; var float nextTime; function PostBeginPlay() { if (bInit) return; bInit = true; if (!bEnabled) return; nextTime = MessageDelay; log("Notifications are active.", 'miniMTL'); SaveConfig(); SetTimer(tTime, true); } function Timer() { if (!bEnabled) return; if (Level.TimeSeconds >= nextTime) { if (Messages[iMsg] != "") ShowNotification(); iMsg++; if (iMsg >= 64) iMsg = 0; if (Messages[iMsg] == "") iMsg = 0; nextTime += MessageTime + MessageDelay; } } function ShowNotification() { local Pawn P; local int i; local miniMTLPlayer mmp; local color rgb; P = Level.PawnList; rgb.G = 255; while (i < Level.Game.NumPlayers) { if (P.IsA('PlayerPawn')) { mmp = miniMTLPlayer(P); if (mmp != none) mmp.ShowNotification(Messages[iMsg], MessageTime, rgb); i++; } P = P.nextPawn; } } K!I|GM %?M , 5rM I<M ;M  0M  y (34 a Ria Q2::$v O!T!q   S!Hl H ~ G@)Ra vwR*RTGCTF: Flag spawned %s at %s for team %iVRXR SG!CTF: Failed to spawn flag at %s for team %iXvSG!R  U!q r -q %+q , q ;$q  R!wb"4/a0 { \[{ !q w{  b {  -L'\10-LvVJv~v. y[Jwb a wa+b b   W!r kNr %Lr , r ;=:=.,r  R _?class MMNextMap extends Mutator config(MiniMTL); var config bool bCountSpectators; var config int NextMap; var config string Maps[32]; var config int MinPlayerCount[32]; var config int MaxPlayerCount[32]; var config int ScoreToWin[32]; var config string VictoryCondition[32]; var bool bInt; var bool bDone; var int LoadingTime; var string ForcedNextMap; function PostBeginPlay() { if (bInt) return; bInt = true; bDone = false; log("NextMap mutator is active.", 'MiniMTL'); SetTimer(1, true); SaveConfig(); Super.PostBeginPlay(); } function Timer() { local miniMTLPlayer playermm; if ((DeusExMPGame(Level.Game) != None) && DeusExMPGame(Level.Game).bNewMap) { if (!bDone) { Level.Game.SetTimer(0, false); LoadingTime = 0; bDone = true; } if (bDone) { if (miniMTLTeam(Level.Game) != none) miniMTLTeam(Level.Game).NextMapText = GetNextMap(); else if (miniMTLDeathMatch(Level.Game) != none) miniMTLDeathMatch(Level.Game).NextMapText = GetNextMap(); } if (LoadingTime++ == 11) { LoadNextMap(); SetTimer(0, false); } } } function int GetNumberOfPlayers() { local Pawn P; local int c; if (bCountSpectators) return Level.Game.GameReplicationInfo.NumPlayers; else { P = Level.PawnList; c = 0; while (P != none) { if (PlayerPawn(P) != none && !PlayerPawn(P).PlayerReplicationInfo.bIsSpectator) c++; P = P.nextPawn; } return c; } } function string GetNextMap() { local int nump, oldnm; local int localNextMap; if (ForcedNextMap != "") { return ForcedNextMap; } localNextMap = NextMap; nump = GetNumberOfPlayers(); oldnm = localNextMap; localNextMap++; while (true) { if (localNextMap >= 32) localNextMap = 0; if (Maps[localNextMap] == "") localNextMap = 0; if (localNextMap == oldnm) { return ""; } if (MinPlayerCount[localNextMap] != 0 && nump < MinPlayerCount[localNextMap]) { // skip this map - too little players to play it localNextMap++; continue; } if (MaxPlayerCount[localNextMap] != 0 && nump > MaxPlayerCount[localNextMap]) { // skip this map - too many players to play it localNextMap++; continue; } break; } return Maps[localNextMap]; } function LoadNextMap() { local int nump, oldnm; if (ForcedNextMap != "") { Level.ServerTravel(ForcedNextMap, false); return; } nump = GetNumberOfPlayers(); oldnm = NextMap; NextMap++; while (true) { if (NextMap >= 32) NextMap = 0; if (Maps[NextMap] == "") NextMap = 0; if (NextMap == oldnm) { log("NextMap mutator is not properly configured. Check config!", 'MiniMTL'); Level.ServerTravel("", false); return; } if (MinPlayerCount[NextMap] != 0 && nump < MinPlayerCount[NextMap]) { // skip this map - too little players to play it NextMap++; continue; } if (MaxPlayerCount[NextMap] != 0 && nump > MaxPlayerCount[NextMap]) { // skip this map - too many players to play it NextMap++; continue; } break; } if (ScoreToWin[NextMap] > 0.0) { DeusExMPGame(Level.Game).ScoreToWin = ScoreToWin[NextMap]; Level.Game.SaveConfig(); } if (VictoryCondition[NextMap] ~= "Time" || VictoryCondition[NextMap] ~= "Frags") { DeusExMPGame(Level.Game).VictoryCondition = VictoryCondition[NextMap]; Level.Game.SaveConfig(); } SaveConfig(); Level.ServerTravel(Maps[NextMap], false); } function Mutate(string S, PlayerPawn P) { local miniMTLPlayer dxp; Super.Mutate(S, P); dxp = miniMTLPlayer(P); if (P != None) { if ((dxp.bModerator || dxp.bAdmin) && S ~= "nextmap") { LoadNextMap(); } else if (dxp.bAdmin && S ~= "clearnextmap") { ForcedNextMap = ""; P.ClientMessage("Next map setting cleared!", , true); } else if (dxp.bAdmin && Left(S, InStr(S, " ")) ~= "setnextmap") { ForcedNextMap = Right(S, Len(S) - InStr(S, " ")); P.ClientMessage("Next map set to: " $ ForcedNextMap, , true); } } } \!W*{6%]!B1p++kJkJkJkJкIkJkJкIkJkJкIЙ҇kJ+6>ЇkJkJkJкIkJkJQkJkJhn B class MMNetSpeed extends Info; var miniMTLSettings SettingsRef; var miniMTLPlayer PlayerToMod; function PostBeginPlay() { if (miniMTLDeathMatch(Level.Game) != none) SettingsRef = miniMTLDeathMatch(Level.Game).Settings; else if (miniMTLTeam(Level.Game) != none) SettingsRef = miniMTLTeam(Level.Game).Settings; if (SettingsRef != none && SettingsRef.bForceNetSpeed) SetTimer(2.0, false); else Destroy(); } function Timer() { if (PlayerToMod != none) { if (PlayerToMod.Player.CurrentNetSpeed < SettingsRef.MinNetSpeed) PlayerToMod.SetPlayerNetSpeed(SettingsRef.MinNetSpeed); else if (PlayerToMod.Player.CurrentNetSpeed > SettingsRef.MaxNetSpeed) PlayerToMod.SetPlayerNetSpeed(SettingsRef.MaxNetSpeed); } Destroy(); } f!tP(5Utf d  TESTeGC JtCJt']CtF>td|(ttC@M(C?<:t%J HCL YJ HCJ d6YIHJt:tPC6Y6Y6Yt:tTY(ePing~D?D(p=?Ga>( !%,%:eGa>(?~?? > % C-6l  -f 6 t5-f dFdCT (#eS6 /e(Ga>S6 eTPing#eS6m  De(p=?T?S6m   -6y    [D]-6D    [F]{ e /e(q=>?,  I-6~   Adminhh-6D   Mod{  &%,,e (e(q=>?,x d  % C#-6l   -f 6 tp-f ddC 6 e #e(q=> #eS6 /e(Ga>S6 eTPing#eS6m  De(p=?T?S6m   -6~   Admin88-6D   Mod{  &%,,e (e(q=>?,x d6C   pSpectating: 6x     Spectator &%,,e (e(q=>?, d C?,EJt(]E :t%J HEJ Z &% J HEL Z %d6YIHJtZ PE6Y6Y6YtZ TY( !,%%:eGa>(?~?? > % EC -6l   CT (#eS6 /e(Ga>S6 eTPing#eS6m  De(p=?T?S6m    -6y    [D]  -6D    [F] { e /e(q=>?,  F -6~   Admine e -6D   Mod {  &%,,e (e(q=>?,x d   %- E -6l  #C 6 e #e(q=> #eS6 /e(Ga>S6 eTPing#eS6m  De(p=?T?S6m   -6~   Admin-6D   ModY{  &%,,e (e(q=>?,x d6C   pSpectating: 6x    Spectator &%,,e (e(q=>?, d  K?,CC( @`!a![!]$P!i_'".0 V!O C+O ?,^C9O ?^zCWO ? ^/CuO ?@^BO ? ^A^^ }CI3-pppppp(SC) D (E) X!yh<6,W![ Sy oclass MMMultiplayerMessageWin extends MultiplayerMessageWin; var float RespawnTime; var string RespawnString1, RespawnString2; var float oldlockoutTime; event InitWindow() { Super.InitWindow(); } function SetRespawnTime(float t) { oldlockoutTime = lockoutTime - 2.0; lockoutTime = Player.Level.Timeseconds + t; } event DrawWindow(GC gc) { local float w, h, x, y; local string str; super.DrawWindow(gc); if (( DeusExMPGame(Player.DXGame) != None ) && DeusExMPGame(Player.DXGame).bClientNewMap ) return; if (bKilled && Player.Level.Timeseconds < lockoutTime) { str = RespawnString1 $ string(int(lockoutTime - Player.Level.Timeseconds)) $ RespawnString2; gc.SetTextColor( whiteColor ); gc.SetFont(Font'FontMenuTitle'); gc.GetTextExtent( 0, w, h, str ); x = (width * 0.5) - (w * 0.5); y = height * 0.88; gc.DrawText( x, y, w, h, str ); if ( !Player.bKillerProfile && Player.killProfile.bValid && (!Player.killProfile.bKilledSelf)) { y += h; str = Detail1String $ curDetailKeyName $ Detail2String; gc.GetTextExtent( 0, w, h, str ); x = (width * 0.5) - (w * 0.5); gc.DrawText( x, y, w, h, str ); } } } event bool VirtualKeyPressed(EInputKey key, bool bRepeat) { local bool bKeyHandled; local String KeyName, Alias; bKeyHandled = False; if ((key == IK_F10) && (bDisplayProgress)) { Player.ConsoleCommand("CANCEL"); return True; } // Let them send chat messages KeyName = player.ConsoleCommand("KEYNAME "$key ); Alias = player.ConsoleCommand( "KEYBINDING "$KeyName ); if ( Alias ~= "Talk" ) Player.Player.Console.Talk(); else if ( Alias ~= "TeamTalk" ) Player.Player.Console.TeamTalk(); if ( Player.Level.Timeseconds < oldlockoutTime ) return True; if ( Alias ~= "KillerProfile" ) { Player.bKillerProfile = True; return True; } else return Super.VirtualKeyPressed(key, bRepeat); } Bw $* r* rK* q-AnK &K-'K %K-(K*K,K?B ^K.class MMWeaponCombatKnife extends WeaponCombatKnife; var float lastShotTime; var float ffrtolerance; var float CBPmpHitDamage; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; if ((miniMTLTeam(Level.Game) != none && miniMTLTeam(Level.Game).bCBP) || (miniMTLDeathMatch(Level.Game) != none && miniMTLDeathMatch(Level.Game).bCBP)) HitDamage = CBPmpHitDamage; } function Fire(float Value) { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 0.49 - ffrtolerance; if (diff < 0.0) return; lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } simulated function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local float mult; local name damageType; local DeusExPlayer dxPlayer; if (Other != None) { // AugCombat increases our damage if hand to hand mult = 1.0; if (bHandToHand && (DeusExPlayer(Owner) != None)) { mult = DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } // skill also affects our damage // GetWeaponSkill returns 0.0 to -0.7 (max skill/aug) mult += -2.0 * GetWeaponSkill(); // Determine damage type damageType = WeaponDamageType(); if (Other != None) { if (Other.bOwned) { dxPlayer = DeusExPlayer(Owner); if (dxPlayer != None) dxPlayer.AISendEvent('Futz', EAITYPE_Visual); } } if ((Other == Level) || (Other.IsA('Mover'))) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); } else if ((Other != self) && (Other != Owner)) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); if (bHandToHand) SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); if (Role == ROLE_Authority && miniMTLPlayer(Other) != none) { if (bPenetrating && Other.IsA('Pawn') && !Other.IsA('Robot')) miniMTLPlayer(Other).SpawnBloodFromWeapon(HitLocation, HitNormal); } } } if (DeusExMPGame(Level.Game) != None) { if (DeusExPlayer(Other) != None) DeusExMPGame(Level.Game).TrackWeapon(self,HitDamage * mult); else DeusExMPGame(Level.Game).TrackWeapon(self,0); } } i!@z6Lg r* rK* K--@K, u!c+zwc*_?s-w.*_. ' s__?_LHPwc*c-J.wJ*J b!M$srcca/!.N::$c4 D?_.S zDxH S sc?_zzwc wc::$c4 D?_.S zDxH- S sc?_z::$w.c*z-ca/!#ca/!-.c:S sw.*w.c*.?_.  l!TrCY r* rK* -wT*-U'K--UK,K T Xo!n! QVa A   q!QWwV*Va  r!Z_VZr* T %TT ,T ]ZT  x!~?!;-w.*w.(~ s!~k &$w*K. v!z]p> z {!{ `iAi>h?i A{  w!o v  y![Hz ZXw[*rK*~XwK*.cKm[-w A Mw.*h.ODw.*h.]Dw.*.-q9w.*.-YDx  e!_ Q &.v %r_ *T :@fHr_ *T :@fT :_ Q wQ *a .Q wa * wa _ c a  S c BPQ Q z/a0 k \T k T\k  XS D0PT k Tc k  XS QCc Qv v Q10v KL z!}u r* ::$ c}%},z:}*&- H}(:}*,H}'}3 %class MMMPlayerTrack extends Actor; var miniMTLPlayer MyPlayer; var miniMTLPlayer AttachedPlayer; var private float TimeSinceCloak; function Tick (float VAE) { MyPlayer = miniMTLPlayer(GetPlayerPawn()); if ((AttachedPlayer == None) || (MyPlayer == None) || (AttachedPlayer == MyPlayer)) { Destroy(); } else { HandleNintendoEffect(); HandlePlayerCloak(VAE); } } function HandleNintendoEffect() { if (AttachedPlayer.NintendoImmunityTimeLeft > 0.00) { AttachedPlayer.DrawInvulnShield(); if (AttachedPlayer.invulnSph != None) { AttachedPlayer.invulnSph.LifeSpan = AttachedPlayer.NintendoImmunityTimeLeft; } } else { if (AttachedPlayer.invulnSph != None) { AttachedPlayer.invulnSph.Destroy(); AttachedPlayer.invulnSph = None; } } } function HandlePlayerCloak(float VAE) { local DeusExRootWindow VAB; local Vector VC6; local float Z9E; if (AttachedPlayer.PlayerReplicationInfo != none && AttachedPlayer.PlayerReplicationInfo.bIsSpectator) { AttachedPlayer.KillShadow(); AttachedPlayer.bHidden = true; AttachedPlayer.ScaleGlow = 0.0; return; } TimeSinceCloak = Abs(TimeSinceCloak) + VAE; AttachedPlayer.bHidden = False; if (AttachedPlayer.MeshType == 0) { TimeSinceCloak = 0.00; AttachedPlayer.CreateShadow(); AttachedPlayer.ScaleGlow = AttachedPlayer.Default.ScaleGlow; return; } else { AttachedPlayer.KillShadow(); if (AttachedPlayer.MeshType >= 2) { AttachedPlayer.bHidden=True; return; } } if (((TeamDMGame(MyPlayer.DXGame) != None) && TeamDMGame(MyPlayer.DXGame).ArePlayersAllied(AttachedPlayer, MyPlayer)) || (MyPlayer.PlayerReplicationInfo.bIsSpectator && MyPlayer.bSpecEnemies)) { AttachedPlayer.ScaleGlow = 0.25; } else { AttachedPlayer.ScaleGlow = AttachedPlayer.Default.ScaleGlow * 0.01 / TimeSinceCloak; if (AttachedPlayer.ScaleGlow <= 0.02) { AttachedPlayer.ScaleGlow = 0.00; AttachedPlayer.bHidden = True; VAB=DeusExRootWindow(MyPlayer.RootWindow); if ((VAB != None) && (VAB.HUD != None) && (VAB.HUD.augDisplay != None) && VAB.HUD.augDisplay.bVisionActive) { VC6 = MyPlayer.Location; VC6.Z += MyPlayer.BaseEyeHeight; Z9E = VSize(AttachedPlayer.Location - VC6); if (Z9E <= VAB.HUD.augDisplay.visionLevelValue) { AttachedPlayer.bHidden = False; } } } } } }!@"r L r*%Z %DZ ,::Z *,aZ a Z  K"_J+ r_* n _bBrn *rn * %L %J %Y %Y , Z.Y n wZ*6Z6Z6Z6Z6:Z6Z6mSZ-6~SZ- -6lSZ--6DSZ-^ 4Z- :Z%L J 6CSZr-6y SZ-pwZX*-6D S'-6D S(Y ^Q6Qbn  6Ob6NbT^V6Mb^~^. g!`F7+.q!Z.U  !vlq v k C"F"n  G" E"uc.\X %TX ,JrX ruG:X *,,TX  |!oe4n.YDwn*:H na HH z}FF %G:H F K %E:H K ZH *o-' X mQ)%-6lS6CSf %f 6f 6CS6x S6f f M  H"b'- @%@,r@rbr@b:@*,r@ HRMr@ | RNr@ ^RO,@@ B"z"~w= @ DU09 w.*:.:$:.:$:.:$.q!W` L"ck|%|,r|rcr|cqr| HRMr| | RNr| ^RO,|| |Z"qMmq %-'*|qr-sw|*a:%w&}%-'w.*.m| Z class MMMOTD extends Info config(MiniMTL); var config string MOTDText[8]; replication { reliable if (ROLE == ROLE_Authority) OpenMenu; reliable if ((ROLE == ROLE_Authority) && (bNetOwner)) MOTDText; } function PostBeginPlay() { SaveConfig(); SetTimer(1.2, false); } function Timer() { local miniMTLPlayer mmp; mmp = miniMTLPlayer(Owner); if (mmp != none && mmp.PlayerReplicationInfo.bIsSpectator) { OpenMenu(mmp); } } simulated function OpenMenu(miniMTLPlayer P) { local DeusExRootWindow W; local MMEscWindow nw; P.ConsoleCommand("FLUSH"); W = DeusExRootWindow(P.RootWindow); nw = MMEscWindow(W.InvokeMenuScreen(Class'MMEscWindow')); if (nw != none) nw.SetMOTDText(MOTDText); } P"Ys -d@w*?%Y%Y,:Y*&-dkYY _Y6 O"n e;wjw.*j:.:$:.:$:.:$ n n T"F ILF %JF ,@:F *,F  AF  p W"lv+rV*WARNING: DummyAug is none!*\%\,r\rl:\*%Vb\V\2* i"X" //=@w.*@--(q!C-'a!l = -sa/!$.Ep"::$p@"a/!$. #<- -s.-(-'-(-( ::$ ::$ ::$6-w.*. "-N$pDq!X ;-::$ -s-(-(q!C-'/a/!.E~ \y4class MMMenuScreenAugSetup extends CBPMenuScreenAugSetup; function CreateAugButtons() { local int iButtonIndex; local bool bShiftRight; local class CurAug; local int i; for (i = 0; i < ArrayCount(class'MMAugmentationManager'.default.mpAugs) - 1; i++) { CurAug = class'MMAugmentationManager'.default.mpAugs[i]; iButtonIndex = (CurAug.default.mpConflictSlot - 3) * 2; bShiftRight = btnAugChoice[iButtonIndex] != None; if (bShiftRight) iButtonIndex++; if (btnAugChoice[iButtonIndex] == None) { btnAugChoice[iButtonIndex] = MenuUIChoiceButton(winClient.NewChild(Class'MenuUIChoiceButton')); btnaugChoice[iButtonIndex].SetButtonText(curAug.default.OldAugClass.default.augmentationName); // this name will be localized... better if (CurAug != class'MMAugAqualung') { if (!bShiftRight) { btnAugChoice[iButtonIndex].SetPos(6, 4 + 23 * (CurAug.default.mpConflictSlot - 2)); } else { btnAugChoice[iButtonIndex].SetPos(172, 4 + 23 * (CurAug.default.mpConflictSlot - 2)); } } else // Last button is aqualung, centered { btnAugChoice[iButtonIndex].SetPos(92, 4 + 23 * (CurAug.default.mpConflictSlot - 2)); } btnAugChoice[iButtonIndex].SetWidth(163); btnAugChoice[iButtonIndex].SetHelpText(curAug.default.OldAugClass.default.MPInfo); btnAugChoice[iButtonIndex].fontButtonText = font'FontMenuSmall'; ChoiceNames[iButtonIndex] = String(CurAug.default.OldAugClass.Name); } } } function class NewGetAugFromStringName(string AugStringName) { local int i; if (AugStringName == "") return None; for (i = 0; i < ArrayCount(class'MMAugmentationManager'.default.mpAugs) - 1; i++) { log("aug name: " $ string(class'MMAugmentationManager'.default.mpAugs[i].default.OldAugClass.Name)); if (string(class'MMAugmentationManager'.default.mpAugs[i].default.OldAugClass.Name) == AugStringName) return class'MMAugmentationManager'.default.mpAugs[i].default.OldAugClass; } return none; } function string AugFamiliarName(string AugStringName) { local class anAug; if (AugStringName == "") return ""; else { anAug = NewGetAugFromStringName(AugStringName); if (anAug == None) return ""; else return anAug.default.AugmentationName; } } function SaveSettings() { local DeusExPlayer p; local LevelInfo Z3D; local int VD3; local int AugIndex; local class CurAug; // Clear player augprefs, copy Chosen augs over for (AugIndex = 0; AugIndex < ArrayCount(player.AugPrefs); AugIndex++) { player.AugPrefs[AugIndex] = ''; } for (AugIndex = 0; ((AugIndex < ArrayCount(ChosenAugs)) && (AugIndex < ArrayCount(player.AugPrefs))); AugIndex++) { log("chosen aug: " $ ChosenAugs[AugIndex]); CurAug = NewGetAugFromStringName(ChosenAugs[AugIndex]); if (CurAug != none) player.AugPrefs[AugIndex] = CurAug.Name; } player.SaveConfig(); Z3D=Player.GetEntryLevel(); if (Z3D != none) { foreach Z3D.AllActors(Class'DeusExPlayer', p) { VD3=0; JL0046: if ( VD3 < 9 ) { p.AugPrefs[VD3]=Player.AugPrefs[VD3]; VD3++; goto JL0046; } p.SaveConfig(); } } Super(MenuUIScreenWindow).SaveSettings(); } Y"^" )N* _"]"Nj0 rN*(B%eB,[BN[:B*%(BB%B,rBNB*$'Bl( U"On =p Bq `"e"@MI.0&rI*'.VreDX*'I-U eDX-\'( I k"c"Y:A q %p %^w^*w.^*w.^*{.^-M:.^M%q M&p ^^"q p % q p & , Nk-a:.%%Ww.*8 ^q!Whq!W- :%% d"jkggF.0&rF*'v %cv ,Yrv FDj(v -' s"g"C(v l"ki / k=U  n" ( T h"~ @w"~ % ~ , (~ ,]%],{]~ {:]*% ]]+r * "( @k ="Cannot use this augmentation while carrying the flag!( _ q"~E"U r~*  ~S~-~%~ % ]lsclass MMLAM extends LAM; simulated function TakeDamage(int Damage, Pawn instigatedBy, Vector HitLocation, Vector Momentum, name damageType) { local ParticleGenerator gen; if ((DamageType == 'TearGas') || (DamageType == 'PoisonGas') || (DamageType == 'Radiation')) return; if (DamageType == 'NanoVirus') return; if ( Role == ROLE_Authority ) { // EMP damage disables explosives if (DamageType == 'EMP') { if (!bDisabled) { PlaySound(sound'EMPZap', SLOT_None,,, 1280); bDisabled = True; gen = Spawn(class'ParticleGenerator', Self,, Location, rot(16384,0,0)); if (gen != None) { gen.checkTime = 0.25; gen.LifeSpan = 2; gen.particleDrawScale = 0.3; gen.bRandomEject = True; gen.ejectSpeed = 10.0; gen.bGravity = False; gen.bParticlesUnlit = True; gen.frequency = 0.5; gen.riseRate = 10.0; gen.spawnSound = Sound'Spark2'; gen.particleTexture = Texture'Effects.Smoke.SmokePuff1'; gen.SetBase(Self); } } return; } bDamaged = True; } if (instigatedBy != none) { SetOwner(instigatedBy); Instigator = instigatedBy; } Explode(Location, Vector(Rotation)); } simulated function Tick(float deltaTime) { local ScriptedPawn P; local DeusExPlayer Player; local Vector dist, HitLocation, HitNormal; local float blinkRate, mult, skillDiff; local float proxRelevance; local Pawn curPawn; local bool pass; local Actor HitActor; time += deltaTime; if ( Role == ROLE_Authority ) { super(DeusExProjectile).Tick(deltaTime); if (bDisabled) return; if ( (Owner == None) && ((Level.NetMode == NM_DedicatedServer) || (Level.NetMode == NM_ListenServer)) ) { // Owner has logged out bDisabled = True; team = -1; } if (( Owner != None ) && (DeusExPlayer(Owner) != None )) { if ( TeamDMGame(DeusExPlayer(Owner).DXGame) != None ) { // If they switched sides disable the grenade if ( DeusExPlayer(Owner).PlayerReplicationInfo.team != team ) { bDisabled = True; team = -1; } // // MINIMTL ADDED - planted granades ignore spectators! // else if (DeusExPlayer(Owner).PlayerReplicationInfo.bIsSpectator) { bDisabled = true; team = -1; } // // // } } // check for proximity if (bProximityTriggered) { if (bArmed) { proxCheckTime += deltaTime; // beep based on skill if (skillTime != 0) { if (time > fuseLength) { if (skillTime % 0.3 > 0.25) PlayBeepSound( 1280, 2.0, 3.0 ); } } // if we have been triggered, count down based on skill if (skillTime > 0) skillTime -= deltaTime; // explode if time < 0 if (skillTime < 0) { bDoExplode = True; bArmed = False; } // DC - new ugly way of doing it - old way was "if (proxCheckTime > 0.25)" // new way: weight the check frequency based on distance from player proxRelevance=DistanceFromPlayer/2000.0; // at 500 units it behaves as it did before if (proxRelevance<0.25) proxRelevance=0.25; // low bound 1/4 else if (proxRelevance>10.0) proxRelevance=20.0; // high bound 30 else proxRelevance=proxRelevance*2; // out past 1.0s, double the timing if (proxCheckTime>proxRelevance) { proxCheckTime = 0; // pre-placed explosives are only prox triggered by the player if (Owner == None) { foreach RadiusActors(class'DeusExPlayer', Player, proxRadius*4) { // the owner won't set it off, either if (Player != Owner) { dist = Player.Location - Location; if (VSize(dist) < proxRadius) if (skillTime == 0) skillTime = FClamp(-20.0 * Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition'), 1.0, 10.0); } } } else { // If in multiplayer, check other players if (( Level.NetMode == NM_DedicatedServer) || ( Level.NetMode == NM_ListenServer)) { curPawn = Level.PawnList; while ( curPawn != None ) { pass = False; if ( curPawn.IsA('miniMTLPlayer') ) { Player = DeusExPlayer( curPawn ); // Pass on owner if ( Player == Owner ) pass = True; // // MINIMTL ADDED - planted granades ignore spectators! // else if (Player.PlayerReplicationInfo.bIsSpectator) { //log("spectator proximity:"$Player.PlayerReplicationInfo.PlayerName, 'MMLAM'); pass = True; } // // // // Pass on team member else if ( (TeamDMGame(Player.DXGame) != None) && (team == Player.PlayerReplicationInfo.team) ) pass = True; // Pass if radar transparency on else if ( Player.AugmentationSystem.GetClassLevel( class'AugRadarTrans' ) == 3 ) pass = True; // Finally, make sure we can see them (no exploding through thin walls) if ( !pass ) { // Only players we can see : changed this to Trace from FastTrace so doors are included HitActor = Trace( HitLocation, HitNormal, Player.Location, Location, true ); if (( HitActor == None ) || (DeusExPlayer(HitActor) == Player)) { } else pass = True; } if ( !pass ) { dist = Player.Location - Location; if ( VSize(dist) < proxRadius ) { if (skillTime == 0) { skillDiff = -skillAtSet + Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition'); if ( skillDiff >= 0.0 ) // Scale goes 1.0, 1.6, 2.8, 4.0 skillTime = FClamp( 1.0 + skillDiff * 6.0, 1.0, 2.5 ); else // Scale goes 1.0, 1.4, 2.2, 3.0 skillTime = FClamp( 1.0 + (-Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition') * 4.0), 1.0, 3.0 ); } } } } curPawn = curPawn.nextPawn; } } } } } } // beep faster as the time expires beepTime += deltaTime; if (fuseLength - time <= 0.75) blinkRate = 0.1; else if (fuseLength - time <= fuseLength * 0.5) blinkRate = 0.3; else blinkRate = 0.5; if (time < fuseLength) { if (beepTime > blinkRate) { beepTime = 0; PlayBeepSound( 1280, 1.0, 0.5 ); } } } if ( bDoExplode ) // Keep the simulated chain going Explode(Location, Vector(Rotation)); if (bDisabled) { Skin = Texture'BlackMaskTex'; return; } // flash faster as the time expires if (fuseLength - time <= 0.75) blinkRate = 0.1; else if (fuseLength - time <= fuseLength * 0.5) blinkRate = 0.3; else blinkRate = 0.5; if ((Level.NetMode == NM_Standalone) || (Role < ROLE_Authority) || (Level.NetMode == NM_ListenServer)) { if (Abs((fuseLength - time)) % blinkRate > blinkRate * 0.5) Skin = Texture'BlackMaskTex'; else Skin = Texture'LAM3rdTex1'; } } |"CVRC CACa/!r.C* m"^f? d^%b^,X:^*,k^^ A^ sE8%a 6%a r"u"R }w.*.-q9w.*.-Y'( t"ht _"/_A?_%_,sr_ | X:_*%-g's:_*,-A ':_*,__I?,<h_-g_?% -A @,_?%-A @,-A A' | _A_ _Nclass MMLagoMeter extends Info; var byte Ping; var byte PacketLoss; var byte ServerLoad; var byte RepRespTime; var bool bCleared; var float PingSendTime; var bool bPingComplete; replication { unreliable if (Role == ROLE_Authority) ClientPingFunc; unreliable if (Role < ROLE_Authority) ServerPingFunc; } function ServerPingFunc() { ClientPingFunc(); } simulated function ClientPingFunc() { local int tmpping; bPingComplete = true; tmpping = int((Level.TimeSeconds - PingSendTime) * 1000.0); if (tmpping > 500) tmpping = 500; Ping = byte(tmpping / 2); PacketLoss = 0; } simulated function Tick(float DeltaTime) { if (Role < ROLE_Authority && bNetOwner) { if (!bCleared && miniMTLPlayer(Owner) != none && miniMTLHUD(miniMTLPlayer(Owner).myHUD) != none) { miniMTLHUD(miniMTLPlayer(Owner).myHUD).ClearLagometer(); PlayerPawn(Owner).ConsoleCommand("inject userflag 1"); bCleared = true; bPingComplete = true; } if (!bPingComplete && ((PingSendTime + 1.0) < Level.TimeSeconds)) { bPingComplete = true; PacketLoss = 100; } if (bPingComplete) { bPingComplete = false; PingSendTime = Level.TimeSeconds; ServerPingFunc(); } } super.Tick(DeltaTime); } simulated function SetServerLoad(string str) { local int tickrate; local float act, net; str = Right(str, Len(str) - 2); tickrate = int(Left(str, InStr(str, " "))); str = Right(str, Len(str) - InStr(str, "act=")); str = Right(str, Len(str) - 4); act = float(Left(str, InStr(str, " "))); str = Right(str, Len(str) - InStr(str, "net=")); str = Right(str, Len(str) - 4); net = float(Left(str, InStr(str, " "))); ServerLoad = byte(((act + net) * 250.0) / (1000.0 / float(tickrate))); if (ServerLoad > 250) ServerLoad = 250; } simulated event Destroyed() { if (Role < ROLE_Authority && bNetOwner) PlayerPawn(Owner).ConsoleCommand("inject userflag 0"); super.Destroyed(); } a"gpt=qg p)class MMHUDObjectSlot extends CBPHUDObjectSlot; var bool bVisible; function SetVisibility(bool bNewVisibility) { bVisible = bNewVisibility; } event DrawWindow(GC gc) { //if (!bIsVisible) return; if (!bVisible) return; // First draw the background DrawHUDBackground(gc); // Now fill the area under the icon, which can be different // colors based on the state of the item. // // Don't waste time drawing the fill if the fillMode is set // to None if (fillMode != FM_None) { SetFillColor(); gc.SetStyle(DSTY_Translucent); gc.SetTileColor(fillColor); gc.DrawPattern( slotIconX, slotIconY, slotFillWidth, slotFillHeight, 0, 0, Texture'Solid' ); } // Don't draw any of this if we're dragging if ((item != None) && (!item.bDeleteMe) && (item.Icon != None) && (!bDragging)) { // Draw the icon DrawHUDIcon(gc); // Text defaults gc.SetAlignments(HALIGN_Center, VALIGN_Center); gc.EnableWordWrap(false); gc.SetTextColor(colObjectNum); // Draw the item description at the bottom gc.DrawText(1, 42, 42, 7, item.beltDescription); // If there's any additional text (say, for an ammo or weapon), draw it if (itemText != "") gc.DrawText(slotIconX, itemTextPosY, slotFillWidth, 8, itemText); // Draw selection border if (bButtonPressed) { gc.SetTileColor(colSelectionBorder); gc.SetStyle(DSTY_Masked); gc.DrawBorders(slotIconX - 1, slotIconY - 1, borderWidth, borderHeight, 0, 0, 0, 0, texBorders); } } else if ((item == None) && (player != None) && (player.Level.NetMode != NM_Standalone) && (player.bBeltIsMPInventory)) { // Text defaults gc.SetAlignments(HALIGN_Center, VALIGN_Center); gc.EnableWordWrap(false); gc.SetTextColor(colObjectNum); if ((objectNum >=1) && (objectNum <=3)) { gc.DrawText(1, 42, 42, 7, "WEAPONS"); } else if ((objectNum >=4) && (objectNum <=6)) { gc.DrawText(1, 42, 42, 7, "GRENADES"); } else if ( ((objectNum >=7) && (objectNum <=9)) || (objectNum == 0) ) { gc.DrawText(1, 42, 42, 7, "TOOLS"); } } // Draw the Object Slot Number in upper-right corner gc.SetAlignments(HALIGN_Right, VALIGN_Center); gc.SetTextColor(colObjectNum); gc.DrawText(slotNumberX - 1, slotNumberY, 6, 7, objectNum); } function DrawHUDIcon(GC GC) { GC.SetStyle(DSTY_Masked); GC.SetTileColorRGB(255,255,255); if ((Item != None) && (!Item.bDeleteMe) && (Item.Icon != None)) { GC.DrawTexture(slotIconX,slotIconY,slotFillWidth,slotFillHeight,0.00,0.00,Item.Icon); } } J#fbf}.fw}*}?%}?%}?%}]&}i I"fzX7`-Rf-\ -U `w.x *.x f-RHx y|GB %G:x B J %E:x J   v"zR $iz%Ez,z Az*$z, Au u  M"xin>?x=wx*xxx  z[class MMHUDObjectBelt extends HUDObjectBelt; var bool bVisible; function CreateSlots() { local RadioBoxWindow winRadio; local int i; winRadio=RadioBoxWindow(NewChild(Class'RadioBoxWindow')); winRadio.SetSize(504.00,54.00); winRadio.SetPos(10.00,6.00); winRadio.bOneCheck=False; winSlots=TileWindow(winRadio.NewChild(Class'TileWindow')); winSlots.SetMargins(0, 0); winSlots.SetMinorSpacing(0); winSlots.SetOrder(ORDER_LeftThenUp); for (i = 0; i < 10; i++ ) { objects[i]=HUDObjectSlot(winSlots.NewChild(Class'MMHUDObjectSlot')); objects[i].SetObjectNumber(i); objects[i].Lower(); } objects[0].SetWidth(44.00); objects[0].Lower(); } function SetVisibility(bool bNewVisibility) { local int i; bVisible = bNewVisibility; Show(bNewVisibility); //for (i = 0; i < 10; i++ ) objects[i].Show(bNewVisibility); for (i = 0; i < 10; i++ ) MMHUDObjectSlot(objects[i]).SetVisibility(bNewVisibility); } event DrawWindow(GC gc) { if (!bVisible) return; super.DrawWindow(gc); } ]ed%.d  B#D#ihX ri*(t.i3rt*(T:yt*,'V(  }"L#f9xHd{~HHG %G:dG vP %E:dP  tQ#c`)% h *gc%@ &@ `,x cTeam|GcTeam{|`J|`& `%`Y`&C YC [U`[cClassVC [cTeamS`z. cchC |.zw|*|y|%|A%@ &|A&@ |^z G#bJ!s.bN:ys*&ys*$:ys*,ys*$  d lK#n_*6?-mhn)-mAn4_n-m  H#b# Z;  mf#agqjGaSkinPassword, /a0 {lXWlujom0 10o[mY N#v_9hv v a$Uvr%v .v-ov1"v"rrJv4v  V-class MMWeaponEMPGrenade extends WeaponEMPGrenade; function PlaceGrenade() { if (AmmoType.AmmoAmount <= 0) { Destroy(); return; } super.PlaceGrenade(); if (AmmoType.AmmoAmount <= 0) Destroy(); } state NormalFire { function AnimEnd() { if (bAutomatic) { if ((Pawn(Owner).bFire != 0) && (AmmoType.AmmoAmount > 0)) { if (PlayerPawn(Owner) != None) Global.Fire(0); else GotoState('FinishFire'); } else GotoState('FinishFire'); } else { // if we are a thrown weapon and we run out of ammo, destroy the weapon if (bHandToHand && (ReloadCount > 0) && (AmmoType.AmmoAmount <= 0)) { // fix disappear bug: //Destroy(); } } } } function Fire(float Value) { local float sndVolume; local bool bListenClient; if (Pawn(Owner) != None) { if (bNearWall) { bReadyToFire = False; GotoState('NormalFire'); bPointing = True; PlayAnim('Place',, 0.1); return; } } bListenClient = (Owner.IsA('DeusExPlayer') && DeusExPlayer(Owner).PlayerIsListenClient()); sndVolume = TransientSoundVolume; if ( Level.NetMode != NM_Standalone ) // Turn up the sounds a bit in mulitplayer { sndVolume = TransientSoundVolume * 2.0; if ( Owner.IsA('DeusExPlayer') && (DeusExPlayer(Owner).NintendoImmunityTimeLeft > 0.01) || (!bClientReady && (!bListenClient)) ) { DeusExPlayer(Owner).bJustFired = False; bReadyToFire = True; bPointing = False; bFiring = False; return; } } // check for surrounding environment if ((EnviroEffective == ENVEFF_Air) || (EnviroEffective == ENVEFF_Vacuum) || (EnviroEffective == ENVEFF_AirVacuum)) { if (Region.Zone.bWaterZone) { if (Pawn(Owner) != None) { Pawn(Owner).ClientMessage(msgNotWorking); if (!bHandToHand) PlaySimSound( Misc1Sound, SLOT_None, sndVolume, 1024 ); // play dry fire sound } GotoState('Idle'); return; } } if (bHandToHand) { if (( Level.NetMode != NM_Standalone ) && !bListenClient ) bClientReady = False; bReadyToFire = False; GotoState('NormalFire'); bPointing=True; if ( Owner.IsA('PlayerPawn') ) PlayerPawn(Owner).PlayFiring(); PlaySelectiveFiring(); PlayFiringSound(); } } simulated function Projectile ProjectileFire(class ProjClass, float ProjSpeed, bool bWarn) { local Projectile proj; if (AmmoType.AmmoAmount <= 0) { bDestroyOnFinish = true; return none; } proj = super(DeusExWeapon).ProjectileFire(ProjClass, ProjSpeed, bWarn); if (proj != none) { proj.PlayAnim('Open'); if (ReloadCount > 0) AmmoType.UseAmmo(1); if ( AmmoType.AmmoAmount <= 0 ) bDestroyOnFinish = True; // Update ammo count on object belt if (DeusExPlayer(Owner) != None) DeusExPlayer(Owner).UpdateBeltText(Self); } return proj; } R#tAIht Jt1ty.t-ot1"t"rrtr%t *t a$  ehclass MMHUDMultiSkills extends HUDMultiSkills; var float FirstDisplayTime; var bool bMenuOpened; function SkillMessage( GC gc ) { local float curx, cury, w, h, w2, offset; local String str; local miniMTLPlayer mmp; local bool forever; mmp = miniMTLPlayer(Player); if (mmp != none && mmp.bDisplaySkillMessageForever) forever = true; if ( curSkillPoints != Player.SkillPointsAvail ) bNotifySkills = False; if (MMSkillManager(Player.SkillSystem) != None && MMSkillManager(Player.SkillSystem).IsPurchasePossible()) { if (FirstDisplayTime == 0.0) FirstDisplayTime = Player.Level.TimeSeconds; if ( !bNotifySkills ) { RefreshKey(); timeToNotify = Player.Level.Timeseconds + TimeDelay; curSkillPoints = Player.SkillPointsAvail; Player.BuySkillSound( 3 ); bNotifySkills = True; } if ( timeToNotify > Player.Level.Timeseconds || forever) { // Flash them to draw a little more attention 1.5 on .5 off if ( (Player.Level.Timeseconds % 1.5) < 1 ) { offset = 0; str = PressString $ curKeyName $ PressEndString; if ((Player.Level.Timeseconds - FirstDisplayTime) < TimeDelay || bMenuOpened) { gc.SetFont(Font'FontMenuSmall_DS'); cury = height * skillMsgY; curx = width * skillListX; gc.GetTextExtent( 0, w, h, SkillsAvailableString ); gc.GetTextExtent( 0, w2, h, str ); } else { gc.SetFont(Font'FontMenuExtraLarge'); cury = height * 0.6; gc.GetTextExtent( 0, w, h, SkillsAvailableString ); gc.GetTextExtent( 0, w2, h, str ); curx = (width - w) * 0.5; } if ( (curx + ((w-w2)*0.5)) < 0 ) offset = -(curx + ((w-w2)*0.5)); gc.SetTextColor( colLtGreen ); gc.GetTextExtent( 0, w, h, SkillsAvailableString ); gc.DrawText( curx+offset, cury, w, h, SkillsAvailableString ); cury += h; gc.GetTextExtent( 0, w2, h, str ); curx += ((w-w2)*0.5); gc.DrawText( curx+offset, cury, w2, h, str ); } } } else FirstDisplayTime = 0.0; } event DrawWindow(GC gc) { local float curx, cury, w, h; local String str, costStr; local int index; local float barLen, costx, levelx; local MMSkillManager smanager; local int i; if (( Player == None ) || (!Player.PlayerIsClient()) ) return; if (Player.Health <= 0) { bMenuOpened = false; FirstDisplayTime = 0.0; } if (Player.PlayerReplicationInfo != none && Player.PlayerReplicationInfo.bIsSpectator) { bMenuOpened = false; FirstDisplayTime = 0.0; return; } if ( Player.bBuySkills ) { bMenuOpened = true; smanager = MMSkillManager(Player.SkillSystem); if (smanager != none) { gc.SetFont(Font'FontMenuSmall_DS'); index = 1; cury = height * skillListY; curx = width * skillListX; costx = width * skillCostX; levelx = width * skillLevelX; gc.GetTextExtent( 0, w, h, CostString ); barLen = (costx+(w*1.33))-curx; gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); cury += (h*0.25); str = SkillPointsString $ Player.SkillPointsAvail; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( curx, cury, w, h, str ); cury += h; gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); cury += (h*0.25); str = SkillString; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( curx, cury, w, h, str ); str = LevelString; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( levelx, cury, w, h, str ); str = CostString; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( costx, cury, w, h, str ); cury += h; gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); cury += (h*0.25); for (i = 0; i < ArrayCount(smanager.SkillLevels) - 1; i++) { index = i + 1; if ( index == 10 ) str = "0. " $ smanager.GetSkillClassNameByIndex(i); else str = index $ ". " $ smanager.GetSkillClassNameByIndex(i); gc.GetTextExtent( 0, w, h, str ); if ( smanager.SkillLevels[i] == 3) { gc.SetTileColor( colBlue ); gc.SetTextColor( colBlue ); costStr = NAString; } else if ( Player.SkillPointsAvail >= smanager.SkillCosts[i] ) { if ( smanager.SkillLevels[i] == 2) { gc.SetTextColor( colLtGreen ); gc.SetTileColor( colLtGreen ); } else { gc.SetTextColor( colGreen ); gc.SetTileColor( colGreen ); } costStr = "" $ smanager.SkillCosts[i]; } else { if ( smanager.SkillLevels[i] == 2) { gc.SetTileColor( colLtRed ); gc.SetTextColor( colLtRed ); } else { gc.SetTileColor( colRed ); gc.SetTextColor( colRed ); } costStr = "" $ smanager.SkillCosts[i]; } gc.DrawText( curx, cury, w, h, str ); DrawLevel( gc, levelx, cury, smanager.SkillLevels[i] ); gc.GetTextExtent( 0, w, h, costStr ); gc.DrawText( costx, cury, w, h, costStr ); cury += h; index += 1; } gc.SetTileColor( colWhite ); if ( curKeyName ~= KeyNotBoundString ) RefreshKey(); str = PressString $ curKeyName $ ToExitString; gc.GetTextExtent( 0, w, h, str ); gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); cury += (h*0.25); gc.SetTextColor( colWhite ); gc.DrawText( curx + ((barLen*0.5)-(w*0.5)), cury, w, h, str ); cury += h; gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); } } else SkillMessage( gc ); Super(HUDBaseWindow).DrawWindow(gc); } function bool AttemptBuySkill2( DeusExPlayer thisPlayer, byte sindex) { local MMSkillManager smanager; smanager = MMSkillManager(thisPlayer.SkillSystem); if (smanager == none) return false; if (sindex < ArrayCount(smanager.SkillLevels)) { // Already master if ( smanager.SkillLevels[sindex] == 3 ) { thisPlayer.BuySkillSound( 1 ); return ( False ); } else if ( thisPlayer.SkillPointsAvail >= smanager.SkillCosts[sindex] ) { thisPlayer.BuySkillSound( 0 ); smanager.IncLevel(sindex); return true; } else { thisPlayer.BuySkillSound( 1 ); return( False ); } } return false; } function bool OverrideBelt( DeusExPlayer thisPlayer, int objectNum ) { if ( !thisPlayer.bBuySkills ) return False; // Zero indexed, but min element is 1, 0 is 10 if ( objectNum == 0 ) objectNum = 9; else objectNum -= 1; if ( AttemptBuySkill2( thisPlayer, objectNum ) ) thisPlayer.bBuySkills = False; // Got our skill, exit out of menu if ( ( objectNum >= 0 ) && ( objectNum < 10) ) return True; else return False; } T#p]Y hptp_  @a#a&<zwa*]?s-w.*]. ' s]]?]LlPwa*a-m.wm*m b!M$sraaa/!.N::$a4 D?].q zDSl q ea?]zzwa wa::$a4 D?].q zDSl- q ea?]z::$w.a*z-aa/!#aa/!-.a:q ew.*w.a*.?].  rclass MMHUDLogDisplay extends HUDLogDisplay; function AddLog(coerce String newLog, Color linecol) { if (newLog != "" && miniMTLPlayer(Player).bColoredTalkMessages) { if (InStr(newLog, Player.PlayerReplicationInfo.PlayerName) != -1 && linecol.R != 200) { if (linecol.R == 0) // teamsay { linecol.R = 255; } else // say { linecol.R = 0; } } } super.AddLog(newLog, linecol); } "v#Y &?1:% r * a AOw*a:%w*a/!Ka*w*a/!La*r*a ]laGr*a "Wdla:% - R  _#Hf4jf + rfff,ffjffrw.f*f .f @j  c#]?;-w.*w.(] i# g#Z `bYb̬?a?b YZ I`#b1>fb + tbbbbbbfbbtw.b*b .b f  Hclass MMHUDActiveItemsDisplay expands HUDActiveItemsDisplay; function CreateContainerWindows() { winAugsContainer = HUDActiveAugsBorder(NewChild(Class'MMHUDActiveAugsBorder')); winItemsContainer = HUDActiveItemsBorder(NewChild(Class'HUDActiveItemsBorder')); } function AddAug(class augclass, bool enabled) { MMHUDActiveAugsBorder(winAugsContainer).NewAddIcon(augclass, enabled); AskParentForReconfigure(); } n#Ya  Yoi[zia~o:Waooaa%a, zas zas oi  a^ Y Mw.*a.ODw.*a.]D Hj4mrMwj*ja/!xjnj,ja $Y? @D?  k#Ih#V1 e%Va $Y? @D?   2l#d_ &`*]#tI/d a0 x-vx--vwxdw.d*6.d@.xdx ?,d^d x ^]]^`x10` !r#WT *wI*IaW-X xeclass MMHUDActiveAugsBorder expands HUDActiveAugsBorder; function CreateIcons() { local int keyIndex; local HUDActiveAug iconWindow; for(keyIndex=FirstKeyNum; keyIndex<=LastKeyNum; keyIndex++) { iconWindow = HUDActiveAug(winIcons.NewChild(Class'MMHUDActiveAug')); iconWindow.SetKeyNum(keyIndex); iconWindow.Hide(); } } function MMHUDActiveAug NewFindAugWindowByKey(int FKey) { local Window currentWindow; local Window foundWindow; currentWindow = winIcons.GetTopChild(False); while (currentWindow != None) { if (MMHUDActiveAug(currentWindow).HotKeyNum == FKey) { foundWindow = currentWindow; break; } currentWindow = currentWindow.GetLowerSibling(False); } return MMHUDActiveAug(foundWindow); } function NewAddIcon(class augclass, bool enabled) { local MMHUDActiveAug augItem; local int FKey; FKey = augclass.default.MPConflictSlot; augItem = NewFindAugWindowByKey(FKey); if (augItem != None) { augItem.SetIcon(augclass.default.smallIcon); //augItem.SetClientObject(saveObject); //augItem.SetObject(saveObject); augItem.hotKeyNum = FKey; augItem.hotKeyString = "F" $ String(FKey); augItem.bEnabled = enabled; augItem.AugClass = augclass; augItem.Show(); // Hide if there are no icons visible if (++iconCount == 1) Show(); AskParentForReconfigure(); augItem.UpdateAugIconStatus(); } } function UpdateAugIconStatus(Augmentation aug) { local HUDActiveAug iconWindow; iconWindow = HUDActiveAug(winIcons.GetTopChild()); while(iconWindow != None) { iconWindow.UpdateAugIconStatus(); iconWindow = HUDActiveAug(iconWindow.GetLowerSibling()); } } a wuU Y-b uP-ba.uPwa*a-p(-b O#j H;wj **\%j r\I]%j O]j ?^j ?^ s#PG#:=K wK *h .K wh *J .h wJ *:J PJ -J -ph rOK K  Hm#x4/o9y%xyhx  KIu#R16"4X%RXr*X-@ (  Xy#kx#`tA/ K%` Kh=`Kh``KQ`$a $? ,q=?@?KQ`?,w_`ww*K-@ '@` w K rw`a $ @@,w-'w!0w #?`a $ @  K-@ Kr*K-@ (  G${fn{QK.{wK*K^%K P,K &K P,K ,K P,K K-Z'Ki $KK'( Ki //----------------------------------------------------------- // //----------------------------------------------------------- class MMHUDActiveAug expands HUDActiveAug; var color colAugDisabled; var bool bEnabled; var class AugClass; function miniMTLPlayer getPlayer() { return miniMTLPlayer(player); } function UpdateAugIconStatus() { local miniMTLPlayer mmp; if (bEnabled) colItemIcon = colAugActive; else colItemIcon = colAugInactive; mmp = getPlayer(); if (mmp != none) { if (mmp.bAugsDisabled && !MMAugmentationManager(mmp.AugmentationSystem).IsAllowedFlagAug(AugClass)) colItemIcon = colAugDisabled; } } _ class MMHECannister20mm extends HECannister20mm; auto simulated state Flying { simulated function ProcessTouch (Actor Other, Vector HitLocation) { if (bStuck) return; if ((Other != instigator) && (DeusExProjectile(Other) == None) && (Other != Owner)) { damagee = Other; Explode(HitLocation, Normal(HitLocation-damagee.Location)); if (Role == ROLE_Authority) { if (bBlood && miniMTLPlayer(damagee) != none) miniMTLPlayer(damagee).SpawnBloodFromProjectile(HitLocation, Normal(HitLocation - damagee.Location), Damage); } } } } ]#A$H C( BHBq4 O%qqOu Bqg"Reconstruction will be complete inSDBqOu secondsAqq-'q,q ,q #  t#HE8>www*D .wwD *v.D wv*:vHv-v-pD OCww ;class MMWeaponFlamethrower extends WeaponFlamethrower; IB$o 1\Io -D%o Du o o -(  J$`+ zw`*X?s-w.*X. ' sXX?XLZPw`*`-`.w`*` b!M$sr``a/!.N::$`4 D?X.A zD`Z A W`?Xzzw` w`::$`4 D?X.A zD`Z- A W`?Xz::$w.`*z-`a/!#`a/!-.`:A Ww.*w.`*.?X.   N$hwK@- -A?-'d Dnd %d %rpSd  {Irr}r&rppr: Ihdhd hef`rk C?f?h ML?hek h f`rh `@r hef`rk C?f?hek h f`r HG49J%GJkG  R$J?!;-w.*w.(J kH$utSE%uEk?uEkuu,duf D,(ui?#CAu  Aclass MMGRI extends MTLGRI; var int Captures[2]; replication { reliable if (Role == ROLE_Authority) Captures; } EP$ 150OF LO 6LO@L%9O OaMF@L'M#M@Ca M9aO ?,@C CML%? ף@@C $ !Q$ 120S$ 0.74X$G `@k@H>?@ kG T$ 0.67U$ 0.60W$ 0.53O$| AuEja |  #?| a(#??9aa|  | ? !^$ 0.27k Mw.*.ODw.*.]Dw.*.-q9w.*.-YDD HV$p4 IW%p:wWC*WCacwW}*W}aWCp a mp!p wWC*FpWCW}p a mp!p GwW}*W}$ApW}  gsclass MMGasGrenade extends GasGrenade; simulated function TakeDamage(int Damage, Pawn instigatedBy, Vector HitLocation, Vector Momentum, name damageType) { local ParticleGenerator gen; if ((DamageType == 'TearGas') || (DamageType == 'PoisonGas') || (DamageType == 'Radiation')) return; if (DamageType == 'NanoVirus') return; if ( Role == ROLE_Authority ) { // EMP damage disables explosives if (DamageType == 'EMP') { if (!bDisabled) { PlaySound(sound'EMPZap', SLOT_None,,, 1280); bDisabled = True; gen = Spawn(class'ParticleGenerator', Self,, Location, rot(16384,0,0)); if (gen != None) { gen.checkTime = 0.25; gen.LifeSpan = 2; gen.particleDrawScale = 0.3; gen.bRandomEject = True; gen.ejectSpeed = 10.0; gen.bGravity = False; gen.bParticlesUnlit = True; gen.frequency = 0.5; gen.riseRate = 10.0; gen.spawnSound = Sound'Spark2'; gen.particleTexture = Texture'Effects.Smoke.SmokePuff1'; gen.SetBase(Self); } } return; } bDamaged = True; } if (instigatedBy != none) { SetOwner(instigatedBy); Instigator = instigatedBy; } Explode(Location, Vector(Rotation)); } simulated function Tick(float deltaTime) { local ScriptedPawn P; local DeusExPlayer Player; local Vector dist, HitLocation, HitNormal; local float blinkRate, mult, skillDiff; local float proxRelevance; local Pawn curPawn; local bool pass; local Actor HitActor; time += deltaTime; if ( Role == ROLE_Authority ) { super(DeusExProjectile).Tick(deltaTime); if (bDisabled) return; if ( (Owner == None) && ((Level.NetMode == NM_DedicatedServer) || (Level.NetMode == NM_ListenServer)) ) { // Owner has logged out bDisabled = True; team = -1; } if (( Owner != None ) && (DeusExPlayer(Owner) != None )) { if ( TeamDMGame(DeusExPlayer(Owner).DXGame) != None ) { // If they switched sides disable the grenade if ( DeusExPlayer(Owner).PlayerReplicationInfo.team != team ) { bDisabled = True; team = -1; } // // MINIMTL ADDED - planted granades ignore spectators! // else if (DeusExPlayer(Owner).PlayerReplicationInfo.bIsSpectator) { bDisabled = true; team = -1; } // // // } } // check for proximity if (bProximityTriggered) { if (bArmed) { proxCheckTime += deltaTime; // beep based on skill if (skillTime != 0) { if (time > fuseLength) { if (skillTime % 0.3 > 0.25) PlayBeepSound( 1280, 2.0, 3.0 ); } } // if we have been triggered, count down based on skill if (skillTime > 0) skillTime -= deltaTime; // explode if time < 0 if (skillTime < 0) { bDoExplode = True; bArmed = False; } // DC - new ugly way of doing it - old way was "if (proxCheckTime > 0.25)" // new way: weight the check frequency based on distance from player proxRelevance=DistanceFromPlayer/2000.0; // at 500 units it behaves as it did before if (proxRelevance<0.25) proxRelevance=0.25; // low bound 1/4 else if (proxRelevance>10.0) proxRelevance=20.0; // high bound 30 else proxRelevance=proxRelevance*2; // out past 1.0s, double the timing if (proxCheckTime>proxRelevance) { proxCheckTime = 0; // pre-placed explosives are only prox triggered by the player if (Owner == None) { foreach RadiusActors(class'DeusExPlayer', Player, proxRadius*4) { // the owner won't set it off, either if (Player != Owner) { dist = Player.Location - Location; if (VSize(dist) < proxRadius) if (skillTime == 0) skillTime = FClamp(-20.0 * Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition'), 1.0, 10.0); } } } else { // If in multiplayer, check other players if (( Level.NetMode == NM_DedicatedServer) || ( Level.NetMode == NM_ListenServer)) { curPawn = Level.PawnList; while ( curPawn != None ) { pass = False; if ( curPawn.IsA('DeusExPlayer') ) { Player = DeusExPlayer( curPawn ); // Pass on owner if ( Player == Owner ) pass = True; // // MINIMTL ADDED - planted granades ignore spectators! // else if (Player.PlayerReplicationInfo.bIsSpectator) { //log("spectator proximity:"$Player.PlayerReplicationInfo.PlayerName, 'MMLAM'); pass = True; } // // // // Pass on team member else if ( (TeamDMGame(Player.DXGame) != None) && (team == player.PlayerReplicationInfo.team) ) pass = True; // Pass if radar transparency on else if ( Player.AugmentationSystem.GetClassLevel( class'AugRadarTrans' ) == 3 ) pass = True; // Finally, make sure we can see them (no exploding through thin walls) if ( !pass ) { // Only players we can see : changed this to Trace from FastTrace so doors are included HitActor = Trace( HitLocation, HitNormal, Player.Location, Location, True ); if (( HitActor == None ) || (DeusExPlayer(HitActor) == Player)) { } else pass = True; } if ( !pass ) { dist = Player.Location - Location; if ( VSize(dist) < proxRadius ) { if (skillTime == 0) { skillDiff = -skillAtSet + Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition'); if ( skillDiff >= 0.0 ) // Scale goes 1.0, 1.6, 2.8, 4.0 skillTime = FClamp( 1.0 + skillDiff * 6.0, 1.0, 2.5 ); else // Scale goes 1.0, 1.4, 2.2, 3.0 skillTime = FClamp( 1.0 + (-Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition') * 4.0), 1.0, 3.0 ); } } } } curPawn = curPawn.nextPawn; } } else // Only have scripted pawns set off promixity grenades in single player { foreach RadiusActors(class'ScriptedPawn', P, proxRadius*4) { // only "heavy" pawns will set this off if ((P != None) && (P.Mass >= 40)) { // the owner won't set it off, either if (P != Owner) { dist = P.Location - Location; if (VSize(dist) < proxRadius) if (skillTime == 0) skillTime = 1.0; } } } } } } } } // beep faster as the time expires beepTime += deltaTime; if (fuseLength - time <= 0.75) blinkRate = 0.1; else if (fuseLength - time <= fuseLength * 0.5) blinkRate = 0.3; else blinkRate = 0.5; if (time < fuseLength) { if (beepTime > blinkRate) { beepTime = 0; PlayBeepSound( 1280, 1.0, 0.5 ); } } } if ( bDoExplode ) // Keep the simulated chain going Explode(Location, Vector(Rotation)); } mC$1DN@ - -N (=E-K.Eg.Kjwg*g-p'E?&E5r1E r1*5E?%w.K*.K-5E?&-N 'Sr1*1E1-E-ppppp1(S1) killed EKZwZ*Za/!$.Z-.Z{Oppppp1(S1) killed EKZZN|KNone=ppp1 killed E.(!zw1E=ppp1 killed EK(!zw1EQ@.E.1'1?%1?L.1X.1, %1?L1?L@1-N {1E-N {1E 1EC1E IY$A11eJ%A:wJC*JCacwJ}*J}a  ~|S q:%  |-_(P ' -_'w*a/!x-_-_(b -_'-S$-_S$S$-Z%P,&P,,P,-Z'B-_?:i &, , oo:i &,&P,,P Bs  0.22k\$} t9 mH%} >wHC*F} HCkwH}*A} H}  L@]EbG .`wG *JwG V*L.G V`rL*k@ HIN 1pGEwN *EN | N N Z  `$P,O6z oef$Ij ,  HT 4m^T ,T ,\w.T *.T I,  }%g F S$ Ig$n1M9na/!Cn.n Vnnnnw.n*.n I  |class MMFrobDisplayWindow extends FrobDisplayWindow; function DrawWindow(GC gc) { local actor frobTarget; local float infoX, infoY, infoW, infoH; local string strInfo; local DeusExMover dxMover; local Mover M; local HackableDevices device; local Vector centerLoc, v1, v2; local float boxCX, boxCY, boxTLX, boxTLY, boxBRX, boxBRY, boxW, boxH; local float corner, x, y; local int i, j, k, offset; local Color col; local int numTools; if (player != None) { frobTarget = player.FrobTarget; if (frobTarget != None) if (!player.IsHighlighted(frobTarget)) frobTarget = None; if (frobTarget != None) { // move the box in and out based on time offset = (24.0 * (frobTarget.Level.TimeSeconds % 0.3)); // draw a cornered targetting box // get the center of the object M = Mover(frobTarget); if (M != None) { M.GetBoundingBox(v1, v2, False, M.KeyPos[M.KeyNum]+M.BasePos, M.KeyRot[M.KeyNum]+M.BaseRot); centerLoc = v1 + (v2 - v1) * 0.5; v1.X = 16; v1.Y = 16; v1.Z = 16; } else { centerLoc = frobTarget.Location; v1.X = frobTarget.CollisionRadius; v1.Y = frobTarget.CollisionRadius; v1.Z = frobTarget.CollisionHeight; } ConvertVectorToCoordinates(centerLoc, boxCX, boxCY); boxTLX = boxCX; boxTLY = boxCY; boxBRX = boxCX; boxBRY = boxCY; // get the smallest box to enclose actor // modified from Scott's ActorDisplayWindow for (i=-1; i<=1; i+=2) { for (j=-1; j<=1; j+=2) { for (k=-1; k<=1; k+=2) { v2 = v1; v2.X *= i; v2.Y *= j; v2.Z *= k; v2.X += centerLoc.X; v2.Y += centerLoc.Y; v2.Z += centerLoc.Z; if (ConvertVectorToCoordinates(v2, x, y)) { boxTLX = FMin(boxTLX, x); boxTLY = FMin(boxTLY, y); boxBRX = FMax(boxBRX, x); boxBRY = FMax(boxBRY, y); } } } } if (!frobTarget.IsA('Mover')) { boxTLX += frobTarget.CollisionRadius / 4.0; boxTLY += frobTarget.CollisionHeight / 4.0; boxBRX -= frobTarget.CollisionRadius / 4.0; boxBRY -= frobTarget.CollisionHeight / 4.0; } boxTLX = FClamp(boxTLX, margin, width-margin); boxTLY = FClamp(boxTLY, margin, height-margin); boxBRX = FClamp(boxBRX, margin, width-margin); boxBRY = FClamp(boxBRY, margin, height-margin); boxW = boxBRX - boxTLX; boxH = boxBRY - boxTLY; // scale the corner based on the size of the box corner = FClamp((boxW + boxH) * 0.1, 4.0, 40.0); // make sure the box doesn't invert itself if (boxBRX - boxTLX < corner) { boxTLX -= (corner+4); boxBRX += (corner+4); } if (boxBRY - boxTLY < corner) { boxTLY -= (corner+4); boxBRY += (corner+4); } // draw the drop shadow first, then normal gc.SetTileColorRGB(0,0,0); for (i=1; i>=0; i--) { gc.DrawBox(boxTLX+i+offset, boxTLY+i+offset, corner, 1, 0, 0, 1, Texture'Solid'); gc.DrawBox(boxTLX+i+offset, boxTLY+i+offset, 1, corner, 0, 0, 1, Texture'Solid'); gc.DrawBox(boxBRX+i-corner-offset, boxTLY+i+offset, corner, 1, 0, 0, 1, Texture'Solid'); gc.DrawBox(boxBRX+i-offset, boxTLY+i+offset, 1, corner, 0, 0, 1, Texture'Solid'); gc.DrawBox(boxTLX+i+offset, boxBRY+i-offset, corner, 1, 0, 0, 1, Texture'Solid'); gc.DrawBox(boxTLX+i+offset, boxBRY+i-corner-offset, 1, corner, 0, 0, 1, Texture'Solid'); gc.DrawBox(boxBRX+i-corner+1-offset, boxBRY+i-offset, corner, 1, 0, 0, 1, Texture'Solid'); gc.DrawBox(boxBRX+i-offset, boxBRY+i-corner-offset, 1, corner, 0, 0, 1, Texture'Solid'); gc.SetTileColor(colText); } // draw object-specific info if (frobTarget.IsA('Mover')) { // get the door's lock and strength info dxMover = DeusExMover(frobTarget); if ((dxMover != None) && dxMover.bLocked) { strInfo = msgLocked $ CR() $ msgLockStr; if (dxMover.bPickable) strInfo = strInfo $ FormatString(dxMover.lockStrength * 100.0) $ "%"; else strInfo = strInfo $ msgInf; strInfo = strInfo $ CR() $ msgDoorStr; if (dxMover.bBreakable) strInfo = strInfo $ FormatString(dxMover.doorStrength * 100.0) $ "%"; else strInfo = strInfo $ msgInf; } else { strInfo = msgUnlocked; } infoX = boxTLX + 10; infoY = boxTLY + 10; gc.SetFont(Font'FontMenuSmall_DS'); gc.GetTextExtent(0, infoW, infoH, strInfo); infoW += 8; if ((dxMover != None) && dxMover.bLocked) infoW += barLength + 2; infoH += 8; infoX = FClamp(infoX, infoW/2+10, width-10-infoW/2); infoY = FClamp(infoY, infoH/2+10, height-10-infoH/2); // draw a dark background gc.SetStyle(DSTY_Modulated); gc.SetTileColorRGB(0, 0, 0); gc.DrawPattern(infoX, infoY, infoW, infoH, 0, 0, Texture'ConWindowBackground'); // draw colored bars for each value if ((dxMover != None) && dxMover.bLocked) { gc.SetStyle(DSTY_Translucent); col = GetColorScaled(dxMover.lockStrength); gc.SetTileColor(col); gc.DrawPattern(infoX+(infoW-barLength-4), infoY+4+(infoH-8)/3, barLength*dxMover.lockStrength, ((infoH-8)/3)-2, 0, 0, Texture'ConWindowBackground'); col = GetColorScaled(dxMover.doorStrength); gc.SetTileColor(col); gc.DrawPattern(infoX+(infoW-barLength-4), infoY+4+2*(infoH-8)/3, barLength*dxMover.doorStrength, ((infoH-8)/3)-2, 0, 0, Texture'ConWindowBackground'); } // draw the text gc.SetTextColor(colText); gc.DrawText(infoX+4, infoY+4, infoW-8, infoH-8, strInfo); // draw the two highlight boxes gc.SetStyle(DSTY_Translucent); gc.SetTileColor(colBorder); gc.DrawBox(infoX, infoY, infoW, infoH, 0, 0, 1, Texture'Solid'); gc.SetTileColor(colBackground); gc.DrawBox(infoX+1, infoY+1, infoW-2, infoH-2, 0, 0, 1, Texture'Solid'); // draw the absolute number of lockpicks on top of the colored bar if ((dxMover != None) && dxMover.bLocked && dxMover.bPickable) { numTools = int((dxMover.lockStrength / player.SkillSystem.GetSkillLevelValue(class'SkillLockpicking')) + 0.99); if (numTools == 1) strInfo = numTools @ msgPick; else strInfo = numTools @ msgPicks; gc.DrawText(infoX+(infoW-barLength-2), infoY+4+(infoH-8)/3, barLength, ((infoH-8)/3)-2, strInfo); } } else if (frobTarget.IsA('HackableDevices')) { // get the devices hack strength info device = HackableDevices(frobTarget); strInfo = DeusExDecoration(frobTarget).itemName $ CR() $ msgHackStr; if (device.bHackable) { if (device.hackStrength != 0.0) strInfo = strInfo $ FormatString(device.hackStrength * 100.0) $ "%"; else strInfo = DeusExDecoration(frobTarget).itemName $ ": " $ msgHacked; } else strInfo = strInfo $ msgInf; infoX = boxTLX + 10; infoY = boxTLY + 10; gc.SetFont(Font'FontMenuSmall_DS'); gc.GetTextExtent(0, infoW, infoH, strInfo); infoW += 8; if (device.hackStrength != 0.0) infoW += barLength + 2; infoH += 8; infoX = FClamp(infoX, infoW/2+10, width-10-infoW/2); infoY = FClamp(infoY, infoH/2+10, height-10-infoH/2); // draw a dark background gc.SetStyle(DSTY_Modulated); gc.SetTileColorRGB(0, 0, 0); gc.DrawPattern(infoX, infoY, infoW, infoH, 0, 0, Texture'ConWindowBackground'); // draw a colored bar if (device.hackStrength != 0.0) { gc.SetStyle(DSTY_Translucent); col = GetColorScaled(device.hackStrength); gc.SetTileColor(col); gc.DrawPattern(infoX+(infoW-barLength-4), infoY+infoH/2, barLength*device.hackStrength, infoH/2-6, 0, 0, Texture'ConWindowBackground'); } // draw the text gc.SetTextColor(colText); gc.DrawText(infoX+4, infoY+4, infoW-8, infoH-8, strInfo); // draw the two highlight boxes gc.SetStyle(DSTY_Translucent); gc.SetTileColor(colBorder); gc.DrawBox(infoX, infoY, infoW, infoH, 0, 0, 1, Texture'Solid'); gc.SetTileColor(colBackground); gc.DrawBox(infoX+1, infoY+1, infoW-2, infoH-2, 0, 0, 1, Texture'Solid'); // draw the absolute number of multitools on top of the colored bar if ((device.bHackable) && (device.hackStrength != 0.0)) { numTools = int((device.hackStrength / player.SkillSystem.GetSkillLevelValue(class'SkillTech')) + 0.99); if (numTools == 1) strInfo = numTools @ msgTool; else strInfo = numTools @ msgTools; gc.DrawText(infoX+(infoW-barLength-2), infoY+infoH/2, barLength, infoH/2-6, strInfo); } } else if (!frobTarget.bStatic && player.bObjectNames) { // TODO: Check familiar vs. unfamiliar flags if (frobTarget.IsA('Pawn')) strInfo = player.GetDisplayName(frobTarget); else if (frobTarget.IsA('DeusExCarcass')) strInfo = DeusExCarcass(frobTarget).itemName; else if (frobTarget.IsA('Inventory')) strInfo = Inventory(frobTarget).itemName; else if (frobTarget.IsA('DeusExDecoration')) strInfo = player.GetDisplayName(frobTarget); else if (frobTarget.IsA('DeusExProjectile')) strInfo = DeusExProjectile(frobTarget).itemName; else strInfo = "DEFAULT ACTOR NAME - REPORT THIS AS A BUG - " $ frobTarget.GetItemName(String(frobTarget.Class)); infoX = boxTLX + 10; infoY = boxTLY + 10; gc.SetFont(Font'FontMenuSmall_DS'); gc.GetTextExtent(0, infoW, infoH, strInfo); infoW += 8; infoH += 8; infoX = FClamp(infoX, infoW/2+10, width-10-infoW/2); infoY = FClamp(infoY, infoH/2+10, height-10-infoH/2); // draw a dark background gc.SetStyle(DSTY_Modulated); gc.SetTileColorRGB(0, 0, 0); gc.DrawPattern(infoX, infoY, infoW, infoH, 0, 0, Texture'ConWindowBackground'); // draw the text gc.SetTextColor(colText); gc.DrawText(infoX+4, infoY+4, infoW-8, infoH-8, strInfo); // draw the two highlight boxes gc.SetStyle(DSTY_Translucent); gc.SetTileColor(colBorder); gc.DrawBox(infoX, infoY, infoW, infoH, 0, 0, 1, Texture'Solid'); gc.SetTileColor(colBackground); gc.DrawBox(infoX+1, infoY+1, infoW-2, infoH-2, 0, 0, 1, Texture'Solid'); if (frobTarget.IsA('DeusExWeapon') && player.bHelpMessages) { strInfo = "Skill: " $ class'MMSkillManager'.static.GetSkillGroupByClass(DeusExWeapon(frobTarget).GoverningSkill); infoX = boxTLX + 10; infoY = boxTLY + 28; gc.SetFont(Font'FontMenuSmall_DS'); gc.GetTextExtent(0, infoW, infoH, strInfo); infoW += 8; infoH += 8; infoX = FClamp(infoX, infoW/2+10, width-10-infoW/2); infoY = FClamp(infoY, infoH/2+10, height-10-infoH/2); // draw a dark background gc.SetStyle(DSTY_Modulated); gc.SetTileColorRGB(0, 0, 0); gc.DrawPattern(infoX, infoY, infoW, infoH, 0, 0, Texture'ConWindowBackground'); // draw the text gc.SetTextColor(colText); gc.DrawText(infoX+4, infoY+4, infoW-8, infoH-8, strInfo); // draw the two highlight boxes gc.SetStyle(DSTY_Translucent); gc.SetTileColor(colBorder); gc.DrawBox(infoX, infoY, infoW, infoH, 0, 0, 1, Texture'Solid'); gc.SetTileColor(colBackground); gc.DrawBox(infoX+1, infoY+1, infoW-2, infoH-2, 0, 0, 1, Texture'Solid'); } } } } } H[ 4oZ[ [  ' X[ [ ?  q$ 9F Ik$|1 >|?  FI2 H{4#\%{\z'  n$2 -%y%z%{%|&}&~&B %F G %J %K &P %-U (E,,&b t$Io$z1<#]%z]z(  FK2 v$H^4Wd %^e d 'd wDe '^ e   {$pt^YpSkin class is : V%Aw%A*%A%Ai %Ai t%t,tt%A tt Iu$_18`%_`w%(_   @%x$p lh |$b{o$bA. s$2 -%%y%z%{%|%}%~%B %F %G %J %K %P %-U (E%, ,%%b 4class MMFleshFragment extends CBPFleshFragment; G%wyb cVN:, w*cP 6c6c6:% %s6c 6ccs%s,Z6c a+csw*sNsw96ww>wa wa'''-'-'a**o$- - Ga/!j.l * {x P{.b=r* r{* r{aN}{x n,class MMWeaponGasGrenade extends WeaponGasGrenade; function PlaceGrenade() { if (AmmoType.AmmoAmount <= 0) { Destroy(); return; } super.PlaceGrenade(); if (AmmoType.AmmoAmount <= 0) Destroy(); } state NormalFire { function AnimEnd() { if (bAutomatic) { if ((Pawn(Owner).bFire != 0) && (AmmoType.AmmoAmount > 0)) { if (PlayerPawn(Owner) != None) Global.Fire(0); else GotoState('FinishFire'); } else GotoState('FinishFire'); } else { // if we are a thrown weapon and we run out of ammo, destroy the weapon if (bHandToHand && (ReloadCount > 0) && (AmmoType.AmmoAmount <= 0)) { // fix disappear bug: //Destroy(); } } } } function Fire(float Value) { local float sndVolume; local bool bListenClient; if (Pawn(Owner) != None) { if (bNearWall) { bReadyToFire = False; GotoState('NormalFire'); bPointing = True; PlayAnim('Place',, 0.1); return; } } bListenClient = (Owner.IsA('DeusExPlayer') && DeusExPlayer(Owner).PlayerIsListenClient()); sndVolume = TransientSoundVolume; if ( Level.NetMode != NM_Standalone ) // Turn up the sounds a bit in mulitplayer { sndVolume = TransientSoundVolume * 2.0; if ( Owner.IsA('DeusExPlayer') && (DeusExPlayer(Owner).NintendoImmunityTimeLeft > 0.01) || (!bClientReady && (!bListenClient)) ) { DeusExPlayer(Owner).bJustFired = False; bReadyToFire = True; bPointing = False; bFiring = False; return; } } // check for surrounding environment if ((EnviroEffective == ENVEFF_Air) || (EnviroEffective == ENVEFF_Vacuum) || (EnviroEffective == ENVEFF_AirVacuum)) { if (Region.Zone.bWaterZone) { if (Pawn(Owner) != None) { Pawn(Owner).ClientMessage(msgNotWorking); if (!bHandToHand) PlaySimSound( Misc1Sound, SLOT_None, sndVolume, 1024 ); // play dry fire sound } GotoState('Idle'); return; } } if (bHandToHand) { if (( Level.NetMode != NM_Standalone ) && !bListenClient ) bClientReady = False; bReadyToFire = False; GotoState('NormalFire'); bPointing=True; if ( Owner.IsA('PlayerPawn') ) PlayerPawn(Owner).PlayFiring(); PlaySelectiveFiring(); PlayFiringSound(); } } simulated function Projectile ProjectileFire(class ProjClass, float ProjSpeed, bool bWarn) { local Projectile proj; if (AmmoType.AmmoAmount <= 0) { bDestroyOnFinish = true; return none; } proj = super.ProjectileFire(ProjClass, ProjSpeed, bWarn); if (proj != none) { if (ReloadCount > 0) AmmoType.UseAmmo(1); if ( AmmoType.AmmoAmount <= 0 ) bDestroyOnFinish = True; // Update ammo count on object belt if (DeusExPlayer(Owner) != None) DeusExPlayer(Owner).UpdateBeltText(Self); } return proj; } A%}dM aw*w*a* C%t{/gw*-X-' Y Y t-(:S%Y d X:S,-' w.{*(.{@{-{-{-l > #<Y  ף<-'j.{wj*wj*wj*"j-g { 6g {c g cj-( 2class MMWeaponGEPGun extends CBPWeaponGEPGun; `,class MMWeaponLAM extends WeaponLAM; function PlaceGrenade() { if (AmmoType.AmmoAmount <= 0) { Destroy(); return; } super.PlaceGrenade(); if (AmmoType.AmmoAmount <= 0) Destroy(); } state NormalFire { function AnimEnd() { if (bAutomatic) { if ((Pawn(Owner).bFire != 0) && (AmmoType.AmmoAmount > 0)) { if (PlayerPawn(Owner) != None) Global.Fire(0); else GotoState('FinishFire'); } else GotoState('FinishFire'); } else { // if we are a thrown weapon and we run out of ammo, destroy the weapon if (bHandToHand && (ReloadCount > 0) && (AmmoType.AmmoAmount <= 0)) { // fix disappear bug: //Destroy(); } } } } function Fire(float Value) { local float sndVolume; local bool bListenClient; if (Pawn(Owner) != None) { if (bNearWall) { bReadyToFire = False; GotoState('NormalFire'); bPointing = True; PlayAnim('Place',, 0.1); return; } } bListenClient = (Owner.IsA('DeusExPlayer') && DeusExPlayer(Owner).PlayerIsListenClient()); sndVolume = TransientSoundVolume; if ( Level.NetMode != NM_Standalone ) // Turn up the sounds a bit in mulitplayer { sndVolume = TransientSoundVolume * 2.0; if ( Owner.IsA('DeusExPlayer') && (DeusExPlayer(Owner).NintendoImmunityTimeLeft > 0.01) || (!bClientReady && (!bListenClient)) ) { DeusExPlayer(Owner).bJustFired = False; bReadyToFire = True; bPointing = False; bFiring = False; return; } } // check for surrounding environment if ((EnviroEffective == ENVEFF_Air) || (EnviroEffective == ENVEFF_Vacuum) || (EnviroEffective == ENVEFF_AirVacuum)) { if (Region.Zone.bWaterZone) { if (Pawn(Owner) != None) { Pawn(Owner).ClientMessage(msgNotWorking); if (!bHandToHand) PlaySimSound( Misc1Sound, SLOT_None, sndVolume, 1024 ); // play dry fire sound } GotoState('Idle'); return; } } if (bHandToHand) { if (( Level.NetMode != NM_Standalone ) && !bListenClient ) bClientReady = False; bReadyToFire = False; GotoState('NormalFire'); bPointing=True; if ( Owner.IsA('PlayerPawn') ) PlayerPawn(Owner).PlayFiring(); PlaySelectiveFiring(); PlayFiringSound(); } } simulated function Projectile ProjectileFire(class ProjClass, float ProjSpeed, bool bWarn) { local Projectile proj; if (AmmoType.AmmoAmount <= 0) { bDestroyOnFinish = true; return none; } proj = super.ProjectileFire(ProjClass, ProjSpeed, bWarn); if (proj != none) { if (ReloadCount > 0) AmmoType.UseAmmo(1); if ( AmmoType.AmmoAmount <= 0 ) bDestroyOnFinish = True; // Update ammo count on object belt if (DeusExPlayer(Owner) != None) DeusExPlayer(Owner).UpdateBeltText(Self); } return proj; } W%cT %b l$I%K?F L%a%aoLg- -SM I b!v$M I b!A$M I a/!b!B$M I . [[ZgN[[Z. w$tIgD0@(( ::$@,'@&L- -aL>kk--aq%eq@q%::$ -aa;- @&::$gN[[Zgg?@,q_ gիa?[?իa?Z?_ D?9_.p`S_ gc::$$- @& ?2::$ ::$ @&cr X r l  r Wc`g?,hP_ g::$a/!M::$w.*.Bg?,`9hhcc::$w.*.Vg?,`9hhR ` R ?_`S9[Z[[R ?sR ??q?s6`q6 _`S9[Zqr A 0.22P%d 1.0haclass MMFireball extends Fireball; var float CBPmpDamage; simulated function PostBeginPlay() { if ((miniMTLTeam(Level.Game) != none && miniMTLTeam(Level.Game).bCBP) || (miniMTLDeathMatch(Level.Game) != none && miniMTLDeathMatch(Level.Game).bCBP)) Damage = CBPmpDamage; } M% +[ -i -i' -d u gNotifications are active.!ba?' Q%_  -d u ={tp KtWt,@t%pztp t%u fg R%AK-A6p=,nAa/!{ .Aw{ *{ Ktp fpnAA" H%~ lF K% 0.27T%Z%X F C&B a F  w*Ol? l? lq B  B l q ::$o-: %-: %-- ---- :%------ :%---q ow* o lw * --: :$: ,9  l  o 33s?k   .o --: :$: ,9  l  o 33s?k m   B l? l? l  l o  -: % -: % --  -- :% -- -- :% --w*-:% :%-(-(UwU*wUU #U-uU l 9?U uul U ui UeU6uU[al U?UuUUUUopM    an B o Wwi *i aeUpr*    M B?X94<2---M  z- ?%M  M r*m* wk*hCk?O L=k #???wDD6O ,DD6O ,DD6O , k-w,@ k-w,  k-w,w:kl=:=6,,  ---n   ?,  - -- - - - - l6,6,Chw PX%U% 0.53[% 0.60\% 0.67)class MMWeaponLAW extends WeaponLAW; V%h%w F  f[}m%m, }|6km fe6i6qm w6d6h6qm w'm(  e zwe*P?s-w.*P. ' sPP?PLFPwe*e-G.wG*G b!M$sreea/!.N::$e4 D?P.yzDKF yv e?Pzzwe we::$e4 D?P.yzDKF- yv e?Pz::$w.e*z-ea/!#ea/!-.e:yv w.*w.e*.?P.  ]% 0.74b% 120mc% 150 e%YwD-@- -A?-'] Dn] %] %epS]  {j ee}e&eppe: j YdYd Ye[L eX X?[?_ _L?YeX _ [L e_ L @e Ye[L eX X?[?YeX _ [L e f%[BfW[Z]a .Faaa K _%I F i%H F j%G F k%F F ` Ur -y -y'-X(-R%R&Dy ?%y pATeamBalancer is active.!bay ' m%N_!w.* )-`( NZJN%-X( l-X'XN-X(~ppAuto balancing teams in SDy  seconds.e~(-X' ` class MMWeaponMiniCrossbow extends WeaponMiniCrossbow; var float lastShotTime; var float ffrtolerance; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; } function Fire(float Value) { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 1.0 - ffrtolerance; if (diff < 0.0) return; lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } g%WTn! *wR*RaW-V n%r%ZFWr%n%m@ma/!m-:m%n:m&r@mm"nrnr&%SR%,rRnnRrnr,U% rAJclass MMEscWindow extends MenuUIScreenWindow; struct S_MenuButton { var int y; var int x; var EMenuActions action; var class invoke; var string key; }; var MenuUIMenuButtonWindow winButtons[4]; var string ButtonNames[4]; var int buttonWidth; var S_MenuButton buttonDefaults[4]; var bool isspec; var bool IsExiting; var string NewPlayerTitle; var string NewPlayerContent; var string NewPlayerContentAug; var bool bShowAugWarning; var bool bAugsConfigured; event InitWindow() { Super.InitWindow(); if (Player.GameReplicationInfo != none && !Player.GameReplicationInfo.bTeamGame) { ButtonNames[0] = "Play"; ButtonNames[1] = ""; ButtonNames[2] = ""; } IsExiting = true; CreateMenuButtons(); if (Player.PlayerReplicationInfo != none && Player.PlayerReplicationInfo.bIsSpectator) isspec = true; else isspec = false; } event FocusLeftDescendant(Window leaveWindow) { super.FocusLeftDescendant(leaveWindow); if (bShowAugWarning) { bShowAugWarning = false; root.MessageBox(NewPlayerTitle, NewPlayerContentAug, 1, false, self); } } function SetMOTDText(string MOTDText[8]) { local int i; for (i = 0; i < 8; i++) CreateLabel(20, 20 + (i * 15), MOTDText[i]); if (miniMTLPlayer(player).AmINewPlayer()) root.MessageBox(NewPlayerTitle, NewPlayerContent, 0, false, self); } event bool BoxOptionSelected(Window box, int buttonNumber) { local MMMenuScreenAugSetup mmaugsetup; root.PopWindow(); if (!bAugsConfigured && buttonNumber == 0) { mmaugsetup = MMMenuScreenAugSetup(root.InvokeMenuScreen(class'MMMenuScreenAugSetup')); mmaugsetup.ResetToDefaults(); bShowAugWarning = true; bAugsConfigured = true; } return true; } final function MenuUISmallLabelWindow CreateLabel(int X, int Y, string S) { local MenuUISmallLabelWindow W; W = MenuUISmallLabelWindow(winClient.NewChild(Class'MenuUISmallLabelWindow')); W.SetPos(X, Y); W.SetText(S); W.SetWordWrap(false); return W; } function CreateMenuButtons() { local int buttonIndex; for (buttonIndex = 0; buttonIndex < arrayCount(buttonDefaults); buttonIndex++) { if (ButtonNames[buttonIndex] != "") { winButtons[buttonIndex] = MenuUIMenuButtonWindow(winClient.NewChild(Class'MenuUIMenuButtonWindow')); winButtons[buttonIndex].SetButtonText(ButtonNames[buttonIndex]); winButtons[buttonIndex].SetPos(buttonDefaults[buttonIndex].x, buttonDefaults[buttonIndex].y); winButtons[buttonIndex].SetWidth(buttonWidth); } } } function bool ButtonActivated(Window buttonPressed) { local bool bHandled; local int buttonIndex; bHandled = False; if (Super.ButtonActivated(buttonPressed)) return true; // Figure out which button was pressed for (buttonIndex = 0; buttonIndex < arrayCount(winButtons); buttonIndex++) { if (buttonPressed == winButtons[buttonIndex]) { // Check to see if there's somewhere to go ProcessMenuAction(buttonDefaults[buttonIndex].action, buttonDefaults[buttonIndex].invoke, buttonDefaults[buttonIndex].key); bHandled = True; break; } } return bHandled; } function ProcessCustomMenuButton(string key) { local miniMTLPlayer mmp; mmp = miniMTLPlayer(Player); isspec = false; if (mmp != none) { switch(key) { case "SPECTATE": /*if (!mmp.IsInState('Spectating'))*/ mmp.Spectate(1); isspec = true; break; case "JOIN_UNATCO": mmp.NewChangeTeam(0); break; case "JOIN_NSF": mmp.NewChangeTeam(1); break; case "JOIN_AUTO": mmp.NewChangeTeam(2); break; } } CancelScreen(); } function ProcessAction(String S) { local miniMTLPlayer mmp; mmp = miniMTLPlayer(Player); Super.ProcessAction(S); switch (S) { case "AUGS": root.InvokeMenuScreen(class'MMMenuScreenAugSetup'); break; case "DISC": Player.DisconnectPlayer(); break; case "SET": root.InvokeMenuScreen(class'CBPMenuSettings'); break; case "CANCEL": //if (isspec && mmp != none) mmp.ActivateAllHUDElements(false); CancelScreen(); //root.PopWindow(); break; } } function CancelScreen() { local MMDeusExHUD mmdxhud; if (isspec) { mmdxhud = MMDeusExHUD(root.hud); if (mmdxhud.HUD_mode == 2) { mmdxhud.HUD_mode = 0; mmdxhud.UpdateSettings(Player); } } // Play Cancel Sound PlaySound(Sound'Menu_Cancel', 0.25); root.PopWindow(); } J.class MMWeaponNanoSword extends WeaponNanoSword; var float lastShotTime; var float ffrtolerance; var float CBPmpHitDamage; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; if ((miniMTLTeam(Level.Game) != none && miniMTLTeam(Level.Game).bCBP) || (miniMTLDeathMatch(Level.Game) != none && miniMTLDeathMatch(Level.Game).bCBP)) HitDamage = CBPmpHitDamage; } function Fire(float Value) { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 0.585 - ffrtolerance; if (diff < 0.0) return; lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } simulated function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local float mult; local name damageType; local DeusExPlayer dxPlayer; if (Other != None) { // AugCombat increases our damage if hand to hand mult = 1.0; if (bHandToHand && (DeusExPlayer(Owner) != None)) { mult = DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } // skill also affects our damage // GetWeaponSkill returns 0.0 to -0.7 (max skill/aug) mult += -2.0 * GetWeaponSkill(); // Determine damage type damageType = WeaponDamageType(); if (Other != None) { if (Other.bOwned) { dxPlayer = DeusExPlayer(Owner); if (dxPlayer != None) dxPlayer.AISendEvent('Futz', EAITYPE_Visual); } } if ((Other == Level) || (Other.IsA('Mover'))) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); } else if ((Other != self) && (Other != Owner)) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); if (bHandToHand) SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); if (Role == ROLE_Authority && miniMTLPlayer(Other) != none) { if (bPenetrating && Other.IsA('Pawn') && !Other.IsA('Robot')) miniMTLPlayer(Other).SpawnBloodFromWeapon(HitLocation, HitNormal); } } } if (DeusExMPGame(Level.Game) != None) { if (DeusExPlayer(Other) != None) DeusExMPGame(Level.Game).TrackWeapon(self,HitDamage * mult); else DeusExMPGame(Level.Game).TrackWeapon(self,0); } } @fclass MMWeaponPistol extends CBPWeaponPistol; var float lastShotTime; var float ffrtolerance; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; } function Fire(float Value) { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 0.585 - ffrtolerance;; if (diff < 0.0) return; lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } simulated function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local float mult; local name damageType; local DeusExPlayer dxPlayer; if (Other != None) { // AugCombat increases our damage if hand to hand mult = 1.0; if (bHandToHand && (DeusExPlayer(Owner) != None)) { mult = DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } // skill also affects our damage // GetWeaponSkill returns 0.0 to -0.7 (max skill/aug) mult += -2.0 * GetWeaponSkill(); // Determine damage type damageType = WeaponDamageType(); if (Other != None) { if (Other.bOwned) { dxPlayer = DeusExPlayer(Owner); if (dxPlayer != None) dxPlayer.AISendEvent('Futz', EAITYPE_Visual); } } if ((Other == Level) || (Other.IsA('Mover'))) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); } else if ((Other != self) && (Other != Owner)) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); if (bHandToHand) SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); if (Role == ROLE_Authority && miniMTLPlayer(Other) != none) { if (bPenetrating && Other.IsA('Pawn') && !Other.IsA('Robot')) miniMTLPlayer(Other).SpawnBloodFromWeapon(HitLocation, HitNormal); } } } if (DeusExMPGame(Level.Game) != None) { if (DeusExPlayer(Other) != None) DeusExMPGame(Level.Game).TrackWeapon(self,HitDamage * mult); else DeusExMPGame(Level.Game).TrackWeapon(self,0); } } simulated function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local Rotator rot; local actor Other; local float dist, alpha, degrade; local int i, numSlugs; local float volume, radius; // make noise if we are not silenced if (!bHasSilencer && !bHandToHand) { GetAIVolume(volume, radius); Owner.AISendEvent('WeaponFire', EAITYPE_Audio, volume, radius); Owner.AISendEvent('LoudNoise', EAITYPE_Audio, volume, radius); if (!Owner.IsA('PlayerPawn')) Owner.AISendEvent('Distress', EAITYPE_Audio, volume, radius); } GetAxes(Pawn(owner).ViewRotation,X,Y,Z); StartTrace = ComputeProjectileStart(X, Y, Z); AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False); // check to see if we are a shotgun-type weapon if (AreaOfEffect == AOE_Cone) numSlugs = 5; else numSlugs = 1; // if there is a scope, but the player isn't using it, decrease the accuracy // so there is an advantage to using the scope if (bHasScope && !bZoomed) Accuracy += 0.2; // if the laser sight is on, make this shot dead on // also, if the scope is on, zero the accuracy so the shake makes the shot inaccurate else if (bLasing || bZoomed) Accuracy = 0.0; for (i=0; i 0) && (Level.NetMode != NM_Standalone) && !(bHandToHand)) if (Accuracy < MinSpreadAcc) Accuracy = MinSpreadAcc; // Let handtohand weapons have a better swing if ((bHandToHand) && (NumSlugs > 1) && (Level.NetMode != NM_Standalone)) { StartTrace = ComputeProjectileStart(X,Y,Z); StartTrace = StartTrace + (numSlugs/2 - i) * SwingOffset; } EndTrace = StartTrace + Accuracy * (FRand()-0.5)*Y*1000 + Accuracy * (FRand()-0.5)*Z*1000 ; EndTrace += (FMax(1024.0, MaxRange) * vector(AdjustedAim)); Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); // randomly draw a tracer for relevant ammo types // don't draw tracers if we're zoomed in with a scope - looks stupid // DEUS_EX AMSD In multiplayer, draw tracers all the time. if ( ((Level.NetMode == NM_Standalone) && (!bZoomed && (numSlugs == 1) && (FRand() < 0.5))) || ((Level.NetMode != NM_Standalone) && (Role == ROLE_Authority) && (numSlugs == 1)) ) { if ((AmmoName == Class'MMAmmo10mm') || (AmmoName == Class'MMAmmo3006') || (AmmoName == Class'MMAmmo762mm')) { if (VSize(HitLocation - StartTrace) > 250) { rot = Rotator(EndTrace - StartTrace); if ((Level.NetMode != NM_Standalone) && (Self.IsA('WeaponRifle'))) Spawn(class'SniperTracer',,, StartTrace + 96 * Vector(rot), rot); else { if (Role == ROLE_Authority && miniMTLPlayer(Owner) != none) miniMTLPlayer(Owner).SpawnTracerFromWeapon(StartTrace + 96 * Vector(rot), rot); } } } } // check our range dist = Abs(VSize(HitLocation - Owner.Location)); if (dist <= AccurateRange) // we hit just fine ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); else if (dist <= MaxRange) { // simulate gravity by lowering the bullet's hit point // based on the owner's distance from the ground alpha = (dist - AccurateRange) / (MaxRange - AccurateRange); degrade = 0.5 * Square(alpha); HitLocation.Z += degrade * (Owner.Location.Z - Owner.CollisionHeight); ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); } } // otherwise we don't hit the target at all } Btclass MMEMPGrenade extends EMPGrenade; simulated function TakeDamage(int Damage, Pawn instigatedBy, Vector HitLocation, Vector Momentum, name damageType) { local ParticleGenerator gen; if ((DamageType == 'TearGas') || (DamageType == 'PoisonGas') || (DamageType == 'Radiation')) return; if (DamageType == 'NanoVirus') return; if ( Role == ROLE_Authority ) { // EMP damage disables explosives if (DamageType == 'EMP') { if (!bDisabled) { PlaySound(sound'EMPZap', SLOT_None,,, 1280); bDisabled = True; gen = Spawn(class'ParticleGenerator', Self,, Location, rot(16384,0,0)); if (gen != None) { gen.checkTime = 0.25; gen.LifeSpan = 2; gen.particleDrawScale = 0.3; gen.bRandomEject = True; gen.ejectSpeed = 10.0; gen.bGravity = False; gen.bParticlesUnlit = True; gen.frequency = 0.5; gen.riseRate = 10.0; gen.spawnSound = Sound'Spark2'; gen.particleTexture = Texture'Effects.Smoke.SmokePuff1'; gen.SetBase(Self); } } return; } bDamaged = True; } if (instigatedBy != none) { SetOwner(instigatedBy); Instigator = instigatedBy; } Explode(Location, Vector(Rotation)); } simulated function Tick(float deltaTime) { local ScriptedPawn P; local DeusExPlayer Player; local Vector dist, HitLocation, HitNormal; local float blinkRate, mult, skillDiff; local float proxRelevance; local Pawn curPawn; local bool pass; local Actor HitActor; time += deltaTime; if ( Role == ROLE_Authority ) { super(DeusExProjectile).Tick(deltaTime); if (bDisabled) return; if ( (Owner == None) && ((Level.NetMode == NM_DedicatedServer) || (Level.NetMode == NM_ListenServer)) ) { // Owner has logged out bDisabled = True; team = -1; } if (( Owner != None ) && (DeusExPlayer(Owner) != None )) { if ( TeamDMGame(DeusExPlayer(Owner).DXGame) != None ) { // If they switched sides disable the grenade if ( DeusExPlayer(Owner).PlayerReplicationInfo.team != team ) { bDisabled = True; team = -1; } // // MINIMTL ADDED - planted granades ignore spectators! // else if (DeusExPlayer(Owner).PlayerReplicationInfo.bIsSpectator) { bDisabled = true; team = -1; } // // // } } // check for proximity if (bProximityTriggered) { if (bArmed) { proxCheckTime += deltaTime; // beep based on skill if (skillTime != 0) { if (time > fuseLength) { if (skillTime % 0.3 > 0.25) PlayBeepSound( 1280, 2.0, 3.0 ); } } // if we have been triggered, count down based on skill if (skillTime > 0) skillTime -= deltaTime; // explode if time < 0 if (skillTime < 0) { bDoExplode = True; bArmed = False; } // DC - new ugly way of doing it - old way was "if (proxCheckTime > 0.25)" // new way: weight the check frequency based on distance from player proxRelevance=DistanceFromPlayer/2000.0; // at 500 units it behaves as it did before if (proxRelevance<0.25) proxRelevance=0.25; // low bound 1/4 else if (proxRelevance>10.0) proxRelevance=20.0; // high bound 30 else proxRelevance=proxRelevance*2; // out past 1.0s, double the timing if (proxCheckTime>proxRelevance) { proxCheckTime = 0; // pre-placed explosives are only prox triggered by the player if (Owner == None) { foreach RadiusActors(class'DeusExPlayer', Player, proxRadius*4) { // the owner won't set it off, either if (Player != Owner) { dist = Player.Location - Location; if (VSize(dist) < proxRadius) if (skillTime == 0) skillTime = FClamp(-20.0 * Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition'), 1.0, 10.0); } } } else { // If in multiplayer, check other players if (( Level.NetMode == NM_DedicatedServer) || ( Level.NetMode == NM_ListenServer)) { curPawn = Level.PawnList; while ( curPawn != None ) { pass = False; if ( curPawn.IsA('DeusExPlayer') ) { Player = DeusExPlayer( curPawn ); // Pass on owner if ( Player == Owner ) pass = True; // // MINIMTL ADDED - planted granades ignore spectators! // else if (Player.PlayerReplicationInfo.bIsSpectator) { //log("spectator proximity:"$Player.PlayerReplicationInfo.PlayerName, 'MMLAM'); pass = True; } // // // // Pass on team member else if ( (TeamDMGame(Player.DXGame) != None) && (team == player.PlayerReplicationInfo.team) ) pass = True; // Pass if radar transparency on else if ( Player.AugmentationSystem.GetClassLevel( class'AugRadarTrans' ) == 3 ) pass = True; // Finally, make sure we can see them (no exploding through thin walls) if ( !pass ) { // Only players we can see : changed this to Trace from FastTrace so doors are included HitActor = Trace( HitLocation, HitNormal, Player.Location, Location, True ); if (( HitActor == None ) || (DeusExPlayer(HitActor) == Player)) { } else pass = True; } if ( !pass ) { dist = Player.Location - Location; if ( VSize(dist) < proxRadius ) { if (skillTime == 0) { skillDiff = -skillAtSet + Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition'); if ( skillDiff >= 0.0 ) // Scale goes 1.0, 1.6, 2.8, 4.0 skillTime = FClamp( 1.0 + skillDiff * 6.0, 1.0, 2.5 ); else // Scale goes 1.0, 1.4, 2.2, 3.0 skillTime = FClamp( 1.0 + (-Player.SkillSystem.GetSkillLevelValue(class'SkillDemolition') * 4.0), 1.0, 3.0 ); } } } } curPawn = curPawn.nextPawn; } } else // Only have scripted pawns set off promixity grenades in single player { foreach RadiusActors(class'ScriptedPawn', P, proxRadius*4) { // only "heavy" pawns will set this off if ((P != None) && (P.Mass >= 40)) { // the owner won't set it off, either if (P != Owner) { dist = P.Location - Location; if (VSize(dist) < proxRadius) if (skillTime == 0) skillTime = 1.0; } } } } } } } } // beep faster as the time expires beepTime += deltaTime; if (fuseLength - time <= 0.75) blinkRate = 0.1; else if (fuseLength - time <= fuseLength * 0.5) blinkRate = 0.3; else blinkRate = 0.5; if (time < fuseLength) { if (beepTime > blinkRate) { beepTime = 0; PlayBeepSound( 1280, 1.0, 0.5 ); } } } if ( bDoExplode ) // Keep the simulated chain going Explode(Location, Vector(Rotation)); } q%BQ v P^%_%dCda/!:d%_Dd:d&^DdCdd"_^%N'_^ B%&NL^_ B%N% ^&ko=- -SR Q b!v$R Q b!A$R Q a/!b!B$R Q . f ebnNf eb. w$tInD0@(( ::$z,'z&L- -kL>kk--kx%;xzx%::$ -kk;- z&::$nNf ebnn?z,xW nիk?e?իk?b?W D?9L.pgh W n9::$$- z& ?2::$ ::$ z&9r X r l  r W9gn?,uPW n::$a/!Ka  n?,`9uu99::$w.*.Vn?,`9uuV g V ?Lgh 9eb11V ?VV ??S?V6gS6 Lgh 9ebxr ^p%Ra} R}r Qzr X~}:WX}}XX%X, zXU zXU }r   X^ J{%D'^r^Bw*- -Z--WY.wY*L.@Y A @'wL*L PsL- 'LbLrL--ZL--W w%]X9|]%v];9]%v]; -]b `]%vb |]%]b ]%]b v% me%T% Tma/!m-]%:m%m?eeDm]%:m&m?eeDmTmme%e&v`]ezv%TeamBalancer: Failed to swap all needed player(s).! ~"class MMDeusExHUD extends DeusExHUD; var int HUD_mode; event InitWindow() { local DeusExPlayer player; super.InitWindow(); player = DeusExPlayer(DeusExRootWindow(GetRootWindow()).parentPawn); if ( belt != None ) belt.Destroy(); belt = HUDObjectBelt(NewChild(Class'MMHUDObjectBelt')); if (augDisplay != None) augDisplay.Destroy(); augDisplay = AugmentationDisplayWindow(NewChild(Class'MMAugmentationDisplayWindow')); augDisplay.SetWindowAlignments(HALIGN_Full,VALIGN_Full); if (hms != none) hms.Destroy(); hms = HUDMultiSkills(NewChild(class'MMHUDMultiSkills')); if (activeItems != none) activeItems.Destroy(); activeItems = HUDActiveItemsDisplay(NewChild(Class'MMHUDActiveItemsDisplay')); if (frobDisplay != none) frobDisplay.Destroy(); frobDisplay = FrobDisplayWindow(NewChild(Class'MMFrobDisplayWindow')); frobDisplay.SetWindowAlignments(HALIGN_Full, VALIGN_Full); if (msgLog != none) msgLog.Destroy(); msgLog = HUDLogDisplay(NewChild(Class'MMHUDLogDisplay', False)); msgLog.SetLogTimeout(player.GetLogTimeout()); } function UpdateSettings( DeusExPlayer player ) { if (HUD_mode > 0) { // spectating another player hit.SetVisibility(player.bHitDisplayVisible); activeItems.SetVisibility(player.bAugDisplayVisible); damageDisplay.SetVisibility(player.bHitDisplayVisible); cross.SetCrosshair(player.bCrosshairVisible); if (HUD_mode > 1) { // playing compass.SetVisibility(player.bCompassVisible); ammo.SetVisibility(player.bAmmoDisplayVisible); belt.SetVisibility(player.bObjectBeltVisible); } else { // spectating another player, hide these compass.SetVisibility(false); ammo.SetVisibility(false); belt.SetVisibility(false); ResetCrosshair(); } } else { // spectating in free mode, hide all hit.SetVisibility(false); activeItems.SetVisibility(false); damageDisplay.SetVisibility(false); cross.SetCrosshair(false); compass.SetVisibility(false); ammo.SetVisibility(false); belt.SetVisibility(false); ResetCrosshair(); } } function ResetCrosshair() { local color col; col.R = 255; col.G = 255; col.B = 255; cross.SetCrosshairColor(col); } eclass MMDartPoison extends DartPoison; var float CBPmpDamage; simulated function PostBeginPlay() { if ((miniMTLTeam(Level.Game) != none && miniMTLTeam(Level.Game).bCBP) || (miniMTLDeathMatch(Level.Game) != none && miniMTLDeathMatch(Level.Game).bCBP)) Damage = CBPmpDamage; } l%E F @G&an }3a 4:z%t a<z?o:4t o:6i?i,6i?,6i6i?,6i?D?i,,6i?,6i6i?,6i?D?i,,96i?,6i6i?,i?,-ui,@%-si, %-Ki,%-K--Ri, %{$ &{$ ,{$ ,{$ ,{$  t -u-s-K{i"t f|A,|ff?,iM?, -K--R--R-S-U w*b :% $$M-T+-X w*] BB:%H$U$ja?%jG?j??ja6g:\6gA[::$ ::$},b}&f}6 f}6f6g}66g}66gf6g%xa=g6f6A6%a+ggz j?% j-O-P-KYixC?K@FDD4C?DBKDDK?,w.*B BT aa6B6B6B666pj BVclass MMCarcass extends CBPCarcass; function SpawnFleshFragments() { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer.LineOfSightTo(self, true) || (Pawn(curplayer.ViewTarget) != none && Pawn(curplayer.ViewTarget).LineOfSightTo(self, true))) curplayer.ClientSpawnFleshFragments(Location); } } function ChunkUp(int Damage) { SpawnFleshFragments(); Super(Carcass).ChunkUp(Damage); } ~%e`[ %Z%F Z e%Fa/!Y .FwY *Y -rY X*g%<F?%F?%xe%:F%-F?g g%aF&[ ee%:F& F?g g%aF%[ eZFF"[  WI&F&x ,C(w*?, >>-q  A:&:,a:7A$?'D?L>w*: %b=< j 6:%'r*WAW ' a .W wa *a AE?a A\B?6Ew* w66 o$A- :, w*N ZJ&U t k+d>6-a:7An$ 8ba:7A $ 8 Q&\ o *&a:7AX$ 8 .class MMBloodSpurt extends CBPBloodSpurt; A&D F E&LaEan.LyppppTeamBalance: Swapping player n (Sn) to zYou have been swapped to X %ypyUNATCO side.zpzUNATCO side. ypyNSF side.zpzNSF side.ey'n=X cnX n aX xJn=,Owx*-Ina x O-Ina+x n n n #n #n"ux x Wnz z%C~ rGCSkinPassword, /a0 {@ `[@ vr_w[*0[10r[*[\ v\ \ , \ %/a0 {@ @ s[[*10a[ L&C F DS&P&eD #% ?  6-D!|L?a:7A@$?g?g@ 8a:7A $?g?g@ 8VD!W  D!P::$a $?g?g@ 8D!Y D!^a:7AF$?g?g@ 8D!aa $?g?g@ 8\Q\>a:7A $?g?g@ 8\(?a:7A$?g?g@ 8a:7AK$?g?g@ 8 ,class MMBloodDrop extends CBPBloodDrop; W&z = # class MMBeam extends Beam; M&T c@~ sJ%Q%QQ,QT  Q  QT  'J&Q%Q,QT  Q  QT  '(  [&V&Y  * q=w.*.- Y-  R*%!y  Q[Vclass MMAutoTurret extends AutoTurret; function SpawnTracerFromWeapon(Vector loc, Rotator rot) { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer.LineOfSightTo(self, true) || (Pawn(curplayer.ViewTarget) != none && Pawn(curplayer.ViewTarget).LineOfSightTo(self, true))) curplayer.ClientSpawnTracerFromWeapon(self, loc, rot); } } function SpawnBlood2(Vector HitLocation, Vector HitNormal, Actor hit) { local rotator rot; local miniMTLPlayer hitplayer; rot = Rotator(Location - HitLocation); rot.Pitch = 0; rot.Roll = 0; hitplayer = miniMTLPlayer(hit); if (hitplayer == none) return; if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) return; hitplayer.SpawnBloodFromWeapon(HitLocation, HitNormal, rot); } function SpawnShellCasing(Vector loc, Rotator rot) { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer.LineOfSightTo(self, true) || (Pawn(curplayer.ViewTarget) != none && Pawn(curplayer.ViewTarget).LineOfSightTo(self, true))) curplayer.ClientSpawnShellCasing(self, loc, false, rot); } } function SpawnSpark(Vector loc, Vector norm, Actor hit) { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer.LineOfSightTo(self, true) || (Pawn(curplayer.ViewTarget) != none && Pawn(curplayer.ViewTarget).LineOfSightTo(self, true))) curplayer.ClientSpawnSpark(self, loc, norm, hit); } } simulated function SpawnEffects(Vector HitLocation, Vector HitNormal, Actor Other) { local miniMTLPlayer curplayer; if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) return; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer.LineOfSightTo(self, true) || (Pawn(curplayer.ViewTarget) != none && Pawn(curplayer.ViewTarget).LineOfSightTo(self, true))) curplayer.ClientSpawnTurretEffects(self, HitLocation, HitNormal, Other); } } function Fire() { local Vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local Rotator rot; local Actor hit; //local ShellCasing shell; //local Spark spark; local Pawn attacker; if (!gun.IsAnimating()) gun.LoopAnim('Fire'); // CNN - give turrets infinite ammo // if (ammoAmount > 0) // { // ammoAmount--; GetAxes(gun.Rotation, X, Y, Z); StartTrace = gun.Location; EndTrace = StartTrace + gunAccuracy * (FRand()-0.5)*Y*1000 + gunAccuracy * (FRand()-0.5)*Z*1000 ; EndTrace += 10000 * X; hit = Trace(HitLocation, HitNormal, EndTrace, StartTrace, True); // spawn some effects if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) { //shell = None; } else { //shell = Spawn(class'ShellCasing',,, gun.Location); SpawnShellCasing(gun.Location, gun.Rotation - rot(0,16384,0)); } //if (shell != None) // shell.Velocity = Vector(gun.Rotation - rot(0,16384,0)) * 100 + VRand() * 30; MakeNoise(1.0); PlaySound(sound'PistolFire', SLOT_None); AISendEvent('LoudNoise', EAITYPE_Audio); // muzzle flash gun.LightType = LT_Steady; gun.MultiSkins[2] = Texture'FlatFXTex34'; SetTimer(0.1, False); // randomly draw a tracer if (FRand() < 0.5) { if (VSize(HitLocation - StartTrace) > 250) { rot = Rotator(EndTrace - StartTrace); //Spawn(class'Tracer',,, StartTrace + 96 * Vector(rot), rot); SpawnTracerFromWeapon(StartTrace + 96 * Vector(rot), rot); } } if (hit != None) { if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) { //spark = None; } else { // spawn a little spark and make a ricochet sound if we hit something SpawnSpark(HitLocation, HitNormal, hit); } attacker = None; if ((curTarget == hit) && !curTarget.IsA('PlayerPawn')) attacker = GetPlayerPawn(); if (Level.NetMode != NM_Standalone) attacker = safetarget; if ( hit.IsA('DeusExPlayer') && ( Level.NetMode != NM_Standalone )) DeusExPlayer(hit).myTurretKiller = Self; hit.TakeDamage(gunDamage, attacker, HitLocation, 1000.0*X, 'AutoShot'); if (hit.IsA('Pawn') && !hit.IsA('Robot')) SpawnBlood2(HitLocation, HitNormal, hit); else if ((hit == Level) || hit.IsA('Mover')) SpawnEffects(HitLocation, HitNormal, hit); } // } // else // { // PlaySound(sound'DryFire', SLOT_None); // } } function PreBeginPlay() { local Vector v1, v2; local class gunClass; local Rotator rot; Super(DeusExDecoration).PreBeginPlay(); if (gun == none) { if (IsA('AutoTurretSmall')) gunClass = class'AutoTurretGunSmall'; else gunClass = class'AutoTurretGun'; rot = Rotation; rot.Pitch = 0; rot.Roll = 0; origRot = rot; gun = Spawn(gunClass, Self,, Location, rot); if (gun != None) { v1.X = 0; v1.Y = 0; v1.Z = CollisionHeight + gun.Default.CollisionHeight; v2 = v1 >> Rotation; v2 += Location; gun.SetLocation(v2); gun.SetBase(Self); } } // set up the alarm listeners AISetEventCallback('Alarm', 'AlarmHeard'); if ( Level.NetMode != NM_Standalone ) { maxRange = mpTurretRange; gunDamage = mpTurretDamage; bInvincible = True; bDisabled = !bActive; } } U&Ke`a#6N=,|L|a/!y-K| "K 'p.|wp*pKKJNL||" ]&e^ aDB::$e v Bwe*e{ ` class MMWeaponPlasmaRifle extends WeaponPlasmaRifle; var float lastShotTime; var float ffrtolerance; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; } function Fire(float Value) { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 0.623 - ffrtolerance; if (diff < 0.0) return; lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } f&hW :yww*!0 #?w::$h v wwh*h{ c&hzwh*J?s-w.*J. ' sJJ?JLn Pwh*h-m .wm *m b!M$srhha/!.N::$h4 D?J.zDkn  t h?Jzzwh wh::$h4 D?J.zDkn - t h?Jz::$w.h*z-ha/!#ha/!-.h:t w.*w.h*.?J.  O&B F _&A F Z&IWys%I6O=,r.IGwr*rKGJO e&H?;-w.*w.(H t i&o  Z   h&FO $::$ E.-rE* qFt%"t, Xq% ot! MWtF%F,zWFEHrM :FE*%EjFEHq&Ft? o&g& , l&E  Z E s <20::$ ::$a A( w m&k&Z4 xw tw =| ?,Xw M-z '-z '`-z (t( t Mw.*| .ODw.*| .]D [v&DG (::$ *w*uA?%Dd> w.ww*w  y  N&}`Q)% v *{~~ B [~ ClassVBL. }~ vB_.Lw_*_y_%_A{_^L L@_J_=5-R/-QPossible cheat detected:!ppPlayer Caught: ..!ppPlayer Address: . .!ppCheat Found: Invalid Console class Detected. (P)!.7~ Invalid console class, disconnecting; try againa;B s&u&Ua( ]D%UD,4?}p}S, K}p},A,D}  D@ w&B" lT!v  -s Tw\*|B,r=\ hBj BT-|  }&Q vf^::$::$Gw\*\a^wi *i a   ENclass MMAugVision extends MMAugmentation abstract; static function ActivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; local float augval; manager = GetManager(dxp); augval = manager.GetAugLevelValue(default.Class); manager.SetVisionAugStatus(augval, true); dxp.RelevantRadius = augval; } static function DeactivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); manager.SetVisionAugStatus(0, false); dxp.RelevantRadius = 0; } UF Up%g?&g=,g333?,gL?,g?,g>,gL>,g> z&|&ld-U/a0 { [{  ,{ -'{    10-U'z { &{n F&-{#r\*\a wDDw\*\a\* p&}b}N.}wN*N?%N?%N?%N]&Ni F'V^ z @2w\* -V,inject userflag 0n-V Fclass MMAugTarget extends MMAugmentation abstract; static function ActivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); manager.SetTargetingAugStatus(true); } static function DeactivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); manager.SetTargetingAugStatus(false); } `&@  G Zyz-Z-y Y'x&sCm - (E%PE, FEE $(Ei-dt-d'' C'bU]wU*/U a0 S\N %ON , N S$N $N Sb10 MK'[ [Jbh[ owb*b S`b jor-Ybb bb be[  &[ e[ e ptCppp(S) is first time player. ['t\  Q V- -E \Tw\*=\- |S\t.r.\*w..\*e.\ ee~e:pAdding IP TempBan for: eh%h, w.*'zh.s Bw.*'zh.U h/h, w.*h.s e//w.*h.U e\a \\. c'cN QA-c ??-E-'c-(  E[class MMWeaponRifle extends CBPWeaponRifle; simulated function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local float mult; local name damageType; local DeusExPlayer dxPlayer; if (Other != None) { // AugCombat increases our damage if hand to hand mult = 1.0; if (bHandToHand && (DeusExPlayer(Owner) != None)) { mult = DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } // skill also affects our damage // GetWeaponSkill returns 0.0 to -0.7 (max skill/aug) mult += -2.0 * GetWeaponSkill(); // Determine damage type damageType = WeaponDamageType(); if (Other != None) { if (Other.bOwned) { dxPlayer = DeusExPlayer(Owner); if (dxPlayer != None) dxPlayer.AISendEvent('Futz', EAITYPE_Visual); } } if ((Other == Level) || (Other.IsA('Mover'))) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); } else if ((Other != self) && (Other != Owner)) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); if (bHandToHand) SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); if (Role == ROLE_Authority && miniMTLPlayer(Other) != none) { if (bPenetrating && Other.IsA('Pawn') && !Other.IsA('Robot')) miniMTLPlayer(Other).SpawnBloodFromWeapon(HitLocation, HitNormal); } } } if (DeusExMPGame(Level.Game) != None) { if (DeusExPlayer(Other) != None) DeusExMPGame(Level.Game).TrackWeapon(self,HitDamage * mult); else DeusExMPGame(Level.Game).TrackWeapon(self,0); } } simulated function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local Rotator rot; local actor Other; local float dist, alpha, degrade; local int i, numSlugs; local float volume, radius; // make noise if we are not silenced if (!bHasSilencer && !bHandToHand) { GetAIVolume(volume, radius); Owner.AISendEvent('WeaponFire', EAITYPE_Audio, volume, radius); Owner.AISendEvent('LoudNoise', EAITYPE_Audio, volume, radius); if (!Owner.IsA('PlayerPawn')) Owner.AISendEvent('Distress', EAITYPE_Audio, volume, radius); } GetAxes(Pawn(owner).ViewRotation,X,Y,Z); StartTrace = ComputeProjectileStart(X, Y, Z); AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False); // check to see if we are a shotgun-type weapon if (AreaOfEffect == AOE_Cone) numSlugs = 5; else numSlugs = 1; // if there is a scope, but the player isn't using it, decrease the accuracy // so there is an advantage to using the scope if (bHasScope && !bZoomed) Accuracy += 0.2; // if the laser sight is on, make this shot dead on // also, if the scope is on, zero the accuracy so the shake makes the shot inaccurate else if (bLasing || bZoomed) Accuracy = 0.0; for (i=0; i 0) && (Level.NetMode != NM_Standalone) && !(bHandToHand)) if (Accuracy < MinSpreadAcc) Accuracy = MinSpreadAcc; // Let handtohand weapons have a better swing if ((bHandToHand) && (NumSlugs > 1) && (Level.NetMode != NM_Standalone)) { StartTrace = ComputeProjectileStart(X,Y,Z); StartTrace = StartTrace + (numSlugs/2 - i) * SwingOffset; } EndTrace = StartTrace + Accuracy * (FRand()-0.5)*Y*1000 + Accuracy * (FRand()-0.5)*Z*1000 ; EndTrace += (FMax(1024.0, MaxRange) * vector(AdjustedAim)); Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); // randomly draw a tracer for relevant ammo types // don't draw tracers if we're zoomed in with a scope - looks stupid // DEUS_EX AMSD In multiplayer, draw tracers all the time. if ( ((Level.NetMode == NM_Standalone) && (!bZoomed && (numSlugs == 1) && (FRand() < 0.5))) || ((Level.NetMode != NM_Standalone) && (Role == ROLE_Authority) && (numSlugs == 1)) ) { if ((AmmoName == Class'MMAmmo10mm') || (AmmoName == Class'MMAmmo3006') || (AmmoName == Class'MMAmmo762mm')) { if (VSize(HitLocation - StartTrace) > 250) { rot = Rotator(EndTrace - StartTrace); if ((Level.NetMode != NM_Standalone) && (Self.IsA('MMWeaponRifle'))) { if (Role == ROLE_Authority && miniMTLPlayer(Owner) != none) miniMTLPlayer(Owner).SpawnSniperTracerFromWeapon(StartTrace + 96 * Vector(rot), rot); } else { if (Role == ROLE_Authority && miniMTLPlayer(Owner) != none) miniMTLPlayer(Owner).SpawnTracerFromWeapon(StartTrace + 96 * Vector(rot), rot); } } } } // check our range dist = Abs(VSize(HitLocation - Owner.Location)); if (dist <= AccurateRange) // we hit just fine ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); else if (dist <= MaxRange) { // simulate gravity by lowering the bullet's hit point // based on the owner's distance from the ground alpha = (dist - AccurateRange) / (MaxRange - AccurateRange); degrade = 0.5 * Square(alpha); HitLocation.Z += degrade * (Owner.Location.Z - Owner.CollisionHeight); ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); } } // otherwise we don't hit the target at all } S'HJ rH* nHbBrn*rn* %V %%V , qV nwq*6q6q6q6q6:q6q6Z.q-6P.q- -6q .q--6H..q-^ q-w.q*6v ..qrV PQ6|Mn 6}M6~MzlV6Ml~l.  ]'rMNe5rf d JrBTESTeiGB{m>f{d|V{rfG@MVffG?,%s,-6q ,.i-w 6,ra-w drdfGT,Vf#eVSS6,/eVGa>fVSS6,ez SPing#eVSS6Z,.DeVp=?z V?fVSS6Z,.B-6P,.BAdmin-6H,.BModi{B &%,,eVSB(eVq=>?,xfVSBd,,% ,-6q ,.-w 6,r-w ddfGB6,eVSB#eVq=>fVSB#eVSS6,/eVGa>fVSS6,ez SPing#eVSS6Z,.DeVp=?z V?fVSS6Z,.B-6P,.BAdmin-6H,.BMod9{B &%,,eVSB(eVq=>?,xfVSBd|6v ,.BpSpectating: 6F,.BSpectator &%,,eVSB(eVq=>?,fVSBd,zKf?,GGV |*class MMWeaponSawedOffShotgun extends WeaponSawedOffShotgun; var float lastShotTime; var float ffrtolerance; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; } function Fire(float Value) { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 1.35 - ffrtolerance; if (diff < 0.0) return; lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } simulated function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local float mult; local name damageType; local DeusExPlayer dxPlayer; if (Other != None) { // AugCombat increases our damage if hand to hand mult = 1.0; if (bHandToHand && (DeusExPlayer(Owner) != None)) { mult = DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } // skill also affects our damage // GetWeaponSkill returns 0.0 to -0.7 (max skill/aug) mult += -2.0 * GetWeaponSkill(); // Determine damage type damageType = WeaponDamageType(); if (Other != None) { if (Other.bOwned) { dxPlayer = DeusExPlayer(Owner); if (dxPlayer != None) dxPlayer.AISendEvent('Futz', EAITYPE_Visual); } } if ((Other == Level) || (Other.IsA('Mover'))) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); } else if ((Other != self) && (Other != Owner)) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); if (bHandToHand) SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); if (Role == ROLE_Authority && miniMTLPlayer(Other) != none) { if (bPenetrating && Other.IsA('Pawn') && !Other.IsA('Robot')) miniMTLPlayer(Other).SpawnBloodFromWeapon(HitLocation, HitNormal); } } } if (DeusExMPGame(Level.Game) != None) { if (DeusExPlayer(Other) != None) DeusExMPGame(Level.Game).TrackWeapon(self,HitDamage * mult); else DeusExMPGame(Level.Game).TrackWeapon(self,0); } } \ class MMWeaponShuriken extends CBPWeaponShuriken; var float lastShotTime; var float ffrtolerance; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; } function Fire(float Value) { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 0.36 - ffrtolerance; if (diff < 0.0) return; lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } u'roi =- -Sp u b!v$p u b!A$p u a/!b!B$p u . oonoNoon. w$tIoD0@(( ::$s,'s&L- -rL>kk--r[%;[s[%::$ -rr;- s&::$oNoonoo?s,[H oիr?o?իr?n?H D?9U.ppuH o9::$$- s& ?2::$ ::$ s&9r X r l  r W9po?,cPH o::$a/!Ka  o?,`9cc99::$w.*.Vo?,`9ccf p f ?Upu9on11f ?Af ???A6p6 Upu9on[r  e'kk  -E  k f'`'7 2--0$ h'V -E-E(.-^ (Moderator logged out.4=gave up moderator abilities. edv&>w.*d.]yyw.*d.Owd*d-Q ri *i a ]-^d-M-Kd-P DL(hT B--E Qw.*_ .Ow.*_ .]@w_ *{_ S@z_ Sh-E'.-^ 'Moderator logged in.2=became a server moderator. g' KYu >0a!~ a!~0-Y -K  -Y Yh Y C  \w*-%Z Play&Z ,Z -g'Aw*--e '-e (  m'cL 4: c8-[-[(Ygd&( ^'y'LY+!, h0)hhpphS:o, hph0hphSh n'bRArp %=p ,^,,p ,p bp p.sYgf%( diclass MMWeaponStealthPistol extends WeaponStealthPistol; var float lastShotTime; var float ffrtolerance; var float CBPmpHitDamage; function PostBeginPlay() { super.PostBeginPlay(); if (miniMTLTeam(Level.Game) != none) ffrtolerance = miniMTLTeam(Level.Game).Settings.FastFireRateTolerance; else if (miniMTLDeathmatch(Level.Game) != none) ffrtolerance = miniMTLDeathmatch(Level.Game).Settings.FastFireRateTolerance; if ((miniMTLTeam(Level.Game) != none && miniMTLTeam(Level.Game).bCBP) || (miniMTLDeathMatch(Level.Game) != none && miniMTLDeathMatch(Level.Game).bCBP)) HitDamage = CBPmpHitDamage; } function Fire(float Value) { local float diff; diff = Level.TimeSeconds - lastShotTime; diff -= 0.332 - ffrtolerance; if (diff < 0.0) return; lastShotTime = Level.TimeSeconds; super.Fire(value); } // fix bug related to firing when having no weapon in hand simulated function bool ClientFire( float value ) { if (DeusExPlayer(Owner) != none && DeusExPlayer(Owner).inHand != self) return false; return super.ClientFire(value); } simulated function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local float mult; local name damageType; local DeusExPlayer dxPlayer; if (Other != None) { // AugCombat increases our damage if hand to hand mult = 1.0; if (bHandToHand && (DeusExPlayer(Owner) != None)) { mult = DeusExPlayer(Owner).AugmentationSystem.GetAugLevelValue(class'AugCombat'); if (mult == -1.0) mult = 1.0; } // skill also affects our damage // GetWeaponSkill returns 0.0 to -0.7 (max skill/aug) mult += -2.0 * GetWeaponSkill(); // Determine damage type damageType = WeaponDamageType(); if (Other != None) { if (Other.bOwned) { dxPlayer = DeusExPlayer(Owner); if (dxPlayer != None) dxPlayer.AISendEvent('Futz', EAITYPE_Visual); } } if ((Other == Level) || (Other.IsA('Mover'))) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); } else if ((Other != self) && (Other != Owner)) { if ( Role == ROLE_Authority ) Other.TakeDamage(HitDamage * mult, Pawn(Owner), HitLocation, 1000.0*X, damageType); if (bHandToHand) SelectiveSpawnEffects( HitLocation, HitNormal, Other, HitDamage * mult); if (Role == ROLE_Authority && miniMTLPlayer(Other) != none) { if (bPenetrating && Other.IsA('Pawn') && !Other.IsA('Robot')) miniMTLPlayer(Other).SpawnBloodFromWeapon(HitLocation, HitNormal); } } } if (DeusExMPGame(Level.Game) != None) { if (DeusExPlayer(Other) != None) DeusExMPGame(Level.Game).TrackWeapon(self,HitDamage * mult); else DeusExMPGame(Level.Game).TrackWeapon(self,0); } } simulated function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local Rotator rot; local actor Other; local float dist, alpha, degrade; local int i, numSlugs; local float volume, radius; // make noise if we are not silenced if (!bHasSilencer && !bHandToHand) { GetAIVolume(volume, radius); Owner.AISendEvent('WeaponFire', EAITYPE_Audio, volume, radius); Owner.AISendEvent('LoudNoise', EAITYPE_Audio, volume, radius); if (!Owner.IsA('PlayerPawn')) Owner.AISendEvent('Distress', EAITYPE_Audio, volume, radius); } GetAxes(Pawn(owner).ViewRotation,X,Y,Z); StartTrace = ComputeProjectileStart(X, Y, Z); AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False); // check to see if we are a shotgun-type weapon if (AreaOfEffect == AOE_Cone) numSlugs = 5; else numSlugs = 1; // if there is a scope, but the player isn't using it, decrease the accuracy // so there is an advantage to using the scope if (bHasScope && !bZoomed) Accuracy += 0.2; // if the laser sight is on, make this shot dead on // also, if the scope is on, zero the accuracy so the shake makes the shot inaccurate else if (bLasing || bZoomed) Accuracy = 0.0; for (i=0; i 0) && (Level.NetMode != NM_Standalone) && !(bHandToHand)) if (Accuracy < MinSpreadAcc) Accuracy = MinSpreadAcc; // Let handtohand weapons have a better swing if ((bHandToHand) && (NumSlugs > 1) && (Level.NetMode != NM_Standalone)) { StartTrace = ComputeProjectileStart(X,Y,Z); StartTrace = StartTrace + (numSlugs/2 - i) * SwingOffset; } EndTrace = StartTrace + Accuracy * (FRand()-0.5)*Y*1000 + Accuracy * (FRand()-0.5)*Z*1000 ; EndTrace += (FMax(1024.0, MaxRange) * vector(AdjustedAim)); Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); // randomly draw a tracer for relevant ammo types // don't draw tracers if we're zoomed in with a scope - looks stupid // DEUS_EX AMSD In multiplayer, draw tracers all the time. if ( ((Level.NetMode == NM_Standalone) && (!bZoomed && (numSlugs == 1) && (FRand() < 0.5))) || ((Level.NetMode != NM_Standalone) && (Role == ROLE_Authority) && (numSlugs == 1)) ) { if ((AmmoName == Class'MMAmmo10mm') || (AmmoName == Class'MMAmmo3006') || (AmmoName == Class'MMAmmo762mm')) { if (VSize(HitLocation - StartTrace) > 250) { rot = Rotator(EndTrace - StartTrace); if ((Level.NetMode != NM_Standalone) && (Self.IsA('WeaponRifle'))) Spawn(class'SniperTracer',,, StartTrace + 96 * Vector(rot), rot); else { if (Role == ROLE_Authority && miniMTLPlayer(Owner) != none) miniMTLPlayer(Owner).SpawnTracerFromWeapon(StartTrace + 96 * Vector(rot), rot); } } } } // check our range dist = Abs(VSize(HitLocation - Owner.Location)); if (dist <= AccurateRange) // we hit just fine ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); else if (dist <= MaxRange) { // simulate gravity by lowering the bullet's hit point // based on the owner's distance from the ground alpha = (dist - AccurateRange) / (MaxRange - AccurateRange); degrade = 0.5 * Square(alpha); HitLocation.Z += degrade * (Owner.Location.Z - Owner.CollisionHeight); ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); } } // otherwise we don't hit the target at all } ^ p't'N Lice-i a%q.C  O C qL-['-i'' ax'j&/zwj*D?s-w.*D. ' sDD?DL~Pwj*j-x.wx*x b!M$srjja/!.N::$j4 D?D.D zDW~ D Gj?Dzzwj wj::$j4 D?D.D zDW~- D Gj?Dz::$w.j*z-ja/!#ja/!-.j:D Gw.*w.j*.?D.  qz'_?;-w.*w.(_ h@{'\ `ObO?P?O b\ b Mw.*P.ODw.*P.]D r o'uK,8ue@pPingu !,,,lQ p=?@Ga>Q u2eGa>Q P l?? P XjpppppppServer: 6|M Map: 6M Players: S6}M/S6~Mu &,,,ue@pjll@?,u*eQ Ga>lP @pjP p?,jpppMiniMTL version:  E  Current time: Lue@pju*eQ Ga>lP @pj ^zAk9z%z,{zZ zY .e zY dzZ zY %e?6qz^ ?6rz^ zY e?jz 9class MMAugShield extends MMAugmentation abstract; ~'rM ~z -g( r'l%l,rrlY Y6ol^ 6nl^ 6ll^ -g'l-g %gX'sZxMQi.ri*  .biCr *  cq-S Z%OZ,Es{&Z&ZN Z H-Rs{@N @N [ N N  -RZx  I(eu j_ e]w.*v]w.\*Re.\  @(TD C.-e (wC*T RSPECTATEC]&-e ' uJOIN_UNATCOC`% JOIN_NSFC`& JOIN_AUTOC`, V feclass MMAugRadarTrans extends MMAugmentation abstract; static function float NewGetEnergyRate() { return default.EnergyRate * default.LevelValues[3]; } E(tb !Q. tt BAUGS O C  ]DISC~ |SET O  CANCELV  U(F(vd-9f..f-  }'O(0Sy%Qy&Eyyy&yt6y6EEy6y6E#6y6EEyy2mEnE.EyE.y.ymy.ny  H(J Vy[-e J .b[J F,J F%J Fe >c  P(K  w.*.-E wT).@.TXK '!U X?,T? D?X. Tni' g h?:%K m an-]Z K 'n%(| '%D?%? !l %%w*w * Y %Tni')-%%  6%% G'!x z'!Q '!|J!am J'm '!Q$:% '!Y:%n,B TK !-]:%$ ?:%w.T*b..Twb*b-Jrb rb rb M%bw.*w.T .@.T%. '!Y '!|.TX,'!C ?% ?%e%'& -^''!l--^(:%S&:&6i>i=rTi?ii_qnp_% _&g -^a!e =:%%?,%%,l_, _,g  )_,&-^a!k =@@-^a!h =:%%%%%%i_,%%% %%--% %%K%%i%%g  _,-^a!g =_,-^a!d =-^a!f =:%%%%1_,%\L_,%\%,z%%%%-^6m _&a!l =a!m =6 -^6-( 6m a!i =6 a!j =r '!H  '!Y '!^ '!a '!g '!C '!x '!| '!o h?A w*Z| :% %Yp | wY*Y %D? AD? Ar % :% % %n,  wT*K T[ ?%n'i-]b!B$  !C ?%n'iW :%RT%'g y ?%%TKT'n b? '!T -  :%n,J T* PC,//============================================================================= // //============================================================================= class _MMConsoleChecker extends Actor; replication { reliable if(ROLE == ROLE_Authority) _clientGiveConsoleInfo; reliable if(ROLE < ROLE_Authority) _serverValidateConsole; } var private string _checkUID; var private string _foundConsole; /** @ignore */ var private bool _bCheckPassed; var private bool _bInitalized; simulated function PostBeginPlay() { if(level.NetMode != NM_StandAlone && ROLE == ROLE_Authority) { SetTimer(10,false); } } final simulated function _Initalize() { if(level.NetMode != NM_StandAlone && ROLE == ROLE_Authority) { if(DeusExPlayer(Owner) != none) { _checkUID=_generateUID(); _clientGiveConsoleInfo(_checkUID); _bInitalized=true; SetTimer(10,false); } } } final simulated function _clientGiveConsoleInfo(string checkID) { _serverValidateConsole(string(DeusExPlayer(Owner).Player.Console.class)$"|"$string(DeusExPlayer(Owner).RootWindow),checkID); } final function _serverValidateConsole(string in, string checkID) { local string conStr,rootStr; if(checkID == _checkUID) { conStr=left(in,instr(in,"|")); _foundConsole=conStr; //rootStr=right(in,len(in)-len(conStr)-1); //nah.. i'll think about checking this too if(conStr ~= "Engine.Console") _bCheckPassed=true; //if(rootStr ~= "DeusEx.DeusExRootWindow") // bCheckPassed=true; } else { log("ConsoleChecker -- Received invalid client answer from"@PlayerPawn(Owner).PlayerReplicationInfo.PlayerName); } } simulated function Timer() { if(_bInitalized) { if(!_bCheckPassed) { Log("Possible cheat detected:", 'MiniMTL'); Log("Player Caught: " $ DeusExPlayer(Owner).PlayerReplicationInfo.PlayerName $ ".", 'MiniMTL'); Log("Player Address: " $ DeusExPlayer(Owner).GetPlayerNetworkAddress() $ ".", 'MiniMTL'); Log("Cheat Found: Invalid Console class Detected. ("$_foundConsole$")", 'MiniMTL'); DeusExPlayer(Owner).ForceDisconnect("Invalid console class, disconnecting; try again"); } Destroy(); } else { _Initalize(); } } static function string _generateUID() { local int i; local string UID; for(i=0;i<16;i++) { if(FRand() < 0.5) { UID=UID$string(Rand(9)); } else { UID=UID$Chr(65+Rand(5)); } } return UID; } yW(I } t -U w* +|  I .lwI *I -I n r  M(C   Q(MP8u@M H#//============================================================================= // Some fixes of the game on client side. //============================================================================= class _MMSomeFixes1 extends Actor; var bool _bFixedLevel; var float _WeaponShotTimes[10]; simulated function PreBeginPlay() { _WeaponShotTimes[0] = 0.5; // default (class'MMWeaponCombatKnife', class'MMWeaponNanoSword', class'MMWeaponPlasmaRifle') _WeaponShotTimes[1] = 0.1; // class'MMWeaponAssaultGun' _WeaponShotTimes[2] = 0.7; // class'MMWeaponAssaultShotGun' _WeaponShotTimes[3] = 0.8; // class'MMWeaponMiniCrossbow' _WeaponShotTimes[4] = 0.6; // class'MMWeaponPistol' _WeaponShotTimes[5] = 0.3; // class'MMWeaponSawedOffShotgun' _WeaponShotTimes[6] = 0.2; // class'MMWeaponShuriken' _WeaponShotTimes[7] = 0.15; // class'MMWeaponStealthPistol' } simulated function Tick(float VC5) { local DeusExLevelInfo Z52; if (!_bFixedLevel) { foreach AllActors(Class'DeusExLevelInfo',Z52) { Z52.missionNumber=7; Z52.bMultiPlayerMap=True; Z52.ConversationPackage=Class'DeusExLevelInfo'.Default.ConversationPackage; } _bFixedLevel = true; } _CheckWeapons(); } final simulated function _CheckWeapons() { local miniMTLPlayer Player; local DeusExWeapon dxw; local int index; Player = miniMTLPlayer(Owner); if (Player == none) return; dxw = DeusExWeapon(Player.Weapon); if (dxw == none) return; else { switch (dxw.Class) { case class'MMWeaponAssaultGun': index = 1; break; case class'MMWeaponAssaultShotGun': index = 2; break; case class'MMWeaponCombatKnife': case class'MMWeaponNanoSword': case class'MMWeaponPlasmaRifle': index = 0; break; case class'MMWeaponMiniCrossbow': index = 3; break; case class'MMWeaponPistol': index = 4; break; case class'MMWeaponSawedOffShotgun': index = 5; break; case class'MMWeaponShuriken': index = 6; break; case class'MMWeaponStealthPistol': index = 7; break; default: return; } // kick if shottime is not correct if (dxw.ShotTime < _WeaponShotTimes[index]) Player.ConsoleCommand("disconnect"); } } R(fu fHw.*.- - LppPSDNfdfd feK{ LD ?K?C Ga?feD C K{ L- -- C { Lpp feK{ LD ?K?feD C K{ L \(2R6+dBcci:\X\Q\c qD?2 @?h D?2 333?2?q?h ,2222DBB%),d2?q}6w l,2?h }62$62=,62$2_??}2?q}:6v l,2?h }62=,62$62$2_??}2?q}:6s l,2?h ,3}62$62$62=,2_??}q 8class MMAugPower extends MMAugmentation abstract; X(z S sw*,stopdemoz demo_%s-%s-%sSSSz %s_%s-%s-%sz SSS,pdemorec z pStarted recording to: z  Y(E R hZ/a0 E WV:E :$:E :$Net actor:VE 10  `(A]no mw*?w *  $mw *  $  T(oF 6+Z-C(;:o:$y-,CANCEL'w,pKEYNAME Rox ,pKEYBINDING w|x Talko |x TeamTalkm u'F|x KillerProfile- ''X o-E ](Hi'A%A,c6v Al6v A&l6w Al6w A&l6s Al6s A&lA6v ,clI6w ,clH6s ,clJ |AxbA%UA,d6v Al$6w Al%6s Al$Acy C J(wM]3xweOTHvq=>weHAOTweOTIDHvGa>weHAOTIDweOTHv?weHAOTweOTHv?weHAOTweOTHv+?weHAOTweOTPingHvp=?weHAOTPingw !,,,wNeGa>vATHOGa>v??  d(Gw8-@ rG* ?qa w | B PB wq*q>qqq>qq va/!e j% j,L?a R | B j~ a v | PB x| B !_ g?~  {~  ~ =~ i  Bb( 0.7e( 0.75zo({x'y{u?,z{u/c r{xzyuzrrra/!.10x lC  0.01f( 0.38g( 0.7h( 0.25i( 0.19j( 5xx(8x::$+rI*d'SwIDXd'|qIa!dd(|TI-\m?TJ$*}wI*TI[a**a b dclass MMAugMuscle extends MMAugmentation abstract; static function DeactivateAction(DeusExPlayer dxp) { if (dxp.CarriedDecoration != None) if (!dxp.CanBeLifted(dxp.CarriedDecoration)) dxp.DropDecoration(); } z(l(m,p(vy` rv* o a z w~P~^wo *o L=zo y Bw(Nz< h %h >R jBh ?R j_h @?R jR wg *g a/!j.g  , R g a/!-R wN*N!aR$ Ď?L>  _(ZT 7z6y Zeo`zpu q=>Zept o`zz00Zeo`@u ?o?Zeo`zzpSD6y ZeJ`zp@o?JZept J`zZeJ`Au ?J?zpSD6y ZeJ`zpAo?JZept J`zZeJ`Bu +?J?zpSD6y ZeJ`zpBo?JZept J`z k(s(e .  r(iWM_ %w_ ,[,pKEYNAME S_ m{[i,pKEYBINDING [|iDropItem[m|iTalk[m|iTeamTalk[m|iShowInventoryWindowC [m'|iShowGoalsWindowJ [mM|iShowMainMenup [mm|iBuySkillsK [_ ||||C C |J J |p p |K K   y(sBu&@ .sr@ * H @ D?rH * c:H To@ :H T^@  Lclass MMAugmentationManager extends CBPAugmentationManager; var const class mpAugs[18]; // 17 + 1 light var byte mpStatus[18]; // 0 - do not have it, 1 = have it, 2 = active var DeusExRootWindow root; var MMAugDummy DummyAug; var float CBPTargetingLevel; var float CBPPowerRecLevel; var float CBPVisionValue; // aug variables var float LastHealTime; var bool bDefenseActive; var float defenseSoundTime; var float LastDefenseTime; var float LastDroneTime; var MMBeam LightBeam1, LightBeam2; // replication { reliable if (Role == ROLE_Authority && bNetOwner) mpStatus; reliable if (Role == Role_Authority) SetDefenseAugStatus, SetTargetingAugStatus, SetVisionAugStatus; } simulated function SetVisionAugStatus(int LevelValue, bool IsActive) { if (player == None) return; if (root == None) return; if (IsActive) { if (++root.hud.augDisplay.activeCount == 1) root.hud.augDisplay.bVisionActive = True; } else { if (--root.hud.augDisplay.activeCount == 0) root.hud.augDisplay.bVisionActive = False; root.hud.augDisplay.visionBlinder = None; } root.hud.augDisplay.visionLevel = 3; root.hud.augDisplay.visionLevelValue = LevelValue; } simulated function SetTargetingAugStatus(bool IsActive) { if (player == None) return; if (root == None) return; root.hud.augDisplay.bTargetActive = IsActive; root.hud.augDisplay.targetLevel = 3; } simulated function SetDefenseAugStatus(DeusExProjectile defenseTarget) { local bool bActive; if (player == None) return; if (root == None) return; if (defenseTarget != none) bActive = true; root.hud.augDisplay.bDefenseActive = bActive; root.hud.augDisplay.defenseLevel = 3; root.hud.augDisplay.defenseTarget = defenseTarget; } function PostBeginPlay() { // spawn dummy aug to handle Deactivate calls DummyAug = Spawn(class'MMAugDummy', self); super.PostBeginPlay(); } event Destroyed() { if (DummyAug != none) DummyAug.Destroy(); super.Destroyed(); } function Tick(float DeltaTime) { local int i; super.Tick(DeltaTime); if (player == none) return; // this is here, because MTL keeps augmanager alive for some time // to keep players stuff due to GPF for (i = 0; i < 18; i++) { mpAugs[i].static.StaticTick(player, DeltaTime); } } simulated function SetRootWindow() { if (player != none) root = DeusExRootWindow(player.rootWindow); } function CreateAugmentations(DeusExPlayer newPlayer) { player = newPlayer; } function AddDefaultAugmentations() { // do nothing! } simulated function AddAugmentationDisplay(class augc, bool enabled) { if (augc != none) { if (root == none) SetRootWindow(); if (root != none) { MMHUDActiveItemsDisplay(root.hud.activeItems).AddAug(augc, enabled); } } } simulated function RefreshAugDisplay() { local int i; if (player == none || Role == ROLE_Authority) return; // First make sure there are no augs visible in the display player.ClearAugmentationDisplay(); for (i = 0; i < 18; i++) { if (mpStatus[i] == 1 && player.bHUDShowAllAugs) { AddAugmentationDisplay(mpAugs[i], false); } else if (mpStatus[i] == 2) { AddAugmentationDisplay(mpAugs[i], true); } } } simulated function int NumAugsActive() { local int i; local int count; if (player == None) return 0; for (i = 0; i < 18; i++) { if (mpStatus[i] == 2) { count++; } } return count; } function SetPlayer(DeusExPlayer newPlayer) { player = newPlayer; } function BoostAugs(bool bBoostEnabled, Augmentation augBoosting) { } simulated function int GetClassLevel(class augClass) { local int i; for (i = 0; i < 18; i++) { if (mpAugs[i].default.OldAugClass == augClass) { if (mpStatus[i] == 2) return 3; break; } } return -1; } simulated function float GetAugLevelValue(class AugClass) { local int i; for (i = 0; i < 18; i++) { if (mpAugs[i].default.OldAugClass == AugClass || mpAugs[i] == AugClass) { if (mpStatus[i] == 2) { if (mpAugs[i] == class'MMAugTarget' && IsCBP()) return CBPTargetingLevel; else if (mpAugs[i] == class'MMAugPower' && IsCBP()) return CBPPowerRecLevel; else if (mpAugs[i] == class'MMAugVision' && IsCBP()) return CBPVisionValue; else return mpAugs[i].default.LevelValues[3]; } else return -1.0; } } return -1.0; } simulated function float GetAugLevelValueWithIgnoredState(class AugClass) { local int i; for (i = 0; i < 18; i++) { if (mpAugs[i].default.OldAugClass == AugClass || mpAugs[i] == AugClass) { if (mpAugs[i] == class'MMAugTarget' && IsCBP()) return CBPTargetingLevel; else if (mpAugs[i] == class'MMAugPower' && IsCBP()) return CBPPowerRecLevel; else if (mpAugs[i] == class'MMAugVision' && IsCBP()) return CBPVisionValue; else return mpAugs[i].default.LevelValues[3]; } } return -1.0; } function ActivateAll() { local int i; local bool bAugsWithFlag; bAugsWithFlag = AugsWithFlag(); if ((player != None) && (player.Energy > 0)) { for (i = 0; i < 17; i++) // without light aug { if (mpStatus[i] == 1 && (bAugsWithFlag || IsAllowedFlagAug(mpAugs[i]))) mpAugs[i].static.AugActivate(player); } } } function DeactivateAll() { local int i; for (i = 0; i < 18; i++) { if (mpStatus[i] == 2) mpAugs[i].static.AugDeactivate(player); } } // deprecated! simulated function Augmentation FindAugmentation(Class findClass) { local int i; if (DummyAug == none) { Log("WARNING: DummyAug is none!"); return none; } for (i = 0; i < 18; i++) { if (mpAugs[i].default.OldAugClass == findClass) { if (mpStatus[i] > 0) { DummyAug.AugAffected = mpAugs[i]; return DummyAug; } break; } } return none; } // deprecated! do not call it! function Augmentation GivePlayerAugmentation(Class giveClass) { return none; } function bool NewGivePlayerAugmentation(class giveClass) { local int i; if (giveClass == none) return false; // check if we already have aug @ that slot for (i = 0; i < 18; i++) { if (mpAugs[i].default.MPConflictSlot == giveClass.default.MPConflictSlot) { if (mpStatus[i] > 0) // already have it return false; } } for (i = 0; i < 18; i++) { if (mpAugs[i] == giveClass) { mpStatus[i] = 1; return true; } } return false; } function bool AugsWithFlag() { local miniMTLCTF game; local miniMTLPlayer p; game = miniMTLCTF(level.game); if (game == none) return true; player = miniMTLPlayer(player); if (p.getPRI().Flag == none) return true; //player has a flag! //allow augs with flag + not escaping if (game.bAugsWithFlag) { if (!p.getPRI().flag.bEscaping) return true; } //player.serverConditionalNotifyMsg(player.MPMSG_NoAugsWithFlag); return false; } simulated function bool IsAllowedFlagAug(class aug) { local int i; local miniMTLCTF ctfgame; ctfgame = miniMTLCTF(Level.Game); if (ctfgame == none) return true; for (i = 0; i < ArrayCount(ctfgame.FlagDisabledAugs); i++) { if (ctfgame.FlagDisabledAugs[i] == aug) return false; } return true; } function bool ActivateAugByKey(int keyNum) { local int i; local class faug; if ((keyNum < 0) || (keyNum > 9)) return False; keyNum += 3; for (i = 0; i < 18; i++) { if (mpAugs[i].default.MPConflictSlot == keyNum) { if (mpStatus[i] > 0) { faug = mpAugs[i]; break; } } } if (faug == none) { player.ClientMessage(NoAugInSlot); return false; } if (!AugsWithFlag() && !IsAllowedFlagAug(faug)) { Player.ClientMessage("Cannot use this augmentation while carrying the flag!"); return false; } return faug.static.AugToggle(player); } function DeactivateCTFAugs() { local int i; for (i = 0; i < 18; i++) { if (mpStatus[i] == 2 && !IsAllowedFlagAug(mpAugs[i])) mpAugs[i].static.AugDeactivate(player); } } simulated function bool IsCBP() { if ((miniMTLTeam(Level.Game) != none && miniMTLTeam(Level.Game).bCBP) || (miniMTLDeathMatch(Level.Game) != none && miniMTLDeathMatch(Level.Game).bCBP)) return true; else return false; } simulated function Float CalcEnergyUse(float deltaTime) { local float energyUse, energyMult; local int i; local bool bHasPowerAug; local bool bPowerAugOn; energyUse = 0; energyMult = 1.0; for (i = 0; i < 18; i++) { if (mpAugs[i] == class'MMAugPower') { if (mpStatus[i] > 0) bHasPowerAug = true; if (mpStatus[i] == 2) bPowerAugOn = true; } if (mpStatus[i] == 2) { energyUse += ((mpAugs[i].static.NewGetEnergyRate() / 60) * deltaTime); } } if (bHasPowerAug) { if (energyUse > 0 && !bPowerAugOn) ActivateAugByKey(4); if (energyUse == 0 && bPowerAugOn) ActivateAugByKey(4); if (bPowerAugOn) energyMult = GetAugLevelValue(class'MMAugPower'); } energyUse *= energyMult; return energyUse; } function ResetAugmentations() { local int i; for (i = 0; i < 17; i++) { mpAugs[i].static.AugDeactivate(player); mpStatus[i] = 0; } // turn off light mpAugs[17].static.AugDeactivate(player); LastDroneTime = default.LastDroneTime; } |(t{ -M b  w w?,b  A}%?}b @6O ??, w6O ??, w6O ??, wO tOa q* O wO*Ob ?,O?aOOOOO-'O a@(}L Bt(WJHr* rW* AkiBW  6A6BBA xq% 8q (u(H'AF)oQ-z ro* ;-p^ a m XP^ a j Xw^ *6] %6] %6] %^  9] ?,d?, B ~(lB|#z .lrz * Gz D?rG* c:GToz :GTwGX*GXo xj_ r8j6::$6[l'q!mp::$p-p ?%X-p( x}(i%x(gAY/c!a8 W ;Ec (W a/!|J.W ca.W a-Ic-l 3:a:c1Ca 6Ca AeCYZgYZ:c:ac-a10 sclass MMAugmentationDisplayWindow extends CBPAugmentationDisplayWindow; var string keyFreeMode, keyPersonView, keyMainMenu, keySkills; const skillListX = 0.01; // Screen multiplier const skillListY = 0.38; const skillMsgY = 0.7; const skillCostX = 0.25; const skillLevelX = 0.19; const levelBoxSize = 5; var Color colBlue1, colWhite; var Color colGreen1, colLtGreen; var Color colRed1, colLtRed; function miniMTLPlayer getPlayer() { return miniMTLPlayer(player); } function RefreshMultiplayerKeys() { local String Alias, keyName; local int i; for ( i = 0; i < 255; i++ ) { keyName = player.ConsoleCommand ( "KEYNAME "$i ); if ( keyName != "" ) { Alias = player.ConsoleCommand( "KEYBINDING "$keyName ); if ( Alias ~= "DropItem" ) keyDropItem = keyName; else if ( Alias ~= "Talk" ) keyTalk = keyName; else if ( Alias ~= "TeamTalk" ) keyTeamTalk = keyName; else if ( Alias ~= "ShowInventoryWindow" ) keyFreeMode = keyName; else if ( Alias ~= "ShowGoalsWindow" ) keyPersonView = keyName; else if ( Alias ~= "ShowMainMenu" ) keyMainMenu = keyName; else if ( Alias ~= "BuySkills" ) keySkills = KeyName;; } } if ( keyDropItem ~= "" ) keyDropItem = KeyNotBoundString; if ( keyTalk ~= "" ) keyTalk = KeyNotBoundString; if ( keyTeamTalk ~= "" ) keyTeamTalk = KeyNotBoundString; if ( keyFreeMode ~= "" ) keyFreeMode = KeyNotBoundString; if ( keyPersonView ~= "" ) keyPersonView = KeyNotBoundString; if ( keyMainMenu ~= "" ) keyMainMenu = KeyNotBoundString; if ( keySkills ~= "" ) keySkills = KeyNotBoundString; } function float FacingActor(Pawn A, Pawn B) { local vector X,Y,Z, Dir; if (B == None || A == None) return -1.0; GetAxes(B.ViewRotation, X, Y, Z); Dir = A.Location - B.Location; X.Z = 0; Dir.Z = 0; return Normal(Dir) dot Normal(X); } function NameAllViewedPlayers(GC gc, miniMTLPlayer mmp) { local Actor target; local miniMTLPlayer P; local float x, y; local vector loc; local bool viewenemy; foreach mmp.VisibleCollidingActors(class'Actor', target, 3000.0, mmp.Location, false) { if (target.IsA('miniMTLPlayer') && (FacingActor(Pawn(target), mmp) > 0.0)) { P = miniMTLPlayer(target); if (P.PlayerReplicationInfo.bIsSpectator || (!mmp.bSpecEnemies && P.PlayerReplicationInfo.Team != mmp.PlayerReplicationInfo.Team)) continue; loc = P.Location; loc.Z -= P.CollisionHeight + 10.0; ConvertVectorToCoordinates(loc, x, y); DrawPlayerName(gc, x, y, (mmp.PlayerReplicationInfo.Team == P.PlayerReplicationInfo.Team) && mmp.GameReplicationInfo.bTeamGame, P.PlayerReplicationInfo.PlayerName); } } } function DrawPlayerName(GC gc, float x, float y, bool sameteam, string pname) { local float w, h; gc.SetFont(Font'FontMenuSmall'); gc.SetStyle(DSTY_Translucent); if (sameteam) gc.SetTextColor(colGreen); else gc.SetTextColor(colRed); gc.GetTextExtent(0, w, h, pname); x -= w * 0.5; y -= h * 0.5; gc.DrawText(x, y, w, h, pname); gc.SetStyle(DSTY_Normal); } function DrawLevel( GC gc, float x, float y, int level ) { local int i; if (( level < 0 ) || (level > 3 )) { log("Warning:Bad skill level:"$level$" " ); return; } for ( i = 0; i < level; i++ ) { gc.DrawTexture( x, y+2.0, levelBoxSize, levelBoxSize, 0, 0, Texture'Solid'); x += (levelBoxSize + levelBoxSize/2); } } function DrawRemotePlayerSkills(GC gc, miniMTLPlayer P) { local float curx, cury, w, h; local String str, costStr; local int i; local float barLen, costx, levelx; local class skillclass; local int level, cost; gc.SetTileColor(colWhite); gc.SetTextColor(colLtGreen); gc.SetFont(Font'FontMenuSmall_DS'); if (!P.bBuySkills) { str = class'HUDMultiSkills'.default.PressString $ keySkills $ class'HUDMultiSkills'.default.PressEndString $ " to show skills."; cury = height * skillMsgY; curx = width * skillListX; gc.GetTextExtent(0, w, h, str); gc.DrawText(curx, cury, w, h, str); return; } cury = height * skillListY; curx = width * skillListX; costx = width * skillCostX; levelx = width * skillLevelX; gc.GetTextExtent( 0, w, h, class'HUDMultiSkills'.default.CostString); barLen = (costx+(w*1.33))-curx; gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); cury += (h*0.25); str = class'HUDMultiSkills'.default.SkillPointsString $ P.TargetSkillsAvail; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( curx, cury, w, h, str ); cury += h; gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); cury += (h*0.25); str = class'HUDMultiSkills'.default.SkillString; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( curx, cury, w, h, str ); str = class'HUDMultiSkills'.default.LevelString; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( levelx, cury, w, h, str ); str = class'HUDMultiSkills'.default.CostString; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( costx, cury, w, h, str ); cury += h; gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); cury += (h*0.25); for (i = 0; i < 10; i++) { level = 1; if ((P.TargetSkills & (0x40000000 >> i)) == (0x40000000 >> i)) level = 3; else if ((P.TargetSkills & (1 << i)) == (1 << i)) level = 2; if (i <= 3) cost = 2000; else cost = 1000; skillclass = class'CBPSkillManager'.default.skillClasses[i]; str = string(int((i + 1) % 10)) $ ". " $ skillclass.default.SkillName; gc.GetTextExtent( 0, w, h, str ); if (level == 3) { gc.SetTileColor(colBlue1); gc.SetTextColor(colBlue1); costStr = class'HUDMultiSkills'.default.NAString; } else if (P.TargetSkillsAvail >= cost) { if (level == 2) { gc.SetTextColor(colLtGreen); gc.SetTileColor(colLtGreen); } else { gc.SetTextColor(colGreen1); gc.SetTileColor(colGreen1); } costStr = "" $ cost; } else { if (level == 2) { gc.SetTileColor(colLtRed); gc.SetTextColor(colLtRed); } else { gc.SetTileColor(colRed1); gc.SetTextColor(colRed1); } costStr = "" $ cost; } gc.DrawText( curx, cury, w, h, str ); DrawLevel(gc, levelx, cury, level ); gc.GetTextExtent( 0, w, h, costStr ); gc.DrawText( costx, cury, w, h, costStr ); cury += h; } gc.SetTileColor( colWhite ); str = class'HUDMultiSkills'.default.PressString $ keySkills $ class'HUDMultiSkills'.default.ToExitString; gc.GetTextExtent( 0, w, h, str ); gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); cury += (h*0.25); gc.SetTextColor( colWhite ); gc.DrawText( curx + ((barLen*0.5)-(w*0.5)), cury, w, h, str ); cury += h; gc.DrawBox( curx, cury, barLen, 1, 0, 0, 1, Texture'Solid'); } function bool IsHeatSourceSpec(Actor A, miniMTLPlayer mmp) { if ((A.bHidden) && (miniMTLPlayer(A) == none || !miniMTLPlayer(A).bBlockActors)) return False; if (A.IsA('Pawn')) { if (A.IsA('ScriptedPawn')) return True; else if ( (A.IsA('DeusExPlayer')) && (A != mmp.ViewTarget) && (A != player) ) return True; return False; } else if (A.IsA('DeusExCarcass')) return True; else if (A.IsA('FleshFragment')) return True; else return False; } function int GetVisionTargetStatusSpec(Actor Target, miniMTLPlayer mmp) { local DeusExPlayer PlayerTarget; local TeamDMGame TeamGame; if (Target == None) return VISIONNEUTRAL; if (player.Level.NetMode == NM_Standalone) return VISIONNEUTRAL; if (target.IsA('DeusExPlayer')) { if (target == mmp.ViewTarget) return VISIONNEUTRAL; TeamGame = TeamDMGame(player.DXGame); // In deathmatch, all players are hostile. if (TeamGame == None) return VISIONENEMY; PlayerTarget = DeusExPlayer(Target); if (TeamGame.ArePlayersAllied(PlayerTarget, DeusExPlayer(mmp.ViewTarget))) return VISIONALLY; else return VISIONENEMY; } else if ( (target.IsA('AutoTurretGun')) || (target.IsA('AutoTurret')) ) { if (target.IsA('AutoTurretGun')) return GetVisionTargetStatusSpec(target.Owner, mmp); else if ((AutoTurret(Target).bDisabled)) return VISIONNEUTRAL; else if (AutoTurret(Target).safetarget == Pawn(mmp.ViewTarget)) return VISIONALLY; else if ((Player.DXGame.IsA('TeamDMGame')) && (AutoTurret(Target).team == -1)) return VISIONNEUTRAL; else if ( (!Player.DXGame.IsA('TeamDMGame')) || (Pawn(mmp.ViewTarget).PlayerReplicationInfo.Team != AutoTurret(Target).team) ) return VISIONENEMY; else if (Pawn(mmp.ViewTarget).PlayerReplicationInfo.Team == AutoTurret(Target).team) return VISIONALLY; else return VISIONNEUTRAL; } else if (target.IsA('SecurityCamera')) { if ( !SecurityCamera(target).bActive ) return VISIONNEUTRAL; else if ( SecurityCamera(target).team == -1 ) return VISIONNEUTRAL; else if (((Player.DXGame.IsA('TeamDMGame')) && (SecurityCamera(target).team==Pawn(mmp.ViewTarget).PlayerReplicationInfo.team)) || ( (Player.DXGame.IsA('DeathMatchGame')) && (SecurityCamera(target).team==Pawn(mmp.ViewTarget).PlayerReplicationInfo.PlayerID))) return VISIONALLY; else return VISIONENEMY; } else return VISIONNEUTRAL; } function DrawVisionAugmentationSpec(GC gc, miniMTLPlayer mmp) { local Vector loc; local float dist; local float BrightDot; local Actor A; local float DrawGlow; local float RadianView; local float OldFlash, NewFlash; local vector OldFog, NewFog; local Texture oldSkins[9]; if (visionLevel >= 1) { gc.SetStyle(DSTY_Modulated); gc.DrawPattern(0, 0, width, height, 0, 0, Texture'VisionBlue'); gc.DrawPattern(0, 0, width, height, 0, 0, Texture'VisionBlue'); gc.SetStyle(DSTY_Translucent); // adjust for the player's eye height loc = mmp.ViewTarget.Location; loc.Z += Pawn(mmp.ViewTarget).BaseEyeHeight; foreach Player.AllActors(class'Actor', A) { if (A.bVisionImportant) { if (IsHeatSourceSpec(A, mmp) || ( (Player.Level.Netmode != NM_Standalone) && ((A.IsA('AutoTurret')) || (A.IsA('AutoTurretGun')) || (A.IsA('SecurityCamera')) ) )) { dist = VSize(A.Location - loc); //If within range of vision aug bit if ( ( ((Player.Level.Netmode != NM_Standalone) && (dist <= (visionLevelvalue / 2))) || ((Player.Level.Netmode == NM_Standalone) && (dist <= (visionLevelValue))) ) && (IsHeatSourceSpec(A, mmp))) { VisionTargetStatus = GetVisionTargetStatusSpec(A, mmp); SetSkins(A, oldSkins); gc.DrawActor(A, False, False, True, 1.0, 2.0, None); ResetSkins(A, oldSkins); } else if ((Player.Level.Netmode != NM_Standalone) && (GetVisionTargetStatusSpec(A, mmp) == VISIONENEMY) && (A.Style == STY_Translucent)) { if ( (dist <= (visionLevelvalue)) && (Pawn(mmp.ViewTarget).LineOfSightTo(A,true)) ) { VisionTargetStatus = GetVisionTargetStatusSpec(A, mmp); SetSkins(A, oldSkins); gc.DrawActor(A, False, False, True, 1.0, 2.0, None); ResetSkins(A, oldSkins); } } else if (Pawn(mmp.ViewTarget).LineOfSightTo(A,true)) { VisionTargetStatus = GetVisionTargetStatusSpec(A, mmp); SetSkins(A, oldSkins); if ((Player.Level.NetMode == NM_Standalone) || (dist < VisionLevelValue * 1.5) || (VisionTargetStatus != VISIONENEMY)) { DrawGlow = 2.0; } else { // Fadeoff with distance square DrawGlow = 2.0 / ((dist / (VisionLevelValue * 1.5)) * (dist / (VisionLevelValue * 1.5))); DrawGlow = FMax(DrawGlow,0.15); } gc.DrawActor(A, False, False, True, 1.0, DrawGlow, None); ResetSkins(A, oldSkins); } } else if ( (A != VisionBlinder) && (Player.Level.NetMode != NM_Standalone) && (A.IsA('ExplosionLight')) && (Pawn(mmp.ViewTarget).LineOfSightTo(A,True)) ) { BrightDot = Normal(Vector(Pawn(mmp.ViewTarget).ViewRotation)) dot Normal(A.Location - Pawn(mmp.ViewTarget).Location); dist = VSize(A.Location - Pawn(mmp.ViewTarget).Location); if (dist > 3000) DrawGlow = 0; else if (dist < 300) DrawGlow = 1; else DrawGlow = ( 3000 - dist ) / ( 3000 - 300 ); // Calculate view angle in radians. RadianView = (Player.FovAngle / 180) * 3.141593; if ((BrightDot >= Cos(RadianView)) && (DrawGlow > 0.2) && (BrightDot * DrawGlow * 0.9 > 0.2)) //DEUS_EX AMSD .75 is approximately at our view angle edge. { VisionBlinder = A; NewFlash = 10.0 * BrightDot * DrawGlow; NewFog = vect(1000,1000,900) * BrightDot * DrawGlow * 0.9; OldFlash = player.DesiredFlashScale; OldFog = player.DesiredFlashFog * 1000; // Don't add increase the player's flash above the current newflash. NewFlash = FMax(0,NewFlash - OldFlash); NewFog.X = FMax(0,NewFog.X - OldFog.X); NewFog.Y = FMax(0,NewFog.Y - OldFog.Y); NewFog.Z = FMax(0,NewFog.Z - OldFog.Z); player.ClientFlash(NewFlash,NewFog); player.IncreaseClientFlashLength(4.0*BrightDot*DrawGlow*BrightDot); } } } } } gc.SetStyle(DSTY_Normal); } function DrawRemoteInventory(GC gc, miniMTLPlayer mmp) { local int xoff, yoff, ytoff, i; yoff = height - 48; ytoff = yoff + 32; xoff = width - 54; gc.SetStyle(DSTY_Masked); gc.SetTileColorRGB(255, 255, 255); gc.SetAlignments(HALIGN_Center, VALIGN_Center); gc.EnableWordWrap(false); gc.SetTextColorRGB(255, 255, 255); gc.SetFont(Font'FontTiny'); // draw biocells if (mmp.TargetBioCells > 0) { gc.DrawTexture(xoff, yoff, 42, 37, 0, 0, Texture'DeusExUI.Icons.BeltIconBioCell'); gc.DrawText(xoff + 1, ytoff, 42, 8, "COUNT:" @ mmp.TargetBioCells); } xoff -= 48; // draw medkit if (mmp.TargetMedkits > 0) { gc.DrawTexture(xoff, yoff, 42, 37, 0, 0, Texture'DeusExUI.Icons.BeltIconMedKit'); gc.DrawText(xoff + 1, ytoff, 42, 8, "COUNT:" @ mmp.TargetMedkits); } xoff -= 48; // draw multitool if (mmp.TargetMultitools > 0) { gc.DrawTexture(xoff, yoff, 42, 37, 0, 0, Texture'DeusExUI.Icons.BeltIconMultitool'); gc.DrawText(xoff + 1, ytoff, 42, 8, "COUNT:" @ mmp.TargetMultitools); } xoff -= 48; // draw lockpick if (mmp.TargetLockpicks > 0) { gc.DrawTexture(xoff, yoff, 42, 37, 0, 0, Texture'DeusExUI.Icons.BeltIconLockPick'); gc.DrawText(xoff + 1, ytoff, 42, 8, "COUNT:" @ mmp.TargetLockpicks); } xoff -= 48; // draw lam if (mmp.TargetLAMs > 0) { gc.DrawTexture(xoff, yoff, 42, 37, 0, 0, Texture'DeusExUI.Icons.BeltIconLAM'); gc.DrawText(xoff + 1, ytoff, 42, 8, "COUNT:" @ mmp.TargetLAMs); } xoff = 16; // draw weapons for (i = 0; i < 3; i++) { if (mmp.TargetWeapons[i] != none) { gc.DrawTexture(xoff, yoff, 42, 37, 0, 0, mmp.TargetWeapons[i].default.Icon); } xoff += 48; } // draw emp if (mmp.TargetEMPs > 0) { gc.DrawTexture(xoff, yoff, 42, 37, 0, 0, Texture'DeusExUI.Icons.BeltIconEMPGrenade'); gc.DrawText(xoff + 1, ytoff, 42, 8, "COUNT:" @ mmp.TargetEMPs); } xoff += 48; // draw gas if (mmp.TargetGGs > 0) { gc.DrawTexture(xoff, yoff, 42, 37, 0, 0, Texture'DeusExUI.Icons.BeltIconGasGrenade'); gc.DrawText(xoff + 1, ytoff, 42, 8, "COUNT:" @ mmp.TargetGGs); } } function PostDrawWindow(GC gc) { local PlayerPawn pp; local miniMTLPlayer mmp; local color col; local string str; local color colGold; local int tmpVisionLevel, tmpVisionLevelValue; pp = Player.GetPlayerPawn(); mmp = miniMTLPlayer(pp); if (mmp == none) return; if (mmp.PlayerReplicationInfo == none) return; if (!mmp.PlayerReplicationInfo.bIsSpectator) { super(AugmentationDisplayWindow).PostDrawWindow(gc); } else { if (!mmp.FreeSpecMode && mmp.ViewTarget != none && !mmp.bBehindView && (mmp.TargetAugs & (0x40000000 >> class'MMAugVision'.default.MPConflictSlot)) == (0x40000000 >> class'MMAugVision'.default.MPConflictSlot) && (mmp.TargetAugs & (1 << class'MMAugVision'.default.ManagerIndex)) == (1 << class'MMAugVision'.default.ManagerIndex)) { tmpVisionLevel = visionLevel; tmpVisionLevelValue = visionLevelValue; visionLevel = 3; visionLevelValue = MMAugmentationManager(mmp.AugmentationSystem).GetAugLevelValueWithIgnoredState(class'MMAugVision'); DrawVisionAugmentationSpec(gc, mmp); visionLevel = tmpVisionLevel; visionLevelValue = tmpVisionLevelValue; } colGold.R = 255; colGold.G = 255; if (mmp.FreeSpecMode) { NameAllViewedPlayers(gc, mmp); DrawStaticText(gc, "Free spectator mode.", 0.93, colGold, false); DrawStaticText(gc, "Press <" $ keyFreeMode $ "> to spectate players.", 0.95, colGold, false); } else if (mmp.ViewTarget != none) { if (PlayerPawn(mmp.ViewTarget).PlayerReplicationInfo.Team != mmp.PlayerReplicationInfo.Team || !mmp.GameReplicationInfo.bTeamGame) col = colRed; else col = colGreen; str = "Spectating: " $ PlayerPawn(mmp.ViewTarget).PlayerReplicationInfo.PlayerName; if (!mmp.bTargetAlive || (MMPRI(PlayerPawn(mmp.ViewTarget).PlayerReplicationInfo) != none && MMPRI(PlayerPawn(mmp.ViewTarget).PlayerReplicationInfo).bDead)) str = str $ " (dead)"; DrawStaticText(gc, str, 0.85, col, true); DrawStaticText(gc, "Press to spectate next player.", 0.89, colGold, false); if (mmp.bBehindView) DrawStaticText(gc, "Press <" $ keyPersonView $ "> for 1st person view.", 0.93, colGold, false); else { DrawRemotePlayerSkills(gc, mmp); DrawRemoteInventory(gc, mmp); DrawStaticText(gc, "Press <" $ keyPersonView $ "> for 3rd person view.", 0.93, colGold, false); } DrawStaticText(gc, "Press <" $ keyFreeMode $ "> to go into free spectator mode.", 0.95, colGold, false); } DrawStaticText(gc, "Press <" $ keyMainMenu $ "> to start playing.", 0.97, colGold, false); gc.SetFont(Font'FontMenuSmall_DS'); gc.SetTextColor(colHeaderText); gc.SetStyle(DSTY_Normal); gc.SetTileColor(colBorder); if (mmp.bShowScores) { if (DeathMatchGame(mmp.DXGame) != None) DeathMatchGame(mmp.DXGame).ShowDMScoreboard(mmp, gc, width, height); else if (TeamDMGame(mmp.DXGame) != None) TeamDMGame(mmp.DXGame).ShowTeamDMScoreboard(mmp, gc, width, height); } } if (getPlayer().GetCTFGame() != none) { getPlayer().getCTFGame().drawHUD(getPlayer(), gc, self, width, height); } if (Player.Level.NetMode != NM_Standalone) { if (!mmp.bShowScores) { DrawNotificationText(gc, mmp); } } } function DrawStaticText(GC gc, string text, float y_ratio, color col, bool big) { local float x, y, w, h; if (big) gc.SetFont(Font'FontMenuTitle'); else gc.SetFont(Font'FontMenuSmall'); gc.SetStyle(DSTY_Translucent); gc.SetTextColor(col); gc.GetTextExtent(0, w, h, text); x = (width * 0.5) - (w * 0.5); y = height * y_ratio; gc.DrawText(x, y, w, h, text); gc.SetStyle(DSTY_Normal); } function DrawNotificationText(GC gc, miniMTLPlayer mmp) { local float mul, x, y, w, h; local color adj; mul = FClamp((mmp.notfMSG_EndTime - Player.Level.Timeseconds) / mmp.notfMSG_Time, 0.0, 1.0); EnableTranslucentText(True); gc.SetFont(Font'FontMenuTitle'); gc.SetStyle(DSTY_Translucent); adj.r = mul * mmp.notfMSG_Color.r; adj.g = mul * mmp.notfMSG_Color.g; adj.b = mul * mmp.notfMSG_Color.b; gc.SetTextColor(adj); gc.GetTextExtent(0, w, h, mmp.notfMSG_Text); x = (width * 0.5) - (w * 0.5); y = height * 0.75; gc.DrawText(x, y, w, h, mmp.notfMSG_Text); gc.SetStyle(DSTY_Normal); EnableTranslucentText(False); } function GetTargetReticleColor2( Actor target, out Color xcolor, out Color col ) { local DeusExPlayer safePlayer; local AutoTurret turret; local bool bDM, bTeamDM; local Vector dist; local float SightDist; local DeusExWeapon w; local int team; local String titleString; local bool bdiff; if (Player == none || Player.PlayerReplicationInfo == none) return; if (target.IsA('DeusExPlayer') && DeusExPlayer(target).PlayerReplicationInfo == none) return; bDM = (DeathMatchGame(player.DXGame) != None); bTeamDM = (TeamDMGame(player.DXGame) != None); if ( target.IsA('DeusExPlayer') && (target != player) ) // Other players IFF { if ( bTeamDM && (TeamDMGame(player.DXGame).ArePlayersAllied(DeusExPlayer(target),player)) ) { xcolor = colGreen; if ( (Player.mpMsgFlags & Player.MPFLAG_FirstSpot) != Player.MPFLAG_FirstSpot ) Player.MultiplayerNotifyMsg( Player.MPMSG_TeamSpot ); } else { if (miniMTLPlayer(Player) != none && miniMTLPlayer(Player).bForceWhiteCrosshair) bdiff = true; xcolor = colRed; } SightDist = VSize(target.Location - Player.Location); if ( ( bTeamDM && (TeamDMGame(player.DXGame).ArePlayersAllied(DeusExPlayer(target),player))) || (target.Style != STY_Translucent) || (bVisionActive && (Sightdist <= visionLevelvalue)) ) { targetPlayerName = DeusExPlayer(target).PlayerReplicationInfo.PlayerName; // DEUS_EX AMSD Show health of enemies with the target active. if (bTargetActive) TargetPlayerHealthString = "(" $ int(100 * (DeusExPlayer(target).Health / Float(DeusExPlayer(target).Default.Health))) $ "%)"; targetOutOfRange = False; w = DeusExWeapon(player.Weapon); if (( w != None ) && ( xcolor != colGreen )) { dist = player.Location - target.Location; if ( VSize(dist) > w.maxRange ) { if (!(( WeaponAssaultGun(w) != None ) && ( Ammo20mm(WeaponAssaultGun(w).AmmoType) != None ))) { targetRangeTime = Player.Level.Timeseconds + 0.1; targetOutOfRange = True; } } } targetPlayerTime = Player.Level.Timeseconds + targetPlayerDelay; targetPlayerColor = xcolor; } else xcolor = colWhite; // cloaked enemy } else if (target.IsA('ThrownProjectile')) // Grenades IFF { if ( ThrownProjectile(target).bDisabled ) xcolor = colWhite; else if ( (bTeamDM && (ThrownProjectile(target).team == player.PlayerReplicationInfo.team)) || (player == DeusExPlayer(target.Owner)) ) xcolor = colGreen; else xcolor = colRed; } else if ( target.IsA('AutoTurret') || target.IsA('AutoTurretGun') ) // Autoturrets IFF { if ( target.IsA('AutoTurretGun') ) { team = AutoTurretGun(target).team; titleString = AutoTurretGun(target).titleString; } else { team = AutoTurret(target).team; titleString = AutoTurret(target).titleString; } if ( (bTeamDM && (player.PlayerReplicationInfo.team == team)) || (!bTeamDM && (player.PlayerReplicationInfo.PlayerID == team)) ) xcolor = colGreen; else if (team == -1) xcolor = colWhite; else xcolor = colRed; targetPlayerName = titleString; targetOutOfRange = False; targetPlayerTime = Player.Level.Timeseconds + targetPlayerDelay; targetPlayerColor = xcolor; } else if ( target.IsA('ComputerSecurity')) { if ( ComputerSecurity(target).team == -1 ) xcolor = colWhite; else if ((bTeamDM && (ComputerSecurity(target).team==player.PlayerReplicationInfo.team)) || (bDM && (ComputerSecurity(target).team==player.PlayerReplicationInfo.PlayerID))) xcolor = colGreen; else xcolor = colRed; } else if ( target.IsA('SecurityCamera')) { if ( !SecurityCamera(target).bActive ) xcolor = colWhite; else if ( SecurityCamera(target).team == -1 ) xcolor = colWhite; else if ((bTeamDM && (SecurityCamera(target).team==player.PlayerReplicationInfo.team)) || (bDM && (SecurityCamera(target).team==player.PlayerReplicationInfo.PlayerID))) xcolor = colGreen; else xcolor = colRed; } col = xcolor; if (bdiff) xcolor = colWhite; } function DrawTargetAugmentation(GC gc) { local String str; local Actor target; local float boxCX, boxCY, boxTLX, boxTLY, boxBRX, boxBRY, boxW, boxH; local float x, y, w, h, mult; local Vector v1, v2; local int i, j, k; local DeusExWeapon weapon; local bool bUseOldTarget; local Color crossColor, tcolor; local DeusExPlayer own; local vector AimLocation; local int AimBodyPart; crossColor.R = 255; crossColor.G = 255; crossColor.B = 255; tcolor.R = 255; tcolor.G = 255; tcolor.B = 255; // check 500 feet in front of the player target = TraceLOS(8000,AimLocation); targetplayerhealthstring = ""; targetplayerlocationstring = ""; if ( target != None ) { GetTargetReticleColor2( target, crossColor, tcolor ); if ((DeusExPlayer(target) != None) && (bTargetActive)) { AimBodyPart = DeusExPlayer(target).GetMPHitLocation(AimLocation); if (AimBodyPart == 1) TargetPlayerLocationString = "("$msgHead$")"; else if ((AimBodyPart == 2) || (AimBodyPart == 5) || (AimBodyPart == 6)) TargetPlayerLocationString = "("$msgTorso$")"; else if ((AimBodyPart == 3) || (AimBodyPart == 4)) TargetPlayerLocationString = "("$msgLegs$")"; } weapon = DeusExWeapon(Player.Weapon); if ((weapon != None) && !weapon.bHandToHand && !bUseOldTarget) { // if the target is out of range, don't draw the reticle if (weapon.MaxRange >= VSize(target.Location - Player.Location)) { w = width; h = height; x = int(w * 0.5)-1; y = int(h * 0.5)-1; // scale based on screen resolution - default is 640x480 mult = FClamp(weapon.currentAccuracy * 80.0 * (width/640.0), corner, 80.0); // make sure it's not too close to the center unless you have a perfect accuracy mult = FMax(mult, corner+4.0); if (weapon.currentAccuracy == 0.0) mult = corner; // draw the drop shadowed reticle gc.SetTileColorRGB(0,0,0); for (i=1; i>=0; i--) { gc.DrawBox(x+i, y-mult+i, 1, corner, 0, 0, 1, Texture'Solid'); gc.DrawBox(x+i, y+mult-corner+i, 1, corner, 0, 0, 1, Texture'Solid'); gc.DrawBox(x-(corner-1)/2+i, y-mult+i, corner, 1, 0, 0, 1, Texture'Solid'); gc.DrawBox(x-(corner-1)/2+i, y+mult+i, corner, 1, 0, 0, 1, Texture'Solid'); gc.DrawBox(x-mult+i, y+i, corner, 1, 0, 0, 1, Texture'Solid'); gc.DrawBox(x+mult-corner+i, y+i, corner, 1, 0, 0, 1, Texture'Solid'); gc.DrawBox(x-mult+i, y-(corner-1)/2+i, 1, corner, 0, 0, 1, Texture'Solid'); gc.DrawBox(x+mult+i, y-(corner-1)/2+i, 1, corner, 0, 0, 1, Texture'Solid'); gc.SetTileColor(tcolor); } } } // movers are invalid targets for the aug if (target.IsA('DeusExMover')) target = None; } // let there be a 0.5 second delay before losing a target if (target == None) { if ((Player.Level.TimeSeconds - lastTargetTime < 0.5) && IsActorValid(lastTarget)) { target = lastTarget; bUseOldTarget = True; } else { RemoveActorRef(lastTarget); lastTarget = None; } } else { lastTargetTime = Player.Level.TimeSeconds; bUseOldTarget = False; if (lastTarget != target) { RemoveActorRef(lastTarget); lastTarget = target; AddActorRef(lastTarget); } } if (target != None) { // draw a cornered targetting box v1.X = target.CollisionRadius; v1.Y = target.CollisionRadius; v1.Z = target.CollisionHeight; if (ConvertVectorToCoordinates(target.Location, boxCX, boxCY)) { boxTLX = boxCX; boxTLY = boxCY; boxBRX = boxCX; boxBRY = boxCY; // get the smallest box to enclose actor // modified from Scott's ActorDisplayWindow for (i=-1; i<=1; i+=2) { for (j=-1; j<=1; j+=2) { for (k=-1; k<=1; k+=2) { v2 = v1; v2.X *= i; v2.Y *= j; v2.Z *= k; v2.X += target.Location.X; v2.Y += target.Location.Y; v2.Z += target.Location.Z; if (ConvertVectorToCoordinates(v2, x, y)) { boxTLX = FMin(boxTLX, x); boxTLY = FMin(boxTLY, y); boxBRX = FMax(boxBRX, x); boxBRY = FMax(boxBRY, y); } } } } boxTLX = FClamp(boxTLX, margin, width-margin); boxTLY = FClamp(boxTLY, margin, height-margin); boxBRX = FClamp(boxBRX, margin, width-margin); boxBRY = FClamp(boxBRY, margin, height-margin); boxW = boxBRX - boxTLX; boxH = boxBRY - boxTLY; if ((bTargetActive) && (Player.Level.Netmode == NM_Standalone)) { // set the coords of the zoom window, and draw the box // even if we don't have a zoom window x = width/8 + margin; y = height/2; w = width/4; h = height/4; DrawDropShadowBox(gc, x-w/2, y-h/2, w, h); boxCX = width/8 + margin; boxCY = height/2; boxTLX = boxCX - width/8; boxTLY = boxCY - height/8; boxBRX = boxCX + width/8; boxBRY = boxCY + height/8; if (targetLevel > 2) { if (winZoom != None) { mult = (target.CollisionRadius + target.CollisionHeight); v1 = Player.Location; v1.Z += Player.BaseEyeHeight; v2 = 1.5 * Player.Normal(target.Location - v1); winZoom.SetViewportLocation(target.Location - mult * v2); winZoom.SetWatchActor(target); } // window construction now happens in Tick() } else { // black out the zoom window and draw a "no image" message gc.SetStyle(DSTY_Normal); gc.SetTileColorRGB(0,0,0); gc.DrawPattern(boxTLX, boxTLY, w, h, 0, 0, Texture'Solid'); gc.SetTextColorRGB(255,255,255); gc.GetTextExtent(0, w, h, msgNoImage); x = boxCX - w/2; y = boxCY - h/2; gc.DrawText(x, y, w, h, msgNoImage); } // print the name of the target above the box if (target.IsA('Pawn')) str = target.BindName; else if (target.IsA('DeusExDecoration')) str = DeusExDecoration(target).itemName; else if (target.IsA('DeusExProjectile')) str = DeusExProjectile(target).itemName; else str = target.GetItemName(String(target.Class)); // print disabled robot info if (target.IsA('Robot') && (Robot(target).EMPHitPoints == 0)) str = str $ " (" $ msgDisabled $ ")"; gc.SetTextColor(tcolor); // print the range to target mult = VSize(target.Location - Player.Location); str = str $ CR() $ msgRange @ Int(mult/16) @ msgRangeUnits; gc.GetTextExtent(0, w, h, str); x = boxTLX + margin; y = boxTLY - h - margin; gc.DrawText(x, y, w, h, str); // level zero gives very basic health info if (target.IsA('Pawn')) mult = Float(Pawn(target).Health) / Float(Pawn(target).Default.Health); else if (target.IsA('DeusExDecoration')) mult = Float(DeusExDecoration(target).HitPoints) / Float(DeusExDecoration(target).Default.HitPoints); else mult = 1.0; if (targetLevel == 0) { // level zero only gives us general health readings if (mult >= 0.66) { str = msgHigh; mult = 1.0; } else if (mult >= 0.33) { str = msgMedium; mult = 0.5; } else { str = msgLow; mult = 0.05; } str = str @ msgHealth; } else { // level one gives exact health readings str = Int(mult * 100.0) $ msgPercent; if (target.IsA('Pawn') && !target.IsA('Robot') && !target.IsA('Animal')) { x = mult; // save this for color calc str = str @ msgOverall; mult = Float(Pawn(target).HealthHead) / Float(Pawn(target).Default.HealthHead); str = str $ CR() $ Int(mult * 100.0) $ msgPercent @ msgHead; mult = Float(Pawn(target).HealthTorso) / Float(Pawn(target).Default.HealthTorso); str = str $ CR() $ Int(mult * 100.0) $ msgPercent @ msgTorso; mult = Float(Pawn(target).HealthArmLeft) / Float(Pawn(target).Default.HealthArmLeft); str = str $ CR() $ Int(mult * 100.0) $ msgPercent @ msgLeftArm; mult = Float(Pawn(target).HealthArmRight) / Float(Pawn(target).Default.HealthArmRight); str = str $ CR() $ Int(mult * 100.0) $ msgPercent @ msgRightArm; mult = Float(Pawn(target).HealthLegLeft) / Float(Pawn(target).Default.HealthLegLeft); str = str $ CR() $ Int(mult * 100.0) $ msgPercent @ msgLeftLeg; mult = Float(Pawn(target).HealthLegRight) / Float(Pawn(target).Default.HealthLegRight); str = str $ CR() $ Int(mult * 100.0) $ msgPercent @ msgRightLeg; mult = x; } else { str = str @ msgHealth; } } gc.GetTextExtent(0, w, h, str); x = boxTLX + margin; y = boxTLY + margin; gc.SetTextColor(GetColorScaled(mult)); gc.DrawText(x, y, w, h, str); gc.SetTextColor(colHeaderText); if (targetLevel > 1) { // level two gives us weapon info as well if (target.IsA('Pawn')) { str = msgWeapon; if (Pawn(target).Weapon != None) str = str @ target.GetItemName(String(Pawn(target).Weapon.Class)); else str = str @ msgNone; gc.GetTextExtent(0, w, h, str); x = boxTLX + margin; y = boxBRY - h - margin; gc.DrawText(x, y, w, h, str); } } } else { // display disabled robots if (target.IsA('Robot') && (Robot(target).EMPHitPoints == 0)) { str = msgDisabled; gc.SetTextColor(tcolor); gc.GetTextExtent(0, w, h, str); x = boxCX - w/2; y = boxTLY - h - margin; gc.DrawText(x, y, w, h, str); } } } } else if ((bTargetActive) && (Player.Level.NetMode == NM_Standalone)) { if (Player.Level.TimeSeconds % 1.5 > 0.75) str = msgScanning1; else str = msgScanning2; gc.GetTextExtent(0, w, h, str); x = width/2 - w/2; y = (height/2 - h) - 20; gc.DrawText(x, y, w, h, str); } // set the crosshair colors DeusExRootWindow(player.rootWindow).hud.cross.SetCrosshairColor(crossColor); } D)}P -\( E)WD /[l(a**a X-\(q!i G)o<J$IW*W N)c}0-L rc* a y eh BK)b]1'l([a**a bq!H @)`l `d `d$<-]`dM`d`eFG^[F?]G?`e[]FG^`d$ d'class MMAugmentation extends Augmentation abstract; var class OldAugClass; var int ManagerIndex; static function float NewGetEnergyRate() { return default.EnergyRate; } static function MMAugmentationManager GetManager(DeusExPlayer dxp) { return MMAugmentationManager(dxp.AugmentationSystem); } static function bool IsAugActive(DeusExPlayer dxp) { local MMAugmentationManager manager; if (dxp == none) return false; manager = MMAugmentationManager(dxp.AugmentationSystem); if (manager == none) return false; if (manager.mpStatus[default.ManagerIndex] == 2) return true; else return false; } static function ToggleStatus(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = MMAugmentationManager(dxp.AugmentationSystem); if (manager.mpStatus[default.ManagerIndex] == 1) manager.mpStatus[default.ManagerIndex] = 2; else if (manager.mpStatus[default.ManagerIndex] == 2) manager.mpStatus[default.ManagerIndex] = 1; } static function bool AugToggle(DeusExPlayer dxp) { local bool bActive; bActive = IsAugActive(dxp); if (bActive) { AugDeactivate(dxp); } else { AugActivate(dxp); } return !bActive; } static function AugActivate(DeusExPlayer dxp) { if (IsAugActive(dxp)) return; // already activated dxp.PlaySound(default.ActivateSound, SLOT_None); if (dxp.AugmentationSystem.NumAugsActive() == 0) dxp.AmbientSound = default.LoopSound; if (miniMTLPlayer(dxp).bDisplayAugMessages) dxp.ClientMessage(dxp.Sprintf(default.OldAugClass.default.AugActivated, default.OldAugClass.default.AugmentationName)); // localized ToggleStatus(dxp); ActivateAction(dxp); } static function AugDeactivate(DeusExPlayer dxp) { if (!IsAugActive(dxp)) return; // already deactivated ToggleStatus(dxp); DeactivateAction(dxp); if (miniMTLPlayer(dxp).bDisplayAugMessages) dxp.ClientMessage(dxp.Sprintf(default.OldAugClass.default.AugDeactivated, default.OldAugClass.default.AugmentationName)); // localized if (dxp.AugmentationSystem.NumAugsActive() == 0) dxp.AmbientSound = None; dxp.PlaySound(default.DeactivateSound, SLOT_None); } static function StaticTick(DeusExPlayer dxp, float deltaTime) { if (IsAugActive(dxp)) { TickAction(dxp, deltaTime); } } // specific functions static function ActivateAction(DeusExPlayer dxp) { } static function DeactivateAction(DeusExPlayer dxp) { } static function TickAction(DeusExPlayer dxp, float deltaTime) { } M)`dVU-`J$I-J$I[ *W*V]D P)L)da Xq!i S)^B0-L r^* a Y _a B@R)^O3[ *J$d I)Yt|= Ds % s ,ppWarning:Bad skill level:Ss   K%Ks Y-eaW@@@ a?,,,KK T)Zn#l'[Z-\'q!m Y)[fz-D r[* a F `_E%xE:\n?a d `_?,E7 B^)OoOa!d *O- \r[ OV{ oSO% WOa!iJ$IJ$ITImnO q(EZD;!|FragsLUwU*U?, , _,U((U?& ,_&U('U?LUEFG'|TimeD?pB??pB??pB@LUwU*_D?U''_D?''?LULUEFG'( UQ)}8dZdyd F -=ppp K    to show skills.3333?I #<eJ/=eI3J/= 3\>I #<w >L\B> eJ/ Ww Jq=?I+eI3W?? 3/>=p  SF TeJ/=eI3J/=3/+eI3W?? 3/>=  eJ/=eI3J/==  eJ/=eL3J/== eJ/=ew 3J/=3/+eI3W?? 3/>|%|, V&6F K@|@|V,ccF K&|&|V,}|,  c| <=ppSD?|&?, . ceJ/=3V,dIdID   F T |V,dydydMdMD pS V,dUdUdPdPD pS eI3J/=tL3VeJ/D ew 3J/D 3/|dZ=pp K   eJ/=+eI3W?? 3/>dZ8eIW?J?3J/=3/+eI3W??  lclass MMAugLight extends MMAugmentation abstract; static simulated function V18(DeusExPlayer dxp, MMBeam LightBeam) { local Vector Z14; local Vector S30; local Vector Z12; local Vector Z15; Z12 = dxp.Location; Z12.Z += dxp.BaseEyeHeight; Z15=Z12 + default.LevelValues[0] * vector(dxp.ViewRotation); dxp.Trace(S30, Z14, Z15, Z12, True); if (S30 == vect(0.00,0.00,0.00)) { S30 = Z15; } LightBeam.SetLocation(S30 - vector(dxp.ViewRotation * 64)); LightBeam.LightRadius=FClamp(VSize(S30 - Z12) / default.LevelValues[0], 0.00, 1.00) * 5.12 + 4.00; LightBeam.LightType=LT_Steady; } static simulated function V17(DeusExPlayer dxp, MMBeam LightBeam) { LightBeam.SetLocation(dxp.Location + (vect(0.00,0.00,1.00) * dxp.BaseEyeHeight) + (vect(1.00,1.00,0.00) * vector(dxp.Rotation * dxp.CollisionRadius * 1.50))); } static function ActivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); if (manager.LightBeam1 != none) manager.LightBeam1.Destroy(); if (manager.LightBeam2 != none) manager.LightBeam2.Destroy(); manager.LightBeam1 = dxp.Spawn(class'MMBeam', dxp, '', dxp.Location); if (manager.LightBeam1 != none) V18(dxp, manager.LightBeam1); manager.LightBeam2 = dxp.Spawn(class'MMBeam', dxp, '', dxp.Location); if (manager.LightBeam2 != none) { manager.LightBeam2.LightBrightness = 220; V17(dxp, manager.LightBeam2); } } static function DeactivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); if (manager.LightBeam1 != none) manager.LightBeam1.Destroy(); if (manager.LightBeam2 != none) manager.LightBeam2.Destroy(); } static function TickAction(DeusExPlayer dxp, float deltaTime) { local MMAugmentationManager manager; manager = GetManager(dxp); if (manager.LightBeam1 != none) V18(dxp, manager.LightBeam1); if (manager.LightBeam2 != none) V17(dxp, manager.LightBeam2); } c)U@o-D rU* a F JIVa d JIm?a d JI BHT class MMAugHealing extends MMAugmentation abstract; static function ActivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); manager.LastHealTime = dxp.Level.TimeSeconds; } static function TickAction(DeusExPlayer dxp, float deltaTime) { local MMAugmentationManager manager; manager = GetManager(dxp); if ((manager.LastHealTime + 1.0) < dxp.Level.TimeSeconds) { manager.LastHealTime = dxp.Level.TimeSeconds; if (dxp.Health < 100) { dxp.HealPlayer(int(default.LevelValues[3]), False); dxp.ClientFlash(0.5, vect(0, 0, 500)); } else AugDeactivate(dxp); } } U)_)fm@>5w]*pp\mod\miniMTL]E < 9class MMAugEnviro extends MMAugmentation abstract; a)JSP]w]*w]*wJ*]-3:]:JH]]H @6class MMAugEMP extends MMAugmentation abstract; m)KW"a:rK*[ IIDX*I*_IKIDX FO2 h)OAYc/a0 E `_rE rE E b'E QO-Q10 b)2 NL-,,&b }class MMAugDummy extends Augmentation; var class AugAffected; function Deactivate() { AugAffected.static.AugDeactivate(MMAugmentationManager(Owner).player); } FP2 W)VgcAV-)r.V*.V- (Va/!#nVa/!h 'Va/!$wVK wV'(Va/!a'Va/!P '( s)LBb/a0 A _^rA rA A b'A }LN10 f)2 B@-%%%, %,b g)Rf| rR*%/::$%Ra/!$]rRj%M.rM*&d.RM@d.j,&z^Ra/!}Ra/!C#Ra/!}fRj[?.R- %[pr.R.j,[a/!Q.R%[a/!Q<:.j.R&[Y:.j.R,[%zxRa/!}.R- %u.R%usa/!Q<.R:.jZa/!T ;.R.j,u&z% s class MMAugDrone extends MMAugmentation abstract; var float reconstructTime; static function ActivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); if (dxp.Level.TimeSeconds - manager.LastDroneTime < default.reconstructTime) { dxp.ClientMessage("Reconstruction will be complete in" @ int(default.reconstructTime - (dxp.Level.TimeSeconds - manager.lastDroneTime)) @ "seconds"); AugDeactivate(dxp); } else { dxp.bSpyDroneActive = True; dxp.spyDroneLevel = 3; dxp.spyDroneLevelValue = default.LevelValues[3]; dxp.Acceleration = vect(0,0,0); } } static function DeactivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; if (dxp.bSpyDroneActive) { manager = GetManager(dxp); manager.LastDroneTime = dxp.Level.TimeSeconds; } dxp.bSpyDroneActive = False; } o)OJ\ H.0wH*O I$H zh' g$H zh( $H h( $H h' $H fh $H eI sws*i.swi*O &$ $iPzh:h:i $ $i>D:h:i <$iPfh:h:i $i9e:h:i $il ss dt)Ilr 4-Ia(((-(o$2a'''-'o$  GS|%#wS S k)k|c'eU&kd$k&e k&e kd$Ny 6N.y/ a0 &TS&- Qg&y`::$>&a/!C&a/!}&a/!}j& N_::$j?,/::$ jg&yf&yK&Vke&(('?@*H&VN<::$f&y&:&:$9j!.y b&'f&yK&Vke&(('?@*H&VNN.y b&'f&yK&V::$j? &D@D@j?j?DD>ke&(('?D*H&VSSw&::$&a/!O !.y b&'U9.y & .y j& .y dj? Dj?,D?D;Ej? ,h?,I@SUh DL>UDfff?L>&P  AUDl#zDzDaDUDfff?jQ  ?P P j6l6l6Q 6l6l6Q 6l6l6Q iP l \ @UDU10kd$ q(class MMAugDefense extends MMAugmentation abstract; const defenseSoundDelay = 2; static simulated function DeusExProjectile FindNearestProjectile(DeusExPlayer dxp) { local DeusExProjectile proj, minproj; local float dist, mindist; local bool bValidProj; minproj = None; mindist = 999999; foreach dxp.AllActors(class'DeusExProjectile', proj) { bValidProj = !proj.bIgnoresNanoDefense; if (bValidProj) { // make sure we don't own it if (proj.Owner != dxp) { // MBCODE : If team game, don't blow up teammates projectiles if (!((TeamDMGame(dxp.DXGame) != None) && (TeamDMGame(dxp.DXGame).ArePlayersAllied(DeusExPlayer(proj.Owner),dxp)))) { // make sure it's moving fast enough if (VSize(proj.Velocity) > 100) { dist = VSize(dxp.Location - proj.Location); if (dist < mindist) { mindist = dist; minproj = proj; } } } } } } return minproj; } static function ActivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); manager.LastDefenseTime = dxp.Level.TimeSeconds; } static function DeactivateAction(DeusExPlayer dxp) { local MMAugmentationManager manager; manager = GetManager(dxp); manager.SetDefenseAugStatus(none); manager.bDefenseActive = false; } static function TickAction(DeusExPlayer dxp, float deltaTime) { local MMAugmentationManager manager; local DeusExProjectile minproj; local float mindist; manager = GetManager(dxp); if ((manager.LastDefenseTime + 0.1) < dxp.Level.TimeSeconds) { manager.LastDefenseTime = dxp.Level.TimeSeconds; if (dxp.Level.Timeseconds > manager.defenseSoundTime) { dxp.PlaySound(Sound'AugDefenseOn', SLOT_Interact, 1.0, ,(default.LevelValues[3]*1.33), 0.75); manager.defenseSoundTime = dxp.Level.Timeseconds + defenseSoundDelay; } minproj = FindNearestProjectile(dxp); if (minproj != None) { manager.bDefenseActive = True; mindist = VSize(dxp.Location - minproj.Location); manager.SetDefenseAugStatus(minproj); // play a warning sound dxp.PlaySound(sound'GEPGunLock', SLOT_None,,,, 2.0); if (mindist < default.LevelValues[3]) { minproj.bAggressiveExploded=True; minproj.Explode(minproj.Location, vect(0,0,1)); dxp.PlaySound(sound'ProdFire', SLOT_None,,,, 2.0); } } else if (manager.bDefenseActive) { manager.SetDefenseAugStatus(none); manager.bDefenseActive = false; } } } z)FVb/a0 } _^r} r} } b'} BFH10 v)d T` {d  9d  ?6{~a {a+a<d  a*d ::$DI b 9class MMAugCombat extends MMAugmentation abstract; x)v R#::$ X lclass MMAugCloak extends MMAugmentation abstract; static function ActivateAction(DeusExPlayer dxp) { if ((dxp.inHand != None) && (dxp.inHand.IsA('DeusExWeapon'))) dxp.ServerConditionalNotifyMsg(dxp.MPMSG_NoCloakWeapon); dxp.PlaySound(Sound'CloakUp', SLOT_Interact, 0.85, ,768,1.0); } static function DeactivateAction(DeusExPlayer dxp) { dxp.PlaySound(Sound'CloakDown', SLOT_Interact, 0.85, ,768,1.0); } y)n J F AFD'pp[ n C*Byoo/a0 y l5ry ry 1lky b'y BCCE?,10 p)` >/a0 ` ;G` ` Y` 10 {)xG!-f%=f, 3r|fG-\'=f-\wfQ*DafQxxx x wD*DoxS .DTwS *S .xTw.S *w.x*.S axxw.D*.D.xxaxDxax*   0 ) { if (miniMTLPlayer(Owner) != none && miniMTLPlayer(Owner).bSpawnShellCasings) return super.SimUseAmmo(); return True; } return False; } E*x:wi/a0 t f5rt rt 1fet b't @x}10 Fclass MMAmmo762mm extends Ammo762mm; simulated function bool SimUseAmmo() { if ( AmmoAmount > 0 ) { if (miniMTLPlayer(Owner) != none && miniMTLPlayer(Owner).bSpawnShellCasings) return super.SimUseAmmo(); return True; } return False; } I*] n#\ \ \   )?P Blb!.l/r!* Er!* p!- ?!-Bw!*!-=!{@ ^@ ^5!{& ^y& ^yqrD,.! k ^|?!q?r6l=,6l=,E!-BA?!E?Free spectator mode.{n?l(E?ppPress <C > to spectate players.33s?l(w!*:.!:!!-RRW pSpectating: .!!-bUw..!*,..!-pW pW  (dead)E?W Y?R'E?Press to spectate next player. c?l(?!-E?ppPress <J > for 1st person view.{n?l(}?!{?!E?ppPress <J > for 3rd person view.{n?l(E?ppPress <C > to go into free spectator mode.33s?l(E?ppPress <p > to start playing.Qx?l(?d ?d ?d$?d!- w.!*.!M!?w.!*.!P!?Wwei*eiFe?::$!- z?! Wclass MMAmmo3006 extends Ammo3006; function bool UseAmmo(int AmountNeeded) { local vector offset, tempvec, X, Y, Z; local ShellCasing shell; local DeusExWeapon W; if (Super(DeusExAmmo).UseAmmo(AmountNeeded)) { GetAxes(Pawn(Owner).ViewRotation, X, Y, Z); offset = Owner.CollisionRadius * X + 0.3 * Owner.CollisionRadius * Y; tempvec = 0.8 * Owner.CollisionHeight * Z; offset.Z += tempvec.Z; // use silent shells if the weapon has been silenced W = DeusExWeapon(Pawn(Owner).Weapon); if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) { shell = None; } else { if ((W != None) && ((W.NoiseLevel < 0.1) || W.bHasSilencer)) miniMTLPlayer(Owner).ClientSpawnShellCasing(Owner, Owner.Location + offset, true); else miniMTLPlayer(Owner).ClientSpawnShellCasing(Owner, Owner.Location + offset, false); } if (shell != None) { shell.Velocity = (FRand()*20+90) * Y + (10-FRand()*20) * X; shell.Velocity.Z = 0; } return True; } return False; } A*J*_"vw.*.-p-O  a(k%-O '-O w.*.ITw.*.j Tk, \a( M*v\fAUU av "U U -'U V  H*R*[>--y `Y%w`*w.`* .`-Y``HY Lclass MMAmmo10mm extends Ammo10mm; function bool UseAmmo(int AmountNeeded) { local vector offset, tempvec, X, Y, Z; local ShellCasing shell; local DeusExWeapon W; if (Super(DeusExAmmo).UseAmmo(AmountNeeded)) { GetAxes(Pawn(Owner).ViewRotation, X, Y, Z); offset = Owner.CollisionRadius * X + 0.3 * Owner.CollisionRadius * Y; tempvec = 0.8 * Owner.CollisionHeight * Z; offset.Z += tempvec.Z; // use silent shells if the weapon has been silenced W = DeusExWeapon(Pawn(Owner).Weapon); if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) { shell = None; } else { if (miniMTLPlayer(Owner) != none) { if ((W != None) && ((W.NoiseLevel < 0.1) || W.bHasSilencer)) miniMTLPlayer(Owner).ClientSpawnShellCasing(Owner, Owner.Location + offset, true); else miniMTLPlayer(Owner).ClientSpawnShellCasing(Owner, Owner.Location + offset, false); } } if (shell != None) { shell.Velocity = (FRand()*20+90) * Y + (10-FRand()*20) * X; shell.Velocity.Z = 0; } return True; } return False; } X*tw ].::$ , tu C(] m 37Q=G] p] ] 0-cD]  F*TEqHP-pTd .Td Td$TdqTe]ytu?]?vrTeuv]ytTd$ 5class miniMTLWaltonSimons extends miniMTLPlayer; N*oM?R#l?oo `K*T*TR'{JJsG\[wss'Rs, s%kzsB s%}swsG %\sG ssM %\sM s;sB  \@MS*c\}D #{J J( c[{GG@'XG, G%qzGB G%G{NextMap mutator is not properly configured. Check config!! ( GG %cGG G=:GM %cGM G=@A?Gg.Ggb|GOTime|GOFrags.GObbGB (  V*]O U ]U T .U SwU *oT -ET -|]nextmap\ST -|]clearnextmapJU #"Next map setting cleared! 'SST - |]~] setnextmapJ]}]~] U ""pNext map set to: J ' F] R Dr*ppWarning:V has a killProfile that is None! gc Q.] QwQ*-' Qo.QSowQ* QrM%N%N,:N.Q*,MN HMM, MN4 %S. ww.*tw*."\.D|. %iw*rM%N%iN,_:N.*,MN HM_M, MNDQ?&QQQDQxn Q d-( a I!Ppp.!-' . FwQ* DQ | + !|p!-'%+ !l (!Tw.o*w.o*%p!-'%+  |b .c .w] * wb *|b Rw.*.--' .  ?w*D | O%c- 'ppppb  b !pQ Gw] * wc *|c ppppc  c !- 'pQ  w] * wo*Sosppppo s!."Q\oDQ|o ppppppWarning: Failed to determine killer method killer:V]  damage:Sx damageType:Wa  |pppp===>Warning: Failed to get killer method:V damageType:Wa -( O*\zQb QIQC?e'\d \d$6j Cb <6Qt 6j Cb <6Qt 6j Cb <6Qt \dj \ egAQ[z?g?|@?\%ez|gAQ[\d$e(  h b /class miniMTLUNATCO extends miniMTLPlayer; Z*c*v* ^*rQ*nDHrSDHR = =u>u> = D H #?V n?::$an$"Mn$"  {*e FX r**a/!U d 5d \ 6\ %6\ % \ ad \ w*6e 6e 6e jae ja ja*b!} !m V::$ -'- - Y*#tLU#r*r* T#a/!$r.#* -qw.*-rw.*#a/!$ w#>-r-.@.#C;&&X,zow.*.-^-J'CG#  -r-.@.#:#:$- G .#|- pp(SD?,d?.#?.#%)-(H .YwH *3CB # YB?H Yw.H *w. .H *=-' ?, CCZF#a/!j .#-CZC8-r..#:r.#CCC#a/!C#a/!}#a/!}G .# u.#G .#u.#V-r :G ,-rG C~sG CZ~C u-( ?, C#a/!^ .#CZ-r..#:8-q-.#CC#a/!}.#- CZ.#CZ~-r..#:8-q-.#CCiC-JCZ e*@3class miniMTLTracerTong extends miniMTLPlayer; g*qD\*j*uz( l*@Cm*r*o*CyDݣCC,&:% gC(LzCCPlayer|CPlayer|CPIayer|CP1ayerCppC_SeCCppC,_S,c  |*x :Ga!OL  b*$F !e6|=,6|=,6|=,6I=,6I=,6I=, G ER w *t |Ifw. *-H. qRH&pp( )f7H, H, H,pp( )ffH, H,pp()a.{wa*a- -x{?a   >6)?D>?&+?D6?&a B DB@a $ !%%%8&{8%$Be)?8+?8?? $Ie)?8+?8?? $Re)?&?,?8+?8?? $Re)?&?,?8+?8?? $Be)?8+?8?? $Ie)?8+?8?? $Re)?8+?&?,?8?? $Re)?8+?&?,?8?? $dI8 a/!x  *r * ? e -x'e*M -x(Mw e ew *6L 6L 6L e  sPtspPOstP8N8&u Bu &| 6| &LL6L?86L?u 6L?| 6L6  6L6  6L6  *eL)+tt)pp+OO)tt+| ,$u ,8,ttppOOttaOt`tp&-::$)?,+?,>?,6?,H $)>?,+6?,>6s?,P?,ts?,pP?,Os?,tP?, , w*  L 6LL?   Lg  Lg  $d$$ !%%%$&etp>6 $ &,,,$e>6 )s>?,+P6?,$e)+>6   a/!#  n   a/!j. n J  a/!m. n  qV   a/!-.  %ppp ( )$dI   pp<SD?,$e>6)t+p6$e)+>6  a/!#?. ?. ) a/!j?.  ?.  )?%\(??>?L= pSDB a/!# a/!- a/!h )?. ?. ppp<SDB ?. ?. ppp<SDB ?. ?. ppp<SDB?. ?. ppp<SDB?. ?. ppp<SDB?. ?. ppp<SDB) $e>6)t+p$du$e)+>6$d #&# a/!#w. * #qV. $e>6)t+t6$e)+>6 a/!-.  % $dI$e>6)s>?,+p6$e)+>6-::$J?@?U$e>6)?,>?,+?,6?,$e)+>6. e| 1class miniMTLThugMale extends miniMTLPlayer; Kclass miniMTLTeam extends MTLTeam; var bool bCBP; var class Team0PlayerClass; var class Team1PlayerClass; var int InitialTeam; var int ReplMaxPlayers; struct ScoreBoardInfo { var string ServerName; var int NumPlayers; var int MaxPlayers; var string Map; }; var ScoreBoardInfo SBInfo; var int SpecCountUNATCO; var int SpecCountNSF; struct PlayerInfo { var bool bAdmin; var int ping; var bool bIsSpectator; var int SpectatedPlayerID; var string SpectatedPlayerName; var bool bDead; var bool bFlag; var bool bModerator; }; var PlayerInfo PInfo[32]; //Array of the additional structure for 32 players /** @ignore */ var PlayerInfo PI[32]; const IDX = 0.22; const PlayerX = 0.27; const KillsX = 0.53; const DeathsX = 0.60; const StreakX = 0.67; const PINGX = 0.74; const ADMINX_OFFSET = 120; const SPECTX_OFFSET = 150; var miniMTLSettings Settings; var Mutator CallDestroy; var class ReplacerClass; var string NextMapText; var bool bReflectiveDamage; var string TempBanAddr[32]; replication { reliable if (Role == ROLE_Authority) ReplMaxPlayers, bReflectiveDamage; unreliable if (Role == ROLE_Authority) NextMapText; } simulated function ContinueMsg( GC gc, float screenWidth, float screenHeight ) { local String str; local float x, y, w, h; local int t; if ( bNewMap && !bClientNewMap) { NewMapTime = Level.Timeseconds + NewMapDelay - 0.5; bClientNewMap = True; } t = int(NewMapTime - Level.Timeseconds); if ( t < 0 ) t = 0; str = t $ NewMapSecondsString; if (NextMapText != "") { str = Left(str, Len(str) - 1); str = str $ ": " $ NextMapText; } gc.SetTextColor( WhiteColor ); gc.SetFont(Font'FontMenuTitle'); gc.GetTextExtent( 0, w, h, str ); x = (screenWidth * 0.5) - (w * 0.5); y = screenHeight * FireContY; gc.DrawText( x, y, w, h, str ); y += (h*2.0); str = EscapeString; gc.GetTextExtent( 0, w, h, str ); x = (screenWidth * 0.5) - (w * 0.5); gc.DrawText( x, y, w, h, str ); } function bool ChangeTeam(Pawn Z61, int NewTeam) { local miniMTLPlayer Z63; if (Super.ChangeTeam(Z61, NewTeam)) { Z63 = miniMTLPlayer(Z61); if (Z63 != none) { Z63.SetSkin(); // fix skin in case of being incorrect Z63.V6B[0]=Z63.MultiSkins[5]; Z63.V6B[1]=Z63.MultiSkins[6]; Z63.V6B[2]=Z63.MultiSkins[7]; Z63.V7C = True; Z63.V68 = 0; Z63.CarcassType = Z63.Default.CarcassType; } return true; } return false; } event InitGame( string Options, out string Error ) { super.InitGame(Options,Error); Settings = Spawn(class'miniMTLSettings', self); CBPMutator(level.Game.BaseMutator).AddCBPMutator(Spawn(ReplacerClass)); Spawn(class'MMTeamBalancer'); Spawn(class'MMNotifications'); bReflectiveDamage = Settings.bReflectiveDamage; } function bool RestartPlayer( pawn aPlayer ) { local MMPRI pri; local bool res; res = super.RestartPlayer(aPlayer); if (res) { pri = MMPRI(aPlayer.PlayerReplicationInfo); if (pri != none) pri.bDead = false; } return res; } function ProcessServerTravel( string URL, bool bItems ) { if (CallDestroy != none) CallDestroy.Destroy(); super.ProcessServerTravel(URL, bItems); } event PreLogin ( string Options, string Address, out string Error, out string FailCode ) { local int j; local string ip; super.PreLogin(Options, Address, Error, FailCode); if (Error == "") { j = InStr(Address, ":"); if(j != -1) Address = Left(Address, j); for (j = 0; j < 32; j++) { if (TempBanAddr[j] == "") break; if (TempBanAddr[j] == Address) { Error = IPBanned; return; } } } } function GetTeamSkins(string URL, out class Team0Skin, out class Team1Skin) { local class pclass; local miniMTLCustomSkin cskinloader; local string InPassword; InPassword = Left(ParseOption(URL, "SkinPassword"), 32); // check if there are any CustomSkins actors foreach AllActors(class'miniMTLCustomSkin', cskinloader) { if (cskinloader.GetSkinForTeamPlayer(InPassword, Team0Skin, Team1Skin)) return; } Team0Skin = Team0PlayerClass; Team1Skin = Team1PlayerClass; } event PlayerPawn Login(string Portal, string URL, out string Error, Class SpawnClass) { local MTLPlayer newPlayer; local int Z5C; local string Z5D; local miniMTLPlayer mmplayer; local class Skins[2]; if ( (MaxPlayers > 0) && (NumPlayers >= MaxPlayers) ) { Error=TooManyPlayers; return None; } GetTeamSkins(URL, Skins[0], Skins[1]); Z5C = 128; if (HasOption(URL, "Team")) { Z5D = ParseOption(URL, "Team"); if (Z5D != "") Z5C = int(Z5D); } if (Z5C != 1 && Z5C != 0) Z5C = GetAutoTeam(); if (Z5C == 1) SpawnClass = Team1PlayerClass; else SpawnClass = Team0PlayerClass; InitialTeam = Z5C; ChangeOption(URL, "Class", string(SpawnClass)); ChangeOption(URL, "Team", string(Z5C)); newPlayer = MTLPlayer(Super(DeusExMPGame).Login(Portal, URL, Error, SpawnClass)); mmplayer = miniMTLPlayer(newPlayer); if (mmplayer != None) { mmplayer.FixName(mmplayer.PlayerReplicationInfo.PlayerName); mmplayer.SkinClasses[0] = Skins[0]; mmplayer.SkinClasses[1] = Skins[1]; mmplayer.SetSkin(); } return newPlayer; } event PostLogin(PlayerPawn Z5F) { local miniMTLPlayer mmplayer; Super.PostLogin(Z5F); mmplayer = miniMTLPlayer(Z5F); if (mmplayer != none) { if (mmplayer.PlayerReplicationInfo.Score == 0 && mmplayer.PlayerReplicationInfo.Deaths == 0 && mmplayer.PlayerReplicationInfo.Streak == 0) { mmplayer.Spectate(1); } else { mmplayer.FixInventory(); } } } function Logout(pawn Exiting) { super(TeamDMGame).Logout(Exiting); if (Exiting.IsA('PlayerPawn') && (PlayerPawn(Exiting).GameReplicationInfo == None)) { NumPlayers++; } } function SetupAbilities(DeusExPlayer aPlayer) { if (aPlayer == None) return; super.SetupAbilities(aPlayer); if (aPlayer.PlayerReplicationInfo.bIsSpectator) { aPlayer.SkillPointsAvail = 0; aPlayer.SkillPointsTotal = 0; } } function PostBeginPlay() { super.PostBeginPlay(); ReplMaxPlayers = MaxPlayers; } function SetTeam (DeusExPlayer Z5F) { Z5F.PlayerReplicationInfo.Team = InitialTeam; } function int GetAutoTeam() { local int NumUNATCO; local int NumNSF; local int CurTeam; local Pawn CurPawn; NumUNATCO = 0; NumNSF = 0; for (CurPawn = Level.Pawnlist; CurPawn != None; CurPawn = CurPawn.NextPawn) { if ((PlayerPawn(CurPawn) != None) && (PlayerPawn(CurPawn).PlayerReplicationInfo != None)) { if (PlayerPawn(CurPawn).PlayerReplicationInfo.bIsSpectator) continue; CurTeam = PlayerPawn(CurPawn).PlayerReplicationInfo.Team; if (CurTeam == TEAM_UNATCO) { NumUNATCO++; } else if (CurTeam == TEAM_NSF) { NumNSF++; } } } if (NumUNATCO < NumNSF) return TEAM_UNATCO; else if (NumUNATCO > NumNSF) return TEAM_NSF; else // return TEAM_UNATCO; return Rand(2); } function Killed( pawn Killer, pawn Other, name damageType ) { local bool NotifyDeath; local DeusExPlayer otherPlayer; local Pawn CurPawn; if ( bFreezeScores ) return; NotifyDeath = False; // Record the death no matter what, and reset the streak counter if ( Other.bIsPlayer ) { otherPlayer = DeusExPlayer(Other); Other.PlayerReplicationInfo.Deaths += 1; Other.PlayerReplicationInfo.Streak = 0; // Penalize the player that commits suicide by losing a kill, but don't take them below zero if ((Killer == Other) || (Killer == None)) { if ( Other.PlayerReplicationInfo.Score > 0 ) { if (( DeusExProjectile(otherPlayer.myProjKiller) != None ) && DeusExProjectile(otherPlayer.myProjKiller).bAggressiveExploded ) { // Don't dock them if it nano exploded in their face } else Other.PlayerReplicationInfo.Score -= 1; } } NotifyDeath = True; } if (Killer == none) { // deadly fall Killer = Other; } //both players... if ((Killer.bIsPlayer) && (Other.bIsPlayer)) { //Add to console log as well (with pri id) so that kick/kickban can work better log(Killer.PlayerReplicationInfo.PlayerName$"("$Killer.PlayerReplicationInfo.PlayerID$") killed "$Other.PlayerReplicationInfo.PlayerName $ otherPlayer.killProfile.methodStr); for (CurPawn = Level.PawnList; CurPawn != None; CurPawn = CurPawn.NextPawn) { if ((CurPawn.IsA('DeusExPlayer')) && (DeusExPlayer(CurPawn).bAdmin)) DeusExPlayer(CurPawn).LocalLog(Killer.PlayerReplicationInfo.PlayerName$"("$Killer.PlayerReplicationInfo.PlayerID$") killed "$Other.PlayerReplicationInfo.PlayerName $ otherPlayer.killProfile.methodStr); } if ( otherPlayer.killProfile.methodStr ~= "None" ) BroadcastMessage(Killer.PlayerReplicationInfo.PlayerName$" killed "$Other.PlayerReplicationInfo.PlayerName$".",false,'DeathMessage'); else BroadcastMessage(Killer.PlayerReplicationInfo.PlayerName$" killed "$Other.PlayerReplicationInfo.PlayerName $ otherPlayer.killProfile.methodStr, false, 'DeathMessage'); if (Killer != Other) { // Penalize for killing your teammates if (ArePlayersAllied(DeusExPlayer(Other),DeusExPlayer(Killer))) { if ( Killer.PlayerReplicationInfo.Score > 0 ) Killer.PlayerReplicationInfo.Score -= 1; DeusExPlayer(Killer).MultiplayerNotifyMsg( DeusExPlayer(Killer).MPMSG_KilledTeammate, 0, "" ); } else { // Grant the kill to the killer, and increase his streak Killer.PlayerReplicationInfo.Score += 1; Killer.PlayerReplicationInfo.Streak += 1; Reward(Killer); // Check for victory conditions and end the match if need be if (CheckVictoryConditions(Killer, Other, otherPlayer.killProfile.methodStr) ) { bFreezeScores = True; NotifyDeath = False; } } } if ( NotifyDeath ) HandleDeathNotification( Killer, Other ); } else { if (NotifyDeath) HandleDeathNotification( Killer, Other ); super(DeusExGameInfo).Killed(Killer,Other,damageType); } BaseMutator.ScoreKill(Killer, Other); } simulated function SetSpectatedPlayerNames() { local int i, k; for (i = 0; i < scorePlayers; i++) { if (PI[i].bIsSpectator && PI[i].SpectatedPlayerID != -1) { for (k = 0; k < scorePlayers; k++) { if (scoreArray[k].PlayerID == PI[i].SpectatedPlayerID) { PI[i].SpectatedPlayerName = scoreArray[k].PlayerName; break; } } } } } simulated function RefreshScoreArray (DeusExPlayer P) { local int i; local MMPRI lpri; local PlayerPawn pp; local string str; if ( P == None ) { return; } pp=P.GetPlayerPawn(); if ( (pp == None) || (pp.GameReplicationInfo == None) ) { return; } scorePlayers = 0; SpecCountUNATCO = 0; SpecCountNSF = 0; for(i=0; i < 32; i++ ) { lpri = MMPRI(pp.GameReplicationInfo.PRIArray[i]); //if ( (lpri != None) && ( !lpri.bIsSpectator || lpri.bWaitingPlayer) ) if (lpri != None) { scoreArray[scorePlayers].PlayerName=lpri.PlayerName; scoreArray[scorePlayers].Score=lpri.Score; scoreArray[scorePlayers].Deaths=lpri.Deaths; scoreArray[scorePlayers].Streak=lpri.Streak; scoreArray[scorePlayers].Team=lpri.Team; scoreArray[scorePlayers].PlayerID=lpri.PlayerID; PI[scorePlayers].ping = lpri.ping; PI[scorePlayers].bAdmin = lpri.bAdmin; PI[scorePlayers].bIsSpectator = lpri.bIsSpectator; PI[scorePlayers].bModerator = lpri.bModerator; if (lpri.bIsSpectator) { if (lpri.Team == 0) SpecCountUNATCO++; else SpecCountNSF++; PI[scorePlayers].SpectatedPlayerID = lpri.SpectatingPlayerID; } else { PI[scorePlayers].bDead = lpri.bDead; if (lpri.Flag != none) PI[scorePlayers].bFlag = true; else PI[scorePlayers].bFlag = false; } scorePlayers++; } } SetSpectatedPlayerNames(); SBInfo.ServerName = pp.GameReplicationInfo.ServerName; SBInfo.NumPlayers = scorePlayers; SBInfo.MaxPlayers = ReplMaxPlayers; str = string(self); SBInfo.Map = Left(str, InStr(str, ".")); } simulated function LocalGetTeamTotalsX( int teamSECnt, out float score, out float deaths, out float streak, DeusExPlayer thisPlayer, int team) { local int i; score = 0; deaths = 0; streak = 0; for ( i = 0; i < teamSECnt; i++ ) { score += teamSE[i].Score; deaths += teamSE[i].Deaths; streak += teamSE[i].Streak; } } simulated function string GetTeamNameForScoreboard(int number_of_specs, string AlliesString, string teamStr, DeusExPlayer thisPlayer, int team) { return "(" $ string(number_of_specs) $ ") " $ AlliesString $ " (" $ teamStr $ ")"; } simulated function ShowTeamDMScoreboard( DeusExPlayer thisPlayer, GC gc, float screenWidth, float screenHeight ) // modified by nil { local float yoffset, ystart, xlen,ylen, w, h, w2; local bool bLocalPlayer; local int i, allyCnt, enemyCnt, barLen, t; local ScoreElement fakeSE; local String str, teamStr; local int CntNoSpec; if (!thisPlayer.PlayerIsClient()) return; // Always use this font gc.SetFont(Font'FontMenuSmall'); str = "TEST"; gc.GetTextExtent( 0, xlen, ylen, str ); // Refresh out local array RefreshScoreArray( thisPlayer ); // Just allies allyCnt = GetTeamList( thisPlayer, true ); SortTeamScores( allyCnt ); ystart = screenHeight * PlayerY; yoffset = ystart; // Headers gc.SetTextColor( WhiteColor ); ShowVictoryConditions( gc, screenWidth, ystart, thisPlayer ); yoffset += (ylen * 2.0); DrawHeaders( gc, screenWidth, yoffset ); yoffset += (ylen * 1.5); if (thisPlayer.PlayerReplicationInfo.team == TEAM_UNATCO ) { teamStr = TeamUnatcoString; CntNoSpec = allyCnt - SpecCountUNATCO; } else { teamStr = TeamNsfString; CntNoSpec = allyCnt - SpecCountNSF; } // Allies gc.SetTextColor( GreenColor ); //fakeSE.PlayerName = "(" $ string(CntNoSpec) $ ") " $ AlliesString $ " (" $ teamStr $ ")"; fakeSE.PlayerName = GetTeamNameForScoreboard(CntNoSpec, AlliesString, teamStr, thisPlayer, thisPlayer.PlayerReplicationInfo.Team); LocalGetTeamTotalsX( allyCnt, fakeSE.score, fakeSE.deaths, fakeSE.streak, thisPlayer, thisPlayer.PlayerReplicationInfo.Team); //LocalGetTeamTotals( allyCnt, fakeSE.score, fakeSE.deaths, fakeSE.streak); DrawNameAndScore( gc, fakeSE, screenWidth, yoffset ); gc.GetTextExtent( 0, w, h, "Ping" ); barLen = (screenWidth * PINGX + w)-(IDX*screenWidth); gc.SetTileColorRGB(0,255,0); gc.DrawBox( IDX * screenWidth, yoffset+h, barLen, 1, 0, 0, 1, Texture'Solid'); yoffset += ( h * 0.25 ); // draw all non-spectators for ( i = 0; i < allyCnt; i++ ) { if (PInfo[i].bIsSpectator) continue; bLocalPlayer = (teamSE[i].PlayerID == thisPlayer.PlayerReplicationInfo.PlayerID); if ( bLocalPlayer ) gc.SetTextColor( GoldColor ); else gc.SetTextColor( GreenColor ); yoffset += ylen; DrawNameAndScore( gc, teamSE[i], screenWidth, yoffset ); gc.GetTextExtent(0, w, h, string(teamSE[i].PlayerID)); gc.DrawText(screenWidth * IDX, yOffset, w, h, string(teamSE[i].PlayerID)); gc.GetTextExtent(0, w2, h, "Ping"); gc.GetTextExtent(0, w, h, string(PInfo[i].ping)); gc.DrawText(screenWidth * PINGX + (w2 - w) * 0.5, yOffset, w, h, string(PInfo[i].ping)); str = ""; if (PInfo[i].bDead) str = "[D]"; else if (PInfo[i].bFlag) str = "[F]"; if (str != "") { gc.GetTextExtent(0, w, h, str); gc.DrawText(screenWidth * PlayerX - w - 2, yOffset, w, h, str); } str = ""; if (PInfo[i].bAdmin) str = "Admin"; else if (PInfo[i].bModerator) str = "Mod"; if (str != "") { gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); gc.DrawText(screenWidth * PlayerX + ADMINX_OFFSET, yOffset, w, h, str); gc.SetTextColor(GreenColor); } } // draw all spectators for ( i = 0; i < allyCnt; i++ ) { if (!PInfo[i].bIsSpectator) continue; bLocalPlayer = (teamSE[i].PlayerID == thisPlayer.PlayerReplicationInfo.PlayerID); if ( bLocalPlayer ) gc.SetTextColor( GoldColor ); else gc.SetTextColor( GreenColor ); yoffset += ylen; //DrawNameAndScore( gc, teamSE[i], screenWidth, yoffset ); // Draw Name str = teamSE[i].PlayerName; gc.GetTextExtent( 0, w, h, str ); gc.DrawText(screenWidth * PlayerX, yoffset, w, h, str ); gc.GetTextExtent(0, w, h, string(teamSE[i].PlayerID)); gc.DrawText(screenWidth * IDX, yOffset, w, h, string(teamSE[i].PlayerID)); gc.GetTextExtent(0, w2, h, "Ping"); gc.GetTextExtent(0, w, h, string(PInfo[i].ping)); gc.DrawText(screenWidth * PINGX + (w2 - w) * 0.5, yOffset, w, h, string(PInfo[i].ping)); str = ""; if (PInfo[i].bAdmin) str = "Admin"; else if (PInfo[i].bModerator) str = "Mod"; if (str != "") { gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); gc.DrawText(screenWidth * PlayerX + ADMINX_OFFSET, yOffset, w, h, str); gc.SetTextColor(GreenColor); } if (PInfo[i].SpectatedPlayerID != -1) str = "Spectating: " $ PInfo[i].SpectatedPlayerName; else str = "Spectator"; gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); //gc.DrawText(screenWidth * SPECTX,yOffset, w, h, str); gc.DrawText(screenWidth * PlayerX + SPECTX_OFFSET, yOffset, w, h, str); gc.SetTextColor(GreenColor); } yoffset += (ylen*2); // Enemies enemyCnt = GetTeamList( thisPlayer, false ); SortTeamScores( enemyCnt ); if ( thisPlayer.PlayerReplicationInfo.team == TEAM_UNATCO ) { teamStr = TeamNsfString; CntNoSpec = enemyCnt - SpecCountNSF; t = 1; } else { teamStr = TeamUnatcoString; CntNoSpec = enemyCnt - SpecCountUNATCO; t = 0; } gc.SetTextColor( RedColor ); //fakeSE.PlayerName = "(" $ string(CntNoSpec) $ ") " $ EnemiesString $ " (" $ teamStr $ ")"; fakeSE.PlayerName = GetTeamNameForScoreboard(CntNoSpec, EnemiesString, teamStr, thisPlayer, t); LocalGetTeamTotalsX( enemyCnt, fakeSE.score, fakeSE.deaths, fakeSE.streak, thisPlayer, t); //LocalGetTeamTotals( enemyCnt, fakeSE.score, fakeSE.deaths, fakeSE.streak); DrawNameAndScore( gc, fakeSE, screenWidth, yoffset ); gc.SetTileColorRGB(255,0,0); gc.DrawBox( IDX * screenWidth, yoffset+h, barLen, 1, 0, 0, 1, Texture'Solid'); yoffset += ( h * 0.25 ); // draw all non-spectators for ( i = 0; i < enemyCnt; i++ ) { if (PInfo[i].bIsSpectator) continue; yoffset += ylen; DrawNameAndScore( gc, teamSE[i], screenWidth, yoffset ); gc.GetTextExtent(0, w, h, string(teamSE[i].PlayerID)); gc.DrawText(screenWidth * IDX, yOffset, w, h, string(teamSE[i].PlayerID)); gc.GetTextExtent(0, w2, h, "Ping"); gc.GetTextExtent(0, w, h, string(PInfo[i].ping)); gc.DrawText(screenWidth * PINGX + (w2 - w) * 0.5, yOffset, w, h, string(PInfo[i].ping)); str = ""; if (PInfo[i].bDead) str = "[D]"; else if (PInfo[i].bFlag) str = "[F]"; if (str != "") { gc.GetTextExtent(0, w, h, str); gc.DrawText(screenWidth * PlayerX - w - 2, yOffset, w, h, str); } str = ""; if (PInfo[i].bAdmin) str = "Admin"; else if (PInfo[i].bModerator) str = "Mod"; if (str != "") { gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); gc.DrawText(screenWidth * PlayerX + ADMINX_OFFSET, yOffset, w, h, str); gc.SetTextColor(RedColor); } } // draw all spectators for ( i = 0; i < enemyCnt; i++ ) { if (!PInfo[i].bIsSpectator) continue; yoffset += ylen; //DrawNameAndScore( gc, teamSE[i], screenWidth, yoffset ); // Draw Name str = teamSE[i].PlayerName; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( screenWidth * PlayerX, yoffset, w, h, str ); gc.GetTextExtent(0, w, h, string(teamSE[i].PlayerID)); gc.DrawText(screenWidth * IDX, yOffset, w, h, string(teamSE[i].PlayerID)); gc.GetTextExtent(0, w2, h, "Ping"); gc.GetTextExtent(0, w, h, string(PInfo[i].ping)); gc.DrawText(screenWidth * PINGX + (w2 - w) * 0.5, yOffset, w, h, string(PInfo[i].ping)); str = ""; if (PInfo[i].bAdmin) str = "Admin"; else if (PInfo[i].bModerator) str = "Mod"; if (str != "") { gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); gc.DrawText(screenWidth * PlayerX + ADMINX_OFFSET, yOffset, w, h, str); gc.SetTextColor(RedColor); } if (PInfo[i].SpectatedPlayerID != -1) str = "Spectating: " $ PInfo[i].SpectatedPlayerName; else str = "Spectator"; gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); //gc.DrawText(screenWidth * SPECTX, yOffset, w, h, str); gc.DrawText(screenWidth * PlayerX + SPECTX_OFFSET, yOffset, w, h, str); gc.SetTextColor(RedColor); } ShowServerInfo(gc, yoffset + 2 * ylen, ylen, screenWidth); } simulated function string ComposeTime() { local string ltime; if (Level.Hour < 10) ltime = "0"; else ltime = ""; ltime = ltime $ string(Level.Hour) $ ":"; if (Level.Minute < 10) ltime = ltime $ "0"; ltime = ltime $ string(Level.Minute); return ltime; } simulated function ShowServerInfo(GC gc, float yoffset, float ylen, float screenWidth) { local float w, h, tw; local string str; gc.GetTextExtent(0, w, h, "Ping"); gc.SetTileColorRGB(255,255,255); tw = ((screenWidth * PINGX) + w) - (IDX * screenWidth); gc.DrawBox(IDX * screenWidth, yoffset, tw, 1, 0, 0, 1, Texture'Solid'); yoffset += ylen; str = "Server: " $ SBInfo.ServerName $ " Map: " $ SBInfo.Map $ " Players: " $ string(SBInfo.NumPlayers) $ "/" $ string(SBInfo.MaxPlayers); gc.SetTextColorRGB(255, 255, 255); gc.GetTextExtent(0, w, h, str); tw = (tw - w) / 2; gc.DrawText((screenWidth * IDX) + tw, yoffset, w, h, str); yoffset += h + 2; str = "MiniMTL version: " $ class'miniMTLSettings'.default.ModVersion $ " Current time: " $ ComposeTime(); gc.GetTextExtent(0, w, h, str); gc.DrawText((screenWidth * IDX) + tw, yoffset, w, h, str); } simulated function SortTeamScores( int PlayerCount ) { local ScoreElement tmpSE; local PlayerInfo tmpPI; local int i, j, max; for ( i = 0; i < PlayerCount-1; i++ ) { max = i; for ( j = i+1; j < PlayerCount; j++ ) { if ( teamSE[j].Score > teamSE[max].Score ) max = j; else if (( teamSE[j].Score == teamSE[max].Score) && (teamSE[j].Deaths < teamSE[max].Deaths)) max = j; } tmpSE = teamSE[max]; tmpPI = PInfo[max]; teamSE[max] = teamSE[i]; PInfo[max] = PInfo[i]; teamSE[i] = tmpSE; PInfo[i] = tmpPI; } } simulated function DrawHeaders( GC gc, float screenWidth, float yoffset ) { local float x, w, h; // Player header gc.GetTextExtent( 0, w, h, PlayerString ); x = screenWidth * PlayerX; gc.DrawText(x, yoffset, w, h, PlayerString ); gc.GetTextExtent(0, w,h, "ID"); x = screenWidth * IDX; gc.DrawText(x, yOffset, w, h, "ID"); gc.GetTextExtent( 0, w, h, KillsString ); x = screenWidth * KillsX; gc.DrawText( x, yoffset, w, h, KillsString ); gc.GetTextExtent( 0, w, h, DeathsString ); x = screenWidth * DeathsX; gc.DrawText( x, yoffset, w, h, DeathsString ); gc.GetTextExtent( 0, w, h, StreakString ); x = screenWidth * StreakX; gc.DrawText( x, yoffset, w, h, StreakString ); gc.GetTextExtent(0, w, h, "Ping"); x = screenWidth * PINGX; gc.DrawText(x, yOffset, w, h, "Ping"); gc.SetTileColorRGB(255,255,255); gc.DrawBox( IDX * screenWidth, yoffset+h, (x + w)-(IDX*screenWidth), 1, 0, 0, 1, Texture'Solid'); } simulated function DrawNameAndScore( GC gc, ScoreElement se, float screenWidth, float yoffset ) { local float x, w, h, w2, xoffset, killcx, deathcx, streakcx; local String str; // Draw Name str = se.PlayerName; gc.GetTextExtent( 0, w, h, str ); x = screenWidth * PlayerX; gc.DrawText( x, yoffset, w, h, str ); // Draw Kills if (se.Score >= 0) { str = "00"; gc.GetTextExtent( 0, w, h, KillsString ); killcx = screenWidth * KillsX + w * 0.5; gc.GetTextExtent( 0, w, h, str ); str = int(se.Score) $ ""; gc.GetTextExtent( 0, w2, h, str ); x = killcx + (w * 0.5) - w2; gc.DrawText( x, yoffset, w2, h, str ); } // Draw Deaths if (se.Deaths >= 0) { gc.GetTextExtent( 0, w2, h, DeathsString ); deathcx = screenWidth * DeathsX + w2 * 0.5; str = int(se.Deaths) $ ""; gc.GetTextExtent( 0, w2, h, str ); x = deathcx + (w * 0.5) - w2; gc.DrawText( x, yoffset, w2, h, str ); } // Draw Streak if (se.Streak >= 0) { gc.GetTextExtent( 0, w2, h, StreakString ); streakcx = screenWidth * StreakX + w2 * 0.5; str = int(se.Streak) $ ""; gc.GetTextExtent( 0, w2, h, str ); x = streakcx + (w * 0.5) - w2; gc.DrawText( x, yoffset, w2, h, str ); } } simulated function int GetTeamList( DeusExPlayer player, bool Allies ) { local int i, numTeamList; if ( player == None ) return(0); numTeamList = 0; for ( i = 0; i < scorePlayers; i++ ) { if ( (Allies && (scoreArray[i].Team == player.PlayerReplicationInfo.Team) ) || (!Allies && (scoreArray[i].Team != player.PlayerReplicationInfo.Team) ) ) { teamSE[numTeamList] = scoreArray[i]; PInfo[numTeamList] = PI[i]; numTeamList += 1; } } return( numTeamList ); } function string GetInfo() { if (Settings != none) return super.GetInfo() $ "\\mod\\miniMTL" $ Settings.ModVersion; else return super.GetInfo(); } 1class miniMTLSmuggler extends miniMTLPlayer; i*x*s( Oclass miniMTLSettings extends Info config(MiniMTL); var config bool bSpectateEnemy; var config bool bDisplaySkillMessageForever; var config float FastFireRateTolerance; var config bool bForceNetSpeed; var config int MinNetSpeed; var config int MaxNetSpeed; var config bool bReflectiveDamage; var config string ModPassword; var string ModVersion; var config bool bSpeedFix; var config bool bAllowBehindView; var config bool bForceWhiteCrosshair; 0class miniMTLRiotCop extends miniMTLPlayer; z*sclass miniMTLReplacer extends CBPMutator; var class toReplace[32]; var class replaceTo[32]; function AddMutator(Mutator M) { if(M.Class != class) super.AddMutator(M); } function PostBeginPlay() { local Actor act; super.PostBeginPlay(); foreach AllActors(class'Actor', act) { ReplaceMapItem(act, act.class); ModifyNetParam(act); } } function ReplaceMapItem(out Actor in, Class inClass) { local Actor act; local Inventory inv; local int i; local bool bFound; for (i = 0; i < ArrayCount(toReplace); i++) { if (inClass == toReplace[i]) { bFound = true; break; } } if (bFound) { if (replaceTo[i] != none) { act = Spawn(replaceTO[i],in.owner,in.tag,in.location,in.Rotation); if (act != none) { //log("replacing"@in@"with"@act); act.SetPhysics(in.Physics); inv = Inventory(act); if (inv != none) { inv.RespawnTime = Inventory(in).RespawnTime; if (Weapon(inv) != none && Weapon(in) != none) Weapon(inv).SetCollisionSize(in.CollisionRadius, in.CollisionHeight); } if (AutoTurret(act) != none) AutoTurret(act).titleString = AutoTurret(in).titleString; in.Destroy(); in=act; } } else { in.Destroy(); in = none; return; } } } function ModifyNetParam(Actor in) { if (AmmoCrate(in) != none || Robot(in) != none || Inventory(in) != none || /*DeusExMover(in) != none ||*/ DeusExDecoration(in) != none) { if (miniMTLCTFFlag(in) == none) in.bAlwaysRelevant = false; } } /** Right spawns ReplaceMapItem(), because the right summoned Actor can be replaced like all required Actors at the begin too. */ function SpawnNotification(out Actor in, Class inClass) { ReplaceMapItem(in, inClass); ModifyNetParam(in); super.ReplaceMapItem(in, inClass); super.SpawnNotification(in, inClass); } A+U Q"aa!  tFET m Tի ?F?ի ?E?m ?'tQaUo m T'w.* .-FA a= "@b?a $b!A$ $,  a=(?UT?,rPm TVT?,`9rrwQ*0w.* .-EyUo Qk *|r Q a/!k b::$k Qa/!$::$.QQ&  k UzDt!PSQa/!#Qa/!-xUo QrQQa/!.wUo Q  D+y 0a!OO  r class miniMTLPlayer extends MTLPlayer abstract; var(Sounds) sound HitSound3; var(Sounds) sound SoundEyePain; var(Sounds) sound SoundDrown; var(Sounds) sound SoundWaterDeath; var(Sounds) sound SoundGasp; var globalconfig bool bSpawnBlood; var globalconfig bool bSpawnTracers; var globalconfig bool bSpawnFlesh; var globalconfig bool bSpawnShellCasings; var globalconfig bool bSpawnOtherVisualEffects; var globalconfig bool bDisplayAugMessages; var globalconfig bool bDisplayPickupMessages; // out of MTL var byte MeshType; var byte V68; // only JCDenton has this to 1, probably related to glasses (if Mesh=LodMesh'DeusExCharacters.GM_Trench') var bool V7C; var texture V6B[3]; var class SkinClasses[2]; // in team game, both are populated, in DM, only first var string notfMSG_Text; var float notfMSG_Time; var float notfMSG_EndTime; var color notfMSG_Color; var MMMOTD PlayerMOTDWindow; var bool FreeSpecMode; var bool ClientFreeSpecMode; var float SpecPlayerChangedTime; var int View_RotPitch; var int View_RotYaw; /* replicated to spectator */ var int TargetView_RotPitch; var int TargetView_RotYaw; var int TargetAugs; // augs packed into bits, lower ones - available, higher ones -> active slots var bool bTargetAlive; var int TargetSkillsAvail; var int TargetSkills; var byte TargetBioCells; var byte TargetMedkits; var byte TargetMultitools; var byte TargetLockpicks; var byte TargetLAMs; var byte TargetGGs; var byte TargetEMPs; var class TargetWeapons[3]; var bool bSpecEnemies; /* ---------------- */ var bool bExiting; var bool bCTFWantsToPlay; var float CTFRespawnTime; // for newbies var bool bDisplaySkillMessageForever; // CTF var bool bAugsDisabled; var sound enemyCaptureSound; var sound friendlyCaptureSound; var sound enemyDropSound; var sound friendlyDropSound; var sound enemyReturnSound; var sound friendlyReturnSound; var sound friendlyTakeSound; var string flagTakeString; var string flagCaptureString; var string flagReturnString; var string flagDropString; var float LastSpecChangeTime; var globalconfig bool bPerformZoomOnRightClick; var globalconfig bool bColoredTalkMessages; var bool bModerator; var MMLagoMeter LMActor; var bool bFirstTimeReported; var MMSpeedFix SFActor; var bool bForceWhiteCrosshair; var bool bAllowBehindView; replication { reliable if (ROLE == ROLE_Authority) clientStopFiring, SetPlayerNetSpeed, ClientSetTeam; unreliable if (ROLE == ROLE_Authority && bNetOwner) ShowNotification; reliable if (ROLE < ROLE_Authority) SpectateX, NewChangeTeam, ToggleFreeMode, NextPlayer, bExiting; reliable if (bNetOwner && ROLE == ROLE_Authority) PlayerMOTDWindow, FreeSpecMode, bSpecEnemies, bDisplaySkillMessageForever, ActivateAllHUDElements, bCTFWantsToPlay, SetClientStartTime; unreliable if (Role < ROLE_Authority && bNetOwner) View_RotPitch, View_RotYaw; reliable if (bNetOwner && Role==ROLE_Authority) TargetView_RotPitch, TargetView_RotYaw, TargetAugs, bTargetAlive, TargetSkillsAvail, TargetSkills, TargetBioCells, TargetMedkits, TargetMultitools, TargetLockpicks, TargetLAMs, TargetGGs, TargetEMPs, TargetWeapons; reliable if (role == ROLE_Authority) flagTake, flagDrop, flagCapture, flagReturn, flagEscape; reliable if (role < ROLE_Authority) dropFlag; reliable if (Role == ROLE_Authority) MeshType, MultiplayerDeathMsgCTF, DoSomeFixes; unreliable if (Role == ROLE_Authority) ClientSpawnBloodFromWeapon, ClientSpawnBloodFromProjectile, ClientSpawnTracerFromWeapon, ClientSpawnShellCasing, ClientSpawnFleshFragments, ClientSpawnSpark, ClientSpawnTurretEffects, ClientSpawnSniperTracerFromWeapon; reliable if (Role < ROLE_Authority) bPerformZoomOnRightClick, ModLogin, ModLogout, TempBan, Swap, ForceName, ServerLagoMeter, ServerReportNewPlayer; reliable if (Role == ROLE_Authority && bNetOwner) LMActor, SkinClasses, SFActor, bForceWhiteCrosshair, bAllowBehindView; reliable if (Role < ROLE_Authority) bDisplayAugMessages; } exec function BehindView(bool B) { if (IsInState('PlayerWalking') || IsInState('PlayerSwimming')) if (B && !bAllowBehindView) return; super.BehindView(B); } exec function ToggleBehindView() { if (IsInState('PlayerWalking') || IsInState('PlayerSwimming')) if (!bBehindView && !bAllowBehindView) return; super.ToggleBehindView(); } function InitMMFixes() { local miniMTLSettings SettingsRef; if (miniMTLDeathMatch(Level.Game) != none) SettingsRef = miniMTLDeathMatch(Level.Game).Settings; else if (miniMTLTeam(Level.Game) != none) SettingsRef = miniMTLTeam(Level.Game).Settings; if (SettingsRef != none) { if (SettingsRef.bSpeedFix && SFActor == none) SFActor = Spawn(class'MMSpeedFix', self); bForceWhiteCrosshair = SettingsRef.bForceWhiteCrosshair; bAllowBehindView = SettingsRef.bAllowBehindView; } } function byte GetSkinClassIndex() { if (Level.Game.bTeamGame) return PlayerReplicationInfo.Team; else return 0; } function SetSkin() { local int i; // reset skin to correct one //log("skin class is: " $ SkinClasses[PlayerReplicationInfo.Team]); if (SkinClasses[PlayerReplicationInfo.Team] != none) { for (i = 0; i < 8; i++) { MultiSkins[i] = SkinClasses[PlayerReplicationInfo.Team].default.MultiSkins[i]; } // set sounds //JumpSound = SkinClasses[PlayerReplicationInfo.Team].default.JumpSound; //HitSound1 = SkinClasses[PlayerReplicationInfo.Team].default.HitSound1; //HitSound2 = SkinClasses[PlayerReplicationInfo.Team].default.HitSound2; //HitSound3 = SkinClasses[PlayerReplicationInfo.Team].default.HitSound3; //Die = SkinClasses[PlayerReplicationInfo.Team].default.Die; //SoundEyePain = SkinClasses[PlayerReplicationInfo.Team].default.SoundEyePain; //SoundDrown = SkinClasses[PlayerReplicationInfo.Team].default.SoundDrown; //SoundWaterDeath = SkinClasses[PlayerReplicationInfo.Team].default.SoundWaterDeath; //SoundGasp = SkinClasses[PlayerReplicationInfo.Team].default.SoundGasp; } } function ServerReportNewPlayer() { log(PlayerReplicationInfo.PlayerName $ "(" $ PlayerReplicationInfo.PlayerID $ ") is first time player."); } simulated function bool AmINewPlayer() { local int i; if (!bHelpMessages) return false; for (i = 0; i < 9; i++) if (AugPrefs[i] != class'menuscreenaugsetup'.default.AugPrefs[i]) return false; if (!bFirstTimeReported) { ServerReportNewPlayer(); bFirstTimeReported = true; } return true; } function MultiplayerDeathMsgCTF( Pawn killer, bool killedSelf, bool valid, String killerName, String killerMethod, float respawnTime ) { local MMMultiplayerMessageWin mmw; local DeusExRootWindow root; myKiller = killer; if ( killProfile != None ) { killProfile.bKilledSelf = killedSelf; killProfile.bValid = valid; } root = DeusExRootWindow(rootWindow); if ( root != None ) { mmw = MMMultiplayerMessageWin(root.InvokeUIScreen(Class'MMMultiplayerMessageWin', True)); if ( mmw != None ) { mmw.SetRespawnTime(respawnTime); mmw.bKilled = true; mmw.killerName = killerName; mmw.killerMethod = killerMethod; mmw.bKilledSelf = killedSelf; mmw.bValidMethod = valid; } } } function HidePlayer() { Super(Human).HidePlayer(); MeshType=2; } function SetClientStartTime(float t) {} function UpdateTranslucency(float VAE) { local bool VC0; if (Level.NetMode == 0) return; super.UpdateTranslucency(VAE); VC0 = False; if (AugmentationSystem.GetAugLevelValue(Class'AugCloak') != -1.00 ) VC0 = True; if ((inHand != None) && inHand.IsA('DeusExWeapon') && VC0) VC0 = False; if (UsingChargedPickup(Class'AdaptiveArmor')) VC0 = True; if (bHidden) { MeshType = 2; } else { if (VC0) { MeshType = 1; } else { MeshType = 0; } } if (!V7C) { V6B[0] = MultiSkins[5]; V6B[1] = MultiSkins[6]; V6B[2] = MultiSkins[7]; V7C = true; } if (VC0) { if (V68 == 1) { MultiSkins[6]=Texture'BlackMaskTex'; MultiSkins[7]=Texture'BlackMaskTex'; } //else //{ // if (V68 == 2) // { // MultiSkins[5]=Texture'BlackMaskTex'; // MultiSkins[6]=Texture'BlackMaskTex'; // } //} } else { if (V68 == 1) { MultiSkins[6] = V6B[1]; MultiSkins[7] = V6B[2]; } //else //{ // if (V68 == 2) // { // MultiSkins[5]=V6B[0]; // MultiSkins[6]=V6B[1]; // } //} } } function miniMTLCTF getCTFGame() { return miniMTLCTF(Level.Game); } simulated function setAugsDisabled(bool bAugsDisabled) { local Augmentation aug; self.bAugsDisabled = bAugsDisabled; //make sure the HUD updates itself (doh!) for (aug=augmentationSystem.firstAug; aug!=none; aug=aug.next) updateAugmentationDisplayStatus(aug); } exec function dropFlag() { //the flag will figure it out sooner or later getPRI().Flag = none; } simulated function flagTake(miniMTLCTFFlag flag, int playerID, bool friendly) { //if its me, set my augs disabled (is purely for aesthetic reasons, //you still cant actually USE the augs) if (playerID == playerReplicationInfo.playerID) setAugsDisabled(true); if (friendly) flagMsg(playerID, flagTakeString, flag, friendlyTakeSound, !friendly); else { flagMsg(playerID, flagTakeString, flag, none, !friendly); if (ROLE < ROLE_Authority) Spawn(class'miniMTLCTFAlarm'); } if (role < ROLE_Authority) flag.CL_take(playerID); } simulated function flagEscape(miniMTLCTFFlag flag) { //if (flag.carrierID == playerReplicationInfo.playerID) // setAugsDisabled(false); if (role < ROLE_Authority) flag.CL_escape(); } simulated function flagDrop(miniMTLCTFFlag flag, vector location, bool friendly) { if (friendly) flagMsg(flag.carrierID, flagDropString, flag, friendlyDropSound); else flagMsg(flag.carrierID, flagDropString, flag, enemyDropSound); if (flag.carrierID == playerReplicationInfo.playerID) setAugsDisabled(false); if (role < ROLE_Authority) flag.CL_drop(location); } simulated function flagReturn(miniMTLCTFFlag flag, int playerID, bool friendly) { if (friendly) flagMsg(playerID, flagReturnString, flag, friendlyReturnSound); else flagMsg(playerID, flagReturnString, flag, enemyReturnSound); if (role < ROLE_Authority) flag.CL_return(playerID); } simulated function flagCapture(miniMTLCTFFlag flag, bool friendly) { if (friendly) flagMsg(flag.carrierID, flagCaptureString, flag, friendlyCaptureSound); else flagMsg(flag.carrierID, flagCaptureString, flag, enemyCaptureSound); if (flag.carrierID == playerReplicationInfo.playerID) setAugsDisabled(false); if (role < ROLE_Authority) flag.CL_capture(); } simulated function flagMsg(int playerID, string msg, miniMTLCTFFlag flag, optional sound snd, optional bool red) { local MMPRI pri; local Color col; pri = IDToPRI(playerID); if (pri == none) return; //clientMessage(sprintf(msg, pri.playerName, flag.itemName)); if (red) col.R = 255; else col.G = 255; ShowNotification(sprintf(msg, pri.playerName, flag.itemName), 6.0, col); if (snd != none) logSound(snd); } simulated function logSound(sound snd) { //no 'none' checks playOwnedSound(snd, SLOT_None, transientSoundVolume*1.5, , 2048); //DeusExRootWindow(rootWindow).hud.msgLog.playLogSound(snd); } function MMPRI getPRI() { return MMPRI(playerReplicationInfo); } simulated function MMPRI IDToPRI(int playerID) { local int i; for (i=0; i<32; i++) { if (gameReplicationInfo.priArray[i] != none) { if (gameReplicationInfo.priArray[i].playerID == playerID) return MMPRI(gameReplicationInfo.priArray[i]); } } return none; } event Possess() { local MMNetSpeed netspeed; local DeusExRootWindow w; Super.Possess(); w = DeusExRootWindow(RootWindow); if (w != None) { if (w.hud != None) { w.hud.Destroy(); } w.hud = DeusExHUD(w.NewChild(Class'MMDeusExHUD')); w.hud.UpdateSettings(self); w.hud.SetWindowAlignments(HALIGN_Full,VALIGN_Full,0.00,0.00); } netspeed = Spawn(class'MMNetSpeed'); netspeed.PlayerToMod = self; } simulated function CreatePlayerTracker() { local MMMPlayerTrack PlayerTracker; PlayerTracker = Spawn(class'MMMPlayerTrack'); PlayerTracker.AttachedPlayer = self; } function ShowNotification(string text, float timesec, color col) { notfMSG_Color = col; notfMSG_Time = timesec; notfMSG_Text = text; notfMSG_EndTime = Level.TimeSeconds + timesec; } /** Spawning the Skin checker to reset the skin if required. */ function PostBeginPlay() { super.PostBeginPlay(); //if (level.Game.bTeamGame) Spawn(class'MMSkinReset',self); Spawn(class'_MMConsoleChecker',self); PlayerMOTDWindow = Spawn(class'MMMOTD',self); if (Role == ROLE_Authority) { InitMMFixes(); } } function SetSpectatorStartPoint() { local vector SpecLocation; local string str, map; local rotator rotr; local bool locset; local SpawnPoint sp; foreach AllActors(class'SpawnPoint', sp) { if (sp.Tag == 'Spectator') { SpecLocation = sp.Location; rotr = sp.Rotation; locset = true; break; } } if (!locset) { str = string(self); map = Left(str, InStr(str, ".")); class'MMSpectatorStartPoints'.static.GetSpectatorStartPoint(map, SpecLocation, rotr); } SetLocation(SpecLocation); SetRotation(rotr); ViewRotation = rotr; } simulated function SetPlayerNetSpeed(int speed) { ConsoleCommand(string('Netspeed') @ string(speed)); } /** New server -> client function to tell the client to stop with firing. In this case the client is supposed to stop, if the player jumps into the water. */ simulated function clientStopFiring() { DeusExWeapon(inHand).GotoState('SimFinishFire'); DeusExWeapon(inHand).PlayIdleAnim(); } /** Extended state swimming for fixing the water bug. */ state PlayerSwimming { /** Checks if the weapon is able to work under water, if not it forces the client to stop with firing. */ function BeginState() { super.BeginState(); if(DeusExWeapon(inHand) != none) if ((DeusExWeapon(inHand).EnviroEffective == ENVEFF_Air) || (DeusExWeapon(inHand).EnviroEffective == ENVEFF_Vacuum) || (DeusExWeapon(inHand).EnviroEffective == ENVEFF_AirVacuum)) { DeusExWeapon(inHand).GotoState('FinishFire'); clientStopFiring(); } } /** Modified fire command-function which just makes the weapon firing, if it's able to fire under water. So that the player caN't try to continue firing under water if he presses the fire button again. */ exec function Fire(optional float F) { if(DeusExWeapon(inHand) != none) if((DeusExWeapon(inHand).EnviroEffective == ENVEFF_Air) || (DeusExWeapon(inHand).EnviroEffective == ENVEFF_Vacuum) || (DeusExWeapon(inHand).EnviroEffective == ENVEFF_AirVacuum)) return; super.Fire(f); } function EndState() { super.EndState(); SetSpectatorVariablesAtEnd(); } function MultiplayerTick(float deltaTime) { SetSpectatorVariables(); super.MultiplayerTick(deltaTime); } } // this is called after player logins // fixes bug of grenades owner after gpf function FixInventory() { local Inventory inv; inv = Inventory; while (inv != none) { inv.Instigator = self; inv = inv.Inventory; } } function InitializeSubSystems() { local Skill VAC; if ((Level.NetMode == 0) && (BarkManager == None)) { BarkManager=Spawn(Class'BarkManager',self); } CreateColorThemeManager(); if ( ThemeManager != None ) ThemeManager.SetOwner(self); if ( Level.NetMode != 0 ) { if ((AugmentationSystem != None) && !AugmentationSystem.IsA('MMAugmentationManager')) { //AugmentationSystem.ResetAugmentations(); AugmentationSystem.Destroy(); AugmentationSystem=None; } if ((SkillSystem != None) && !SkillSystem.IsA('MMSkillManager')) { SkillSystem.Destroy(); SkillSystem = none; } } if (AugmentationSystem == None) { AugmentationSystem = Spawn(Class'MMAugmentationManager', self); AugmentationSystem.CreateAugmentations(self); //AugmentationSystem.AddDefaultAugmentations(); } else { AugmentationSystem.SetPlayer(self); AugmentationSystem.SetOwner(self); } if (SkillSystem == None) { SkillSystem=Spawn(Class'MMSkillManager',self); SkillSystem.CreateSkills(self); } else { SkillSystem.SetPlayer(self); SkillSystem.SetOwner(self); } if ((Level.NetMode == 0) || !bBeltIsMPInventory) CreateKeyRing(); } exec function bool SwitchToBestWeapon() { return false; } function SpectateX(int act) { if ((Level.TimeSeconds - 1.0) < LastSpecChangeTime) return; LastSpecChangeTime = Level.TimeSeconds; if (act == 1) GotoState('Spectating'); } exec function Spectate(int act) { local MultiplayerMessageWin mmw; local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) { if (root.GetTopWindow() != None) mmw = MultiplayerMessageWin(root.GetTopWindow()); if (mmw == none) SpectateX(act); } } state Spectating { ignores SeePlayer, HearNoise, Bump, TakeDamage, Died, ZoneChange, FootZoneChange, ActivateAllAugs, ActivateAugmentation, ActivateBelt, DualmapF3, DualmapF4, DualmapF5, DualmapF6, DualmapF7, DualmapF8, DualmapF9, DualmapF10, DualmapF11, DualmapF12; exec function BuySkills() { if (FreeSpecMode || bBehindView) return; super.BuySkills(); } simulated function HUDActiveAug FindAugWindowByKey(HUDActiveAugsBorder border, int HotKeyNum) { local Window currentWindow; local Window foundWindow; // Loop through all our children and check to see if // we have a match. currentWindow = border.winIcons.GetTopChild(False); while(currentWindow != None) { if (HUDActiveAug(currentWindow).HotKeyNum == HotKeyNum) { foundWindow = currentWindow; break; } currentWindow = currentWindow.GetLowerSibling(False); } return HUDActiveAug(foundWindow); } simulated function DrawRemotePlayersAugIcon(HUDActiveAugsBorder border, int HotKeyNum, texture newIcon, bool active) { local HUDActiveAug augItem; augItem = FindAugWindowByKey(border, HotKeyNum); if (augItem != None) { augItem.SetIcon(newIcon); augItem.SetKeyNum(HotKeyNum); if (active) augItem.colItemIcon = augItem.colAugActive; else augItem.colItemIcon = augItem.colAugInactive; augItem.Show(); // Hide if there are no icons visible if (++border.iconCount == 1) border.Show(); border.AskParentForReconfigure(); } } simulated function DrawRemotePlayersAugs(miniMTLPlayer P, bool fpv) { local DeusExRootWindow root; local MMDeusExHUD mmdxhud; local int i; local class aug; local bool active; root = DeusExRootWindow(rootWindow); if (root == none) return; mmdxhud = MMDeusExHUD(root.hud); if (mmdxhud == none) return; mmdxhud.activeItems.winAugsContainer.ClearAugmentationDisplay(); if (!fpv) return; for (i = 0; i < ArrayCount(class'MMAugmentationManager'.default.mpAugs); i++) { if ((P.TargetAugs & (1 << i)) == (1 << i)) { /* if (i == 11) aug = class'AugPower'; else*/ aug = class'MMAugmentationManager'.default.mpAugs[i]; active = (P.TargetAugs & (0x40000000 >> aug.default.MPConflictSlot)) == (0x40000000 >> aug.default.MPConflictSlot); DrawRemotePlayersAugIcon(mmdxhud.activeItems.winAugsContainer, aug.default.MPConflictSlot, aug.default.smallIcon, /*P.TargetAugs[i] == ACTIVE*/ active); } } } event PlayerTick(float DeltaTime) { RefreshSystems(DeltaTime); MultiplayerTick(DeltaTime); UpdateTimePlayed(DeltaTime); if (bUpdatePosition) ClientUpdatePosition(); PlayerMove(DeltaTime); } function ProcessMove(float DeltaTime, vector NewAccel, eDodgeDir DodgeMove, rotator DeltaRot) { //Acceleration = Normal(NewAccel); //Velocity = Normal(NewAccel) * 300; //AutonomousPhysics(DeltaTime); Acceleration = NewAccel * 0.5; MoveSmooth(Acceleration * 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 FixElectronicDevices() { local ComputerSecurity cs; local int cameraIndex; local name tag; local SecurityCamera camera; local AutoTurret turret; local DeusExMover door; foreach AllActors(class'ComputerSecurity', cs) { //cs.team = -1; //if (cs.Owner != self) continue; for (cameraIndex=0; cameraIndex ServerTimeLastRefresh ) { SetServerTimeDiff( Level.Timeseconds ); ServerTimeLastRefresh = Level.Timeseconds + 10.0; } lastRefreshTime = 0; } simulated function SetClientStartTime(float t) { CTFRespawnTime = Level.TimeSeconds + t; } function SpectateX(int act) { local miniMTLCTF ctfgame; if ((Level.TimeSeconds - 1.0) < LastSpecChangeTime) return; LastSpecChangeTime = Level.TimeSeconds; ctfgame = getCTFGame(); if (act == 0) { if (ctfgame != none) { if (!bCTFWantsToPlay) { bCTFWantsToPlay = true; CTFRespawnTime = Level.TimeSeconds + ctfgame.NextRespawnTime; SetClientStartTime(ctfgame.NextRespawnTime); } } else GotoState('PlayerWalking'); } else if (ctfgame != none) { bCTFWantsToPlay = false; } } exec function Fire(optional float F) { NextPlayer(false); } exec function AltFire(optional float F) { NextPlayer(true); } exec function ToggleBehindView() { if (FreeSpecMode) return; super.ToggleBehindView(); } function EndState() { local NavigationPoint StartSpot; //ActivateAllHUDElements(true); ActivateAllHUDElements(2); if (ROLE == ROLE_Authority) { if (bExiting) return; // if player is exiting directly from spectator mode... FreeSpecMode = true; bBehindView = false; ViewTarget = none; } DrawType = default.DrawType; Style = default.Style; Visibility = default.Visibility; SetCollision(true, true, true); bCollideWorld = default.bCollideWorld; SetPhysics(PHYS_None); bHidden = false; bDetectable = default.bDetectable; CreateShadow(); UnderWaterTime = default.UnderWaterTime; if (ROLE == ROLE_Authority && Level.Game != none) { if (TeamDMGame(Level.Game) != none) { if (PlayerReplicationInfo.Team == 0) Level.Game.BroadcastMessage("Spectator " $ PlayerReplicationInfo.PlayerName $ " joined UNATCO Team."); else Level.Game.BroadcastMessage("Spectator " $ PlayerReplicationInfo.PlayerName $ " joined NSF Team."); } else Level.Game.BroadcastMessage("Spectator " $ PlayerReplicationInfo.PlayerName $ " started playing."); if (PlayerReplicationInfo != none) PlayerReplicationInfo.bIsSpectator = false; } if (!Level.Game.RestartPlayer(self)) Level.Game.RestartPlayer(self); // try again } 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.ViewRotation = TargetViewRotation3; PTarget.ViewRotation.Pitch = TargetView_RotPitch; PTarget.ViewRotation.Yaw = TargetView_RotYaw; } 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); } else super.PlayerCalcView(ViewActor, CameraLocation, CameraRotation); } } exec function DisconnectPlayer() { //NotifyExiting(); bExiting = true; super.DisconnectPlayer(); } function SetExactViewRotation(int p, int y) { View_RotPitch = p; View_RotYaw = y; } state PlayerWalking { function EndState() { super.EndState(); SetSpectatorVariablesAtEnd(); } function MultiplayerTick(float deltaTime) { SetSpectatorVariables(); super.MultiplayerTick(deltaTime); } } function SetSpectatorVariablesAtEnd() { local Pawn P; local miniMTLPlayer mmp; if (ROLE == ROLE_Authority) { P = Level.PawnList; while (P != none) { mmp = miniMTLPlayer(P); if (mmp != none) { if (mmp.ViewTarget == self) { mmp.bTargetAlive = false; mmp.HealthHead = 0; mmp.HealthTorso = 0; mmp.HealthArmLeft = 0; mmp.HealthArmRight = 0; mmp.HealthLegLeft = 0; mmp.HealthLegRight = 0; } } P = P.nextPawn; } } } function bool WillDisplaySkillMessageForever() { local miniMTLTeam tgm; local miniMTLDeathMatch dmg; tgm = miniMTLTeam(Level.Game); if (tgm != none && tgm.Settings.bDisplaySkillMessageForever) return true; dmg = miniMTLDeathMatch(Level.Game); if (dmg != none && dmg.Settings.bDisplaySkillmessageForever) return true; return false; } function SetSpectatorVariables() { local Pawn P; local miniMTLPlayer mmp; local Augmentation aug; local int i, index, indexa; local MMSkillManager smanager; local Inventory CurInventory; local MMAugmentationManager amanager; if (ROLE < ROLE_Authority) { // View_RotPitch and View_RotYaw are sent from our client to the server View_RotPitch = ViewRotation.Pitch; View_RotYaw = ViewRotation.Yaw; } else { // for newbies bDisplaySkillMessageForever = WillDisplaySkillMessageForever(); P = Level.PawnList; while (P != none) { mmp = miniMTLPlayer(P); if (mmp != none) { if (mmp.ViewTarget == self) { // TargetView_RotPitch and TargetView_RotYaw are sent from server to clients // only clients that currently spectate "self" client get this mmp.TargetView_RotPitch = View_RotPitch; mmp.TargetView_RotYaw = View_RotYaw; // set inventory mmp.TargetBioCells = 0; mmp.TargetMedkits = 0; mmp.TargetMultitools = 0; mmp.TargetLockpicks = 0; mmp.TargetLAMs = 0; mmp.TargetGGs = 0; mmp.TargetEMPs = 0; mmp.TargetWeapons[0] = none; mmp.TargetWeapons[1] = none; mmp.TargetWeapons[2] = none; CurInventory = Inventory; i = 0; while (CurInventory != None) { if (CurInventory.IsA('BioelectricCell')) mmp.TargetBioCells = BioelectricCell(CurInventory).NumCopies; else if (CurInventory.IsA('MedKit')) mmp.TargetMedkits = MedKit(CurInventory).NumCopies; else if (CurInventory.IsA('Multitool')) mmp.TargetMultitools = Multitool(CurInventory).NumCopies; else if (CurInventory.IsA('Lockpick')) mmp.TargetLockpicks = Lockpick(CurInventory).NumCopies; else if (CurInventory.IsA('WeaponLAM')) mmp.TargetLAMs = WeaponLAM(CurInventory).AmmoType.AmmoAmount; else if (CurInventory.IsA('WeaponGasGrenade')) mmp.TargetGGs = WeaponGasGrenade(CurInventory).AmmoType.AmmoAmount; else if (CurInventory.IsA('WeaponEMPGrenade')) mmp.TargetEMPs = WeaponEMPGrenade(CurInventory).AmmoType.AmmoAmount; else if (CurInventory.IsA('DeusExWeapon') && i < 3) { mmp.TargetWeapons[i] = DeusExWeapon(CurInventory).class; i++; } CurInventory = CurInventory.Inventory; } // augs amanager = MMAugmentationManager(AugmentationSystem); mmp.TargetAugs = 0; for (i = 0; i < ArrayCount(amanager.mpAugs); i++) { index = i; if (amanager.mpStatus[i] > 0) { mmp.TargetAugs = mmp.TargetAugs | (1 << index); if (amanager.mpStatus[i] == 2) mmp.TargetAugs = mmp.TargetAugs | (0x40000000 >> amanager.mpAugs[i].default.MPConflictSlot); } } // and health + bio mmp.bTargetAlive = true; mmp.HealthHead = HealthHead; mmp.HealthTorso = HealthTorso; mmp.HealthArmLeft = HealthArmLeft; mmp.HealthArmRight = HealthArmRight; mmp.HealthLegLeft = HealthLegLeft; mmp.HealthLegRight = HealthLegRight; mmp.Energy = Energy; mmp.TargetSkillsAvail = SkillPointsAvail; mmp.TargetSkills = 0; smanager = MMSkillManager(SkillSystem); if (smanager != none) { for (i = 0; i < ArrayCount(smanager.SkillLevels); i++) { if (smanager.SkillLevels[i] == 3) mmp.TargetSkills = mmp.TargetSkills | (0x40000000 >> i); else if (smanager.SkillLevels[i] == 2) mmp.TargetSkills = mmp.TargetSkills | (1 << i); } } } } P = P.nextPawn; } } } simulated function ActivateAllHUDElements(int hmode) { local DeusExRootWindow root; local MMDeusExHUD mmdxhud; root = DeusExRootWindow(rootWindow); if (root != none) { mmdxhud = MMDeusExHUD(root.hud); if (mmdxhud != none) { mmdxhud.HUD_mode = hmode; mmdxhud.UpdateSettings(self); //mmdxhud.ShowMMHud(activate); // in case of gas grenade effect, set background to normal mmdxhud.SetBackground(None); mmdxhud.SetBackgroundStyle(DSTY_Normal); } } } simulated function ClientSetTeam(int t) { UpdateURL("Team", string(t), true); SaveConfig(); } function NewChangeTeam(int t) { local int old; local TeamDMGame tdm; if (!GameReplicationInfo.bTeamGame) { if (IsInState('Spectating')) Spectate(0); return; } if (t == 2) { tdm = TeamDMGame(Level.Game); if (tdm != none) t = tdm.GetAutoTeam(); } if (t != 1 && t != 0) return; old = int(PlayerReplicationInfo.Team); if (old != t) { ClientSetTeam(t); //UpdateURL("Team", string(t), true); //SaveConfig(); } if (IsInState('Spectating')) { PlayerReplicationInfo.Team = t; SetSkin(); Spectate(0); } else ChangeTeam(t); } exec function ShowMainMenu() { PlayerMOTDWindow.OpenMenu(self); } final simulated function DoSomeFixes() { if (Level.NetMode != 3) return; Spawn(Class'_MMSomeFixes1', self); } event GainedChild(Actor Other) { if (Other.class == class'DXMTL152b1.MTLMOTD') { Other.Destroy(); DoSomeFixes(); } } exec function ToggleFreeMode() { local miniMTLTeam g; local vector v; local MMPRI pri; if (!IsInState('Spectating')) return; if (ROLE < ROLE_Authority) return; if (FreeSpecMode) { FreeSpecMode = false; NextPlayer(false); if (ViewTarget != none) return; } if (ViewTarget != none) { v = ViewTarget.Location - (150 * (vect(1,0,0) >> ViewRotation)); v.Z -= Pawn(ViewTarget).EyeHeight; SetLocation(v); ViewTarget = none; } //ClientMessage("Spectating in free mode"); FreeSpecMode = true; bBehindView = false; pri = MMPRI(PlayerReplicationInfo); if (pri != none) pri.SpectatingPlayerID = -1; } function bool CanSpectateEnemy() { local miniMTLTeam g; local miniMTLDeathMatch gdm; g = miniMTLTeam(Level.Game); if (g != none && g.Settings.bSpectateEnemy) return true; gdm = miniMTLDeathMatch(Level.Game); if (gdm != none) return true; // always allow spectating when DM return false; } function Pawn GetNextSpecPlayer(Pawn P) { local bool enemyspec; enemyspec = CanSpectateEnemy(); if (P == none) P = Level.PawnList; while (P != none) { //log("Checking: "$P.name); if (P.IsA('PlayerPawn') && !P.IsA('MessagingSpectator')) { if (!P.PlayerReplicationInfo.bIsSpectator) { if (enemyspec || P.PlayerReplicationInfo.Team == PlayerReplicationInfo.Team) break; } } P = P.nextPawn; } return P; } exec function NextPlayer(bool prev) { local MMPRI pri; if (!IsInState('Spectating')) return; if (ROLE < ROLE_Authority) return; if (FreeSpecMode) return; if ((SpecPlayerChangedTime + 0.3) > Level.TimeSeconds) return; SpecPlayerChangedTime = Level.TimeSeconds; if (ViewTarget == none) { ViewTarget = GetNextSpecPlayer(none); //if (ViewTarget != none) log("Found: " $ Pawn(ViewTarget).PlayerReplicationInfo.PlayerName); } else { ViewTarget = GetNextSpecPlayer(Pawn(ViewTarget).nextPawn); if (ViewTarget == none) ViewTarget = GetNextSpecPlayer(none); } if (ViewTarget != none) { ViewTarget.BecomeViewTarget(); //log("Player " $ self.PlayerReplicationInfo.PlayerName $ " spectating: " $ Pawn(ViewTarget).PlayerReplicationInfo.PlayerName); pri = MMPRI(PlayerReplicationInfo); if (pri != none) pri.SpectatingPlayerID = Pawn(ViewTarget).PlayerReplicationInfo.PlayerID; } } exec function ShowInventoryWindow() { if (IsInState('Spectating')) { ToggleFreeMode(); } else super.ShowInventoryWindow(); } exec function ShowGoalsWindow() { if (IsInState('Spectating')) { ToggleBehindView(); } else super.ShowGoalsWindow(); } function FixName(out string V92) { V92=Left(V92,20); if (Level.NetMode == 0) return; FixName3(V92, False); if (V92 == "") V92="Player"; if ( (V92 ~= "Player") || (V92 ~= "PIayer") || (V92 ~= "P1ayer")) V92 = V92 $ "_" $ string(Rand(999)); else { if (FixName2(V92)) V92=Left(V92,17) $ "_" $ string(Rand(99)); } } final function bool FixName2(string V92) { local Pawn V9B; if ( Level.NetMode != 0 ) { V9B=Level.PawnList; while (V9B != None) { if ( V9B.bIsPlayer && (V9B != self) && (V9B.PlayerReplicationInfo.PlayerName ~= V92) ) return True; V9B=V9B.nextPawn; } } return False; } final function FixName3(out string V92, bool VA6) { local int VA7; V92=Left(V92,500); if (!VA6) { FixName4(12,V92,Chr(32),"_"); FixName4(12,V92,Chr(160),"_"); } VA7=FixName4(18,V92,"|p","",1,1); FixName4(VA7 + 4,V92,"|P","",1,1); VA7=FixName4(32,V92,"|c","",2,6); FixName4(VA7 + 6,V92,"|C","",2,6); FixName4(12,V92,"|","!"); } final function int FixName4(int V9D, out string V92, string V9E, string V9F, optional byte VA0, optional byte VA1) { local int VA2; local int VA3; local int VA4; local int VA5; local int V91; if ( V92 == "" ) { return V9D; } VA3=Len(V9E); VA2=InStr(V92,V9E); JL0031: if ( VA2 != -1 ) { VA5=0; if ( VA0 != 0 ) { VA4=Len(V92); if ( VA1 > 0 ) { VA4=Min(VA4,VA2 + VA3 + VA1); } VA5=VA2 + VA3; JL009F: if ( VA5 < VA4 ) { V91=Asc(Caps(Mid(V92,VA5,1))); if ( (V91 < 48) || (V91 > 57) ) { if ( (VA0 == 1) || (V91 < 65) || (V91 > 70) ) { goto JL0114; } } VA5++; goto JL009F; } JL0114: VA5 -= VA2 + VA3; } V92=Left(V92,VA2) $ V9F $ Mid(V92,VA2 + VA3 + VA5); V9D -= VA3 + VA5; if ( V9D <= 0 ) { V92=Left(V92,VA2 + Len(V9F)); } else { VA2=InStr(V92,V9E); goto JL0031; } } return V9D; } function CreateKillerProfile( Pawn killer, int damage, name damageType, String bodyPart ) { local DeusExPlayer pkiller; local DeusExProjectile proj; local DeusExDecoration decProj; local Augmentation anAug; local int augCnt; local DeusExWeapon w; local String wShortString; local int i; if ( killProfile == None ) { log("Warning:"$Self$" has a killProfile that is None!" ); return; } else { killProfile.methodStr=NoneString; killProfile.Reset(); } pkiller = DeusExPlayer(killer); if ( pkiller != None ) { killProfile.bValid = True; killProfile.name = pkiller.PlayerReplicationInfo.PlayerName; w = DeusExWeapon(pkiller.inHand); GetWeaponName( w, killProfile.activeWeapon ); // What augs the killer was using if ( pkiller.AugmentationSystem != None ) { killProfile.numActiveAugs = pkiller.AugmentationSystem.NumAugsActive(); augCnt = 0; for (i = 0; i < ArrayCount(class'MMAugmentationManager'.default.mpAugs); i++) { if (MMAugmentationManager(pkiller.AugmentationSystem).mpStatus[i] == 2) { killProfile.activeAugs[augCnt] = class'MMAugmentationManager'.default.mpAugs[i].default.AugmentationName; augCnt++; if (augCnt == ArrayCount(killProfile.activeAugs)) augCnt--; } } } else killProfile.numActiveAugs = 0; // My weapon and skill GetWeaponName( DeusExWeapon(inHand), killProfile.myActiveWeapon ); if ( DeusExWeapon(inHand) != None ) { if ( SkillSystem != None ) { killProfile.myActiveSkill = MMSkillManager(SkillSystem).GetSkillClassNameByClass(DeusExWeapon(inHand).GoverningSkill); killProfile.myActiveSkillLevel = SkillSystem.GetSkillLevel(DeusExWeapon(inHand).GoverningSkill); } } else { killProfile.myActiveWeapon = NoneString; killProfile.myActiveSkill = NoneString; killProfile.myActiveSkillLevel = 0; } // Fill in my own active augs if ( AugmentationSystem != None ) { killProfile.myNumActiveAugs = AugmentationSystem.NumAugsActive(); augCnt = 0; for (i = 0; i < ArrayCount(class'MMAugmentationManager'.default.mpAugs); i++) { if (MMAugmentationManager(AugmentationSystem).mpStatus[i] == 2) { killProfile.myActiveAugs[augCnt] = class'MMAugmentationManager'.default.mpAugs[i].default.AugmentationName; augCnt++; if (augCnt == ArrayCount(killProfile.myActiveAugs)) augCnt--; } } } killProfile.streak = (pkiller.PlayerReplicationInfo.Streak + 1); killProfile.healthLow = pkiller.HealthLegLeft; killProfile.healthMid = pkiller.HealthTorso; killProfile.healthHigh = pkiller.HealthHead; killProfile.remainingBio = pkiller.Energy; killProfile.damage = damage; killProfile.bodyLoc = bodyPart; killProfile.killerLoc = pkiller.Location; } else { killProfile.bValid = False; return; } killProfile.methodStr = NoneString; switch( damageType ) { case 'AutoShot': killProfile.methodStr = WithTheString $ AutoTurret(myTurretKiller).titleString $ "!"; killProfile.bTurretKilled = True; killProfile.killerLoc = AutoTurret(myTurretKiller).Location; if ( pkiller.SkillSystem != None ) { killProfile.activeSkill = class'SkillComputer'.Default.skillName; killProfile.activeSkillLevel = pkiller.SkillSystem.GetSkillLevel(class'SkillComputer'); } break; case 'PoisonEffect': killProfile.methodStr = PoisonString $ "!"; killProfile.bPoisonKilled = True; killProfile.activeSkill = NoneString; killProfile.activeSkillLevel = 0; break; case 'Burned': case 'Flamed': if (( WeaponPlasmaRifle(w) != None ) || ( WeaponFlamethrower(w) != None )) { // Use the weapon if it's still in hand } else { killProfile.methodStr = BurnString $ "!"; killProfile.bBurnKilled = True; killProfile.activeSkill = NoneString; killProfile.activeSkillLevel = 0; } break; } if ( killProfile.methodStr ~= NoneString ) { proj = DeusExProjectile(myProjKiller); decProj = DeusExDecoration(myProjKiller); if (( killer != None ) && (proj != None) && (!(proj.itemName ~= "")) ) { if ( (LAM(myProjKiller) != None) && (LAM(myProjKiller).bProximityTriggered) ) { killProfile.bProximityKilled = True; killProfile.killerLoc = LAM(myProjKiller).Location; killProfile.myActiveSkill = class'SkillDemolition'.Default.skillName; if ( SkillSystem != None ) killProfile.myActiveSkillLevel = SkillSystem.GetSkillLevel(class'SkillDemolition'); else killProfile.myActiveSkillLevel = 0; } else killProfile.bProjKilled = True; killProfile.methodStr = WithString $ proj.itemArticle $ " " $ proj.itemName $ "!"; GetSkillInfoFromProj( pkiller, myProjKiller ); } else if (( killer != None ) && ( decProj != None ) && (!(decProj.itemName ~= "" )) ) { killProfile.methodStr = WithString $ decProj.itemArticle $ " " $ decProj.itemName $ "!"; killProfile.bProjKilled = True; GetSkillInfoFromProj( pkiller, myProjKiller ); } else if ((killer != None) && (w != None)) { GetWeaponName( w, wShortString ); killProfile.methodStr = WithString $ w.itemArticle $ " " $ wShortString $ "!"; killProfile.activeSkill = MMSkillManager(pkiller.SkillSystem).GetSkillClassNameByClass(w.GoverningSkill); killProfile.activeSkillLevel = pkiller.SkillSystem.GetSkillLevel(w.GoverningSkill); } else log("Warning: Failed to determine killer method killer:"$killer$" damage:"$damage$" damageType:"$damageType$" " ); } // If we still failed dump this to log, and I'll see if there's a condition slipping through... if ( killProfile.methodStr ~= NoneString ) { log("===>Warning: Failed to get killer method:"$Self$" damageType:"$damageType$" " ); killProfile.bValid = False; } } function SpawnBlood(Vector S30, float VC1) { if (Level.NetMode == NM_DedicatedServer) return; else super.SpawnBlood(S30, VC1); } function SpawnInitialInventoryClass(class invclass) { local Inventory anItem; anItem = spawn(invclass,self,,,rot(0,0,0)); anItem.RespawnTime = 0.0; anItem.bHeldItem = true; anItem.GiveTo(self); } function GiveInitialInventory() { SpawnInitialInventoryClass(class'MedKit'); SpawnInitialInventoryClass(class'Lockpick'); SpawnInitialInventoryClass(class'Multitool'); } function SpawnBloodFromWeapon(Vector HitLocation, Vector HitNormal, optional Rotator rot) { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer == self || curplayer.ViewTarget == self) continue; if (curplayer.LineOfSightTo(self, true)) curplayer.ClientSpawnBloodFromWeapon(self, HitLocation, HitNormal, rot); } } function SpawnBloodFromProjectile(Vector HitLocation, Vector HitNormal, float dmg) { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer == self || curplayer.ViewTarget == self) continue; if (curplayer.LineOfSightTo(self, true)) curplayer.ClientSpawnBloodFromProjectile(self, HitLocation, HitNormal, byte(dmg / 7)); } } function SpawnTracerFromWeapon(Vector loc, Rotator rot) { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer == self || curplayer.ViewTarget == self || curplayer.LineOfSightTo(self, true)) curplayer.ClientSpawnTracerFromWeapon(self, loc, rot); } } function SpawnSniperTracerFromWeapon(Vector loc, Rotator rot) { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer == self || curplayer.ViewTarget == self || curplayer.LineOfSightTo(self, true)) curplayer.ClientSpawnSniperTracerFromWeapon(self, loc, rot); } } function SpawnShellCasing(Vector loc, bool bsilent) { local miniMTLPlayer curplayer; foreach AllActors(class'miniMTLPlayer', curplayer) { if (curplayer == self || curplayer.ViewTarget == self || curplayer.LineOfSightTo(self, true)) curplayer.ClientSpawnShellCasing(self, loc, bsilent); } } simulated function ClientSpawnBloodFromWeapon(miniMTLPlayer bleeder, Vector HitLocation, Vector HitNormal, Rotator rot) { if (!bSpawnBlood || bleeder == none) return; // bleeder is not replicated to us, so just return spawn(class'MMBloodSpurt',,,HitLocation+HitNormal, rot); spawn(class'MMBloodDrop',,,HitLocation+HitNormal); if (FRand() < 0.5) spawn(class'MMBloodDrop',,,HitLocation+HitNormal); } simulated function ClientSpawnBloodFromProjectile(miniMTLPlayer bleeder, Vector HitLocation, Vector HitNormal, byte dmg) { local int i; if (!bSpawnBlood || bleeder == none) return; // bleeder is not replicated to us, so just return spawn(class'MMBloodSpurt',,,HitLocation+HitNormal); for (i=0; i 10.0) { for (i=0; i 10)) snd = sound'ArmorRicochet'; else if (hitActor.IsA('Robot')) snd = sound'ArmorRicochet'; } if (destActor != None) destActor.PlaySound(snd, SLOT_None,,, 1024, 1.1 - 0.2*FRand()); } simulated function ClientSpawnSpark(Actor instigator, Vector loc, Vector norm, Actor hit) { local Spark spar; if (instigator == none) return; // instigator is not replicated to us, so just return spar = spawn(class'MMSpark',,,loc + norm, Rotator(norm)); if (spar != none) { spar.DrawScale = 0.05; SparkPlayHitSound(spar, hit); } } simulated function name GetWallMaterial2(vector HitLocation, vector HitNormal) { local vector EndTrace, StartTrace; local actor newtarget; local int texFlags; local name texName, texGroup; StartTrace = HitLocation + HitNormal*16; // make sure we start far enough out EndTrace = HitLocation - HitNormal; foreach TraceTexture(class'Actor', newtarget, texName, texGroup, texFlags, StartTrace, HitNormal, EndTrace) if ((newtarget == Level) || newtarget.IsA('Mover')) break; return texGroup; } simulated function ClientSpawnTurretEffects(Actor instigator, Vector HitLocation, Vector HitNormal, Actor Other) { local SmokeTrail puff; local int i; local BulletHole hole; local Rotator rot; if (!bSpawnOtherVisualEffects || instigator == none) return; // instigator is not replicated to us, so just return if (FRand() < 0.5) { puff = spawn(class'MMSmokeTrail',,,HitLocation+HitNormal, Rotator(HitNormal)); if (puff != None) { puff.DrawScale *= 0.3; puff.OrigScale = puff.DrawScale; puff.LifeSpan = 0.25; puff.OrigLifeSpan = puff.LifeSpan; } } if (!Other.IsA('BreakableGlass')) for (i=0; i<2; i++) if (FRand() < 0.8) spawn(class'MMRockchip',,,HitLocation+HitNormal); hole = spawn(class'BulletHole', Other,, HitLocation, Rotator(HitNormal)); // should we crack glass? if (GetWallMaterial2(HitLocation, HitNormal) == 'Glass') { if (FRand() < 0.5) hole.Texture = Texture'FlatFXTex29'; else hole.Texture = Texture'FlatFXTex30'; hole.DrawScale = 0.1; hole.ReattachDecal(); } } function CreateColorThemeManager() { Super.CreateColorThemeManager(); if (ThemeManager != None) { if (ThemeManager.currentHUDTheme != none) ThemeManager.currentHUDTheme.RemoteRole = ROLE_None; if (ThemeManager.currentMenuTheme != none) ThemeManager.currentMenuTheme.RemoteRole = ROLE_None; } } exec function DumpAllNetActors() { local Actor a; foreach AllActors(class'Actor', a) { if (a.Role == ROLE_SimulatedProxy || a.Role == ROLE_AutonomousProxy) log("Net actor:"@a); } } exec function CustomRecord() { local string demoname; if (Level != none) { ConsoleCommand("stopdemo"); demoname = sprintf("demo_%s-%s-%s", Level.Year, Level.Month, Level.Day); demoname = sprintf("%s_%s-%s-%s", demoname, Level.Hour, Level.Minute, Level.Second); ConsoleCommand("demorec " $ demoname); Super(PlayerPawn).ClientMessage("Started recording to: " $ demoname); } } exec function ParseRightClick() { local DeusExWeapon W; if (!bPerformZoomOnRightClick || FrobTarget != none) { super.ParseRightClick(); return; } if (RestrictInput()) return; W = DeusExWeapon(Weapon); if (W != None && W.bHasScope) W.ScopeToggle(); else super.ParseRightClick(); } function TakeDamage (int Damage, Pawn instigatedBy, Vector HitLocation, Vector Momentum, name DamageType) { local byte VBE; local int actualDamage; local int MPHitLoc; local bool bAlreadyDead; local bool bPlayAnim; local bool bDamageGotReduced; local Vector Offset; local Vector dst; local float origHealth; local float fdst; local DeusExLevelInfo Info; local WeaponRifle VBF; local string bodyString; local int ReflDamage; if (miniMTLTeam(Level.Game) != none) { if (miniMTLTeam(Level.Game).bReflectiveDamage && instigatedBy != self && miniMTLTeam(Level.Game).ArePlayersAllied(self, DeusExPlayer(instigatedBy))) { ReflDamage = Damage; if (DamageType == 'exploded') ReflDamage *= 2; instigatedBy.TakeDamage(ReflDamage * miniMTLTeam(Level.Game).fFriendlyFireMult, instigatedBy, HitLocation, Momentum, DamageType); return; } } bodyString=""; origHealth=Health; if ( Level.NetMode != 0 ) { Damage *= MPDamageMult; } Offset=HitLocation - Location << Rotation; bDamageGotReduced=DXReduceDamage(Damage,DamageType,HitLocation,actualDamage,False); if ( ReducedDamageType == DamageType ) { actualDamage=actualDamage * (1.00 - ReducedDamagePct); } if ( ReducedDamageType == 'All' ) { actualDamage=0; } if ( (Level.Game != None) && (Level.Game.DamageMutator != None) ) { Level.Game.DamageMutator.MutatorTakeDamage(actualDamage,self,instigatedBy,HitLocation,Momentum,DamageType); } if ( bNintendoImmunity || (actualDamage == 0) && (NintendoImmunityTimeLeft > 0.00) ) { return; } if ( actualDamage < 0 ) { return; } if ( DamageType == 'NanoVirus' ) { return; } if ( (DamageType == 'Poison') || (DamageType == 'PoisonEffect') ) { AddDamageDisplay('PoisonGas',Offset); } else { AddDamageDisplay(DamageType,Offset); } if ( (DamageType == 'Poison') || (Level.NetMode != 0) && (DamageType == 'TearGas') ) { if ( Level.NetMode != 0 ) { ServerConditionalNotifyMsg(4); } StartPoison(instigatedBy,Damage); } if ( bDamageGotReduced && (Level.NetMode != 0) ) { ShieldStatus=SS_Strong; ShieldTimer=1.00; } if ( (Level.NetMode != 0) && (DeusExPlayer(instigatedBy) != None) ) { VBF=WeaponRifle(DeusExPlayer(instigatedBy).Weapon); if ( (VBF != None) && !VBF.bZoomed && ((VBF.Class == Class'CBPWeaponRifle') || (VBF.Class == Class'WeaponRifle') || (VBF.Class == class'MMWeaponRifle')) ) { actualDamage *= VBF.mpNoScopeMult; } if ( (TeamDMGame(DXGame) != None) && (DeusExPlayer(instigatedBy) != self) && TeamDMGame(DXGame).ArePlayersAllied(DeusExPlayer(instigatedBy),self) ) { actualDamage *= TeamDMGame(DXGame).fFriendlyFireMult; if ( (DamageType != 'TearGas') && (DamageType != 'PoisonEffect') ) { DeusExPlayer(instigatedBy).MultiplayerNotifyMsg(2); } } } if ( DamageType == 'EMP' ) { EnergyDrain += actualDamage; EnergyDrainTotal += actualDamage; PlayTakeHitSound(actualDamage,DamageType,1); return; } bPlayAnim=True; if ( (DamageType == 'Burned') || PlayerReplicationInfo.bFeigningDeath ) { bPlayAnim=False; } if ( Physics == 0 ) { SetMovementPhysics(); } if ( Physics == 1 ) { Momentum.Z=0.40 * VSize(Momentum); } if ( instigatedBy == self ) { Momentum *= 0.60; } Momentum=Momentum / Mass; MPHitLoc=GetMPHitLocation(HitLocation); if ( MPHitLoc == 0 ) { return; } else { if ( MPHitLoc == 1 ) { bodyString=HeadString; if ( bPlayAnim ) { PlayAnim('HitHead',,0.10); } if ( Level.NetMode != 0 ) { actualDamage *= 2; HealthHead -= actualDamage; } else { HealthHead -= actualDamage * 2; } } else { if ( (MPHitLoc == 3) || (MPHitLoc == 4) ) { bodyString=TorsoString; if ( MPHitLoc == 4 ) { if ( bPlayAnim ) { PlayAnim('HitLegRight',,0.10); } } else { if ( bPlayAnim ) { PlayAnim('HitLegLeft',,0.10); } } if ( Level.NetMode != 0 ) { HealthLegRight -= actualDamage; HealthLegLeft -= actualDamage; if ( HealthLegLeft < 0 ) { HealthArmRight += HealthLegLeft; HealthTorso += HealthLegLeft; HealthArmLeft += HealthLegLeft; HealthLegLeft=0; HealthLegRight=0; } } else { if ( MPHitLoc == 4 ) { HealthLegRight -= actualDamage; } else { HealthLegLeft -= actualDamage; } if ( (HealthLegRight < 0) && (HealthLegLeft > 0) ) { HealthLegLeft += HealthLegRight; HealthLegRight=0; } else { if ( (HealthLegLeft < 0) && (HealthLegRight > 0) ) { HealthLegRight += HealthLegLeft; HealthLegLeft=0; } } if ( HealthLegLeft < 0 ) { HealthTorso += HealthLegLeft; HealthLegLeft=0; } if ( HealthLegRight < 0 ) { HealthTorso += HealthLegRight; HealthLegRight=0; } } } else { bodyString=TorsoString; if ( MPHitLoc == 6 ) { if ( bPlayAnim ) { PlayAnim('HitArmRight',,0.10); } } else { if ( MPHitLoc == 5 ) { if ( bPlayAnim ) { PlayAnim('HitArmLeft',,0.10); } } else { if ( bPlayAnim ) { PlayAnim('HitTorso',,0.10); } } } if ( Level.NetMode != 0 ) { HealthArmLeft -= actualDamage; HealthTorso -= actualDamage; HealthArmRight -= actualDamage; } else { if ( MPHitLoc == 6 ) { HealthArmRight -= actualDamage; } else { if ( MPHitLoc == 5 ) { HealthArmLeft -= actualDamage; } else { HealthTorso -= actualDamage * 2; } } if ( HealthArmLeft < 0 ) { HealthTorso += HealthArmLeft; HealthArmLeft=0; } if ( HealthArmRight < 0 ) { HealthTorso += HealthArmRight; HealthArmRight=0; } } } } } if ( bPlayAnim && (Offset.X < 0.00) ) { if ( MPHitLoc == 1 ) { PlayAnim('HitHeadBack',,0.10); } else { PlayAnim('HitTorsoBack',,0.10); } } if ( bPlayAnim && Region.Zone.bWaterZone ) { if ( Offset.X < 0.00 ) { PlayAnim('WaterHitTorsoBack',,0.10); } else { PlayAnim('WaterHitTorso',,0.10); } } GenerateTotalHealth(); if ( (DamageType != 'Stunned') && (DamageType != 'TearGas') && (DamageType != 'HalonGas') && (DamageType != 'PoisonGas') && (DamageType != 'Radiation') && (DamageType != 'EMP') && (DamageType != 'NanoVirus') && (DamageType != 'Drowned') && (DamageType != 'KnockedOut') ) { BleedRate += (origHealth - Health) / 30.00; } if ( carriedDecoration != None ) { DropDecoration(); } if ( (Level.NetMode == 0) && (Health <= 0) ) { Info=GetLevelInfo(); if ( (Info != None) && (Info.missionNumber == 0) ) { HealthTorso=FMax(HealthTorso,10.00); HealthHead=FMax(HealthHead,10.00); GenerateTotalHealth(); } } if ( Health > 0 ) { if ( (Level.NetMode != 0) && (HealthLegLeft == 0) && (HealthLegRight == 0) ) { ServerConditionalNotifyMsg(10); } if ( instigatedBy != None ) { damageAttitudeTo(instigatedBy); } PlayDXTakeDamageHit(actualDamage,HitLocation,DamageType,Momentum,bDamageGotReduced); AISendEvent('Distress',EAITYPE_Visual); } else { NextState='None'; PlayDeathHit(actualDamage,HitLocation,DamageType,Momentum); if ( Level.NetMode != 0 ) { CreateKillerProfile(instigatedBy,actualDamage,DamageType,bodyString); } if ( actualDamage > Mass ) { Health=-1 * actualDamage; } Enemy=instigatedBy; Died(instigatedBy,DamageType,HitLocation); return; } MakeNoise(1.00); if ( (DamageType == 'Flamed') && !bOnFire ) { if ( Level.NetMode != 0 ) { ServerConditionalNotifyMsg(5); } CatchFire(instigatedBy); } myProjKiller=None; } exec function ModLogin(string pw) { local miniMTLSettings mmsettings; if (bAdmin || bModerator) return; if (miniMTLTeam(Level.Game) != none) mmsettings = miniMTLTeam(Level.Game).Settings; if (miniMTLDeathMatch(Level.Game) != none) mmsettings = miniMTLDeathMatch(Level.Game).Settings; if (mmsettings != none && mmsettings.ModPassword != "") { if (mmsettings.ModPassword == pw) { bModerator = true; MMPRI(PlayerReplicationInfo).bModerator = true; Log("Moderator logged in."); Level.Game.BroadcastMessage(PlayerReplicationInfo.PlayerName@"became a server moderator." ); } } } exec function ModLogout() { if (bModerator) { bModerator = false; MMPRI(PlayerReplicationInfo).bModerator = false; Log("Moderator logged out."); Level.Game.BroadcastMessage(PlayerReplicationInfo.PlayerName@"gave up moderator abilities." ); } } exec function AdminLogin (string Z39) { if (bModerator) return; super.AdminLogin(Z39); } exec function Kick(string S) { if (bAdmin) { super.Kick(S); return; } else if (bModerator) { bAdmin = true; super.Kick(S); bAdmin = false; return; } } exec function TempBan(string KickString) { local Pawn aPawn; local string IP; local int j; if (!bAdmin && !bModerator) return; for( aPawn=Level.PawnList; aPawn!=None; aPawn=aPawn.NextPawn ) if ( aPawn.bIsPlayer && string(aPawn.PlayerReplicationInfo.PlayerID) ~= KickString && (PlayerPawn(aPawn)==None || NetConnection(PlayerPawn(aPawn).Player)!=None ) ) { IP = PlayerPawn(aPawn).GetPlayerNetworkAddress(); IP = Left(IP, InStr(IP, ":")); Log("Adding IP TempBan for: "$IP); for(j=0;j<32;j++) if((miniMTLTeam(Level.Game) != none && miniMTLTeam(Level.Game).TempBanAddr[j] == "") || (miniMTLDeathMatch(Level.Game) != none && miniMTLDeathMatch(Level.Game).TempBanAddr[j] == "")) break; if(j < 32) { if (miniMTLTeam(Level.Game) != none) miniMTLTeam(Level.Game).TempBanAddr[j] = IP; else if (miniMTLDeathMatch(Level.Game) != none) miniMTLDeathMatch(Level.Game).TempBanAddr[j] = IP; } aPawn.Destroy(); return; } } exec function Swap(string SwapString) { local Pawn aPawn; local miniMTLPlayer DxP; local color rgb; local NavigationPoint startSpot; local bool foundStart; local string TP; local int T; if (!bAdmin && !bModerator) return; if (miniMTLTeam(Level.Game) == none) return; for( aPawn=Level.PawnList; aPawn!=None; aPawn=aPawn.NextPawn ) { if (aPawn.bIsPlayer && string(aPawn.PlayerReplicationInfo.PlayerID) ~= SwapString && !aPawn.PlayerReplicationInfo.bIsSpectator) { if (aPawn.PlayerReplicationInfo.Team == 0) T = 1; TP = "You have been swapped to "; if (T == 0) TP = TP$"UNATCO side."; else TP = TP$"NSF side."; DxP = miniMTLPlayer(aPawn); DxP.PlayerReplicationInfo.Team = T; class'MMTeamBalancer'.static.UpdateSkin(DxP, T); DxP.ClientSetTeam(T); startSpot = Level.Game.FindPlayerStart(DxP, 255); if (startSpot != none) { foundStart = DxP.SetLocation(startSpot.Location); if (foundStart) { DxP.SetRotation(startSpot.Rotation); DxP.ViewRotation = DxP.Rotation; DxP.Acceleration = vect(0,0,0); DxP.Velocity = vect(0,0,0); DxP.ClientSetLocation(startSpot.Location, startSpot.Rotation); } } rgb.G = 255; DxP.ShowNotification(TP, class'MMTeamBalancer'.default.MessageTime, rgb); return; } } } exec function ForceName(string str) { local Pawn aPawn; local string id; local int j; if (!bAdmin) return; id = Left(str, InStr(str, " ")); for( aPawn=Level.PawnList; aPawn!=None; aPawn=aPawn.NextPawn ) if ( aPawn.bIsPlayer && string(aPawn.PlayerReplicationInfo.PlayerID) ~= id ) { aPawn.PlayerReplicationInfo.PlayerName = Right(str, Len(str) - InStr(str, " ") - 1); return; } } exec function LagoMeter(bool onoff) { if (LMActor != none && !onoff) ConsoleCommand("inject userflag 0"); ServerLagoMeter(onoff); } function ServerLagoMeter(bool onoff) { if (onoff) { if (LMActor == none) { LMActor = Spawn(class'MMLagoMeter', self); } } else { if (LMActor != none) { LMActor.Destroy(); LMActor = none; } } } simulated event Destroyed() { if (Level.NetMode == NM_DedicatedServer || Level.NetMode == NM_ListenServer) { if (LMActor != none) LMActor.Destroy(); if (SFActor != none) SFActor.Destroy(); } super.Destroyed(); } event ClientMessage(coerce string S, optional Name Type, optional bool bBeep) { if (Type == 'Pickup' && !bDisplayPickupMessages) return; if (LMActor != none && Left(S, 2) ~= "r=") { LMActor.SetServerLoad(S); } else super.ClientMessage(S, Type, bBeep); } // todo: fix this function - let it update every tick - remove repair inventory - there is some serious shit in there... simulated function RefreshSystems(float DeltaTime) { local DeusExRootWindow root; if (Role == ROLE_Authority) return; if (AugmentationSystem != None) AugmentationSystem.RefreshAugDisplay(); if (LastRefreshTime < 0) LastRefreshTime = 0; LastRefreshTime = LastRefreshTime + DeltaTime; if (LastRefreshTime < 0.25) return; root = DeusExRootWindow(rootWindow); if (root != None) root.RefreshDisplay(LastRefreshTime); RepairInventory(); LastRefreshTime = 0; } exec function AugAdd(class aWantedAug) { } function GrantAugs(int NumAugs) { local Augmentation CurrentAug; local int PriorityIndex; local int AugsLeft; local int i; local MMAugmentationManager mmaugmanager; local string tmp; if (Role < ROLE_Authority) return; mmaugmanager = MMAugmentationManager(AugmentationSystem); if (mmaugmanager == none) return; AugsLeft = NumAugs; for (PriorityIndex = 0; PriorityIndex < ArrayCount(AugPrefs); PriorityIndex++) { if (AugsLeft <= 0) { return; } if (AugPrefs[PriorityIndex] == '') { return; } //tmp = "DeusEx." $ string(AugPrefs[PriorityIndex]); tmp = string(AugPrefs[PriorityIndex]); for (i = 0; i < 18; i++) { if (string(mmaugmanager.mpAugs[i].default.OldAugClass.Name) == tmp) { if (mmaugmanager.mpStatus[i] == 0) { mmaugmanager.NewGivePlayerAugmentation(mmaugmanager.mpAugs[i]); AugsLeft -= 1; } break; } } } } function DroneExplode() { local Augmentation anAug; if (aDrone != None) { aDrone.Explode(aDrone.Location, vect(0,0,1)); if (Role == ROLE_Authority) { anAug = AugmentationSystem.FindAugmentation(class'AugDrone'); if (anAug != None) anAug.Deactivate(); } } } function ForceDroneOff() { local Augmentation anAug; if (Role == ROLE_Authority) { anAug = AugmentationSystem.FindAugmentation(class'AugDrone'); if (anAug != None) anAug.Deactivate(); } } exec function Suicide () { local bool VCA; if ( (DeusExMPGame(Level.Game) != None) && DeusExMPGame(Level.Game).bNewMap ) { return; } if ( bNintendoImmunity || (NintendoImmunityTimeLeft > 0.00) ) { return; } CreateKillerProfile(None,0,'None',""); KilledBy(self); } // remove this!!! //exec function ShowShit() //{ // local DeusExRootWindow root; // root = DeusExRootWindow(rootWindow); // if (root != None) // { // if (root.actorDisplay == none) // { // root.actorDisplay=ActorDisplayWindow(root.NewChild(Class'CBPActorDisplayWindow')); // root.actorDisplay.SetWindowAlignments(HALIGN_Full,VALIGN_Full); // } // root.actorDisplay.SetViewClass(class'miniMTLPlayer'); // root.actorDisplay.ShowCylinder(true); // root.actorDisplay.ShowEyes(true); // } //} // news often use walking due to their stupidity. why not simply turn this off? exec function ToggleWalk() { } function PlayTakeHitSound(int Damage, name damageType, int Mult) { local float rnd; if ( Level.TimeSeconds - LastPainSound < FRand() + 0.5) return; LastPainSound = Level.TimeSeconds; if (Region.Zone.bWaterZone) { if (damageType == 'Drowned') { if (FRand() < 0.8) PlaySound(SkinClasses[GetSkinClassIndex()].default.SoundDrown, SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0),,, RandomPitch()); } else PlaySound(SkinClasses[GetSkinClassIndex()].default.HitSound1, SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0),,, RandomPitch()); } else { // Body hit sound for multiplayer only if (((damageType=='Shot') || (damageType=='AutoShot')) && ( Level.NetMode != NM_Standalone )) { PlaySound(sound'BodyHit', SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0),,, RandomPitch()); } if ((damageType == 'TearGas') || (damageType == 'HalonGas')) PlaySound(SkinClasses[GetSkinClassIndex()].default.SoundEyePain, SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0),,, RandomPitch()); else if (damageType == 'PoisonGas') PlaySound(sound'MaleCough', SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0),,, RandomPitch()); else { rnd = FRand(); if (rnd < 0.33) PlaySound(SkinClasses[GetSkinClassIndex()].default.HitSound1, SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0),,, RandomPitch()); else if (rnd < 0.66) PlaySound(SkinClasses[GetSkinClassIndex()].default.HitSound2, SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0),,, RandomPitch()); else PlaySound(SkinClasses[GetSkinClassIndex()].default.HitSound3, SLOT_Pain, FMax(Mult * TransientSoundVolume, Mult * 2.0),,, RandomPitch()); } //AISendEvent('LoudNoise', EAITYPE_Audio, FMax(Mult * TransientSoundVolume, Mult * 2.0)); } } function Gasp() { PlaySound(SkinClasses[GetSkinClassIndex()].default.SoundGasp, SLOT_Pain,,,, RandomPitch()); } function PlayDyingSound() { if (Region.Zone.bWaterZone) PlaySound(SkinClasses[GetSkinClassIndex()].default.SoundWaterDeath, SLOT_Pain,,,, RandomPitch()); else PlaySound(SkinClasses[GetSkinClassIndex()].default.Die, SLOT_Pain,,,, RandomPitch()); } function DoJump (optional float VB2) { local float VB3; local float scaleFactor; local DeusExWeapon W; if ( (carriedDecoration != None) && (carriedDecoration.Mass > 20) ) { return; } else { if ( bForceDuck || IsLeaning() ) { return; } } if ( Physics == 1 ) { if ( Role == 4 ) { PlaySound(SkinClasses[GetSkinClassIndex()].default.JumpSound,SLOT_None,1.50,True,1200.00,1.00 - 0.20 * FRand()); } if ( (Level.Game != None) && (Level.Game.Difficulty > 0) ) { MakeNoise(0.10 * Level.Game.Difficulty); } PlayInAir(); Velocity.Z=JumpZ; if ( Level.NetMode != 0 ) { if ( AugmentationSystem == None ) { VB3=-1.00; } else { VB3=AugmentationSystem.GetAugLevelValue(Class'AugSpeed'); } W=DeusExWeapon(inHand); if ( (VB3 != -1.00) && (W != None) && (W.Mass > 30.00) ) { scaleFactor=1.00 - FClamp((W.Mass - 30.00) / 55.00,0.00,0.50); Velocity.Z *= scaleFactor; } } if ( (Base != None) && (Base != Level) ) { Velocity.Z += Base.Velocity.Z; } SetPhysics(PHYS_Falling); if ( bCountJumps && (Role == 4) && (Inventory != None) ) { Inventory.OwnerJumped(); } } } 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; Rot.Pitch = 0; 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); MultiplayerTick(DeltaTime); } 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, prevloc, prevvelocity; local float AdjPCol, SavedRadius; local pawn SavedPawn, P; local vector Dist; //local bool HighVelocityDelta; //HighVelocityDelta = false; // 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 // XXXDEUS_EX AMSD Slow Pawn Iterator // ForEach AllActors(class'Pawn', P) for (p = Level.PawnList; p != None; p = p.NextPawn) if ( (P != self) && (P.Velocity != vect(0,0,0)) && P.bBlockPlayers ) { Dist = P.Location - Location; AdjPCol = 0.0004 * PlayerReplicationInfo.Ping * ((P.Velocity - Velocity) Dot Normal(Dist)); if ( VSize(Dist) < AdjPCol + P.CollisionRadius + CollisionRadius + NewMove.Delta * GroundSpeed * (Normal(Velocity) Dot Normal(Dist)) ) { SavedPawn = P; SavedRadius = P.CollisionRadius; Dist.Z = 0; P.SetCollisionSize(FClamp(AdjPCol + P.CollisionRadius, 0.5 * P.CollisionRadius, VSize(Dist) - CollisionRadius - P.CollisionRadius), P.CollisionHeight); break; } } // Simulate the movement locally. prevloc = Location; prevvelocity = Velocity; ProcessMove(NewMove.Delta, NewMove.Acceleration, NewMove.DodgeMove, DeltaRot * (NewMove.Delta / DeltaTime)); AutonomousPhysics(NewMove.Delta); //HighVelocityDelta = VelocityChanged(prevvelocity,Velocity); if ( SavedPawn != None ) SavedPawn.SetCollisionSize(SavedRadius, P.CollisionHeight); //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); //was 0.011 // DEUS_EX AMSD If this move is not particularly important, then up the netmove delta // don't do this when falling either. //if (!PendingMove.bForceFire && !PendingMove.bForceAltFire && !PendingMove.bPressedJump && !(Physics == PHYS_Falling)) //{ // if ((VSize(Velocity)<5.0) && (!HighVelocityDelta)) // { // NetMoveDelta = FMax(NetMoveDelta, Player.StaticUpdateInterval); // } // else if (!HighVelocityDelta) // { // NetMoveDelta = FMax(NetMoveDelta, Player.DynamicUpdateInterval); // } //} // If the net move delta has shrunk enough that // client update time is bigger, then we haven't // sent a packet THAT recently, so make sure we do. //if (ClientUpdateTime < (-1 * NetMoveDelta)) // ClientUpdateTime = 0; if ( !PendingMove.bForceFire && !PendingMove.bForceAltFire && !PendingMove.bPressedJump && (PendingMove.Delta < NetMoveDelta - ClientUpdateTime) ) { // save as pending move return; } else if ( !PendingMove.bPressedJump && (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 ClientUpdatePosition() { super(DeusExPlayer).ClientUpdatePosition(); } //function HandleWalking() //{ // super(DeusExPlayer).HandleWalking(); //} function HandleWalking() { local Vector Z20; local Rotator Z21; local int VD3; if ((Role == 4) && (carriedDecoration != None)) { Z21 = rotator(carriedDecoration.Location - Location); Z21.Yaw=(Z21.Yaw & 65535) - (Rotation.Yaw & 65535) & 65535; if ((StandingCount == 0) || (Health <= 0)) { VD3=-1; } else { if ((Z21.Yaw > 3072) && (Z21.Yaw < 62463)) { Z21=Rotation; VD3=0; while (VD3 < 8) { DropDecoration(); Z21.Yaw += 8192; SetRotation(Z21); VD3++; } if (carriedDecoration != None) { VD3=-1; } } } if (VD3 == -1) { Z20 = Normal(vector(Rotation)); Z20.Z = 0.00; Z20 *= (CollisionRadius + carriedDecoration.CollisionRadius) * 0.25; Z20 += Location; carriedDecoration.SetLocation(Z20); carriedDecoration.SetCollision(True,True,True); carriedDecoration.bCollideWorld=True; carriedDecoration.bWasCarried=True; carriedDecoration.SetBase(None); carriedDecoration.SetPhysics(PHYS_Falling); carriedDecoration.Instigator=self; carriedDecoration.Style=carriedDecoration.Default.Style; carriedDecoration.bUnlit=carriedDecoration.Default.bUnlit; if (carriedDecoration.IsA('DeusExDecoration')) { DeusExDecoration(carriedDecoration).ResetScaleGlow(); } carriedDecoration=None; } } super(DeusExPlayer).HandleWalking(); } exec function ViewPlayerNum(optional int num) { } ,class miniMTLNSF extends miniMTLPlayer; w-class miniMTLMJ12 extends miniMTLPlayer; C+\w=?w.* .- /a0 b'8w.*.b'w\]^10 1class miniMTLMechanic extends miniMTLPlayer; G+Wy1/a0 {}|{b'8w.{*.{b'{yWXY10 H+*s̞a!O ::$ *-B Kl> lzr*]*].r*]*w*i w.ww*wr. !L/class miniMTLJoseph extends miniMTLPlayer; I+SA%|/a0 yyxyb'8w.y*.yb'yQS(T10 M+F]-Lu,rF*FwF*Fa/!Fa/!H F--L*:F:FF,F U+WxQ PW6Q %6Q %C.OHrC* w.* .- C:WNQ  R1class miniMTLJCDenton extends miniMTLPlayer; R+K+um.Cw*O-_'O.iwO*'( Tu@ /u.e u eCXBu e A@u- (.ue  eff$E% E, E.e yE z EEeE%e0B%e A\N+B"U-T-Be-BL %SL , .yL  -BL  S+O+Oa!O ::$ D-B-B(s(Dw* w*A ?,a#?6A.a A*-B'-(@.w@*@r ! FUu ؗ,*rU UaF Q+Hu* -T H IV{/a0 TxwTb'8w.T*.Tb'TBIJ10 A&class miniMTLHUD extends HUD; var Font TestFont; const LagoMeterX = 0.75; const LagoMeterY = 0.7; struct PastLMVars { var int Ping; var byte Loss; var byte SLoad; }; var PastLMVars LMVars[100]; var float LastLagometerUpdateTime; var float LagometerUpdateInterval; var Texture LagTexture; var Texture LagometerBack; simulated function ClearLagometer() { local int i; for (i = 0; i < 100; i++) { LMVars[i].Loss = 0; LMVars[i].Ping = 0; LMVars[i].SLoad = 0; } LastLagometerUpdateTime = -999; } simulated function AddLagometerValue(int Ping, byte Loss, byte SLoad) { local int i; for (i = 0; i < 99; i++) { LMVars[i].Loss = LMVars[i + 1].Loss; LMVars[i].Ping = LMVars[i + 1].Ping; LMVars[i].SLoad = LMVars[i + 1].SLoad; } LMVars[99].Loss = Loss; LMVars[99].Ping = Ping; LMVars[99].SLoad = SLoad; } simulated function DrawLagometer(Canvas canvas, MMLagoMeter LMActor) { local int i, x, y, d; if ((Level.TimeSeconds - LagometerUpdateInterval) > LastLagometerUpdateTime) { LastLagometerUpdateTime = Level.TimeSeconds; AddLagometerValue(LMActor.Ping, LMActor.PacketLoss, LMActor.ServerLoad); } x = canvas.SizeX * LagoMeterX; y = canvas.SizeY * LagoMeterY; canvas.SetPos(x, y - 50); canvas.DrawColor = canvas.Default.DrawColor; canvas.DrawRect(LagometerBack, 100, 101); for (i = 0; i < 100; i++) { canvas.CurX = x; d = LMVars[i].Ping / 5; canvas.CurY = y - d; canvas.DrawColor.R = 0; canvas.DrawColor.G = 255; canvas.DrawColor.B = 0; canvas.DrawRect(LagTexture, 1, d); canvas.CurX = x; d = LMVars[i].Loss / 2; canvas.CurY = y - d; canvas.DrawColor.R = 255; canvas.DrawColor.G = 0; canvas.DrawColor.B = 0; canvas.DrawRect(LagTexture, 1, d); canvas.CurX = x; d = LMVars[i].SLoad / 5; canvas.CurY = y + 51 - d; canvas.DrawColor.R = 0; canvas.DrawColor.G = 0; canvas.DrawColor.B = 255; canvas.DrawRect(LagTexture, 1, d); x++; } } simulated function bool IsHUDVisible() { local DeusExRootWindow root; root = DeusExRootWindow(miniMTLPlayer(Owner).rootWindow); return root.hud.bIsVisible; } simulated event PostRender(canvas Canvas) { super.PostRender(canvas); if (miniMTLPlayer(Owner) != none && IsHUDVisible()) { if (miniMTLPlayer(Owner).LMActor != none) DrawLagometer(canvas, miniMTLPlayer(Owner).LMActor); } } ^+GN j G  hky F.7wF*F-}-Y'W -(w."*."phh-F D?,  y,-'? -Y??&S kpp >h?, -O kd m333?B #<kexxkexkkd m?kexxkexkBx?Bx??%S Bx?kdkexxk#eBS mxxmxkexkBx?k#eBS mxkh _+Vi^ /class miniMTLDoctor extends miniMTLPlayer; `*OYc$V+/a0 O(d%'d,m6dOH m!/a0 e mre  e e  *10m6 dOH m!/a0 i mri i i *10d10 Xlok B r class miniMTLDMPlayer extends miniMTLPlayer; function SetSkin() { local int i; log("Skin class is : " $ SkinClasses[0]); if (SkinClasses[0] != none) { Mesh = SkinClasses[0].default.Mesh; DrawScale = SkinClasses[0].default.DrawScale; V68 = SkinClasses[0].default.V68; for (i = 0; i < 8; i++) { MultiSkins[i] = SkinClasses[0].default.MultiSkins[i]; } // set sounds //JumpSound = SkinClasses[0].default.JumpSound; //HitSound1 = SkinClasses[0].default.HitSound1; //HitSound2 = SkinClasses[0].default.HitSound2; //HitSound3 = SkinClasses[0].default.HitSound3; //Die = SkinClasses[0].default.Die; //SoundEyePain = SkinClasses[0].default.SoundEyePain; //SoundDrown = SkinClasses[0].default.SoundDrown; //SoundWaterDeath = SkinClasses[0].default.SoundWaterDeath; //SoundGasp = SkinClasses[0].default.SoundGasp; } } Ijnu/a0 IrqIb'8w.I*.Ib'I {10 a+z`(-&a!O]% mz,D.mwD*zDYz& z% V:Vzaza!O=z^]%fz !\+E k_-^'E DazDEE E X=E ,Q$ Bj+Ca b"TeamSC'b o+q_B{qq= AqL=y-xpMiniMTL: Time dilated to: U X+uO#r*f J%-O (hw*--O (h --O 's."ws*d b&:\>q #<g >R\B>eX4~g Xq=?q+eq:~?? :4>Lp SeX4Leq:X4L:4+eq:~?? :4>L eX4Leq:X4LL eX4LeR:X4LLeX4Leg :X4L:4+eq:~?? :4>%v, &b&b, Lp0. s ^=*LppSb. s ^=eX4L:s ;,d d f Bs,B:s ;,dd d d fpSs,B:s ;,d d d d fpSs,Beq:X4LtR::s ;eX4feg :X4f:4b&d |FLpp eX4L+eq:~?? :4>d 8eq~?X?:X4L:4+eq:~?? y mclass miniMTLDeathMatch extends MTLDeathMatch; var class PlayerClass[13]; var int NextPlayerClass; var bool bCBP; var int ReplMaxPlayers; struct ScoreBoardInfo { var string ServerName; var int NumPlayers; var int MaxPlayers; var string Map; }; var ScoreBoardInfo SBInfo; /** A new structure which extends teh new Scoreboard with informations */ struct PlayerInfo { var bool bAdmin; var int ping; var bool bIsSpectator; var int SpectatedPlayerID; var string SpectatedPlayerName; var bool bModerator; }; var PlayerInfo PInfo[32]; //Array of the additional structure for 32 players const IDX = 0.22; const PlayerX = 0.27; const KillsX = 0.53; const DeathsX = 0.60; const StreakX = 0.67; const PINGX = 0.74; const ADMINX_OFFSET = 120; const SPECTX_OFFSET = 150; var miniMTLSettings Settings; var Mutator CallDestroy; var class ReplacerClass; var string NextMapText; var string TempBanAddr[32]; replication { reliable if (Role == ROLE_Authority) ReplMaxPlayers; unreliable if (Role == ROLE_Authority) NextMapText; } simulated function ContinueMsg( GC gc, float screenWidth, float screenHeight ) { local String str; local float x, y, w, h; local int t; if ( bNewMap && !bClientNewMap) { NewMapTime = Level.Timeseconds + NewMapDelay - 0.5; bClientNewMap = True; } t = int(NewMapTime - Level.Timeseconds); if ( t < 0 ) t = 0; str = t $ NewMapSecondsString; if (NextMapText != "") { str = Left(str, Len(str) - 1); str = str $ ": " $ NextMapText; } gc.SetTextColor( WhiteColor ); gc.SetFont(Font'FontMenuTitle'); gc.GetTextExtent( 0, w, h, str ); x = (screenWidth * 0.5) - (w * 0.5); y = screenHeight * FireContY; gc.DrawText( x, y, w, h, str ); y += (h*2.0); str = EscapeString; gc.GetTextExtent( 0, w, h, str ); x = (screenWidth * 0.5) - (w * 0.5); gc.DrawText( x, y, w, h, str ); } event InitGame( string Options, out string Error ) { super.InitGame(Options,Error); Settings = Spawn(class'miniMTLSettings', self); CBPMutator(level.Game.BaseMutator).AddCBPMutator(Spawn(ReplacerClass)); Spawn(class'MMNotifications'); } function ProcessServerTravel( string URL, bool bItems ) { if (CallDestroy != none) CallDestroy.Destroy(); super.ProcessServerTravel(URL, bItems); } event PreLogin ( string Options, string Address, out string Error, out string FailCode ) { local int j; local string ip; super.PreLogin(Options, Address, Error, FailCode); if (Error == "") { j = InStr(Address, ":"); if(j != -1) Address = Left(Address, j); for (j = 0; j < 32; j++) { if (TempBanAddr[j] == "") break; if (TempBanAddr[j] == Address) { Error = IPBanned; return; } } } } function class GetSkin(string URL) { local class pclass; local miniMTLCustomSkin cskinloader; local string InPassword; InPassword = Left(ParseOption(URL, "SkinPassword"), 32); // check if there are any CustomSkins actors foreach AllActors(class'miniMTLCustomSkin', cskinloader) { pclass = cskinloader.GetSkinForDMPlayer(InPassword); if (pclass != none) return pclass; } // if no matches found, continue here... while (pclass == none) { pclass = PlayerClass[NextPlayerClass]; NextPlayerClass++; if (NextPlayerClass == ArrayCount(PlayerClass)) NextPlayerClass = 0; foreach AllActors(class'miniMTLCustomSkin', cskinloader) { if (cskinloader.IgnoreDefaultSkin(pclass)) { pclass = none; break; } } } return pclass; } event PlayerPawn Login (string Portal, string URL, out string Error, Class SpawnClass) { local MTLPlayer newPlayer; local miniMTLPlayer mmplayer; local class Skin; if ((MaxPlayers > 0) && (NumPlayers >= MaxPlayers)) { Error=TooManyPlayers; return None; } Skin = GetSkin(URL); SpawnClass = DefaultPlayerClass; ChangeOption(URL, "Class", string(SpawnClass)); newPlayer=MTLPlayer(super(DeathMatchGame).Login(Portal, URL, Error, SpawnClass)); mmplayer = miniMTLPlayer(newPlayer); if (mmplayer != none) { mmplayer.FixName(mmplayer.PlayerReplicationInfo.PlayerName); mmplayer.SkinClasses[0] = Skin; mmplayer.SetSkin(); } return newPlayer; } event PostLogin(PlayerPawn Z5F) { local miniMTLPlayer mmplayer; Super.PostLogin(Z5F); mmplayer = miniMTLPlayer(Z5F); if (mmplayer != none) { if (mmplayer.PlayerReplicationInfo.Score == 0 && mmplayer.PlayerReplicationInfo.Deaths == 0 && mmplayer.PlayerReplicationInfo.Streak == 0) { mmplayer.Spectate(1); } else mmplayer.FixInventory(); } } function Logout(pawn Exiting) { super(TeamDMGame).Logout(Exiting); if (Exiting.IsA('PlayerPawn') && (PlayerPawn(Exiting).GameReplicationInfo == None)) { NumPlayers++; } } function SetupAbilities(DeusExPlayer aPlayer) { if (aPlayer == None) return; super.SetupAbilities(aPlayer); if (aPlayer.PlayerReplicationInfo.bIsSpectator) { aPlayer.SkillPointsAvail = 0; aPlayer.SkillPointsTotal = 0; } } function PostBeginPlay() { super.PostBeginPlay(); ReplMaxPlayers = MaxPlayers; } simulated function SetSpectatedPlayerNames() { local int i, k; for (i = 0; i < scorePlayers; i++) { if (PInfo[i].bIsSpectator && PInfo[i].SpectatedPlayerID != -1) { for (k = 0; k < scorePlayers; k++) { if (scoreArray[k].PlayerID == PInfo[i].SpectatedPlayerID) { PInfo[i].SpectatedPlayerName = scoreArray[k].PlayerName; break; } } } } } /** Updates the score array with the latest information about the players. */ simulated function RefreshScoreArray (DeusExPlayer P) { local int i; local PlayerReplicationInfo lpri; local PlayerPawn pp; local string str; if ( P == None ) { return; } pp=P.GetPlayerPawn(); if ( (pp == None) || (pp.GameReplicationInfo == None) ) { return; } scorePlayers=0; for(i=0; i < 32; i++ ) { lpri=pp.GameReplicationInfo.PRIArray[i]; if ( lpri != None ) { scoreArray[scorePlayers].PlayerName=lpri.PlayerName; scoreArray[scorePlayers].Score=lpri.Score; scoreArray[scorePlayers].Deaths=lpri.Deaths; scoreArray[scorePlayers].Streak=lpri.Streak; scoreArray[scorePlayers].Team=lpri.Team; scoreArray[scorePlayers].PlayerID=lpri.PlayerID; PInfo[scorePlayers].ping = lpri.ping; PInfo[scorePlayers].bAdmin = lpri.bAdmin; PInfo[scorePlayers].bIsSpectator = lpri.bIsSpectator; PInfo[scorePlayers].bModerator = MMPRI(lpri).bModerator; if (lpri.bIsSpectator && MMPRI(lpri) != none) PInfo[scorePlayers].SpectatedPlayerID = MMPRI(lpri).SpectatingPlayerID; scorePlayers++; } } SetSpectatedPlayerNames(); SBInfo.ServerName = pp.GameReplicationInfo.ServerName; SBInfo.NumPlayers = scorePlayers; SBInfo.MaxPlayers = ReplMaxPlayers; str = string(self); SBInfo.Map = Left(str, InStr(str, ".")); } simulated function ShowDMScoreboard( DeusExPlayer thisPlayer, GC gc, float screenWidth, float screenHeight ) { local float yoffset, ystart, xlen, ylen, w2; local String str; local bool bLocalPlayer; local int i; local float w, h; if ( !thisPlayer.PlayerIsClient() ) return; gc.SetFont(Font'FontMenuSmall'); RefreshScoreArray( thisPlayer ); SortScores(); str = "TEST"; gc.GetTextExtent( 0, xlen, ylen, str ); ystart = screenHeight * PlayerY; yoffset = ystart; gc.SetTextColor( WhiteColor ); ShowVictoryConditions( gc, screenWidth, ystart, thisPlayer ); yoffset += (ylen * 2.0); DrawHeaders( gc, screenWidth, yoffset ); yoffset += (ylen * 1.5); // draw non-spectators first for ( i = 0; i < scorePlayers; i++ ) { if (PInfo[i].bIsSpectator) continue; bLocalPlayer = (scoreArray[i].PlayerID == thisPlayer.PlayerReplicationInfo.PlayerID); if ( bLocalPlayer ) gc.SetTextColor( GoldColor ); else gc.SetTextColor( WhiteColor ); yoffset += ylen; DrawNameAndScore( gc, scoreArray[i], screenWidth, yoffset ); gc.GetTextExtent(0, w, h, string(scoreArray[i].PlayerID)); gc.DrawText(screenWidth * IDX, yOffset, w, h, string(scoreArray[i].PlayerID)); gc.GetTextExtent(0, w2, h, "Ping"); gc.GetTextExtent(0, w, h, string(PInfo[i].ping)); gc.DrawText(screenWidth * PINGX + (w2 - w) * 0.5, yOffset, w, h, string(PInfo[i].ping)); str = ""; if (PInfo[i].bAdmin) str = "Admin"; else if (PInfo[i].bModerator) str = "Mod"; if (str != "") { gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); gc.DrawText(screenWidth * PlayerX + ADMINX_OFFSET, yOffset, w, h, str); gc.SetTextColor(RedColor); } } // draw spectators for ( i = 0; i < scorePlayers; i++ ) { if (!PInfo[i].bIsSpectator) continue; bLocalPlayer = (scoreArray[i].PlayerID == thisPlayer.PlayerReplicationInfo.PlayerID); if ( bLocalPlayer ) gc.SetTextColor( GoldColor ); else gc.SetTextColor( WhiteColor ); yoffset += ylen; //DrawNameAndScore( gc, scoreArray[i], screenWidth, yoffset ); str = scoreArray[i].PlayerName; gc.GetTextExtent( 0, w, h, str ); gc.DrawText( screenWidth * PlayerX, yoffset, w, h, str ); gc.GetTextExtent(0, w, h, string(scoreArray[i].PlayerID)); gc.DrawText(screenWidth * IDX, yOffset, w, h, string(scoreArray[i].PlayerID)); gc.GetTextExtent(0, w2, h, "Ping"); gc.GetTextExtent(0, w, h, string(PInfo[i].ping)); gc.DrawText(screenWidth * PINGX + (w2 - w) * 0.5, yOffset, w, h, string(PInfo[i].ping)); str = ""; if (PInfo[i].bAdmin) str = "Admin"; else if (PInfo[i].bModerator) str = "Mod"; if (str != "") { gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); gc.DrawText(screenWidth * PlayerX + ADMINX_OFFSET, yOffset, w, h, str); gc.SetTextColor(RedColor); } if (PInfo[i].SpectatedPlayerID != -1) str = "Spectating: " $ PInfo[i].SpectatedPlayerName; else str = "Spectator"; gc.SetTextColorRGB(0, 255, 255); gc.GetTextExtent(0, w, h, str); //gc.DrawText(screenWidth * SPECTX, yOffset, w, h, str); gc.DrawText(screenWidth * PlayerX + SPECTX_OFFSET, yOffset, w, h, str); gc.SetTextColor(GreenColor); } ShowServerInfo(gc, yoffset + 2 * ylen, ylen, screenWidth); } simulated function string ComposeTime() { local string ltime; if (Level.Hour < 10) ltime = "0"; else ltime = ""; ltime = ltime $ string(Level.Hour) $ ":"; if (Level.Minute < 10) ltime = ltime $ "0"; ltime = ltime $ string(Level.Minute); return ltime; } simulated function ShowServerInfo(GC gc, float yoffset, float ylen, float screenWidth) { local float w, h, tw; local string str; gc.GetTextExtent(0, w, h, "Ping"); gc.SetTileColorRGB(255,255,255); tw = ((screenWidth * PINGX) + w) - (IDX * screenWidth); gc.DrawBox(IDX * screenWidth, yoffset, tw, 1, 0, 0, 1, Texture'Solid'); yoffset += ylen; str = "Server: " $ SBInfo.ServerName $ " Map: " $ SBInfo.Map $ " Players: " $ string(SBInfo.NumPlayers) $ "/" $ string(SBInfo.MaxPlayers); gc.SetTextColorRGB(255, 255, 255); gc.GetTextExtent(0, w, h, str); tw = (tw - w) / 2; gc.DrawText((screenWidth * IDX) + tw, yoffset, w, h, str); yoffset += h + 2; str = "MiniMTL version: " $ class'miniMTLSettings'.default.ModVersion $ " Current time: " $ ComposeTime();; gc.GetTextExtent(0, w, h, str); gc.DrawText((screenWidth * IDX) + tw, yoffset, w, h, str); } simulated function SortScores() { local PlayerReplicationInfo tmpri; local int i, j, max; local ScoreElement tmpSE; local PlayerInfo tmpPI; for ( i = 0; i < scorePlayers-1; i++ ) { max = i; for ( j = i+1; j < scorePlayers; j++ ) { if ( scoreArray[j].score > scoreArray[max].score ) max = j; else if (( scoreArray[j].score == scoreArray[max].score) && (scoreArray[j].deaths < scoreArray[max].deaths)) max = j; } tmpSE = scoreArray[max]; tmpPI = PInfo[max]; scoreArray[max] = scoreArray[i]; PInfo[max] = PInfo[i]; scoreArray[i] = tmpSE; PInfo[i] = tmpPI; } } simulated function DrawHeaders( GC gc, float screenWidth, float yoffset ) { local float x, w, h; gc.GetTextExtent( 0, w, h, PlayerString ); x = screenWidth * PlayerX; gc.DrawText( x, yoffset, w, h, PlayerString ); gc.GetTextExtent(0, w, h, "ID"); x = screenWidth * IDX; gc.DrawText(x, yOffset, w, h, "ID"); gc.GetTextExtent( 0, w, h, KillsString ); x = screenWidth * KillsX; gc.DrawText( x, yoffset, w, h, KillsString ); gc.GetTextExtent( 0, w, h, DeathsString ); x = screenWidth * DeathsX; gc.DrawText( x, yoffset, w, h, DeathsString ); gc.GetTextExtent( 0, w, h, StreakString ); x = screenWidth * StreakX; gc.DrawText( x, yoffset, w, h, StreakString ); gc.GetTextExtent(0, w, h, "Ping"); x = screenWidth * PINGX; gc.DrawText(x, yOffset, w, h, "Ping"); gc.SetTileColorRGB(255,255,255); gc.DrawBox( IDX * screenWidth, yoffset+h, (x + w)-(IDX*screenWidth), 1, 0, 0, 1, Texture'Solid'); } simulated function DrawNameAndScore( GC gc, ScoreElement se, float screenWidth, float yoffset ) { local float x, w, h, w2, xoffset, killcx, deathcx, streakcx; local String str; // Draw Name str = se.PlayerName; gc.GetTextExtent( 0, w, h, str ); x = screenWidth * PlayerX; gc.DrawText( x, yoffset, w, h, str ); // Draw Kills str = "00"; gc.GetTextExtent( 0, w, h, KillsString ); killcx = screenWidth * KillsX + w * 0.5; gc.GetTextExtent( 0, w, h, str ); str = int(se.Score) $ ""; gc.GetTextExtent( 0, w2, h, str ); x = killcx + (w * 0.5) - w2; gc.DrawText( x, yoffset, w2, h, str ); // Draw Deaths gc.GetTextExtent( 0, w2, h, DeathsString ); deathcx = screenWidth * DeathsX + w2 * 0.5; str = int(se.Deaths) $ ""; gc.GetTextExtent( 0, w2, h, str ); x = deathcx + (w * 0.5) - w2; gc.DrawText( x, yoffset, w2, h, str ); // Draw Streak gc.GetTextExtent( 0, w2, h, StreakString ); streakcx = screenWidth * StreakX + w2 * 0.5; str = int(se.Streak) $ ""; gc.GetTextExtent( 0, w2, h, str ); x = streakcx + (w * 0.5) - w2; gc.DrawText( x, yoffset, w2, h, str ); } function bool CheckVictoryConditions( Pawn Killer, Pawn Killee, String Method ) { local Pawn winner; if ( VictoryCondition ~= "Frags" ) { GetWinningPlayer( winner ); if ( winner != None ) { if (( winner.PlayerReplicationInfo.Score == ScoreToWin-(ScoreToWin/5)) && ( ScoreToWin >= 10 )) NotifyGameStatus( ScoreToWin/5, winner.PlayerReplicationInfo.PlayerName, False, False ); else if (( winner.PlayerReplicationInfo.Score == (ScoreToWin - 1) ) && (ScoreTowin >= 2 )) NotifyGameStatus( 1, winner.PlayerReplicationInfo.PlayerName, False, True ); if ( winner.PlayerReplicationInfo.Score >= ScoreToWin ) { PlayerHasWon( winner, Killer, Killee, Method ); return True; } } } else if ( VictoryCondition ~= "Time" ) { timeLimit = float(ScoreToWin)*60.0; if (( Level.Timeseconds >= timeLimit-NotifyMinutes*60.0 ) && ( timeLimit > NotifyMinutes*60.0*2.0 )) { GetWinningPlayer( winner ); if ( winner != none) NotifyGameStatus( int(NotifyMinutes), winner.PlayerReplicationInfo.PlayerName, True, True ); else NotifyGameStatus( int(NotifyMinutes), "", True, True ); } if ( Level.Timeseconds >= timeLimit ) { GetWinningPlayer( winner ); PlayerHasWon( winner, Killer, Killee, Method ); return true; } } return false; } function string GetInfo() { if (Settings != none) return super.GetInfo() $ "\\mod\\miniMTL" $ Settings.ModVersion; else return super.GetInfo(); } @class miniMTLCustomSkin extends Info abstract config(CustomSkins); function PostBeginPlay() { super.PostBeginPlay(); SaveConfig(); } // override this function class GetSkinForDMPlayer(string password) { return none; } function bool GetSkinForTeamPlayer(string password, out class Team0, out class Team1) { return false; } // used for DM games function bool IgnoreDefaultSkin(class SkinToCheck) { return false; } Zclass miniMTLCTFFlag extends DeusExDecoration; var miniMTLPlayer carrier; var int carrierID; var int team; //var int autoReturnTime; var vector baseLoc; var bool bUpdateBaseLoc; var string teamString; //what to put after the 'teamString' when displaying on the HUD var string flagString, HQString; var float lastTakeTime; var vector loc; var vector carrierLastLoc; //how long after dropping the flag can a player pick it up again? var float dropTakeTime; //don't let the last carrier immediately pick up the flag again var miniMTLPlayer lastCarrier; var float lastDropTime; //offset of flag to player when carried (from the floor) //this is so we can raise the flag for smaller flag models etc. (or lower it?) //so the ambrosia etc. looks as tho the player is carrying rather than dragging it var float carrierAdjustHeight; var int escapeTime; var bool bEscaping; enum flagEvent_e { FEV_Take, FEV_TakeFromField, FEV_Drop, FEV_DropOnPurpose, FEV_Return, FEV_Capture, //FEV_AutoReturn, FEV_Escape }; replication { //server->client reliable if (role == ROLE_Authority) baseLoc, /*autoReturnTime,*/ teamString, flagString, HQString, team, escapeTime; //server->client, things which will change reliable if (role == ROLE_Authority) carrier; //only when carrier is relevant to player //(i.e. server will send it to player when the carrier //comes into view) //this needs to be sent out initially the get the simulated flags //into sync with that of the server reliable if (bNetInitial) carrierID, bEscaping; //got to send out the escaping? //when the flag is with player, server sends out location //but ONLY when the client can't actually see the carrier (if //carrier is valid, then we don't need to replicate the 'loc' variable) reliable if (role == ROLE_Authority && isInState('withPlayer') && !carrier.bNetRelevant) loc; } simulated function refreshItemName() { //set the itemname itemName = teamString $ " " $ flagString; } simulated function postNetBeginPlay() { super.postNetBeginPlay(); refreshItemName(); } simulated function beginPlay() { super.beginPlay(); if (role < ROLE_Authority) return; //set it now but it will re-adjust once flag hits floor baseLoc = location; } simulated function adjustToPlayer(miniMTLPlayer player) { local vector newLoc; newLoc = (player.location)-(vector(player.rotation))*collisionRadius*1.25; newLoc.z += carrierAdjustHeight; setLocation(newLoc); setRotation(player.rotation + default.rotation); setBase(player); //server also needs to keep track of these, and replicate the location if (role == ROLE_Authority) { carrierLastLoc = carrier.location; loc = location; } } simulated function setMobile(bool mobile) { if (mobile) { setCollision(false, false, false); bCollideWorld = false; setPhysics(PHYS_None); } else { setCollision(true, true, true); bCollideWorld = true; setPhysics(PHYS_Falling); } } function flagEvent(flagEvent_e ev, /*optional */ miniMTLPlayer player) { local miniMTLCTF game; local Pawn pawn; local miniMTLPlayer client; game = miniMTLCTF(level.game); if (game != none) { switch(ev) { case FEV_Take: game.flagTake(self, player, true); break; case FEV_TakeFromField: game.flagTake(self, player, false); break; case FEV_Drop: game.flagDrop(self, player, false); break; case FEV_DropOnPurpose: game.flagDrop(self, player, true); break; case FEV_Return: game.flagReturn(self, player); break; case FEV_Capture: game.flagCapture(self, carrier); break; //case FEV_AutoReturn: // game.flagAutoReturn(self); // break; } } //multicast the event out to all players for (pawn=level.pawnList; pawn!=none; pawn=pawn.nextPawn) { client = miniMTLPlayer(pawn); if (client != none) { switch(ev) { case FEV_Take: case FEV_TakeFromField: client.flagTake(self, player.playerReplicationInfo.playerID, Player.PlayerReplicationInfo.Team == client.PlayerReplicationInfo.Team); break; case FEV_Drop: case FEV_DropOnPurpose: client.flagDrop(self, carrierLastLoc, Player.PlayerReplicationInfo.Team == client.PlayerReplicationInfo.Team); break; case FEV_Return: client.flagReturn(self, player.playerReplicationInfo.playerID, Player.PlayerReplicationInfo.Team == client.PlayerReplicationInfo.Team); break; case FEV_Capture: client.flagCapture(self, Player.PlayerReplicationInfo.Team == client.PlayerReplicationInfo.Team); break; //case FEV_AutoReturn: // client.flagAutoReturn(self); // break; case FEV_Escape: client.flagEscape(self); break; } } } } function setCarrier(miniMTLPlayer player) { if (player == none) { lastCarrier = carrier; carrier.getPRI().Flag = none; carrier = none; } else { carrier = player; carrier.getPRI().Flag = self; } } function int SV_CountEnemies(miniMTLPlayer player) { local int c; local Pawn pwn; pwn = Level.PawnList; while (pwn != none) { if (pwn.PlayerReplicationInfo != none && Player.PlayerReplicationInfo != none && !pwn.PlayerReplicationInfo.bIsSpectator && pwn.PlayerReplicationInfo.Team != Player.PlayerReplicationInfo.Team) c++; pwn = pwn.NextPawn; } return c; } function SV_take(miniMTLPlayer player) { //don't let dead people pick up the flag if (player.isInState('Dying')) return; //don't let invulnerable people pick up the flag if (player.bNintendoImmunity) return; //don't let them pick it up too quickly after just dropping it if (lastCarrier == player && ((level.timeSeconds - lastDropTime) < dropTakeTime)) return; // don't let it pickup if no enemies if (SV_CountEnemies(Player) == 0) return; setCarrier(player); if (IsInState('atBase')) flagEvent(FEV_Take, carrier); else flagEvent(FEV_TakeFromField, carrier); adjustToPlayer(carrier); //if (IsInState('atBase')) lastTakeTime = Level.timeSeconds; CL_take(player.PlayerReplicationInfo.PlayerID); } simulated function CL_take(int playerID) { setMobile(true); carrierID = playerID; bEscaping = true; GotoState('withPlayer'); } function SV_return(miniMTLPlayer player) { lastCarrier = none; flagEvent(FEV_Return, player); CL_return(player.PlayerReplicationInfo.PlayerID); } simulated function CL_return(int playerID) { SetLocation(baseLoc); GotoState('atBase'); } function SV_drop(bool bOnPurpose) { if (bOnPurpose) { flagEvent(FEV_DropOnPurpose, carrier); } else { flagEvent(FEV_Drop, carrier); lastCarrier = none; // set lastcarrier to none, so if player died, // he can recapture the flag immediatelly } setCarrier(none); lastDropTime = Level.timeSeconds; CL_drop(carrierLastLoc); } simulated function CL_drop(vector location) { //log("CL_drop"); setMobile(false); carrierID = -1; setBase(none); SetLocation(location); //bEscaping = false; GotoState('inField'); } function SV_capture() { flagEvent(FEV_Capture, carrier); SetCarrier(none); CL_capture(); } simulated function CL_capture() { carrierID = -1; setMobile(false); setBase(none); SetLocation(baseLoc); bEscaping = false; GotoState('atBase'); } simulated function CL_escape() { //has escaped bEscaping = false; } simulated function tick(float deltaTime) { //never EVER go into stasis... EVER bStasis = false; } auto simulated state atBase { simulated function Tick(float deltaTime) { global.Tick(deltaTime); //if simulated, and carrierID is sent out as different from -1 //then we are actually being carried so change to that state //(this will happen when u first connect to the server) if (role < ROLE_Authority) if (carrierID != -1) { setMobile(true); GotoState('withPlayer'); } //if the flag is on server, and has finished falling then update the baseloc if (role == ROLE_Authority) { if (bUpdateBaseLoc && vsize(velocity) == 0) { baseLoc = location; bUpdateBaseLoc = false; } } } function Bump(Actor other) { local miniMTLPlayer player; local MMPRI pri; player = miniMTLPlayer(other); if (player == none) return; pri = player.getPRI(); if (pri == none) return; //enemy player, allow pickup if (pri.team != team) SV_take(player); //friendly player, and friendly player has an enemy flag, so cap if (pri.team == team) if (pri.flag != none) pri.flag.SV_capture(); } } simulated state inField { simulated function tick(float deltaTime) { global.Tick(deltaTime); } function Bump(Actor other) { local miniMTLPlayer player; local MMPRI pri; player = miniMTLPlayer(other); if (player == none) return; pri = player.getPRI(); if (pri == none) return; //enemy player, allow pickup if (pri.team != team) SV_take(player); //friendly player, allow return if (pri.team == team) SV_return(player); } } simulated state withPlayer { simulated function Tick(float deltaTime) { global.Tick(deltaTime); //serverside if (role == ROLE_Authority) { //carrier left the game if (carrier == none) SV_drop(true); //class as a deliberate drop //carrier dropped flag on purpose if (carrier.getPRI().Flag != self) SV_drop(true); //carrier dropped flag due to death else if (carrier.isInState('Dying')) SV_drop(false); else //carrier still has flag, so put on back adjustToPlayer(carrier); if (bEscaping && ((level.timeSeconds - lastTakeTime) > escapeTime)) { //escape is complete, flag now becomes visible to all players //so they can hunt down the carrier! flagEvent(FEV_Escape, none); CL_escape(); } } //clientside else { //adjust onto players back (IF carrier is relevant) if (carrier != none) adjustToPlayer(carrier); else if (carrierID != -1) { //else just put it where the server keeps telling us setBase(none); SetLocation(loc); } } } } +class miniMTLCTFAlarm extends Effects; `+@($::$--\w.*w.p. *.p. x.,inject userflag 1-\'-^'-^a?-^'Q$d-^-^(al@ Bclass miniMTLCTF extends miniMTLTeam; var() globalconfig class FlagDisabledAugs[17]; var() globalconfig int SkillsPerCapture; //number of skill points you get when you capture the enemy flag var() globalconfig int SkillsPerScore; //number of skill points you get when you score the enemy flag var() globalconfig int SkillsPerReturn; //number of skill points you get when you return own flag var() globalconfig int AugsPerCapture; //number of augs you get when you capture the enemy flag var() globalconfig int AugsPerScore; //number of augs you get when you score the enemy flag var() globalconfig int AugsPerReturn; //number of augs you get when you return own flag var() globalconfig int TeamSkillsPerCapture; //number of skill points team get when you capture the enemy flag var() globalconfig int TeamSkillsPerScore; //number of skill points team get when you score the enemy flag var() globalconfig int TeamSkillsPerReturn; //number of skill points team get when you return own flag var() globalconfig int TeamAugsPerCapture; //number of augs team get when you capture the enemy flag var() globalconfig int TeamAugsPerScore; //number of augs you get when team score the enemy flag var() globalconfig int TeamAugsPerReturn; //number of augs team get when you return own flag //how many seconds are u invisible to the team whos flag u took? //(invisible as in no flag icon on their HUDs) var globalconfig int flagEscapeTime; //allow flag carriers to use augs? var globalconfig bool bAugsWithFlag; var float FixedRespawnTime; var bool bRespawnIntervals; var float RespawnInterval; var float RespawnThreshold; var float NextRespawnTime; //how many seconds between flag pickups from base will gifts be awarded? //var float flagScrumTime; var int PtsPerKill; var int PtsPerScore; var int PtsPerCapture; var int PtsPerReturn; //the flags (one for each team) var miniMTLCTFFlag Flags[2]; //bias to give to friendly flag when choosing a spawn point // (i.e. how many 'teammates' does it represent) var float friendlyFlagBias; var float friendlyFlagRandomBias; // only on client var int FlagFlashCount; struct FlagSpawnPoint { var string MapName; var Vector Location0; var Vector Location1; }; var FlagSpawnPoint FlagSpawnPoints[7]; replication { //make sure players know about the flags reliable if (Role == ROLE_Authority) Flags, FlagDisabledAugs; } function Tick(float deltaTime) { if (Role == ROLE_Authority) { if (bRespawnIntervals) { NextRespawnTime -= deltaTime; if (NextRespawnTime < RespawnThreshold) { NextRespawnTime += RespawnInterval; } } else NextRespawnTime = FixedRespawnTime; } super.Tick(deltaTime); } function HandleDeathNotification( Pawn killer, Pawn killee ) { local bool killedSelf, valid; killedSelf = (killer == killee); if (( killee != None ) && killee.IsA('miniMTLPlayer')) { valid = DeusExPlayer(killee).killProfile.bValid; if ( killedSelf ) valid = False; miniMTLPlayer(killee).MultiplayerDeathMsgCTF(killer, killedSelf, valid, DeusExPlayer(killee).killProfile.name, DeusExPlayer(killee).killProfile.methodStr, NextRespawnTime); } } function customizeFlag(miniMTLCTFFlag flag, int flagTextureNum) { switch (flagTextureNum) { case 0: flag.skin = texture'DeusExDeco.Skins.FlagPoleTex5'; break; case 1: flag.skin = texture'DeusExDeco.Skins.FlagPoleTex4'; break; } } simulated function LocalGetTeamTotalsX(int teamSECnt, out float score, out float deaths, out float streak, DeusExPlayer thisPlayer, int team ) { local int i; local MMGRI gri; score = 0; deaths = -1; streak = -1; gri = MMGRI(thisPlayer.GameReplicationInfo); if (gri != none) score = gri.Captures[team]; } function CalcTeamScores() { local MMGRI gri; gri = MMGRI(GameReplicationInfo); if (gri != none) { TeamScore[TEAM_NSF] = gri.Captures[1]; TeamScore[TEAM_UNATCO] = gri.Captures[0]; } } simulated function HUD_CTF_drawFlagTexture(GC gc, float xloc, float yloc) { gc.drawPattern(xloc-5, yloc-5, 10, 7, 0, 0, Texture'Solid'); gc.drawPattern(xloc-5, yloc, 2, 8, 0, 0, Texture'Solid'); } simulated function HUD_CTF_drawMiniFlagTexture(GC gc, float xloc, float yloc) { gc.drawPattern(xloc+3, yloc-9, 5, 4, 0, 0, Texture'Solid'); gc.drawPattern(xloc+3, yloc-9, 1, 7, 0, 0, Texture'Solid'); } simulated function HUD_CTF_drawCarrierTexture(GC gc, float xloc, float yloc) { gc.drawPattern(xloc-7,yloc,14,2,0,0, texture'solid'); gc.drawPattern(xloc-1,yloc-6,2,13,0,0, texture'solid'); } simulated function HUD_CTF_drawHQTexture(GC gc, float xloc, float yloc) { gc.drawPattern(xloc-2, yloc-2, 5, 5, 0, 0, texture'Solid'); } simulated function HUD_drawText(GC gc, string str, float xloc, float yloc) { local float x, y, w, h; gc.setFont(font'FontMenuSmall_DS'); gc.setStyle(DSTY_Normal); gc.getTextExtent(0, w, h, str); x = xloc - w/2; y = yloc + h; gc.drawText(x, y, w, h, str); } simulated function HUD_CTF_drawFlag(GC gc, miniMTLCTFFlag flag, miniMTLPlayer player, float xloc, float yloc) { local string str; local float x, y, w, h; //if being carried, we draw a different image, someone please help me with this :)) if (flag.isInState('withPlayer')) { //do a check for escape time (only if flag is on my team) if (player.playerReplicationInfo.team == flag.team && flag.bEscaping) return; //dont draw is escaping HUD_CTF_drawMiniFlagTexture(gc, xloc, yloc); //assume enemy carrier gc.setTileColor(redColor); if (flag.team != player.playerReplicationInfo.team) { //if the carrier is on my team, draw a green cross if ((player.IDToPRI(flag.carrierID)).team == player.playerReplicationInfo.team) { gc.setTileColor(greenColor); } } HUD_CTF_drawCarrierTexture(gc, xloc, yloc); } else { HUD_CTF_drawFlagTexture(gc, xloc, yloc); } //if (player.bHUDText && flag.teamString != "") if (flag.teamString != "") HUD_drawText(gc, flag.teamString $ " " $ flag.flagString, xloc, yloc); } simulated function HUD_CTF_drawHQ(GC gc, miniMTLCTFFlag flag, miniMTLPlayer player, float xloc, float yloc) { HUD_CTF_drawHQTexture(gc, xloc, yloc); //if (player.bHUDText && flag.teamString != "") if (flag.teamString != "") HUD_drawText(gc, flag.teamString $ " " $ flag.HQString, xloc, yloc); } simulated function HUD_CTF_drawMyFlag(GC gc, float width, float height) { FlagFlashCount++; if (FlagFlashCount == 80) FlagFlashCount = 0; if (FlagFlashCount < 55) { gc.SetStyle(DSTY_Masked); GC.SetTileColorRGB(255,255,255); gc.DrawStretchedTexture(width - 32 - 5, height * 0.8, 32, 32, 0, 0, 64, 64, Texture'CTFItems100.HUD_Flag'); } } simulated function drawHUD(miniMTLPlayer player, GC gc, Window window, float width, float height) { local string str; local float x, y, w, h; local int i; local MMPRI pri; local miniMTLCTFFlag f; pri = MMPRI(Player.PlayerReplicationInfo); if (pri != none && pri.Flag != none) HUD_CTF_drawMyFlag(gc, width, height); //HUD_CTF_drawMyFlag(gc, width, height); // if we are spectator and we want to play if (pri != none && pri.bIsSpectator) { if (Player.bCTFWantsToPlay) { str = "Starting to play... Wait " $ string(int(Player.CTFRespawnTime - Player.Level.Timeseconds)) $ " seconds."; gc.SetTextColorRGB(255, 255, 255); gc.SetFont(Font'FontMenuTitle'); gc.GetTextExtent(0, w, h, str); x = (width * 0.5) - (w * 0.5); y = height * 0.65; gc.DrawText( x, y, w, h, str ); } } foreach AllActors(class'miniMTLCTFFlag', f) { if (player.playerReplicationInfo.team == f.team) gc.setTileColor(greenColor); else gc.setTileColor(redColor); if (!(f.isInState('atBase'))) if (window.convertVectorToCoordinates(f.baseLoc, x, y)) HUD_CTF_drawHQ(gc, f, player, x, y); if (window.convertVectorToCoordinates(f.location, x, y)) HUD_CTF_drawFlag(gc, f, player, x, y); } //for (i=0; i<2; i++) //{ // if (flags[i] == none) continue; // if (player.playerReplicationInfo.team == flags[i].team) // gc.setTileColor(greenColor); // else // gc.setTileColor(redColor); // if (!(flags[i].isInState('atBase'))) // if (window.convertVectorToCoordinates(flags[i].baseLoc, x, y)) // HUD_CTF_drawHQ(gc, flags[i], player, x, y); // if (window.convertVectorToCoordinates(flags[i].location, x, y)) // HUD_CTF_drawFlag(gc, flags[i], player, x, y); //} } event InitGame(string Options, out string Error) { super.InitGame(Options, Error); // spawn flags if (level.netMode != NM_Standalone) initFlags(); if (bRespawnIntervals) NextRespawnTime = RespawnInterval; else NextRespawnTime = FixedRespawnTime; } function initFlags() { local int i, k; local NavigationPoint point; local SpawnPoint flagSpawn; local string str, map; log("Initializing CTF flags...", 'MiniMTL'); //check for 'flagStarts' (the new way we do it) foreach AllActors(class'SpawnPoint', flagSpawn) { if (flagSpawn.Tag == 'CTFFLAG') { if (flagSpawn.ownerTeam == '0') Flags[0] = spawnFlag(0, flagSpawn.Location); else if (flagSpawn.ownerTeam == '1') Flags[1] = spawnFlag(1, flagSpawn.Location); } } //now customize the flags for (i=0; i<2; i++) { if (Flags[i] == none) { str = string(self); map = Left(str, InStr(str, ".")); for (k = 0; k < arrayCount(FlagSpawnPoints); k++) { if (FlagSpawnPoints[k].MapName ~= map) { if (i == 0) Flags[i] = spawnFlag(i, FlagSpawnPoints[k].Location0); else Flags[i] = spawnFlag(i, FlagSpawnPoints[k].Location1); break; } } if (Flags[i] == none) { log("ERROR: Not enough flag spawn points set!", 'MiniMTL'); assert(false); } } if (i == 0) flags[i].teamString = "UNATCO"; else flags[i].teamString = "NSF"; flags[i].escapeTime = flagEscapeTime; customizeFlag(flags[i], i); flags[i].refreshItemName(); log(sprintf("CTF: %s = %s", flags[i], flags[i].itemName), 'MiniMTL'); } } function miniMTLCTFFlag spawnFlag(int team, vector location) { local miniMTLCTFFlag flag; flag = spawn(class'miniMTLCTFFlag',,, location); if (flag != none) { //set the team anyway (even if it was done by default) flag.team = team; log(sprintf("CTF: Flag spawned %s at %s for team %i", flag, flag.location, team), 'MiniMTL'); } else log(sprintf("CTF: Failed to spawn flag at %s for team %i", location, team), 'MiniMTL'); return flag; } function float distanceCost(float dist) { local float cost; if (dist < 200) cost = 300; else if (dist < 400) cost = 250; else if (dist < 800) cost = 175; else if (dist < 1600) cost = 100; else if (dist < 3200) cost = 25; else cost = 0; return cost; } function float EvaluatePlayerStart(Pawn player, PlayerStart pointToEvaluate, optional byte inTeam) { local miniMTLCTFFlag flag; //the bias we give to a nearby friendly flag local float friendlyFlagBonus, bestFriendlyFlagBonus; local float dist; local int team; local Pawn CurPawn; local DeusExPlayer OtherPlayer; bestFriendlyFlagBonus = 0; if (player == none) team = inTeam; else if (player.playerReplicationInfo == none) team = inTeam; else team = player.playerReplicationInfo.team; // check so we do not spawn on another player & kill him for (CurPawn = Level.PawnList; CurPawn != None; CurPawn = CurPawn.NextPawn) { OtherPlayer = DeusExPlayer(CurPawn); if ((OtherPlayer != None) && (OtherPlayer != Player)) { //Get Dist dist = VSize(OtherPlayer.Location - PointToEvaluate.Location); if (Dist < 75.0) return -100000; } } //evaluate our distance from enemy flag BASE locations (not the flag) foreach allActors(class'miniMTLCTFFlag', flag) { //if this player is NOT on the team of the flag if (team != flag.team) //would the player be too close?? if (vsize(flag.baseLoc - pointToEvaluate.location) < 1500.0) return -100000; //don't spawn me here! //friendly flag! bias us towards it if (team == flag.team) { dist = vsize(flag.baseLoc - pointToEvaluate.location); friendlyFlagBonus = distanceCost(dist); if (friendlyFlagBonus > bestFriendlyFlagBonus) bestFriendlyFlagBonus = friendlyFlagBonus; } } //we dont even bother considering enemies now - ALWAYS spawn nearish flag return bestFriendlyFlagBonus * (friendlyFlagBias + frand() * friendlyFlagRandomBias); } function flagCapture(miniMTLCTFFlag flag, miniMTLPlayer player) { local MMPRI pri; local MMGRI gri; local Pawn P; //count the capture (so he/she cant swap team and take cap with em lol) gri = MMGRI(gameReplicationInfo); if (gri != none) gri.Captures[player.PlayerReplicationInfo.team]++; CTFReward(player, SkillsPerScore, AugsPerScore, PtsPerScore); if (TeamSkillsPerScore > 0) CTFRewardTeamSkills(player.PlayerReplicationInfo.Team, TeamSkillsPerScore); if (TeamAugsPerScore > 0) CTFRewardTeamAugs(player.PlayerReplicationInfo.Team, TeamAugsPerScore); //check for end of game if (CheckVictoryConditions(player, none, flag.itemName)) bFreezeScores = True; } function flagTake(miniMTLCTFFlag flag, miniMTLPlayer player, bool bFromBase) { //if (!bAugsWithFlag) if (bFromBase || flag.bEscaping || !bAugsWithFlag) { //player.AugmentationSystem.DeactivateAll(); if (MMAugmentationManager(Player.AugmentationSystem) != none) { MMAugmentationManager(Player.AugmentationSystem).DeactivateCTFAugs(); } } if (bFromBase) { CTFReward(player, SkillsPerCapture, AugsPerCapture, PtsPerCapture); if (TeamSkillsPerCapture > 0) CTFRewardTeamSkills(player.PlayerReplicationInfo.Team, TeamSkillsPerCapture); if (TeamAugsPerCapture > 0) CTFRewardTeamAugs(player.PlayerReplicationInfo.Team, TeamAugsPerCapture); } } function flagReturn(miniMTLCTFFlag flag, miniMTLPlayer player) { CTFReward(player, SkillsPerReturn, AugsPerReturn, PtsPerReturn); if (TeamSkillsPerReturn > 0) CTFRewardTeamSkills(player.PlayerReplicationInfo.Team, TeamSkillsPerReturn); if (TeamAugsPerReturn > 0) CTFRewardTeamAugs(player.PlayerReplicationInfo.Team, TeamAugsPerReturn); } function flagDrop(miniMTLCTFFlag flag, miniMTLPlayer player, bool bOnPurpose) { return; } function CTFReward(DeusExPlayer PlayerToReward, int skills, int augs, int pts) { if (PlayerToReward != None) { if (skills > 0) PlayerToReward.SkillPointsAdd(skills); if (augs > 0) PlayerToReward.GrantAugs(augs); PlayerToReward.PlayerReplicationInfo.Score += pts; PlayerToReward.PlayerReplicationInfo.Streak += pts; } } function CTFRewardTeamSkills(int team, int skills) { local DeusExPlayer dxp; local Pawn p; local MMPRI pri; p = Level.PawnList; while (p != none) { dxp = DeusExPlayer(p); if (dxp != none) { pri = MMPRI(dxp.PlayerReplicationInfo); if (pri != none && pri.Team == team && !pri.bIsSpectator && !pri.bDead) dxp.SkillPointsAdd(skills); } p = p.NextPawn; } } function CTFRewardTeamAugs(int team, int augs) { local DeusExPlayer dxp; local Pawn p; local MMPRI pri; p = Level.PawnList; while (p != none) { dxp = DeusExPlayer(p); if (dxp != none) { pri = MMPRI(dxp.PlayerReplicationInfo); if (pri != none && pri.Team == team && !pri.bIsSpectator && !pri.bDead) dxp.GrantAugs(augs); } p = p.NextPawn; } } function Killed( pawn Killer, pawn Other, name damageType ) { local bool NotifyDeath; local DeusExPlayer otherPlayer; local Pawn CurPawn; local MMPRI pri; if ( bFreezeScores ) return; NotifyDeath = False; // Record the death no matter what, and reset the streak counter if ( Other.bIsPlayer ) { otherPlayer = DeusExPlayer(Other); pri = MMPRI(otherPlayer.PlayerReplicationInfo); if (pri != none) pri.bDead = true; Other.PlayerReplicationInfo.Deaths += 1; Other.PlayerReplicationInfo.Streak = 0; // Penalize the player that commits suicide by losing a kill, but don't take them below zero if ((Killer == Other) || (Killer == None)) { if ( Other.PlayerReplicationInfo.Score > 0 ) { if (( DeusExProjectile(otherPlayer.myProjKiller) != None ) && DeusExProjectile(otherPlayer.myProjKiller).bAggressiveExploded ) { // Don't dock them if it nano exploded in their face } else Other.PlayerReplicationInfo.Score -= 1; } } NotifyDeath = True; } if (Killer == none) { // deadly fall Killer = Other; } //both players... if ((Killer.bIsPlayer) && (Other.bIsPlayer)) { //Add to console log as well (with pri id) so that kick/kickban can work better log(Killer.PlayerReplicationInfo.PlayerName$"("$Killer.PlayerReplicationInfo.PlayerID$") killed "$Other.PlayerReplicationInfo.PlayerName $ otherPlayer.killProfile.methodStr); for (CurPawn = Level.PawnList; CurPawn != None; CurPawn = CurPawn.NextPawn) { if ((CurPawn.IsA('DeusExPlayer')) && (DeusExPlayer(CurPawn).bAdmin)) DeusExPlayer(CurPawn).LocalLog(Killer.PlayerReplicationInfo.PlayerName$"("$Killer.PlayerReplicationInfo.PlayerID$") killed "$Other.PlayerReplicationInfo.PlayerName $ otherPlayer.killProfile.methodStr); } if ( otherPlayer.killProfile.methodStr ~= "None" ) BroadcastMessage(Killer.PlayerReplicationInfo.PlayerName$" killed "$Other.PlayerReplicationInfo.PlayerName$".",false,'DeathMessage'); else if ( Killer != Other) BroadcastMessage(Killer.PlayerReplicationInfo.PlayerName$" killed "$Other.PlayerReplicationInfo.PlayerName $ otherPlayer.killProfile.methodStr, false, 'DeathMessage'); if (Killer != Other) { // Penalize for killing your teammates if (ArePlayersAllied(DeusExPlayer(Other),DeusExPlayer(Killer))) { if ( Killer.PlayerReplicationInfo.Score > 0 ) Killer.PlayerReplicationInfo.Score -= PtsPerKill; DeusExPlayer(Killer).MultiplayerNotifyMsg( DeusExPlayer(Killer).MPMSG_KilledTeammate, 0, "" ); } else { // Grant the kill to the killer, and increase his streak Killer.PlayerReplicationInfo.Score += PtsPerKill; Killer.PlayerReplicationInfo.Streak += PtsPerKill; Reward(Killer); } } if ( NotifyDeath ) HandleDeathNotification( Killer, Other ); } else { if (NotifyDeath) HandleDeathNotification( Killer, Other ); super(DeusExGameInfo).Killed(Killer,Other,damageType); } BaseMutator.ScoreKill(Killer, Other); } n+Brw2P.~wP*k.bP~wk*kFBkFke*ke$ ,` 0class miniMTLBumMale extends miniMTLPlayer; Ws+]q 1::$6g6-}U]w]*.]w*rN}gV $~ $i $Y $U $V $\ $% g*& g*, g*HW%wH*Ha/!M V =. HHa/!J ~ =.H-Ha/!K i =.HgHa/!L Y =.HHa/!w U =.HHa/!G V =.H0Ha/!J \ =.HHa/!x W,W g.HWHHt^ .{%W%W,ZWw:W^ *%{{&Zw:W^ *,{{@W^ HW-b'TK%` ."w` *W%W, :W`  ;,KK@W:W`  ;,KK&WWd]]R z+r`8[Y::$NrSbrSb_rSS Wclass miniMTLBasicTeam extends miniMTLTeam; /** @ignore */ function PreBeginPlay () { Super.PreBeginPlay(); ResetNonCustomizableOptions(); } function ResetNonCustomizableOptions () { Super.ResetNonCustomizableOptions(); if( !bCustomizable ) { SkillsTotal=0; SkillsAvail=0; SkillsPerKill=0; InitialAugs=9; AugsPerKill=0; MPSkillStartLevel=3; SaveConfig(); } } c+Yq6W."Y&rW*(:r , e::r W ;,Yy&(Y:r W,BYy%W br 'Yy&(( Ww+r+UW.CwW*WO-M'S.wS*S]-M'( Wq+\A {\-(,n%n, 4n&Yq\=n\-(wn% n, 'y( B,Vp|::$VwV*A.VwA*rAA-b(A%A%A%A%A%A%VV" Iclass miniMTLBasicDM extends miniMTLDeathMatch; function PreBeginPlay() { Super.PreBeginPlay(); ResetNonCustomizableOptions(); } function ResetNonCustomizableOptions() { Super.ResetNonCustomizableOptions(); if( !bCustomizable ) { SkillsTotal=0; SkillsAvail=0; SkillsPerKill=0; InitialAugs=9; AugsPerKill=0; MPSkillStartLevel=3; SaveConfig(); } } {+~S~::$1D, D, b||Dg|?|?b|o:|o:b`S||%S D }MiniMTL: Speed fix init. @,|p{q| }~+e 2 . }+w m-[ " w eww *w -|%.w  k]}  O[{ p  cJ j{c.-W~c:6P,:6P%6P=,6P$ cP F,|+~(| h+7hIe77}7,fJ7~7 77}7~7act=77}7,gL7~7 77}7~7net=77}7,hL7~7 c CghzCzD?f:c ,c $ x E bx `x e.e Le jx eex    C,QXPIA::$-.,inject userflag 0   K,zp zzg{ D,vploe(_wo*I.Lov^o_ooe(.L^ w ba?( oL~class miniMTLBasicCTF extends miniMTLCTF; function PreBeginPlay () { Super.PreBeginPlay(); ResetNonCustomizableOptions(); } function ResetNonCustomizableOptions () { Super.ResetNonCustomizableOptions(); if( !bCustomizable ) { // kills SkillsPerKill=0; AugsPerKill=0; // CTF SkillsPerCapture=0; SkillsPerScore=0; SkillsPerReturn=0; AugsPerCapture=0; AugsPerScore=0; AugsPerReturn=0; TeamSkillsPerCapture=0; TeamSkillsPerScore=0; TeamSkillsPerReturn=0; TeamAugsPerCapture=0; TeamAugsPerScore=0; TeamAugsPerReturn=0; // can players use augs when flag taken at all? bAugsWithFlag=false; // after that time, players would be allowed to use augs (under bAugsWithFlag=true condition) // but also displayed on radar for enemy players flagEscapeTime=0; // initial InitialAugs=9; MPSkillStartLevel=3; SkillsTotal=0; SkillsAvail=0; SaveConfig(); } } d$~~z-C'  G,mn) mzp wz*zSm z zpFS z-[-uz]mze &eezm [+w,D[w*I{ 1w*Zw*-'a(((-(-'-(o$w*a*w*a*-(-(X5::$.w*a**$::$*-B'-(v.wv*vrvX*v-p(Y-i(# w*qI qqaVw.*.O$$r%b::$w*5=ppPlayer  is now spectator. V,_w]*U]YP]hYP]YQ]hYQa 0J,~$X 6O,0&Rf`S X,_~ v|ew*_~  }  x.Dwx*::$x-6x N6x }xwx*x x-} x D-6~ xb-f ~ } 4Cz _~ }   L,R,mE&MG.eKwG*GmG.Ge GD k(.e V. e  T,tm ]$.Vnt-se Y >w.*Y.]yyw.*Y.OwY*Y-Za@(a lZ,S,Omgp"r,8::$!-C -B'-(*a'''--o$-(--d::$w*w.*8:%:=ppSpectator  joined UNATCO Team.7=ppSpectator  joined NSF Team.7=ppSpectator  started playing.w*-( UU  F`Cr_ `..e 9w*e.e `cw*e.e de$$w*e.e ^w*e.e cw*e.e ye$$+w*e.e \(c `}  eg,Lco -B   Y,AF#i$F%A- A- A- eA- F&A-A-A-!(((W(( (e((((W ^class miniMTLAdvTeam extends miniMTLTeam; /** @ignore */ function PreBeginPlay () { Super.PreBeginPlay(); ResetNonCustomizableOptions(); } function ResetNonCustomizableOptions () { Super.ResetNonCustomizableOptions(); if( !bCustomizable ) { SkillsTotal=2000; SkillsAvail=2000; SkillsPerKill=2000; InitialAugs=2; AugsPerKill=2; MPSkillStartLevel=1; SaveConfig(); } } [,C WLc@6C =,6C =,6C =, eC  uzxw*Jw*J V *xw*YD?,>.aw*kb~(: ` a<: ` q~?6A6A6Aq 666eqst\s[tEsGt9D9&Z 8Z &\ ,\ &~6~?96~?Z 6~?\ 6~6q6~6q6~6q e~JK\\J[[KEEJGGK\ ,5Z ,9, a/!.\@[@E@G@\\[[EEGGjE\kG[Mjk=@ BE\M\M?,EM?,G[M[M?,GM?, !%%%9&9%Ke\?9?Y[?9?YM?? Ke\?9?Y[?9?Y?M? ReE?9M?Y[?9?YM?? KeE?9?Y[?9?Y?M? Ke\?9?YG?9?YM?? Re\?9?YG?9M?Y?M? VeE?9M?&?YG?9?YM?? ReE?9?YG?9M?Y?M? d9 a/!.N. wN*N-pp<N- ppRNB%ppp< N-ppRNB% p' \?, [?, d e?, wN*N-?,?,?,?, ?, ?,?,?, ?, ?,d$ !%%%&e  wN*N-d$cuNdcne?,?,?,?,N?,?,?, cuNdcse?,?,?,?,?,N?,?,?, d0e?,?,?,?,d$d+e? d=e?&?&?,?,?  wN*N-N- FDN + p}?h F&SF{ SFTe?,?,?,?,?,?,?,xa/!Tv.pp.<v- vppRvB%pp.: p\?, [?, d e?,@v?,?,?,?, ?, ?,?,?, ?, ?,d$ !%%%&e vd$cuvdc_e?,?,v?,?, d0e?,?,?,?,d$d+e? d=e?&?&?,?,? v- vFDv + p}?2F&SFESFEe?,?,?,?,xx- -a/!# @a/!a.Oa/!E .a/!j @a/!m.pDEFAULT ACTOR NAME - REPORT THIS AS A BUG - qV\?, [?, d e?,?,?,?, ?, ?,?,?, ?, ?,d$ !%%%&e d0e?,?,?,?,d$d+e? d=e?&?&?,?,? xa/!x- pSkill: S "q.\?, [?,d e?,?,?,?, ?, ?,?,?, ?, ?,d$ !%%%&e d0e?,?,?,?,d$d+e? d=e?&?&?,?,?  Rclass miniMTLAdvDM extends miniMTLDeathMatch; function PreBeginPlay () { Super.PreBeginPlay(); ResetNonCustomizableOptions(); } function ResetNonCustomizableOptions () { Super.ResetNonCustomizableOptions(); if( !bCustomizable ) { SkillsTotal=2000; SkillsAvail=2000; SkillsPerKill=2000; InitialAugs=2; AugsPerKill=2; MPSkillStartLevel=1; SaveConfig(); } } Iclass miniMTLAdvCTF extends miniMTLCTF; function PreBeginPlay () { Super.PreBeginPlay(); ResetNonCustomizableOptions(); } function ResetNonCustomizableOptions () { Super.ResetNonCustomizableOptions(); if( !bCustomizable ) { // kills SkillsPerKill=2000; AugsPerKill=0; // CTF SkillsPerCapture=0; SkillsPerScore=0; SkillsPerReturn=0; AugsPerCapture=1; AugsPerScore=1; AugsPerReturn=1; TeamSkillsPerCapture=0; TeamSkillsPerScore=2000; TeamSkillsPerReturn=0; TeamAugsPerCapture=0; TeamAugsPerScore=1; TeamAugsPerReturn=0; // can players use augs when flag taken at all? bAugsWithFlag=false; // after that time, players would be allowed to use augs (under bAugsWithFlag=true condition) // but also displayed on radar for enemy players flagEscapeTime=30; // initial InitialAugs=2; MPSkillStartLevel=1; SkillsTotal=2000; SkillsAvail=2000; SaveConfig(); } } 'class CBPTeam extends miniMTLTeam; b,[ 6c,KQS3class CBPDeathmatch extends miniMTLDeathmatch; d,[6e,P'hnS1class CBPBasicTeam extends miniMTLBasicTeam; m,^,H]Wo s' af,_ 6h,U=aKS-class CBPBasicDM extends miniMTLBasicDM; ci,a 6k,:&ctS-class CBPAdvTeam extends miniMTLAdvTeam; o,j, Wn s( H,` _kE` .Cw` *` -^`  Ls,rk<l!?^  ^ @ir%w@*-i-i'm @~V@~q!~w@*-i( dl,c 6p,zdS)class CBPAdvDM extends miniMTLAdvDM; |~v,pV4Plm p n,o^#apo ,FLUSHp.oM.l p O l nwM*M Rw eq,e 6u,#eWpGSy,qpf::$X B-im q!~ -l u>-B r*0w.*.-N-l w.*/:.:s(>r*-B'-(@.>w@*@rU?%qx>  Q   A q+class CBPAdvCTF extends miniMTLAdvCTF; M,sXc-s-B - w*T-sa  a+ Z-s.-  -s4.- -s. -s.- -s4.--s. -s  vz,~)j q Yi=Gj HYj j Hj H mx,g 6},a5mpPSq%q%q%o%E%o%$o%#o%k$q% o%~%o%@&o%X&o%So%y$o%Y&X&C%o%vo%xo%[&o%o%L&I&o%o%T&X&}X&y$o%Z&o%IX&zo%S&q%o%j o%r$o%uT&_#o%|%\&i%o%[o%mo%Zo%JX&H%Y&iq%Lo%}o%j$\&@q%v\&`#o%O%L&o%Co%io%l$q%AX&ro%ro%Qo%}X&U L&\o%~o%\L&B&o%U&o%~o%rY&E$o%E _%Io%A%o%k#X&dq%[&xo%jS&D[&lZ&ko%\&o%XX&ET&RX&eY&bX&q$Y&IX&A"q%vq%wZ&q%do%^o%}o%x T&^X&H%Y&Q%Y&xX&n[&CT&oY&E X&eX&H%o%v%o%{X&X&Do%vT&\o%I X&xo%$[&t_%bY&`$o%W&[&G#o%To%TY&D$T&co%jo%CX&QX&V[&CZ&PS&j@& Y&F o%}X&Y&eX&Vo%|o%^ @&?T&d@& Y&e$o%qo%n$X&j$[&E#Y&\X&$o%cY&Po%H%[&F$o%s$T&@Y&xo%.[&`#U&o%o%\%o%h$\&lY&i#[&H#\&U$@& o%X&R[&|o%`X&H%\&L$[&o%x$o%A&Z&hY&Y&FY&fY&O[&O#Z&E![&H$o%o%}$@&2Z&KY&SU&gX&uo%o$[&yo%zZ&X#Y&BT&c#U&hX&YY&~[&A#[&C#Y&p[&SS&Do%No%jo%tX&sV[&I#Z&^o%k[&H@&d$Z&Co%W\&\ B%mZ&]&Z&]!o%L&o%Oq%bX&Ro%SY&`X&H%Y&)o%FT&WX&H%[&dZ&`!Z&ZY&HZ&NX&H!o%P \&iS&p"o%h o%KX&qS&e[&I\&A$Y&OY&KZ&do%}Y&N @&FT&_T&XX&E Y&\Y&BA&No%pX&_o%Uo%aX&BY&hY&~@&q%H%Y&L X&Tq%@[&`#_%wT&Uo%ho%J [&Yo%gY&O o%uW&bX&\i$B@&X&P\&n#S&HS&Zo%T o%-o%z\&b#o%a@&__%bo%G _%co%sZ&oA&C\&jZ&q\&EY&Ci$QZ&A[&~@&so%l[&gX&(Z&l#[&i[&}Z&o%QS&gS&Z&LX&NY&rdS&TT&o"@&fZ&G[&}"T&Uq%RZ&DkZ&aS&bY&E"Y&GS&u X&NL&^#X&HB%oZ&`Z&b![&I$[&Zo%w @&MZ&JX&MZ&M@&po%_X&h[&`#o%mU&tX&W[&kY!o%~Z&ro%_%T&mB%nZ&a Z&h [&NW&M&X&ET&\#[&E[&DT&pY&F Y&U#Z&hX&m~o%v Y&{"Y&Ro%p$Y&P!Z&T&nZ&a!o%qX&TY&I"Z&iS&V[&SZ&O @&oS&JZ&j@&yFX&a$X&nT&yS&\Y&["Y&]"Z&Co%aS&nq%-o%So%NZ&F@&Tq%\&s[&yZ&Do%qT&xS&zT&iX&Z&QX&{o%yY&BY&S#@&Z#Z&c[&u%D Y&TX&XX&{!o%fY&t"q%[Y&pS&i@&jo%\Z&LS&p"Y&NZ&iY&Z[&KZ&iX&y[&KZ&M[&ko%co%q$o%uS&aX&OU&AZ&I[&`#[&Bo%LS&e Z%"]X&$[&]Y&O Z&ZS&NY&GZ&FZ&S_%KY&H_%hT&zY&EZ&{X&h@&No%dZ&KX&IZ&kS&@X&|!o%rq%WvX&@q%po%sS&[Z&I@&o%pX&Zo%t@& o%qo%wq%m#o%h%o%xZ&Eq%}o%tX&r@&} Z&[#Y&d#q%BY&[[&E\%sLY&|@& o%sW&l%Y&F"T&K X&RX&AY&G"Y&]S&bX&tX&H%Y&|[&l\%%[Y&hY&io%L Z&`o%V@&L\&y#X&4Qo%rX&wo%m[&d"Y&JZ&AS&o%Go%K o%KS&EX&kh%@& Z&DS&FZ&H@&O@&No%rX&W\&g#o%fX&k#o%y[&x`#S&Io%Do%J T&B@&uU&p @& @&?@&v @&0q @&0Go%Y@&ybo%R@&yE_%`@&ya@&y _%]@&yB_%J_%F@&f@&b@&Eo%j@&a@&u@& @&B@&~ [&u_%E@&k_%B@&w _%CX&M@&S @& @&{ S&sU_%@_%z@&A@&C@&Q@&u o%q@& [&\i_%HY&o%@Z&PX&V o%}@&DZ&X\&fHZ&]![&_o%vo%uo%qo%po%oo%nY&N"o%l[&f\& o%AY&V"_%w@&X _%t_%s@&y @&x @&~@&o S&\[S&lS&W@&UZ&M_%aY&lo%wS& v@&4M T&o_%cT&[o%M S&k_%d_%e@&BS&t@&TS&US&zo%^\&~"Z&^Z&x"X&B@&S&_Y&@S&`A&~o%ho%gX&T&xP[&YY&ZW&bX&_%o%RS&`o%kS&YY&L\&O S&m@&QY&y!\&h[&H[&GT&UT&_T&[ T&fS&sS&GZ&`@&CS&FS&RT&L S&A@&P q%h \%%]Z&[!@&n Z&|@&L Y&jT&YY&WX&z@&\"X&go%bZ&k@&J Z&^Z&E!@&b|Y&T#Y&K @&C@&V@&M@&w@&@&F S&u"[&RZ&zo%|o%a o%N @&Q@&`"S&UA&~S&TS&}S&~Z&{\&q o%m#@&`S&M&[&{X&U@&bO S&@#[&\Z&j@&gOW&UZo%xo%d@&"D@&Fu @&joY&PS&rL&x@Z&DY&n@&wo%Yo%\@&EoX&O@&"X&#kX&#j_%HT&tZ&}[&P@&4b Y&X[&zo%_o%eX&O_%i_%j_%l_%e_%T@&p o%s_%E_%k_%m_%P_%OB%v@&{@&rB%lo%W\&{@&yX&GZ&F_%u@&c@&FY&fZ&QZ&[@&Y%R!o%V@&V_%ro%X@&YmS&sW_%q_%p@&wo%ZZ&x@&w_%o@&J_%n@&W@&w _%v@&W@&v@&I@&s @&\o%D@&k[&fT&I@&W& N[&g_%KX&y%[&bZ&|Y&rf"Z&z#Z&j#S&G\&N@&S&yZ&I _%J_%CY&gZ&a@&]@&VN @&w@&MY&~Y&w_%B@&u o%K@&'@&g _%AX&hY&W[&}`#_%wT&q[&H@&l Z&C@&R @&4N @&l_%L_%jU&W_%L@&Q @&F@&F_%KZ&BZ&w#_%O@&J@&l@&r @&o S&mW&Y _%t_%c@&+@&@ Z&OX&fS&}J_%^T&fdT&ff_%B_%tW& K@&hX&w!T&K"X&sY&J"Z&a_%sZ&p_%r[&|@&A @&H Z&@[&CX&+m@&Y#@&y"[&h_%kY&DY&6T_%G@&YE \&v@&@Z&lY&a@&OX&mY&6U_%u@&e"Z&u#T&o"[&|Z&y@&uN _%~@&mS&ES&up"\&VT&fBZ&iWo%{T&fgZ&h#@&c"Y&t!_%}Z&o@&"@&MZ&^Z&]_%|_%{Y&d T&k _%z@&G@&^ o%O@&sj \%%aS&\%%`Z&|Z&{S&yS&z@&|S&{T&o \%%_\%%^\&mo%H@&q Z&L@&H@&M[&g[&F[&C@&W \%VS&V#o%X\%U\%T@&u\%S\%Ro%iS&LS&QZ&IS&Z\%Q\%PZ&s @&t @&Z@& S&kS&}Z&D\%OZ&e\%ENY&w\%EMZ&\!Z&MY&rA\%sI%4P\%nG\%nF[&~[&}[&~[&[&@[&dS&AZ&}Z&~@&4D Y&XZ&b\%nD[&so%MZ&Do%Qo%To%_ \%nCX&[\% @\% \% ~\%|\%yX&I\%x_%`_%oS&|[&U[&V@&m S&V#@&K_%n@& @& @&X @& @&sc Y&fS&dY&xS&cS&aS&__%k[&a@&FX&VZ&^!i$WVo%No%Uo%` @&pS&V#S&{S&|S&zS&~S&}S&AS&BS&C_%$S_%$P_%$M_%j[&Y][&YTT&x_%kS&@S&PS&HS&CS&AS&BS&VS&US&WS&IS&JS&gS&GS&F_%lS&fS&DS&yS&6X&JX&oS&@@&_%m@&n S&MS&ES&sS&g[&gT&YW&sb[&`[&V[&y[&zX&zS&Z_%nZ&\x@&h"o%h@&U @&\ _%o_%Y_%p@&z _%u@&y@&~ @&@ @&A @&B @&C @&D @&E @&F @&G @&H @&I @&mD q%,j_%X\%tmY&u!S&B_%WZ&c@&B @&e_%T_%S_%R@&cT&W#o%t_%Q_%PS&p"_%NY&x!Y&P#_%M@&P_%L_%Jo%_%I_%G@&D_%xo%w$_%y@&u@& @&Y o%@%@&M @&] @&x o%B%_%@&g _%AX&x#@&R@&Y @&n@&a@&y@&c@& @&V_%D@&A&~A&~_%Fo%I%_%E@&D_%C@&`X&[_%I@&V@&i o%Q_%fo%%_%[_%\@&y`q%jo%r@&yV@&yJ@&F @&u@&{o%O@&]@&u@&%z@&!B q%x_% y|miKgVZ W'} xjTqg~\ Le_S q S ~T tK Q_O$ M_# ZW {g # u}EA_k F_G$ S ] _ hky G G S T \ aW Sm H {__ H SU Sc ] q [ }QIlW hfL_ t QS S a V nq @${ v# I_u V `$ c` o D$  O$ K-XXlfW k u*i&A Xj A%xW h G k T C& a k n # z O$ G O$ T h a"C$n S ~W # K G$ X Sd SrH@ # Q f^D l _y-_G]{ U Jb D#qW G$ ABM # [ P h }uT%D>O$ R x_k Qm k { mGW ~U G$ c O$ p G$ }  I[V _ d ^ qT%~_L h Z _g_uU{Cm_~_La _Z _ h G u _B q!P _^H%l0s#z ZnI ^ wH%EH%S [ao Y" ~_i JF WF d Sq| Pq hM1 # [ SgF u# B` N O$ [ X g0\tND E Sq q _ ` l ~y a G `$ TW i a1 ` mq zJ@G k G `$ S G$ ` ^ m W{ G$ IP$V k eU w q u ~ m$ KRX Ldh1 SL @Zvi~ _$ z\f G n m1 k zk G^ TKX bSnf # |^ IJ }Wm H%em L% sq F @ SMW d![~ ~ ix }v }D _ R i _ # k mx ^ FL}S Ca WJp @  z A G M TR `W O$ m\$z _H `VO$ d h pO$ }_q I G U b$ b ~oFE }4J1g G Dm$Q _ _ v l O$ y7 {Ea G S v ` D& lb$ y `#EG Tg @$aG o G |_t Id[ V4 J$ d qqG  t LmG Y^ f4I! t }@ qN Z\O$ k}# xb% D I! P e \w iW yv F&Dsd" R) ^  _ G$l ^ z ^ HFM V9 _ c^  o'E |^  ICBV k X O$ e }rUAO$ P _$ \0_! h ku~tD O$ xCX D[$P)S_u m _ zG$ Fm zS`$ a u n X{} |Ip XN$ f$SsAA%G$ PN ]O j_` wN DO QN ^z N$ k|xO F cS-Xb T$ po }O$ Jm WN$ dp q@ e@w ~ N~ K% [ k! h w%u N$ C4 G Ok h\q Sjq vx E& F KS1 G$ a1 `$ n K{ i J \ W a d Sq u FP L G$ Y N$ f S$ sS _@R_}O$ m e y ` F G$ S _ ` i m%F z| ZG O$ UA ca q D o Q O&]]T" kXw `F O$ T B! a ` n ] { hH0 ZV]|" d Sqq p W C% KW e X F#eS u oB { P Q#_^ a# meY z [ FI SR@ ~` Zn@ h})t# K r X Se qs)H%A S  O ` \ci M wq ~ Cq G% PO$ ]i jS yq F% F @ S{$ ` ^ m^{eI{W ex @ q _ ~B!KB! Y-o fO$ sJ @ @ H% M"; Z_s f$G$ s_w @L@ MLKZ_G! hLD$t_u BLE$OO$ ]Ly i$k voCFQo_Fmo{$i I;R$ VV$c$# r=O$ ~O$ JJ E$WJ D$eO$ sO$ O$ La XJ KeJ y sx E$@M" N^ [x D$i G$ wx KD SRR`D Snx y |s I` O$ V E$b D$p K~ `$ Ld Y@ ` hRtW F B~ J% OW S  \ qi L x `  E E Q ~_ N  m O$ z O$ FSS O$ a J!m h { v# H e U O$ c= b  p `  } qJ)`$ Y G$ f # s N)D$ MT H% Z>] g>z!tVR CGP }` Knq G|teJvnof S] O$ kf G$ x SEw" Sn" ` B!l ~z j$HFN V Jc | q~ P ~| O$ K`XP& icv # E `Q i _ l% l I y NF k T ^a y om #|7 O$ Jx w%V b  d@ dqx O$ a KLcDZK^]U lz u ysE! F KS/ e aS ~nLO$ |ss  Isu V O$ bbM n {z m$ H m U m$ b j! o a| XJ)b X ^ f B tKAN OB\ ] m jLw%w ~E m SD% ` imd" { O$ H m U ~ bw n ow o | k I P! V }# c w%p e ~ W K J X M% eJ w%r ] @^  L # YO$ f h r Ou ME EZJ O$ _ i lm$ y Y F OS b  b ~oj} m KO$ X m d lq `% m K m X # e Kr S$ @A} L KIv# WO$ d `# p G$}` Kb  X~el s-Y  ` LeF Y _ f u sv# @mKM ^  [ ~h` v~CO$ R,T^,D mFD z w% F XS,ka Z  pv# }` J {W we~t,e% C] P o \ D$ i[vZD|RRun` NO\ O$ j O$ vKBG$P|r# ^ m k|  x|bE|d" SH%`z m n W  { k G bX T s m l Uy W Y H 5 H%T h m b ao dr% } W J J c m W W ~d $u r H% $_ M ds% Z du% g f k t OX A  \M 7 Y\ .O$ j |ov 2X D | jP |`# _ ]l ^| @ QL 5}#Z \h _S$ x M#E _S < w%c < M q 4 O$  { Z K |X X 7 v e |F r t H% ?b M _r Y 0 Je 0 i s [@ < PP "K ^ ak d z "_G / R U dt% c WX p YX | Q C% H 1 _ U 1 u b |~! o W K |  G I 1 ^U = H%c XEq K K M ZZ  `j b y jxF ]L# ~  D$ K  `$ X  @$ e _r ]P" @ 5 b  M  G$ Z `g d u K B ]Q" O _\ ]_ j q t w q uD K R se_ sO$ D fP Y^ # n _{ O$ I O$ V r"c w r `  B  K |H%X u f _ s e @ FO M w Z `g FH u 'R B ^ N x\ d m T z FG {U O$ c ao p } g J yW G$ P L] N$ k O$ x r E pQ H%_ ` m hz ] H SU H d c$q v g$ M 0S! Y jf  ^ u J C 0T! P 0U! ] {j J c x 0V! D 0W! Q O$ ^ J w j  Y w Q& D 0X! P w%] J F k  x ~E 0Z! S O$ ` m S$ { h H G$ U N% b H" o S| n K J {X mf G$ t ~ H A j"N  S$ \ z%h F w K D  D$ Q S^ L{l  `$ z RJG 0f! Q ^  ^ l w z  G  R$T |  b P  n c { s  G h T  C a O n LF | m!I  ^ W  C e  Xs V& A A!M *C \ W ` i  J v su  C q" P Lw \ B i Lc v {B r  P S\ q  j W v w # ^  D W uQ H%_ x c m x w y o! F ' ^  S |  ` x F l x {y f `$ G t  T  N$ ` + ^  m  ] z f S$ G uS f D$ a . h n g { XTI p! W 5 m$d 5 u$ r x `$~ D ^L x aZ W c!h z v ]lE W ~ q ~ ~  v# K W rX K f W  t z g% A EN ac |$ q a a} @ K st  W si  d Z~# q S h} Z> K  ^ X M" f 9s  c B J  O j\  t$k n!z m$ H a v# U a ~ b u o z { \J s! X pe MLt n @ @  m$ M E! Z n g ~  t J aA ~ O$ O _\ I_j W I m$ V } B c O$ p J `$} i K ~ W F d J _q e b M }  [ Hfg Y_M ] l G y  b  F ] S g% ` G m tz # X M d ^ p `$~ hL V Z hg U% u m$ B aO YK] B h ~ u DCB pE l T n a ]% n  v# { > H  @ U a a T$ n n { O$ H XhU e } aJ ]x X zP S ^ I k Y y h F `S @ b k> n @Xz ]R ~` hn gV Zd  ar X  @ }$L  v# [ ,j% h  vu s D # Q 0} ]  ~ l G> y @ E 0k  Q H% ^ ak }yy N r Z$   BL O$ Z B g v# t ~ A m!N  v] d l fy $ j H e V _l b $ ao X# } XSJ  $X dK | ]  J t G W {d 7 O$ r _e  8 A$L 8Q$Z 8 `$j 8 p x @ YE K#S S O$ a I G$ m I k z < L"F Y aT Y Kb Q O$ p W L | k x I q YV ]e d rtq |}! e Jr |W@ WO J ^ J k M x b E B$ S C _ I l W" y G$ F mS J a M n  v# { VH W" W bd C t RA G$ O > \ x@ i _u FI C mP H%^ ` l J y M F h S w%` man `$| J J mW b  e k r 0M!  0N! L 0O! Y 0@  f 0C  s 0D  @ U$M b  [ X$h O v B# C t P 0F  ] hj V`# x mv# E ># R m~ _ D$l 0S  z `$G LaU bc Br A@ L N L [ D$h `$v L`$D jR 0X` ~ n iv{ v# q i~ ljL ~ v y C L_O m" ] aj  H x @ E  {Q !> _ Rl @ { > G )G$ S m!` @ n ^z > I )# U *Rb " p g |  \ I  ] V (Sc {q >  RK @ Y e e d q ]q# ~ e J d V Qc 6 b  r @  *> K aW ]S e G$ r k  v# K ~ X *F e  `$ q  D$ ~ x _J 4 v"X D$ f `$s `$ A # N p! [ Sg o! u SB o! P p! ] |# i p! v o! B SO |# ] p! j o! v )O%C )b Q )Q% ^ Sk Lf y LY$ F |# S )k ` !|# m x z RG `$U Xc ` q g} E$K gY gVg E$} 0P  K >n% X 0O  d 0L  q V_#~ fIL m`$U mvc k Y d f c s b @ ZM K!\ |ok |# y ]F u T oY  a vwm %[ d 6Qs ?M$A 9Q Q Xn% ^ nBk XU m a  z f  G g  T ega c H ! U `$a nho nM } =~ I =B V =x c G|# p s` } z]$J B" Y C" f D" s ~  `$M P% [ ^g ^v Z! E ~ Q o^ f$ l g% y ^ F s T |# ` A!m @!| c]K  h ^ w J f E F R J Y$ ^ F k mw f E BoQ ^ @ m$ N n [ pj u" x H E }" R n% _ ~ k Ew J{  L  u X  m$ e { r t  A  ^ N a]\ x y  m$ H a `$U |c n% r }" ~ H K _OX u" g x t x f C n P m  _ x Y$ l } y y f u F j S } ~ b i o / m$ ~ 2 m$ K 5 ^ X 9 ^ f 9 m$ t ^IA v$J D v X \d W } r \ I M W T  [ H h \Eu `$z W v!H W wV S O$ d W \ q S _  @ }# M s Y e! e Z|# r g!  g% L UY r!h H v  T B hP [  ^ ok n L y f E q O$ R Y$ _ w W l w O$ y VYF J _ X_l ZVK ~a l o n | R% I O$ V f  c _  o _  | V% I W% V X% c P o  f# | a% I c  V `$b n p A$ } ` I l U _ b [ p y} [ L | Y _hf k|# N T$ [ w g  A%t B B ,[  O r \ ,k% i {  v y  C x  P ]] K!k E y v  F m%S Ia  ~o  T$ } p% J _V  J$ d $ v q $ }} $ {K $ KY f g et / Q C P H% Q 1 b ^ 1 c k 1 d x bE q T U Xa U co U d } ^ B$ J dg W ^ H%e a H% s d @ dh M 0 D[ m Ei dk x F  e# T p k` s n dL  } N# J 8 @$W < Ye @ `$ s @ D$ @ I `$ M | } Z I D$ f I P s S a@ S KN Q `$ \ Yi W zy k wI lYW n`p ]d P q r ] ]R" j q s w ]S" D O Q J# ^ r k k z |  I G& V H& c u o L | `$ I D$ V X" c d p k } `$ I X" V D$ b To FL~ FKL FJ Z k g Ft J B `$O E$] D$k j y D$F K T N& a @ Lm z y e E SR x a G n H { nH g" V ` c _ o s | KI d"W R& e }# q \ ~ l" K ^X  | f  B s  H% A ^ _N S$ m ` _y b _X d _w  s" V  Z c  w p M|  b M  c Z P g 0f _t *|# S 4 ~` 4 G$n 6 ` | / Z I  ^$ V  ^b ^$ q  V& ~ gK ]z"Y ]Xh  ~ w  D$ D ` P F\ ` j W Pv ` F U uR p G S$ T R d` Q PD s 8T d L S X Ye w%s D PA C PQ y a am W{ I  I i" V E$ c Yp w%~ {  L B LY Ye Q s WA E O A L\ Kh av _D b" R c _ b k ~Lx {PD zPT  Kd %E o @ B| yL~ JJ xLX 'Q d d!q wP M O ` \ K& i Jv J& D l  Q X^ \ l A x z H KW ]O" e onr v  ` | L"m a| t  J w%W h  e  R#r z KE z aS mia z L J s YW e s w%t o ]# B kxN g hF h YT G  b h w%o c Y} iy K c m D hk Q g^ | fC Z Y H ] Y w% k Q D$ x [E Q SU R C c S H o S L} I }% K N RX N Yf K @" t N w% @ G _# M F RZ eHHh F Yp m ~ @ SM F w% [ 8 E$h > ` v 8 D$B = _P o ^ ^m < R} < m K 9 ` X c[ d 5 _ 7 JM p [ / Rj / Yx , ` F / WR $ g ` $ [ m 0` z _ O a ^ b m T| u L 0w  [  D h 0~ u  K C QP R`  d" n  b{  r#I RW az g  S$ a c  m Syz a  s  h @ V[M  _ h  v u sB `c Q C  t q A e# N T$ [ D$ h {# u `$ B ,r `O {# o x| M K g X L e ,_  r LN ,^  M ,f% Z h g p t ,R A f N v Z x f ^s mB ^hQ `$ y D$ F ,oS t g ]  t E A r"N ^r ] O OZ O[ c  j  v r B[% OW p\[% LV TXU cl M" O ` \ {# i X u c% B {# O ^ \[K j S% u ~B L!P T]^ D! { C! Hz t Uz Y% b y  o l  | h  Ip Z" Vp M" b a  o \ |g g% Kg Y% W v!dM r} X@f x N\[hi} k y QYF` w%_` x%m` n% { G H~$ V_#bGpo E5R``eW r! EW qRW o` P_n} } M} d# ZD U git3IbfXA U ~OaJ2 ^ k/ ^ y- ^  GiTV i v# I Z V ^ c M]q C" NU [ t$g bu {# C `# P Z ] {# ihvkSF x Y KwfB" ]`# jn w^ Dd`RY% rg% ^  KM" XZ" eY% q{# ~t KGwX{# OFN\` jE^vM" T^ ar o^ |I"JRl` z` FB[S\no }_JD`Yt# yRE3 S$ S{_O oz |-v# I^Vp ez^$ rU ~gA Jwp Vx{# c U pP~}u{# {=v Hlj Uij aii mfF! zf| Gfu T_x a_p mUp zOzGKzVCY eCzr9J A9L NBf [=p h/g% u w^A/Y% _.M$l"^ |"[ I"Y V"V c j^p(Q% N(b Z"U g"D t"R A$q N{# [Dt ht t{# @C MZZ uwhd% _alKzt^HRf] t s^AC _ rzlp! fF sa{# Mo! ZKg{# up^BF `o^ln^JF hatKBp! P0I\{mO }z J0R  Wo! d_#q0T  0X  L0Y  Ys fSs0\  A0`  N{[O kz x0HEo Zh!gi! us BR O{# \l! i{# u{# B{# O!U \`# hB u~ B{# Oi\{# j?EwW$ | `H |hO$ d! Tq! `EW$ ev q!?E~?ECW$ H!pT]K$4lD}0Pgp 0l VW0OPmD$}E$K `Y 0{ky 0\d oK@W$ K wSW |jW$ f0N{s0M@n0LznW$hMYw0KOPN_ oKmW$ x lwID{# MW$ Z @gNRgC-ysIfW$oMf~2Md) }qd nF${K_em2Y{K$4P T )BdF$f~JW$ YfQe0PEv{# {zK$4+HG s @@NR@yK$49RC-KW$ x }Ed B JBOKQe_fcmwK$45P xEa }sIJW$ S"K$4bM_*?EA* `FeKfG q* |~oK$4u z0IlomK$4C[BI^ }gd d TP qKAeOl6]# S x``$ XE$ejK$47sD$jD$ xG$ Ek RG ^ MxkfK$4^ cK$4yAK$4X zg7RfN,Ijjup_ ]BON,Qjj}D#gW$ JN,WjjCbymW$ f?Er tw0HdkD tO `Co {coN-^!jjKW$uK]C { x` |XH%T0GZb0Fw|zTsP ,G)O$ sRK$41@"qWqw0BVH.W$ ^4W$ k"pbx2W$ ZLIg"^]pM 4M5W$ A"\FMKFS8W$ Y"bBeYK$4-g "W/T0EbC"oGeZK$4Ml?W$ yh[F "p Ra>MsK$4o,BCW$ qK$4w~ "\!uHzVHW$e"+[soxNKW$ FK$4HS"|S[dW$ nOW$ {  BH"q JSZi "l&w0@I] "r Afbig "kUPVW$emE$s]K$4J@A{ZKK$4M ePA.rfW$ sf`# fiLmD$Zi)h0CjQIC{h.~K$4zlwGfeW$ mK$4V.zzoPprZo=`# I=iV ,d Q5P[EuW$ `?El~6q]&g `M o mH`K Tk 0Q @u]K$4J&\ rXfW$ ~ JM K`:X l&R|W$ xn E\ d] q ce~0eycW$ \Qci 'bL~-nW$ [ DAhkKiW$tMYCK$4e \ s SA uTb I IWW{# n v[{ @VW$VCK$4D5d #h`KW$ Zj]gO&DW$ jW$ w@KDW$ O Ya\NR}khOC-wW$ di 3q  (d@FL E]RW$ o)K$4ws|VNsfeAsIfRuoW$ dt @p~ pW$ }K$4YJp*cK$4{)Mb[H0z}c R g`iKGW$R K$4f`E$F%W$ T%*`D$JW$ Xh`e0fnEW$ s`_@Jz_RYcg_Iv0 W$ _gql_e]K$4a-BAecK$4phH]2xr jGpvW$ f^  rK$4}^  |Y SI^ \` jH4DvG?EzRG `MI1BmK$4So a^BG |`H4y\H%UI1=c@" `dl_psT=cW$`K$4pnW$ ^ U\k0HAG0GuHH4B}TW$ MI1AZ E$[ D$ikthwfK_` jK$4t wK$4j kH #U W$ xHJ4uD0EuyK$4EnIJ1]spP w@HS4A W$ @?ELkStsQK$4LD ` Pw  ]TFngv  Uj _ `jV JU UT `TA~kS i TtHT4LHK$4rsTm0DmFIT1js S {]i XkTtkc]cN ` qS$ ~Ir1RJO,\eI*H% W$ rHa4a~g (_Ia1RGK$4HYH4`a $ A I1.^ F$L H43p 2dc , d G I14T  F$H , ml H4Vz , KP p^d^ : q B I1EN p!S , et , v# B {6N  2TD K$4>X yiV W K$4y,V }PO!{[ _!K$4