[Setup] Product=Gamebots Version=10523 Archive=Gamebots.umod SrcPath=. MasterPath=.. Group=SetupGroup Group=GamebotsGroup Group=umodIncludeFilesGroup [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=509,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=294,Flags=3) [GamebotsGroup] File=(Src=System\BotAPI.ini,Size=1332) File=(Src=System\BotAPI.u,Size=290284) File=(Src=System\FriendlyBotAPI.ini,Size=2184) File=(Src=System\FriendlyBotAPI.int,Size=205) File=(Src=System\FriendlyBotAPI.u,Size=4005497) File=(Src=System\BotAPI.int,Size=749) [umodIncludeFilesGroup] File=(Src=Help\GamebotsReadme.txt,Size=3184) [Setup] LocalProduct=Gamebots ReadMe=Help\GamebotsReadme.txt SetupWindowTitle=Gamebots Install AutoplayWindowTitle=Gamebots Options ProductURL=www.planetunreal.com/gamebots/ VersionURL=www.planetunreal.com/gamebots/ Developer=Gamebots group DeveloperURL=www.planetunreal.com/gamebots/ [BotAPI.VizConnection] bDebug=False updateTime=0.200000 [BotAPI.BotConnection] bIterative=False bDebug=False visionTime=0.100000 [Engine.GameInfo] bMuteSpectators=False bLowGore=False bVeryLowGore=False bNoCheating=True bAllowFOV=True bExternalBatcher=False AutoAim=0.930000 GameSpeed=1.000000 MaxSpectators=2 AdminPassword= GamePassword= MaxPlayers=16 IPPolicies[0]=ACCEPT,* IPPolicies[1]= IPPolicies[2]= IPPolicies[3]= IPPolicies[4]= IPPolicies[5]= IPPolicies[6]= IPPolicies[7]= IPPolicies[8]= IPPolicies[9]= IPPolicies[10]= IPPolicies[11]= IPPolicies[12]= IPPolicies[13]= IPPolicies[14]= IPPolicies[15]= IPPolicies[16]= IPPolicies[17]= IPPolicies[18]= IPPolicies[19]= IPPolicies[20]= IPPolicies[21]= IPPolicies[22]= IPPolicies[23]= IPPolicies[24]= IPPolicies[25]= IPPolicies[26]= IPPolicies[27]= IPPolicies[28]= IPPolicies[29]= IPPolicies[30]= IPPolicies[31]= IPPolicies[32]= IPPolicies[33]= IPPolicies[34]= IPPolicies[35]= IPPolicies[36]= IPPolicies[37]= IPPolicies[38]= IPPolicies[39]= IPPolicies[40]= IPPolicies[41]= IPPolicies[42]= IPPolicies[43]= IPPolicies[44]= IPPolicies[45]= IPPolicies[46]= IPPolicies[47]= IPPolicies[48]= IPPolicies[49]= ServerLogName=server.log bLocalLog=True bWorldLog=True bBatchLocal=False DemoBuild=0 DemoHasTuts=0 *E@""*ZHwB"None SendLineBotAPI PlayerPawn BotFaces BotNames BotClasses BotSkins RemoteBotAddBot BotTeams GetArgValCoreSetProgressMessage NeedPlayersEngineBotstartupBegin SpectatorLogTeamChangeinFront ChangeTeamDying GetGameInfoGetGameStatusSetProgressTimeBotpackGutHit StillFrRpTournamentPlayerRemoteBotInfo Commander StartMatch TakeDamage ClearOrders TooManyBots FlushLogLogPlayerConnectPostBeginPlay RightHit ParseVectorClearProgressMessages SetOrdersClientReplicateSkins AddRemoteBotSpawnRemoteBotRunSmTimer StillSmFrSystem DuckWlkS SkillTauntsFindPlayerStartTweenToRunningTweenToWaiting StopWaitingRestartPlayerPlayTeleportEffect FallingStateSkillsLeftHitRunning Fallback JumpSmFrDead3 PlayDecap ReBalance JumpLgFr SpecialNavig WarnTargetRoamingDied AddToTeam LongFall DuckWlkLWalkSmEnemyAcquiredWalkLgSetText HurtOtherEndGameCHIndividualizeRunLg GetValue SuicidedMoveMesh BeginStateCHGetBotClassUWindowDoneDead2WaitingForStart PlayWaitingLanded GetBotTeamChooseBotInfo GameEndedSetFall monitoringDead9Defend AcceptedSelectionMesh OneOnOnePlayStartUpMessage TeamSkin2IpDrv FreelanceProcessAction bAllowFOVNetWait FaceSkinListen CountDown ReceivedLineDefaultPackage MakeItem SendText MinPlayers ReceivedTextDead1 CarcassTypeDefaultSkinName WalkLgFrAimDnLg ReduceDamageDead7 bLocalLogDead4 bPauseable BotMenuTypeRunSmFrServerReStartPlayerHeadHitRunLgFr WalkSmFr ForceAddBotLogSpecialEvent MenuName InitialBotsAddDefaultInventory RestartGame GameName TimeMessageLogoutAS PlayInAir PlayRunningTestCloseDead8 PlaySwimming PlayDyingFollow SetBotOrdersSetAttractionStateFor SetHelpTextSwitchToBestWeaponAnimEndTweenToSwimmingAimDnSmGetSelectedIndexInitforbBalanceTeams BaseChangeWaitingForInitbPlayersBalanceTeamsPlayDyingSound TrackingJumpingAimUpLgTreadLgCreatedSetFontDead5PlayVictoryDanceAimUpSmae SeePlayerib SetValueDucking VoiceType TryAgainTaunt1 ZoneChangeForceMeshToExistStrafeCreateControl Victory1 PlayRightHitTreadSmTurning checkVisionUMenuTweenToFalling PlayGutHit PlayLeftHitStrafeL checkSelfSendVoiceMessageshotVoicePackMetaClassDumbDownChangedPickupEnemyNotVisible Decapitated BeginPlay FixedSkinKilledzappedRemoteFireWeapon AdjustAim RemoteJumpStrafeRFireWhileFalling GetSpeed LostChild PlayLandedBreath1FireAltFire PlayFiring GainedChildTeamBroadcastChangedWeaponTakeHitChat1Thrust InitRecievedAlternatePath Breath1L Breath2L ChangeNameTweenToFighter StillLgFrWalkBalanceTeamsChanged ParseRot checkGameWaiting HaltFiring StopFiring LandSmFr PlayDuck PlayHeadHit LandLgFr PlayTurningBumpSwimSmSwimLg SetMultiSkinHeld ControlPoint PlayWalkingsplash BindPort AcceptClass ListenPortPlayChallenge TryToDuckAttackBreath2 SetEnemyClosedMaxConnectionsSendGlobalMessagePlayFeignDeath LightEffect SpecialFireCheckFutureSightSendTeamMessage LightType Buoyancy PlayDodge bIsFemale PlayRisingTweenToWalking UnderLift ClientDying LightRadiusTeamLightSaturation FearThisSpotPlayWeaponSwitch AdjustTossLightBrightness DrawScaleStyle bIsHuman PlayRecoil OwnerJumped DifficultyBotVoiceMessageIdleTakeFallingDamageSetHandGestureDrowned HidePlayer AddInventory GetMultiSkin JumpSound DownWeaponPutDownCollisionHeight SpawnCarcass SaveConfigsFighterCollisionRadiusAlterDestinationSetMovementPhysicsBroadcastMessage PlayCrawling FireWeapon TeamMessage PreBeginPlayClientMessageInventorySpotGlobal HearNoiseTickMayFall PainTimerHeadZoneChangeFootZoneChange EndStateHitWallTriggerLoadCurrentValuesConfigureIndivBots LightHueRandomChecked VizServerRemoteUTBotConfigSClientVizConnectionRemoteTMale2BotRemoteTMale1BotRemoteUTBotConfigClientRemoteTFemale1BotRemoteMaleBotRemoteTFemale2Bot PathMarkerBotTeamGamePlusPathMarkerMutatorBotDominationBotDeathMatchPlus BotServerBotConnectionBotAPIConfigMenuItemBotAPIConfigMenuMinPlayersHelp DumbDownTextBalanceTeamsHelp VictoryDanceTurnLg ClearControlCanImpactJumpYellAt PlayFlip SpawnWait TeamSkin1PlayLookAround PlayWaving MaybeTaunt ImpactJumpInitializeSkill HearPickupFindAmbushSpotCockGun Alertness FastInAirDodgeRBackRun MenuHelpExecute MenuCaptionNumBotsChangedAutoAdjustChecked BaseChangedremoteVisionLimitRemoteHumanBotRemoteFemaleBotBotAPIConfigMenuCWMinPlayersText PlayFallLook DeathEndUWHit2 CockGunLBaseEyeHeight DeathEnd2drownTurnSm DeathEnd3 EyeHeightCloseToPointManDead11TranslocateToTarget StatusBelt StatusDollSetPeripheralVision LandGrunt updateTime bAllowPause BotAccuracyDead6ImpactJumpingBigJumpBalanceTeamsText BeforePaintNotify ReSetSkillWave SendHomeDodgeL visionTime ClientClass SetMaxLengthSetSelectedIndex ShowModal bIterativeSetNumericOnlyBotCTFSetNumericFloat DumbDownHelp WindowTitle MessageBox FortStandard MovingFireUWindowComboControlUWindowClientWindowUWindowFramedWindowUWindowSmallCloseButtonUWindowDialogClientWindowUWindowEditControlUWindowWindowdistUWindowPulldownMenuItemUWindowScrollingDialogClientSecond GetParent NoiseMaker TimeSecondsAlignWinLeftUWindowCheckboxUWindowDialogControlRootIconsUWindowRootWindow PawnList Translocator bVeryLowGore newFootZoneOwner bPainZone nextPawnSimAnimspeed LinkStatePausercarc AnimRateNavigationPointListNetModeLandUWindowPulldownMenuUWindowLabelControl ViewRotationSetSize CreateWindow bMeleeWeapon WinHeight CenterWidth CloseButtonGame RecipientPRIWait MessageTypebWaitingPlayerbIsABotHasFlagfirstScore WinWidthFixedAreaClass bPointing NumPlayers bTeamGame GameClass HeadRegion PainTime bWaterZoneSkill Velocity bByParentTcpLinkbIsMultiSkinned bReadyToPlaybBeep TimerRate bDrowningbCanFlyRateEventInstigator bCheckedSender MultiSkinsDamage HitLocation bUpAndOut NewWeapon Momentum projSpeedshooterNKillerP LevelNameZoneusealtHitLocTeamsNum bAltFirebFireCharge NextState NextLabelOldMessageTime bGameEnded LoudnessConnectionCount ReceivedDataRemainingTime AmmoAmountbStopCountDown RouteCache AccuracyFireDir aimerror projStart bRapidFirebNoCRLFRegionEnteredMessage MaxPlayersTargetbRecommendAltSplashDamageDamageScalingHealth PointRegion Location AirControlJumpZbRecommendSplashDamage GroundSpeedControlOffset CenterPos bCanJumpEnemyFemaleMale TeamInfo VoicePack MaxTeamsBotConfigType bIsPlayerbIsPawn MaxTeamSizeSize bCanDuck OldEnemybReadyToAttackbNoClearSpecial OrderObject NextAnim LastPainTime FireSpot FireRotation TargetDist TossSpeed TossTime enemyDistduckDir NewEnemynextNavigationPoint AmmoType SeenPlayer MessageIDPendingWeapon PRIArray PlayerNameMVel2D bDuckLeftLoc2DDest2DAnglemoveDirMLand3 FragLimit TimeLimitNumBotsRemainingBotsBotNbSpawnInTeamAreaId Acceleration NextBotTeam DesiredTeamNewTeam SmallestTeam bAdjustSkill bRandomOrderaPawn AccelRate NextBotClass NextBotDesc TeamIndex decisionbDamageTriggered bUseAltMode BotConfigNewBot ConfigUsednewAnim mdrown2fem RotationRateType AnimSequenceOrdersMass HitActor impactVel bIsAnArmor bOverTime PlayerID HitNormalNewZone newHeadZoneAtLeastOneBotTextAtLeastOneBotTitleUMenuLabelControlUMenuBotConfigBaseUMenuBotmatchClientWindowUMenuModMenuItem ControlWidth ControlLeft ControlRightBotmatchParent Initialized BaseCombo TauntLabel NumBotsEditAutoAdjustCheck RandomCheck ButtonWidth ButtonLeft MenuItemPhysics SightRadiusDeathMatchPlus DamageTypebHiddendepthtempASpot TeamGamePlusAChallengeBotInfoXCEZYPitchRollj LastSeenPosPeripheralVision TweenTime SkinNamei WalkingSpeed ScriptTextSVBYawOtherR DeltaTime Selection ReturnValueStaticSaveConfigDynamicLoadObjectCTFGame ZoneGravitySetPropertyTextRemainingMinute DominationMutator ElapsedTimeTimeBetweenAttacksFocusWeapon LevelInfo GameInfo ZoneInfoCarcassNavigationPointInv MoveTarget Destination MoveTimerNewItem FootRegion instigatedBy RotationbAdvancedTactics bCountJumps FaceNameTeamNumCTFFlagCrystalPlayerReplicationInfoStatLogCountDownMessageNotReadyMessage ReadyMessageWaitingMessage2WaitingMessage1Info RestartWaitbAlwaysForceRespawn bDumbDownTournamentGameInfoBotReplicationInfoUT_HeadFemale UT_HeadMaleUT_FemaleFootTMale2CarcassTMale2TMale1CarcassTFemale2CarcassTFemale1Carcass TFemale1bHomeCTFReplicationInfoTMale1 PointDiedSelectionWeight CommandoTMJump3SoldierWoman WomanBelt FCommandoSGirlbInitLifeMessagebNovicebImpactJumping bPowerPlay bBigJump bTacticalDirbNoTactLastAcquireTimeOldMessageType OldMessageIDBaseAlertnessMyTranslocatorMoron NewOrders OrderGiverbNoAckrealYaw TargetLook TargetVel FireDist bDefendMeleeDestn JumpDest bRatedGameHolder FlagList RealOrdersRealOrderGiverbForceRespawnbRequireReady bNetReady StartCountLastStartSpotNumCommandersEndTimeaBotGameReplicationInfo bBalancingbigsmallbigsize smallsize OldStartSpotMinSizeLeaving totalWeightpartialWeightControlPointsDomScoreEventCP bReturnOnlyControllingTeam Controller bScoreReadymyFlagbCleanDesiredTargetbReadyOutStrUTMenuAmmo InventorySkin enemyDirFocus2DUTConfigIndivBotsWindowv2BalanceTeamsCheckDumbDownCheckCanvas bJumpOffPawn TempActorMessageStringHitVec HitVec2DinjureddotpbResult strafemagVelDirTextLevelMoveraPlayerExiting WorldLog StartSpot bDeleteMe CurrentID LocalLog bIsWalking OtherDir leadTarget bReversedbDebugbNoTeamChanges myConnection RemoteEnemyRemoteDestination RemoteFocus myTargetmyDestinationmyFocuslastWallHitTime lastBumpTimeActorPawnbFallLodMesh DescriptionSound RemoteTargetTextureClassParent outstringPackageHitLHitNRot RecievedArgs RecievedVals tempBooltheBotGoalTeamScoreMUWHit2 gameInfoStr TextBuffer clientName teamStringcmdTypeargBodyremendloc wordsplitattrNum curBotStateObjectargName argValue FunctionvecNamedelimStateRotator boolResultrotTargoutBuf focusTargVectorStructbBound ArmorAmountlookDir sentNavs UnrealShare plrString isVisible sendUpdaterepeatnavType theVizServer theBotServerbServerLoadedRemoteBotConfigNumRemoteBots StrPropertyStructPropertyClassPropertytheConnection NamePropertybInitedPortBoxObjectPropertyFloatProperty BoolProperty IntProperty BytePropertytu B 7\[L] #tttttttt{#Ut{#UtX'tt #tГГГГ #ГГyrүyrүyrү #yrүyrүyrүw4w4w4w4w4')L')L #w4 #w4w4 # amxj\j\j\j\j\tj\j\j\j\ #ГГГГ{#U{#UX'ѸB # ##fIn#fIn-%n #ԝX11111111ԝXtt # #2Rtt #tt #ttttttttttttX'ttttt1t1ttttttttX'X'tttttttttttttttt111tttttX'ԝXttt111tX'X'ѸBX'X'Г #ԝXԝX #tԝX #ԝX #X'X'X'X'X' #X'11[ # # #t{#U{#U # # # #Г #X' ~$4?@J@@@`F@~KW ^L #2![[ amxMnO-N]K!L4[[[{#U[[[[[[[[[[[[ԝX[ԝX[ԝX[[[[[ԝX[ԝX[[[[[[[[[[[[[[[[X'[[[[[ԝX[ԝX[[ԝX[[[[[[ԝX[ԝX[[[[[[[[[[[ԝX[ԝX[[[[[[[[[w4[[[[ amxMnO-N]K!L4[{#U amxMnO-N]K!L4 amx amx amx amxl gb$=S]{s]}u] @g ]  amx2!l D" K"S]{s]}u] C @y U@@R @so#t U[[[{#U[[[[{#U[{#U[{#U[ ]CommandoSkins.BlakeSGirlSkins.AryssSoldierSkins.MalcomCommandoSkins.LuthorFCommandoSkins.CryssFCommandoSkins.VisseSoldierSkins.KregoreSGirlSkins.CiliaCommandoSkins.Kragoth FCommandoSkins.Tanya SoldierSkins.Johnson CommandoSkins.Boris SGirlSkins.Vixen SGirlSkins.SaraSoldierSkins.OthelloFCommandoSkins.KylaCommandoSkins.GornSGirlSkins.AnnakaSoldierSkins.RikerFCommandoSkins.MaliseCommandoSkins.RamirezFCommandoSkins.FreylisSoldierSkins.ArkonSGirlSkins.SarenaCommandoSkins.GrailFCommandoSkins.MarianaSoldierSkins.RankinSGirlSkins.IsisCommandoSkins.GravesSGirlSkins.LaurenSoldierSkins.MalcomFCommandoSkins.Jaycef]YigalPaulJeffLewisMilindEdDanielBillJim Kevin Stacy Ulf Randy Yolanda Wei-MinGalSheilaAndrewDavid  Andrew MTaylorAaron RogelioJayChonJihieJafar BenaminMike  Jose LuisNicoHans "                         W$?t$?]BotAPI.RemoteTMale1BotBotAPI.RemoteTFemale2BotBotAPI.RemoteTMale2BotBotAPI.RemoteTMale1BotBotAPI.RemoteTFemale1BotBotAPI.RemoteTFemale1BotBotAPI.RemoteTMale2BotBotAPI.RemoteTFemale2BotBotAPI.RemoteTMale1Bot BotAPI.RemoteTFemale1Bot BotAPI.RemoteTMale2Bot BotAPI.RemoteTMale1Bot BotAPI.RemoteTFemale2Bot BotAPI.RemoteTFemale2BotBotAPI.RemoteTMale2BotBotAPI.RemoteTFemale1BotBotAPI.RemoteTMale1BotBotAPI.RemoteTFemale2BotBotAPI.RemoteTMale2BotBotAPI.RemoteTFemale1BotBotAPI.RemoteTMale1BotBotAPI.RemoteTFemale1BotBotAPI.RemoteTMale2BotBotAPI.RemoteTFemale2BotBotAPI.RemoteTMale1BotBotAPI.RemoteTFemale1BotBotAPI.RemoteTMale2BotBotAPI.RemoteTFemale2BotBotAPI.RemoteTMale1BotBotAPI.RemoteTFemale2BotBotAPI.RemoteTMale2BotBotAPI.RemoteTFemale1Bot]CommandoSkins.cmdoSGirlSkins.fbthSoldierSkins.blktCommandoSkins.dacoFCommandoSkins.gothFCommandoSkins.gothSoldierSkins.RawSSGirlSkins.VenmCommandoSkins.goth FCommandoSkins.daco SoldierSkins.sldr CommandoSkins.daco SGirlSkins.Garf SGirlSkins.armySoldierSkins.blktFCommandoSkins.dacoCommandoSkins.cmdoSGirlSkins.fbthSoldierSkins.blktFCommandoSkins.gothCommandoSkins.dacoFCommandoSkins.gothSoldierSkins.RawSSGirlSkins.VenmCommandoSkins.gothFCommandoSkins.dacoSoldierSkins.sldrSGirlSkins.GarfCommandoSkins.dacoSGirlSkins.armySoldierSkins.blktFCommandoSkins.dacoz4KRSgJQ&@Vf|@`^:;7@V`@h@{JuO ,'w4E2!l D" K"C!@\w[ tT>xd  Z@zv E t{0B yAP@+Dn@I@]U i6rK!L4'#t #t ֟w4w4[[ #[ #[ #[{#U[{#U#t #t [w4[[tttt{#Ut[> Y[[[[> Y[t[{#U[{#U[{#U[{#U[{#U[w4[w4[w4[[w4w4& & & & tttL]L]tL]L]L]L]L]L]L]L]L]L]t{#Ut{#Ut{#Utttttt{#Ut{#Ut{#Ut{#Ut{#Utt{#U& & tt{#U& & t{#Utxx[tttt{#UtttL]L]L]ttttt#fInL]ttt{#Ut{#UL]tttL]ttxxL]L]L]#fInL]L]ttt{#UL]{#UttL]tL]L]L]#fInw4w4ʇ`L]{#Uʇ`ʇ`w4w4w4ʇ`L]{#UL]ʇ`w4t{#Ut{#Uj\ttttttt{#Utt> Yttt> Ytttt> Yttt> Ytxx> Yttt> Y> Y> Y> Y> Y> Y> Ytttttttt> Yt'n 6'n 6'n 6'n 6 amx amx amxttt{#Utr[{#U[{#U[{#Uj\ amx amx amx,'w4E amx#t R eShSx"p"s"M"CoD]! BotAPI.RemoteUTBotConfigSClientP]Remote Bot Capture the FlagALY6~Mn}"##t #t ֟w4w4[[ #[ #[ #[{#U[{#U#t #t [w4[[tttt{#Ut[> Y[[[[> Y[tttL]ttxx[{#U[{#U[{#U[{#U[{#U[w4[w4[w4[[w4w4& & & & tt> Yttt> Ytttt> Yttt> Ytxx> Yttt> Y> Y> Y> Y> Y> Y> Ytttttttt> Yt'n 6'n 6'n 6'n 6tttL]L]tL]L]L]L]L]L]L]L]L]L]t{#Ut{#Ut{#Utttttt{#Ut{#Ut{#Ut{#Ut{#Utt{#U& & tt{#U& & t{#Utxx[tttt{#UtttL]L]L]ttttt#fInL]ttt{#Ut{#UL]tttttttt{#U amx amx amxttt{#Ut amx amx amx,'w4E amx#t R eShSx"p"s"M"CoD]! BotAPI.RemoteUTBotConfigSClientP]Remote Bot Team GameAHt [6kN]L#t #t ֟w4w4[[ #[ #[ #[{#U[{#U#t #t [w4[[tttt{#Ut[> Y[[[[> Y[t[{#U[{#U[{#U[{#U[{#U[w4[w4[w4[[w4w4& & & & tttL]L]tL]L]L]L]L]L]L]L]L]L]t{#Ut{#Ut{#Utttttt{#Ut{#Ut{#Ut{#Ut{#Utt{#U& & tt{#U& & t{#Utxx[tttt{#UtttL]L]L]ttttt#fInL]ttt{#Ut{#UL]tttL]L]L]L]ttxxttttttt{#Uw4')L')L')L')Lt{#Uw4& & 'n 6& {#U{#U& {#U{#Utt> Yttt> Ytttt> Yttt> Ytxx> Yttt> Y> Y> Y> Y> Y> Y> Ytttttttt> Yt'n 6'n 6'n 6'n 6 amx amx amxttt{#Ut')L')L amx amx amx,'w4E amx#t R eShSx"p"s"M"CoD]! BotAPI.RemoteUTBotConfigSClientP]Remote Bot DominationAIR\6LO--%ntttt[{#U[{#Uw4[{#U& & & & ttL]ttxx[ttt> Yttt> Ytttt> Yttt> Ytxx> Yttt> Y> Y> Y> Y> Y> Y> Ytttttttt> Yt'n 6'n 6'n 6'n 6t{#U& & tt#t #t ֟w4w4[[ #[ #[ #[{#U[{#U#t #t [w4[[tttt{#Ut[> Y[[[[> Y[t amx amx amxttt{#Ut amx amx amx,'w4E amx#t R x"p"s"M"CoD]! BotAPI.RemoteUTBotConfigSClientP]Remote Bot DeathMatchAf @i @JZ@XEtGiM@ b@k@r@l@@qKD@)UP@]TqW@v B G@Y ]a@L R@cq W\b*@lXM@IFFpuY d@`@^p  @R@Hu\mrQuPS_@y]}eD@K8{@\c @d1OTb@@O@.x@d@9@Q@i_X}l@m@dEM@`dG@PSj@t{L @hI@K@}@?[@ps@d@o@W Af@^@veZ@DO w  rbMn| @B 7DxM~]H]H]H]H]H]H]H]H {JFRQL]BotPack.VoiceFemaleUEMio VB 7 FWM~]H]H]H]H1 {L]BotPack.VoiceMalew e@Q @@a\CkG B 70M~[X'X'X'X'X'X'X'X'X'X'ѸBX'X'X'X'X'X'X'tX'X'X'X'X'X'X'X'X'1X'X'X'X'X'X'X'X'X'X'X'X'X'X'X' cH$AM$Aw$As$BS$BbIOLei O@xaF \h@`H,iZ@a[l@quX  hSo@q@I@JP xfO@cED@{z f@CmG~I @Y@ @v Rdu|y VBlTh B@g ^rs /ds[@~@3q ]I @|@_ r^\ MF.bG% - r* ::$ ::$ h-eG= Ga>> KM KZG=> \qkbM Kb\L? pppppppppppppPRJTimeUKZDirectionYPb GL @LVR@AS X V ZV%ia!A333?= CfJ"pmHJCbpUUppppppppppppDAMDamageSJDamageTypeWUStz_C WC _2WSL?UppppppUInstigatorVC U jWwE~ C@@x@$[0!( !pa&!xYL?a&!(xYa&!px ZfPN|,Ptp_] Se@Y ]qir qa!333? WwrT@F | oHkos`kppppppppppppDIEKillerVoDamageTypeWs z,{@e x sFs`[-^@y,H@I @zD VA,By@ @Ngqy|F@u @5@Oy@pb @@~@`@{@@Lo{ u@M ecbAhFwL! !\<?a&!=hIa&!(huh?a&!hua&!\h RW@Ukk@zt @t[ niU}l~w)[0!G !Ba&!~YL?a&!G~Ya&!B~ ~EIm Q;ʕ2!,'w4EMnO-N]K!L4ttttt{#Ut{#UtX'tttw4w4')L')Lw4w4w4ГГГj\j\j\j\tj\j\,'w4EMnO-N]K!L4,'w4El VU$L>S]{s]}u] |vG&[0!= !Aa&!vYL?a&!=vYa&!Av ^@QYT2XDR\dL|.XڨL}"#|.Xڨ}"#}"#tt+X-%nt+X-%nt+X᱘_4R_4R-%nR_4R᱘_4|.XڨR|.XڨRt+X-%n|.Xڨ}"#|.XڨLt.'lo R|.XڨRR|.XڨR|.Xڱ|.Xڱ|.Xڱ|.Xtt+X|.Xڱ|.Xڱ|.Xڱ|.X+X|.Xڱ|.Xڱ|.Xڱ|.XDZ 2[]Balance Teamsc]If this setting is checked, bots will automatically change teams to ensure there is a balanced number of members on each team.b]Enhanced Team AIk]SQEnable enhanced team artificial intelligence features for the bots in this game.B]Min. Total Playersa]sqBots will fill out the game to ensure there are always this many players. Set this number to 0 to disable bots.<  Experienced< Skilled<Adept<  Masterful< Inhuman< Godlike4They know how to kill.4Don't get cocky.4You think you're tough?4You'd better be good.4I hope you like to respawn.4You're already dead.4I am the Alpha and the Omega.G@KLN~XM>XSԝX 2bWa$?RN `2MS\ZUQ E=$ 7{.> j@Fu @O U^$Y::$333?Nr*?,a!AVa!mw*--:% :%a!?,a&!1>a&!>H-) #=!e @?U!e=r*?,a!s??>a!G??>>r*?,@?!] !HU;0?U!];U!Hz@?!i !jU?U!iU!jUaU>>aU>>> x]J( J`2[MZ 2chlMBotAPI Optionsy cW(%#w*Eq!; Z@^pad[`A hV>~ amxttttttZ 2fg @l@E@lr@o@@J@t@R @m@w p@B@P@Bn\k Fz@qM<gV@G  k @A @He@M  Z @J @} @t O ]PKv, {vIA|vIO vv V _y-JpRecieved - _HpH_PzH&, HH&~H, aHzH&, HHta::$ ~H, a v@Y Jaa T ot-JoOw*PaOP! P!b L~o}LL}o_oLho~ob%gb,  {hb~h&Zh&b&L~ZbnZLbIZL&hh&hh~hb__n_ e xg x Namef Team;zf~,G~Jfgf BotTeamGamePlus.M-x~e BotDeathMatchPlus.O-x~e &BotDomination.N-x~e bBotCTF.K-x~e 7zp(q!d!> U @S Yn-ycomandType:YY VPAUSES-HvizClient UNPAUSE|-H  ] ^ _ @` @a @h @f [ wQ!-yp Sending: w8-L wwOwppw, ,  l mgg '-JAccepted BotConnectionVgf qBotTeamGamePlusm.M BotDeathMatchPlusm.O BotDominationm.N BotCTFm.K }VZ~}.LEVELINFOaZ}}ZpppppppppppppNFOGametypegf&Level}&mq!d!g \ X S PKO, {OnA|OnSOIO c @H g j)'iQ r{QG~Qii,k~Qi6jLQkQQk&k~Qi6jLQk6jLQk& 6jL x6jL y6jL z @ nq1ppppppBEGTimeU]Y BotTeamGamePlus.M3 BotDeathMatchPlus.O3 BotDomination.N3 0BotCTF.K*3 ?w?*?-{ppppppppppppppppppppppppppppppppppppPLRIdV?RotationY? LocationX? TeamR?Name?WeaponV?:?%{pppppp{Firing1g:?%{pppppp{AltFiring2{pppppp{AltFiring0{??GGnwG*Ga/!r.G*Y,;Y.GppppppppppppppppppDOMIdVGLocationXG ControllerSYWW-PppppppppppppNAVIdVGLocationXG GG-P'/a0 n! na!Nn-ppppppppppppINVIdVnLocationXn 10/a0 DIppppppppppppppppppFLGIdVDTeamRDStateWDamDa!~IppppppppppppILocationXD HolderVDIppppppILocationXD I10ppppppENDTimeU H'X pg. glgi&gkn-JSpawned BotConnection | a  | a  Lp k@ [0!( !za&!kYL?a&!(kYa&!zk @` }Gz [0!= !ea&!}YL?a&!=}Ya&!e} r _ ib HtNB-yHV~H>VV}HbHVoH~Hu%(u,  {oD~olo&D&V~luIlVulV&oo&oo~oupbbnb  @j hpD#aP Rotation{PL~Paa,m~Pa6hDLPmPPm&m~Pa6hDLPm6hDLPm&!6hDL pitch6hDL yaw6hDL roll ay |BQFa!B =::$|a  #L?a<" @w|*|d| 6| 6| 6 Az YZi0Y!Ua!X = fY!P-B >a!\ = 6?, @??a!z =a!O = Y!K Y!Ta!e = {6\6333?-k?Bya!@ = 6- ?a!A =a!X = ^gq )dg,g>a!333?L>bPg333?a!f333?L>ba!z333?L> | a  @ KBoa!X =::$Ka  #L?a<" @wK*KdK 6K 6K 6 {'e-v{a ,{YBotCTFya yfBotCTF-v'a k } o *sylPyidykjpppppppppppppppppppppppsPGoalTeamScoresUdsPTimeLimitsSdsPMaxTeamssSdsPMaxTeamSizesSdj O@d P v$ppppP J  @PC E 7{.> Lk@ .!(a&!k,a&!(k ~ XBEylPyiMyk*GAM*ppp*EPPlayerScoresNwN*Na/!*pppppp*EPVNEUNMNN*p*M*ppp*EPTeamScoresh%h*pppppp*EPShEUhMhE*p*MwX*l:X.lwX**pppppp*EPHaveFlagEVXMwl*l-*pppppp*EPEnemyHasFlagE1M* T^r7a&!~> E@D E Yt7s J Y^36J333?@r*?,a!{Ha!| K k^50B3r*?,0wk*k?,t!/ !E!S0!L !I!N0!@!D0!K!30!1!0!b!~00!r!l@@rk*k?,!S !H!/@!N !}!L@!D!@@!3!K@ !!1@&!~!b@@!l!r N `H-~a%!o |4!S!H|Q!/!E|n!N!}|!L!I|!@a&!@<|!Da&!D<||a%!r2a%!k !m !A7?,a&!1 ף<|l- !a&! ף<||aa! M NTwd J+~-Vw*,a&!={{a ::$a! ף<!1a!1w ף<!m !a!mw ף< Plx$a!D>333?= D 0p_ J-+\%2%o\, \&%\%,-(*- %w * a/!. @   J< *-(!"- %% ` w * a/!. @  ::$ %-@' w * a/! a/!. --@(  4-@,%! w *x a/!. *V,  a/!. Qx.  pS%  , w * a/!. *. @.  %.  &g. -.  ,.  ,  ::$, w * a/!j.   - -::$ w * a! a/! -. F  c   % ;-8?O- %-(??,<?%%Qtimelimit R ol# 7o V p7}c::$333?Sr*?,a&!Ap`a&!mpw*P a%!r 6%666666f6Vr*?,a&!r>ca&!l>r*?,a&!b>a&!~>r*?,a&!1pa&!p T P DR_CwD*.D`DDa/!Da/!Da/!\Da/!   Da/!Da/!  :D#D]-- -C X {|C9r*?,a!3Aa!K U X9AXXkw3*3a/!$Destroying botXa(-fXXa/!.X3.Xr3*-f3*X3-$.3!fL?3-(3 +!f*'Xt(wt*t-3:t:3ta/!-h((ta/!.t!f-h'tt`X-h3-'3 +!G*'.3!G-fL?2Cw2*,2a/!h/:.2:3.2-R.222PR2w2*2a/!h/:.2:33.2N.2NP22f-f Z vr M>r*?,a&!3>Ka&!K> 2\ CTj(-Ca&!a>&a&!v> R] oTT333?ia%!kWr*?,a&!3@da&!K@ a%!wo@o333?r*?,a&!@oa&!Do ^ iu<333?ia%!kWr*?,a&!3?da&!K? a%!wi?i>r*?,a&!@ia&!Di Lb\"bbb=bbxb{.>a$@@b(D>L?6- b #<a$@bL>@(D?5bu=a%!k%r*?,a&!u=2a&!x=aXa%!d`r*?,a&!u=a&!x= Y|n _wp# [0!G !@a&!_YL?a&!G_Ya&!@_ A d [yv -ypRecieved - [JpJ[PzJ&, JJ&~~J, ~]J~~zJ~&, ~JJ~t]::$ ~~J, a W MCmF$~- % M%R%]%`%u&uu]Mu]uu`Ru`uuY-'']`&w*- :Ma/!a/!{.)!w{*{%{H*!U{ ]`{R$'-(|w*e-a/!a/!$.![f..erf*f-f-3:f:.*\.C i Jmu a w e @I@j \gJ#-yAccepted VizConnection]Y mBotTeamGamePlus\.M BotDeathMatchPlus\.O BotDomination\.N BotCTF\.K MVx~M.LEVELINFO]xMMxpppppppppppppNFOGametype]YLevelM\q!d!> J'?<4].,2-ySpawned VizConnection _ qU 03::$+9?%Y1^ u- -h-a!Hpa!X r6r^6^d6dur^Gd^quGq@?8q@a!wEu#?wEd^?%a!Ha!X r*W!/ -?,W!EW!H ?,W!/ W!S&Wa aW v Unb 5 -JcomandType:U9-OU aTEST q!!V3 sINITg3 INCH8 n?,d9   q!!V3 "SETWALK WalktempBool--K3 CSTOP q!!3 ^JUMPW3 `RUNTO Targetz)>Location n> q!!V]tempActor]w*b$   n  q!!V3 STRAFE)>Location n>q Targetzq)tFocus Kt6*wtempActorqww*b$  6 Kt8 q!!}3 nSHOOT Target)>LocationEnemyRemoteEnemy8 x> AlttempBool U-K3 MCHANGEWEAPON ID|best_JtempActorJw*.r*cJJwr3 |STOPSHOOT8s3 CHECKREACH TargetY idz)>Location-xb >ppppppppppppppppppRCHIDY&ReachableT-x&FromX &tempActorw*b$  -xbppppppppppppppppppppppppRCHIDY&ReachableT-x&FromX &ToX &3 h TURNTO TargetzpIw6I%6I%6I%)>Location K>6* K 9I?6*A tempActorA w*b$  6 K>8 q!!B3 a ROTATE AxisI 5J Amount zVertical6I6I5 6I6I5 K 9I?6*8 q!!B3  TRACK Target {tempActor b$  68 q!!j3 GETPATH5%z 5,Z r5@*z p 5@*5. )>Locationb>Y idmppppppPTHIDY&5% 5, r5@*  mppppppppmS5V5@X5@ &5 m3  MESSAGE Text-xK Global { -xbp@  b3 0 PINGPong3  k du!Dzqa{ !> >,lx jF`wL! !\<?a&!=jIa&!(juh?a&!jua&!Xj s@^ma!_333?L> LyWCr*?,a!K>>Ua!e>> \ $!,,-:$,(:$,#$:$G%GrG*%GGTGGGG-_&_hw_*Q_a/!_a/!h__w_*w_*8:_G$=,;:_\\;%;G$=,;,;%;G$=,;,;, ;;TQ$a/!$=,0w* $Ow* $'$a/! $=;w* $w* $':$;-($a/!.$*K;I;$'wG*GIT$'( @w gv/vgu Gx wC )_w)*Hw))-b$) ) #ra\`) )/ppppppppppppppppppppppppppppppppppppppppppppppppPLRIdV)RotationY) LocationX) VelocityX) NameTeamR)ReachableTb)WeaponV):)%/pppppp/Firing14:)%/pppppp/AltFiring24/pppppp/AltFiring0 /))/a8 wwa!Nw-w ra\`w *ppppppppppppppppppppppppINVIdVwLocationXw ReachableTbwClassVw10/a8 qBAq-q ra\`q *ppppppppppppppppppppppppppppppMOVIdVqLocationXq ReachableTbqDamageTrigTq-ClassVq100w0*b$0 0 ra\`0 *0a/!r.0*a, a.0ppppppppppppppppppppppppDOMIdV0LocationX0 ReachableTb0ControllerSappppppppppppppppppNAVIdV0LocationX0 ReachableTb000W zgfBotCTF/a0 @  b$@ @ w@/ppppppFLGIdV@ @a!~/pppppppppppp/LocationX@ HolderV@; /pppppp/LocationX@ /pppppppppppppppppp/TeamR@ReachableTb@StateW@a /10 | UIOU%V%B{wB*NB-UBdVdV,d{BB@ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppSLFIdVRotationYLocationXVelocityXNameTeamRHealthSWeaponVCurrentAmmoSArmorSU:%@pppppp@Firing19:%@pppppp@AltFiring29@pppppp@AltFiring0 @ z _A yP ppppppppppppppppppHITIdVeDamageSyDamageTypeWi s X]4Xa/!}wX*zXa!?X-'X 6=X q!?!EXa!GX-'X 6=X q!G!E N} Q #1<7}w}*}a/!}a/!r.}Q .} +!m*}} AC cZ(Pi0c!Ua!A = fc!P-B >a!@ = 6?, @?6q6- ?a!p L=::$Fa  #?wF*FdF 6F 6F 6a!\ = c!K c!Ta!e = f6q6333?-V?Bda!A = ?a!B =a!z = \ I{q|I(Na=PIx?6N #FZ?6N #FZ(z'  N -=8'.VN Ar'*Failed to spawn remote bot*'=e{M '=e"- -D%e%t&ttDDtett@e:''=,'-'e,'e'%-XVV5'=,{wV*'a V 'a+V ' V 'a+' V :''VXV :''w* &'%w* &'%\' ^B nq n,n>a!333?L>Pn?a!f333?L>tn@?a!z333?L>a&!zL> I gag6T333?Er*?,a&!{gRa&!|g G XT3*z$$-(* 'H 9>i-9C--?S-33>##^o$+..'q!a!bq!!y ]I c:8 Yu J:/ J K B N J?E=::$&\&  M P i?\, O R @*-\ f s.[A`gas5*=,`rs*Could not find starting spot for RemoteBot*a Yg s s r*pCouldn't spawn player at VsXw*eee&e= `gRg s N- % q!!]X::$--SXwS*AS-wS*S-Sa/!-.SH,% & , , A.S,SSN |_y [/--ypRecievedTest in Server - _ O dvv<Ta@ !gw*za!ba!ppppppBEGTimeU&gf BotTeamGamePlus.M &BotDeathMatchPlus.O ^BotDomination.N BotCTF.K  ICppppppENDTimeU&$-OaF !> >g4n Y fZ H:̌ D E ]-"-q!baL>;-tL-ma>.j9 !y-' ]y; i` X,‹_$$6a(((o$# FIN ^ g _ Y( Q's-YQa ,QYBotDomination|a |fBotDomination-Y'@a @k a c *j|lr|is|kdpppppppppppppppppppppppjrGoalTeamScorejUsjrTimeLimitjSsjrMaxTeamsjSsjrMaxTeamSizejSsd j@d e j f S%[ b i ?T|lZ|i`|k GAM ppp TZPlayerScoresfwf*fa/! pppppp TZVfTUf`ff p ` ppp TZTeamScores|%| pppppp TZS|TU|`|E p ` ppp TZDomPointse%e,we*4re*u,Wue pppppp TZVeTSu`e p `  T@k J" n c l o m F܊ t O p h ~0v -wL>j%j?>?_?=?wL?jw>B- %~Bw~*D.~+wD*wD*D-DwDw~~,%1%j1,`1?%w*3Kdom_score_updateS1U1`w*3Kdom_score_updateS1U11c1%1, A1wA*w*=Kdom_playerscore_updateSASDAw*=Kdom_playerscore_updateSASDA1q?%1%1,1Qteamscorelimit1=-c%%%bc, c&%c%,-(- w * a/!. @   =/ -(! - %s% S w * a/!. @  ::$ %-~' w * a/! a/!. --~(  '-~,%! w *k a/!. *I,  a/!. Qk.  pS%  , w *u a/!. *. @.  %.  &Z. -.  ,u.  ,  ::$,   w * a/!j.     - -::$  w *  a! a/! -. F  V     %  . -+ ?O  - %-( ??,<?% %Qtimelimit  q sx s Fq u v fC w H r WR8,'fWWIWa/!Wa/!dWa/!cWa/!   Wa/!Wa/!  :W#W%-- -C y { _9Q __^._w^*^a/!^!f^ +!m*w^*^a/!$Destroying bot_a(-p_ _a/!._-p | ^~ S a Cv " \] b5iF X  MM Z8M B Xg6/--yAccepted connection in BotServer ]G LW)s@.sWWarskw@*@'PD?WsarW `Mu}8M J fOi}8O T Qvo<$ppppQj& @AY@yQ _Oz\w*A6A\A ?%#\6i633%q!;!_q!;![ l vc;Q!-Jp Sending: v8-OwvOwppv, ,  M U EVIFSz 8IV Y HMX*H>a&!E?VIH+?a&!I?Va&!L? k V!>a&!3333? Ag(/--oAccepted connection in VizServer ] n{6x68{n4n-7>q!;!A c a*sL.iaa[]ikwL*L'PD?ai[]a ` `1xT GA #16FwF*Fa/!Fa/!r.FA .F +!m*FF b @e&3::$+9?%Y1^ Tr*a!n-?,a!Ia!}?,a!La!N h f,Tx8f "^ @ -=8(.`@ Ar(*Failed to spawn remote bot*(=l{k(=l"- -K%{%v&vvKKv{vv@{:((=,(-'{,({(%-i``5(=,{w`*(a ` (a+` ( ` (a+( ` :('`i` :('w* &(%w* &(%c( c m6B=::$09?%am;7m ar*]!/-?,]!E]!H?,]!/]!S]#a a&]m p aW#1;::$09?%aa;7aar*a&!na-?,a&!Iaa&!}a?,a&!Laa&!Na ~my20-opRecievedText in VizServer - m (Q T $x@\ ve[Le^~^ ::$x-yBotServer: Listening again - connections have been closed.r saF(+x k ];~(::$ ![*a?L>;b !YO-o$ ![a333?6?j366 66 o$6zC !Jv!`a?!-($! !;q?Going from -Doneq!t-g!vlL>ta&=-(!qGoing from -Splashq!-6-o$q6?, w*O>A66 66  L>?,9?%iE::$ ![f---a>SaL>86?,<6?,<a=#a?-(-(na@ !J66 66 -a>T wtCAt[_J;Y}0w z j dw,!!!TakeHitq  a m JG>E=::$&c&  l o i>c, n q G?*-c p s $?c r u.@`R@au5*=,`ru*Could not find starting spot for RemoteBot*a@ YR u u r*pCouldn't spawn player at VuXw*@@@&@=@ `R@RR u N- % q!!]X::$--eXwe*Ae-we*e-ea/!-.eH,% & , , A.e,eeN v 0Sr x I_!r 8_I Cy {"q!8"{}~EG Xqy Cu Xr@?::$##^aA !$y**vaA !V-@UanZn !V !Ur6*anKan6n !} !X::$##r6*b$6  !ya6aL= !j::$##w6*a6aK ! Bj}V}VS~ { rbk( C } Z|k h'w-Bha ,hYBotTeamGamePlusza zfBotTeamGamePlus-B'Ca Ck @ B (xzlWzilzkKpppppppppppppppppppppppxWGoalTeamScorexUlxWTimeLimitxSlxWMaxTeamsxSlxWMaxTeamSizexSlK x@E  o{j F D gwzj( K fPqif A H <~bzlRziQzk9GAM9ppp9bRPlayerScoresdwd*da/!9pppppp9bRVdbUdQdd9p9Q9ppp9bRTeamScoresZ%Z9pppppp9bRSZbUZQZE9p9Q9 b@I L J Jei N MZ{h R DSBf 1rDjD?j0>% Trj*jrj*ppppppppppppppppppKILIdVjKillerVDDamageTypeWh G pRXp>pa/!pa/!Ypa/!dtpa/!   pa/!pa/!  :p#p-- -C O ]Cs ~- % ]%^%U%X%r&rrU]rUrrX^rXrrY-''UX&w*- :]a/!a/!}.)!w}*}%}H*!U} UX}^$'-(|w*e-a/!a/!$.![V..erV*V-V-3:V:.*\.C U P n74f S X T N/e' V sW F%e KQ Nsj.pNNbTpkwj*j'PD?NpbTN ^ LV<I_  .y1r *$$hb$     - a/!nP  .  L  !D?!?, ?,   L  ?  -ww * -L?-w!?L?%L?@B-!?!?\B>-,-w!D?!@L>L> ::$: :$!? !D?!?> ?,F> ::$: :$!?-)?,?$ @?,-w!ff?!?,-` ?%!D?! -` L?%p  : :$q6   6   6p 6p6p6p?333??pLL66  6: :$  ?.?z  a: :$6z%9z  5?-8(-8b$.-8b$. -8>   ?  -8( ---w w*2-- :%: :$%6?,P6  L6?,6  #-w @?CacS#? ?,(-8rC*-8c#@@-8b$.: :$-8b$.-8(-866  -8b$.d-866  fff? -8b$.P.F6!,!!66! ?66? )?66? 669666666  66 U9y.C.yUCacS.( wC* 6S333?6F!= ?66? )?66?! 669666666 = 66 U9.yUCacS.( wC*S?,  -CacS.( wC* SU.PUL -w w * FLU c T_c8-.y>T?%VTF+-{-Vr-*b$- - 4- I- F{--b66 66  ITlIT64>66 l?,l?,<P4F+D?+?, ?, - I- ?- F-^r-*--I?+D?+ff@L>j+@?>+ff?+D?+?33>?,>+?{-)?,?$ @?,+?-{ ?%+D?+"-{4?333?? IT"b$4F4?4- 646- b$4F4TaOP4F(wT*$$4ի?,-Pa(@?WT>66 66  IWlIW64>66 l?,l?,<P4Fu6+,++66+?66? )?66?669666666 66 O9TaOPF4FCOF(SwT*6P333?6u+G?66? )?66?+669666666 G66 O9-V w-*-FTO jZ %,-:%,(:%,#%:%g%grJ*%Jg\gJgg-_&RhwR*QRa/!Ra/!hRRwR*wR*8:RJ%=,7:R\\7%7J%=,7,7%7J%=,7,7, 77\Q%a/!%=,0w* %Ow* %'%a/! %=7w* %w* %':%7-(%a/!.%*K7I7%'wJ*JI\%'( ` e b P{6' gf HUzC4w*Hw*%-' `-H$$ _?$$ ^? i |v 4 h Rl Wh/3=o$-e6-'c a Z]$mZa/!}wZ*zZa!?Z-'Z 6=Z q!?!EZa!GZ-'Z 6=Z q!G!E q j t, k K #<HwH*Ha/!Ha/!r.HK .H +!m*HH cm 0LJ-+d%2%od, d&%d%,-(*-%w*a/!. @ J< *-(!"- %% `w*a/!. @::$ %-`'w*a/!a/!.--`(4-`,%!w*xa/!.*V, a/!. Qx. pS%,w*a/!.*. @.  %.  &g.-.  ,.  ,::$,w*a/!j.- -::$w*a!a/!-.Fc   % ;-8?O- %-(??,<?%%Qtimelimit r o B*ppppppppppppHRNSourceClassVcRotationYPc  YXq_)WLppppppHRPRotationYPX  p x--".^xAr"*Failed to spawn remote bot*"=m{w"=m"- -O%[%E&EEOOE[EE@[:""=,"-'[,"[FUCK"%-t^^5"=,w^*"a ^ "a+^ " ^ "a+" ^ :"'^t^ :"'w* &"%w* &"%d" s[ L F:% @ "z Xz%?%a?(GG?, TG6T_X 6___T_L?66T66TGC?`nppppppppppppBMPIdVXLocationXX `v!z | iI $?\ppppppppppppppppppWALIdVfNormalXiLocationX\ ~ { ]# J} c~ QSr#r*_IIa!qq!h*Yw*:%$$ ^?:%$$ _? jkppppppppppppCWPIdVClassV t @J%'4E=::$&d&   Bi,4d, AD1'5*-d CF$65d EQ9?76QQS.Q{wS*Sa/!$Destroying botQa(-|QQa/!.Q-| SKHEc % -6-6--6",*#?#!l%@ MSNbq-333?K2?,LKff&?>fff? Gz.Ud8`JCaz5*=,`rz*Could not find starting spot for RemoteBot*aC YJ z z r*pCouldn't spawn player at VzXw*&=C `JCRJ z N- % q!!]X::$--aXwa*Aa-wa*a-aa/!-.aH,% & , , A.a,aaN N}{>dK}5ppppppZCBIdV} PAF8KA5ppppppZCHIdVA TCG20KC5ppppppZCFIdVC QRUS+I \mgu.:F: ppppppppppppppppppVMGSenderVFTypeWmIdRR VE'{-LEa ,EYBotDeathMatchPlusAa AfBotDeathMatchPlus-L'qa qk XZ(tAloAi|AkRppppppppppptoFragLimittS|toTimeLimittS|R t@na[}C8ppppppVMTStringn ]Y`:HAleAi[AkBGAMBpppBHePlayerScoresRwR*Ra/!BppppppBHeVRHUR[RRBpB[B H@bB C8ppppppVMSStringB cvLD|Dt:A :tJvt!A ejQQ|Dc:ds :dcJjcd![ hQnQkppppppppppppAINIdVQClassVQ _n.T+`Qqan5*=,`rn*Could not find starting spot for RemoteBot*aq YQ n n r*pCouldn't spawn player at VnXw*SSS&S=q `QqRQ n N- % q!!]X::$--LXwL*AL-wL*L-La/!-.LH,% & , , A.L,LLN kgh; ljZ -? rBD -B-&-Bq!!hppppppppppppFALFellT-BLocationX--B fOO=X=w* O\w* OOoOWyO}OWy=X' nWo|qf~  "mtJvE=::$&]&  svi], uxv*-] wz$] y0DJ-+]%2%o], ]&%]%,-(*-%w*a/!. @ J< *-(!"- %% `w*a/!. @::$ %-F'w*a/!a/!.--F(4-F,%!w*xa/!.*V, a/!. Qx. pS%,w*a/!.*. @.  %.  &g.-.  ,.  ,::$,w*a/!j.- -::$w*a!a/!-.Fc   % ;-8?O- %-(??,<?%%Qtimelimit }sY't%w* Co: @tRC$$ {VK!sz.{VVx^{kwz*z'PD?V{x^V B!L CAXEM Gx> z6c9ZL"ccw.c{ww*wa/!$Destroying botca(-ccca/!.c-c Z@waclass VizConnection expands TcpLink config(BotAPI); var string ReceivedData; var string RecievedArgs[9]; var string RecievedVals[9]; //used to store info inside function where local wont work //set property text dosent seem to work with a local var actor tempActor; var VizServer Parent; // set true to allow viz clients to pause var config bool bAllowPause; // set true for verbose debug logs var config bool bDebug; // delay between visionUpdates var config float updateTime; // record once we have sent navs - don't need to duplicate var bool sentNavs; // configurable delimeters for strings sent to clients // currently of form (with multiple possible attributes): // "type"$ib$"identifier"$ib$as$"attrname1"$ib$"attrvalue1"$ae // as = identifies the start of an attribute var string as; // ae = attribute end var string ae; // ib = item break var string ib; //------------Message Types--------------------------- // Each message appears on a seperate line. The first item // of each message is the type identifier. It is a three // letter code identifing what the message contains. // Used types are: // (Asynchronous messages) // (Synchronous messages) // PLR - see another player // INV - see an inventory item (or weapon) // NAV - see a navigation point // DOM - see a domination point // FLG - see a flag // END - end of a vision batch // BEG - begin of a vision batch // GAM - random information about the game //-------------------------------------------------- function PostBeginPlay() { Parent = VizServer(Owner); if(bDebug) log("Spawned VizConnection"); } //Socket established event Accepted() { local string gameInfoStr, levelName; local int i; if(bDebug) log("Accepted VizConnection"); //no clean way to do this since gametypes are not derived from //a common ancestor switch(Parent.gameClass) { case "BotTeamGamePlus": gameInfoStr = BotTeamGamePlus(Level.Game).GetGameInfo(); break; case "BotDeathMatchPlus": gameInfoStr = BotDeathMatchPlus(Level.Game).GetGameInfo(); break; case "BotDomination": gameInfoStr = BotDomination(Level.Game).GetGameInfo(); break; case "BotCTF": gameInfoStr = BotCTF(Level.Game).GetGameInfo(); break; } levelName = string(Level); i = InStr(Caps(levelName), ".LEVELINFO"); if(i != -1) levelName = Left(levelName, i); SendLine("NFO" $ib$as$ "Gametype" $ib$ Parent.gameClass $ae$ib$as$ "Level" $ib$ levelName $ae$ gameInfoStr); gotoState('monitoring','Running'); } //Closed on other end event Closed() { Destroy(); } //Recieve info - parse into lines and call RecievedLine event ReceivedText( string Text ) { local int i; local string S; if(bDebug) log("Recieved - "$Text); ReceivedData = ReceivedData $ Text; // remove a LF which arrived in a new packet // and thus didn't get cleaned up by the code below if(Left(ReceivedData, 1) == Chr(10)) ReceivedData = Mid(ReceivedData, 1); i = InStr(ReceivedData, Chr(13)); while(i != -1) { S = Left(ReceivedData, i); i++; // check for any LF following the CR. if(Mid(ReceivedData, i, 1) == Chr(10)) i++; ReceivedData = Mid(ReceivedData, i); ReceivedLine(S); if(LinkState != STATE_Connected) return; i = InStr(ReceivedData, Chr(13)); } } //Here is where we handle incoming commands /* Commands expected to look like: runto {Argument value} {Arg value}... Currently hard coded to take no more than 9 args Command type and arguments can be any length, but first space terminates the name. Values can have spaces or any other kind of character. */ function ReceivedLine(string S) { local string cmdType, argBody, rem; local int endloc, wordsplit, attrNum; local name curBotState; if(bDebug) log(S); wordsplit = InStr(S,ib); if( wordsplit == -1) wordsplit = Len(S); cmdType = left(S,wordsplit); rem = mid(S,InStr(S,as)); attrNum = 0; //iterate through attr/val pairs, storring them in the //parallel arrays RecievedArgs and RecievedVals while(attrNum < 9 && rem != "") { endloc = InStr(rem,ae); argBody = mid(rem,1,(endloc - 1)); wordsplit = InStr(argBody,ib); RecievedArgs[attrNum] = left(argBody,wordsplit); RecievedVals[attrNum] = mid(argBody,(wordsplit + 1)); rem = mid(rem,1); //advance rem = mid(rem,InStr(rem,as)); attrNum++; } cmdType = Caps(cmdType); ProcessAction(cmdType); } function string GetArgVal(string argName) { local string argValue; local int i; while (i < 9 && RecievedArgs[i] != "") { if (RecievedArgs[i] ~= argName) return RecievedVals[i]; i++; } return ""; } function ProcessAction(string cmdType) { local int i; local vector v, v2; local bool boolResult; local string target, rotTarg, id, outBuf, focusTarg; local rotator r; if(bDebug) log("comandType:"@cmdType); switch(cmdType) { case "PAUSE": if (bAllowPause) Level.Pauser="vizClient"; break; case "UNPAUSE": if (bAllowPause) Level.Pauser=""; break; } } //Send a line to the client function SendLine(string Text, optional bool bNoCRLF) { if(bDebug) log(" Sending: "$Text); if(bNoCRLF) SendText(Text); else SendText(Text$Chr(13)$Chr(10)); } //Concat two strings togeather with our list bookends function string MakeItem(string first, string second) { return (as$first$ib$second$ae); } // iterate through objects and send appropriate messages function checkGame() { local Inventory I; local Pawn P; local string plrString; local NavigationPoint N; local CTFFlag C; local bool isVisible, sendUpdate; local int repeat, temp; local string navType, outstring; SendLine("BEG" $ib$as$ "Time" $ib$ Level.TimeSeconds $ae); //no clean way to do this since gametypes are not derived from //a common ancestor that has AddRemoteBot switch(Parent.gameClass) { case "BotTeamGamePlus": sendLine( BotTeamGamePlus(Level.Game).GetGameStatus() ); break; case "BotDeathMatchPlus": sendLine( BotDeathMatchPlus(Level.Game).GetGameStatus() ); break; case "BotDomination": sendLine( BotDomination(Level.Game).GetGameStatus() ); break; case "BotCTF": sendLine( BotCTF(Level.Game).GetGameStatus(none) ); break; } for ( P=Level.PawnList; P!=None; P=P.NextPawn ) { if( !P.bHidden ) { plrString = "PLR" $ib$as$ "Id" $ib$ P $ae$ib$as$ "Rotation" $ib$ P.Rotation $ae$ib$as$ "Location" $ib$ P.Location $ae$ib$as$ "Team" $ib$ P.PlayerReplicationInfo.Team $ae$ib$as$ "Name" $ib$ P.PlayerReplicationInfo.PlayerName $ae$ib$as$ "Weapon" $ib$ P.Weapon.Class $ae; if( P.bFire != 0 ) plrString = plrString $ib$as$ "Firing" $ib$ "1" $ae; else if( P.bAltFire != 0 ) plrString = plrString $ib$as$ "AltFiring" $ib$ "2" $ae; else plrString = plrString $ib$as$ "AltFiring" $ib$ "0" $ae; sendLine(plrString); } } for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) { if(N.IsA('ControlPoint')) { if( ControlPoint(N).ControllingTeam == none ) temp = 255; else temp = ControlPoint(N).ControllingTeam.TeamIndex; SendLine("DOM" $ib$as$ "Id" $ib$ N $ae$ib$as$ "Location" $ib$ N.Location $ae$ib$as$ "Controller" $ib$ temp $ae); } else if(!sentNavs) { //only send Navs once SendLine("NAV" $ib$as$ "Id" $ib$ N $ae$ib$as$ "Location" $ib$ N.Location $ae); } } sentNavs = true; foreach AllActors (class'Inventory', I) { if( I.GetStateName() == 'Pickup' && !I.bHidden ) { SendLine("INV" $ib$as$ "Id" $ib$ I $ae$ib$as$ "Location" $ib$ I.Location $ae); } } foreach AllActors (class'CTFFlag', C) { outstring = "FLG" $ib$as$ "Id" $ib$ C $ae$ib$as$ "Team" $ib$ C.Team $ae$ib$as$ "State" $ib$ C.GetStateName() $ae; //when a flag is held its location is not updated by engine =( if( C.GetStateName() == 'Held') outstring = outstring $ib$as$ "Location" $ib$ C.Holder.Location $ae$ib$as$ "Holder" $ib$ C.Holder $ae; else outstring = outstring $ib$as$ "Location" $ib$ C.Location $ae; SendLine(outstring); } SendLine("END" $ib$as$ "Time" $ib$ Level.TimeSeconds $ae); } //fire right up into the loop for sending updates auto state monitoring { Begin: Running: if( Level.Pauser == "" ) checkGame(); sleep(updateTime); goto 'Running'; } Jclass VizServer expands TcpLink config(BotAPI); var config int ListenPort; var config int MaxConnections; var string gameClass; var bool bBound; var config bool bDebug; var int ConnectionCount; //shouldn't happen event ReceivedText( string Text ) { if(bDebug) log("RecievedText in VizServer - "$Text); } function BeginPlay() { Super.BeginPlay(); if(!bBound) { BindPort( ListenPort ); if(bDebug) log("VizServer bound to port "$ListenPort); Listen(); bBound = true; } } //should never happen - accepted connections should be forwarded to a botconnection event Accepted() { if(bDebug) log("Accepted connection in VizServer"); } //called everytime a new botconnection is spawned event GainedChild( Actor C ) { Super.GainedChild(C); ConnectionCount++; //BotConnection(C).Parent = self; // if too many connections, close down listen. if(MaxConnections > 0 && ConnectionCount > MaxConnections && LinkState == STATE_Listening) { if(bDebug) Log("VizServer: Too many connections - closing down Listen."); Close(); } } event LostChild( Actor C ) { Super.LostChild(C); ConnectionCount--; // if closed due to too many connections, start listening again. if(ConnectionCount <= MaxConnections && LinkState != STATE_Listening) { if(bDebug) Log("VizServer: Listening again - connections have been closed."); Listen(); } } FH -oy$$v.TH Brv*Failed to spawn remote bot.*v=V{G v=VT :v'v-'w* &v%w* &v%]v } BCm#~- % B%C%q%p%m&mmqBmqmmpCmpmmY-''qp&w*- :Ba/!a/!i.)!wi*i%iH*!Ui qpiC$'-(|w*e-a/!a/!$.![S..erS*S-S-3:S:.*\.C g"!8"gda^Z q//Scrollable frame for RemoteUTBotConfigClient class RemoteUTBotConfigSClient extends UWindowScrollingDialogClient; function Created() { ClientClass = class'RemoteUTBotConfigClient'; FixedAreaClass = None; Super.Created(); } vNrPP/$Z 2cQ//Remotebot version of the bot configuration menu - ensures singleplayer // and net games both set minimal bots in the same way. class RemoteUTBotConfigClient extends UMenuBotConfigBase; // Botconfig var Class BotConfig; var UWindowCheckbox BalanceTeamsCheck; var localized string BalanceTeamsText; var localized string BalanceTeamsHelp; var UWindowCheckbox DumbDownCheck; var localized string DumbDownText; var localized string DumbDownHelp; var localized string MinPlayersText; var localized string MinPlayersHelp; function Created() { local int ControlWidth, ControlLeft, ControlRight; local int CenterWidth, CenterPos, ButtonWidth, ButtonLeft; Super.Created(); ControlWidth = WinWidth/2.5; ControlLeft = (WinWidth/2 - ControlWidth)/2; ControlRight = WinWidth/2 + ControlLeft; CenterWidth = (WinWidth/4)*3; CenterPos = (WinWidth - CenterWidth)/2; NumBotsEdit.SetText(MinPlayersText); NumBotsEdit.SetHelpText(MinPlayersHelp); if(class(BotmatchParent.GameClass) != None) { // Balance Teams BalanceTeamsCheck = UWindowCheckbox(CreateControl(class'UWindowCheckbox', ControlLeft, ControlOffset, ControlWidth, 1)); BalanceTeamsCheck.SetText(BalanceTeamsText); BalanceTeamsCheck.SetHelpText(BalanceTeamsHelp); BalanceTeamsCheck.SetFont(F_Normal); BalanceTeamsCheck.Align = TA_Right; if(class(BotmatchParent.GameClass) != None) { DumbDownCheck = UWindowCheckbox(CreateControl(class'UWindowCheckbox', ControlRight, ControlOffset, ControlWidth, 1)); DumbDownCheck.SetText(DumbDownText); DumbDownCheck.SetHelpText(DumbDownHelp); DumbDownCheck.SetFont(F_Normal); DumbDownCheck.Align = TA_Right; } ControlOffset += 25; } } function BeforePaint(Canvas C, float X, float Y) { local int ControlWidth, ControlLeft, ControlRight; local int CenterWidth, CenterPos, ButtonWidth, ButtonLeft; Super.BeforePaint(C, X, Y); ControlWidth = WinWidth/2.5; ControlLeft = (WinWidth/2 - ControlWidth)/2; ControlRight = WinWidth/2 + ControlLeft; CenterWidth = (WinWidth/4)*3; CenterPos = (WinWidth - CenterWidth)/2; if(BalanceTeamsCheck != None) { BalanceTeamsCheck.SetSize(ControlWidth + 10, 1); BalanceTeamsCheck.WinLeft = ControlLeft - 5; } if(DumbDownCheck != None) { DumbDownCheck.SetSize(ControlWidth + 10, 1); DumbDownCheck.WinLeft = ControlRight - 5; } } function AutoAdjustChecked() { BotConfig.Default.bAdjustSkill = AutoAdjustCheck.bChecked; BotConfig.static.StaticSaveConfig(); } function RandomChecked() { BotConfig.Default.bRandomOrder = RandomCheck.bChecked; BotConfig.static.StaticSaveConfig(); } function ConfigureIndivBots() { if(int(NumBotsEdit.GetValue()) == 0) MessageBox(AtLeastOneBotTitle, AtLeastOneBotText, MB_OK, MR_OK, MR_OK); else GetParent(class'UWindowFramedWindow').ShowModal(Root.CreateWindow(class'UTMenu.UTConfigIndivBotsWindow', 100, 100, 200, 200, Self)); } // replaces UMenuBotConfigClientWindow's version function LoadCurrentValues() { local int i; BotConfig = class'DeathMatchPlus'.default.BotConfigType; for(i=0;i<8;i++) Skills[i] = BotConfig.default.Skills[i]; BaseCombo.SetSelectedIndex(Min(BotConfig.default.Difficulty, 7)); TauntLabel.SetText(SkillTaunts[BaseCombo.GetSelectedIndex()]); AutoAdjustCheck.bChecked = BotConfig.Default.bAdjustSkill; RandomCheck.bChecked = BotConfig.Default.bRandomOrder; NumBotsEdit.SetValue(string(class(BotmatchParent.GameClass).Default.MinPlayers)); if(BalanceTeamsCheck != None) BalanceTeamsCheck.bChecked = class'TeamGamePlus'.Default.bBalanceTeams; if(DumbDownCheck != None) DumbDownCheck.bChecked = !class'Domination'.Default.bDumbDown; } // replaces UMenuBotConfigClientWindow's version function BaseChanged() { TauntLabel.SetText(SkillTaunts[BaseCombo.GetSelectedIndex()]); BotConfig.Default.Difficulty = BaseCombo.GetSelectedIndex(); BotConfig.static.StaticSaveConfig(); } // replaces UMenuBotConfigClientWindow's version function NumBotsChanged() { if (int(NumBotsEdit.GetValue()) > 16) NumBotsEdit.SetValue("16"); class(BotmatchParent.GameClass).default.MinPlayers = int(NumBotsEdit.GetValue()); class(BotmatchParent.GameClass).default.InitialBots = int(NumBotsEdit.GetValue()); BotmatchParent.GameClass.static.StaticSaveConfig(); } function BalanceTeamsChanged() { class'TeamGamePlus'.Default.bBalanceTeams = BalanceTeamsCheck.bChecked; Log("Set BalanceTeams to: "$class'TeamGamePlus'.Default.bBalanceTeams); class'TeamGamePlus'.static.StaticSaveConfig(); } function DumbDownChanged() { class'Domination'.Default.bDumbDown = !DumbDownCheck.bChecked; class'Domination'.static.StaticSaveConfig(); } function SaveConfigs() { Super.SaveConfigs(); } function Notify(UWindowDialogControl C, byte E) { if (!Initialized) return; Super.Notify(C, E); switch(E) { case DE_Change: switch(C) { case BalanceTeamsCheck: BalanceTeamsChanged(); break; case DumbDownCheck: DumbDownChanged(); break; } break; } } KgR&g>ga/!ga/!Yga/!]tga/!    _//============================================================================= // TMale2Bot. //============================================================================= class RemoteTMale2Bot extends RemoteMaleBot; function ForceMeshToExist() { Spawn(class'TMale2'); } FSm RB 6TggFW {q"R"k"|]SoldierSkins.blktu]SoldierSkins.h]Botpack.SelectionMale2L] Male SoldierWS[' .}{-S-S'[{w[*d[a/!@a M[ [ [[' e//============================================================================= // RemoteTMale1Bot. //============================================================================= class RemoteTMale1Bot extends RemoteMaleBot; function ForceMeshToExist() { Spawn(class'TMale1'); } FVn SB 6W'pFW Tpq"k"k"|]CommandoSkins.cmdouMCommandoSkins.h]Botpack.SelectionMale1L]Male Commandox]BotPack.VoiceMaleOneWV Q(YW-MB|I-ypBotServer bound to port S|r-M' h//============================================================================= // TFemale2Bot. //============================================================================= class RemoteTFemale2Bot extends RemoteFemaleBot; DYWB 6Z VqDx {q"R"k"|]SGirlSkins.armyu] SGirlSkins.h]Botpack.SelectionFemale2LMFemale Soldierx]BotPack.VoiceFemaleTwoWg//============================================================================= // TFemale1Bot. //============================================================================= class RemoteTFemale1Bot extends RemoteFemaleBot; function ForceMeshToExist() { Spawn(class'TFemale1'); } i E d q _H} ~1-(-(-(/--(_ D[{ UB 6^Dx q"k"|]FCommandoSkins.cmdou]FCommandoSkins.h]Botpack.SelectionFemale1L]Female Commandox]BotPack.VoiceFemaleOneWL Xx} N coL}-q!; G~u ac' d@@bF `$F Q S Wtd| 8tW e=R+p 250) && (FRand() < 0.75) ) { if ( FRand() < 0.5 ) PlayAnim('Dead1',,0.1); else PlayAnim('Dead11',, 0.1); return; } // check for repeater death if ( (Health > -10) && ((DamageType == 'shot') || (DamageType == 'zapped')) ) { PlayAnim('Dead9',, 0.1); return; } if ( (HitLoc.Z - Location.Z > 0.7 * CollisionHeight) && !Level.Game.bVeryLowGore ) { if ( FRand() < 0.5 ) PlayDecap(); else PlayAnim('Dead7',, 0.1); return; } if ( Region.Zone.bWaterZone || (FRand() < 0.5) ) //then hit in front or back PlayAnim('Dead3',, 0.1); else PlayAnim('Dead8',, 0.1); } function PlayDecap() { local carcass carc; PlayAnim('Dead4',, 0.1); if ( Level.NetMode != NM_Client ) { carc = Spawn(class 'UT_HeadMale',,, Location + CollisionHeight * vect(0,0,0.8), Rotation + rot(3000,0,16384) ); if (carc != None) { carc.Initfor(self); carc.Velocity = Velocity + VSize(Velocity) * VRand(); carc.Velocity.Z = FMax(carc.Velocity.Z, Velocity.Z); } } } function PlayGutHit(float tweentime) { if ( (AnimSequence == 'GutHit') || (AnimSequence == 'Dead2') ) { if (FRand() < 0.5) TweenAnim('LeftHit', tweentime); else TweenAnim('RightHit', tweentime); } else if ( FRand() < 0.6 ) TweenAnim('GutHit', tweentime); else TweenAnim('Dead8', tweentime); } function PlayHeadHit(float tweentime) { if ( (AnimSequence == 'HeadHit') || (AnimSequence == 'Dead7') ) TweenAnim('GutHit', tweentime); else if ( FRand() < 0.6 ) TweenAnim('HeadHit', tweentime); else TweenAnim('Dead7', tweentime); } function PlayLeftHit(float tweentime) { if ( (AnimSequence == 'LeftHit') || (AnimSequence == 'Dead9') ) TweenAnim('GutHit', tweentime); else if ( FRand() < 0.6 ) TweenAnim('LeftHit', tweentime); else TweenAnim('Dead9', tweentime); } function PlayRightHit(float tweentime) { if ( (AnimSequence == 'RightHit') || (AnimSequence == 'Dead1') ) TweenAnim('GutHit', tweentime); else if ( FRand() < 0.6 ) TweenAnim('RightHit', tweentime); else TweenAnim('Dead1', tweentime); } K #d+,-:#,(:#,##:#r%rrE*%Er}rErr-_&YhwY*QYa/!Ya/!hYYwY*wY*8:YE#=,::Y\\:%:E#=,:,:%:E#=,:,:, ::}Q#a/!#=,0w* #Ow* #'#a/! #=:w* #w* #':#:-(#a/!.#*K:I:#'wE*EI}#'( C//============================================================================= // RemoteHumanBot. //============================================================================= class RemoteHumanBot extends RemoteBot abstract; //----------------------------------------------------------------------------- // Sound functions //----------------------------------------------------------------------------- // Animation functions function PlayTurning() { BaseEyeHeight = Default.BaseEyeHeight; if ( (Weapon == None) || (Weapon.Mass < 20) ) PlayAnim('TurnSM', 0.3, 0.3); else PlayAnim('TurnLG', 0.3, 0.3); } function PlayVictoryDance() { PlayAnim('Victory1', 0.7); } function PlayWaving() { PlayAnim('Wave', 0.7, 0.2); } function TweenToWalking(float tweentime) { if ( Physics == PHYS_Swimming ) { if ( (vector(Rotation) Dot Acceleration) > 0 ) TweenToSwimming(tweentime); else TweenToWaiting(tweentime); } BaseEyeHeight = Default.BaseEyeHeight; if (Weapon == None) TweenAnim('Walk', tweentime); else if ( Weapon.bPointing ) { if (Weapon.Mass < 20) TweenAnim('WalkSMFR', tweentime); else TweenAnim('WalkLGFR', tweentime); } else { if (Weapon.Mass < 20) TweenAnim('WalkSM', tweentime); else TweenAnim('WalkLG', tweentime); } } function TweenToRunning(float tweentime) { local name newAnim; if ( Physics == PHYS_Swimming ) { if ( (vector(Rotation) Dot Acceleration) > 0 ) TweenToSwimming(tweentime); else TweenToWaiting(tweentime); return; } BaseEyeHeight = Default.BaseEyeHeight; if (Weapon == None) newAnim = 'RunSM'; else if ( Weapon.bPointing ) { if (Weapon.Mass < 20) newAnim = 'RunSMFR'; else newAnim = 'RunLGFR'; } else { if (Weapon.Mass < 20) newAnim = 'RunSM'; else newAnim = 'RunLG'; } if ( (newAnim == AnimSequence) && (Acceleration != vect(0,0,0)) && IsAnimating() ) return; TweenAnim(newAnim, tweentime); } function PlayWalking() { if ( Physics == PHYS_Swimming ) { if ( (vector(Rotation) Dot Acceleration) > 0 ) PlaySwimming(); else PlayWaiting(); return; } BaseEyeHeight = Default.BaseEyeHeight; if (Weapon == None) LoopAnim('Walk'); else if ( Weapon.bPointing ) { if (Weapon.Mass < 20) LoopAnim('WalkSMFR'); else LoopAnim('WalkLGFR'); } else { if (Weapon.Mass < 20) LoopAnim('WalkSM'); else LoopAnim('WalkLG'); } } function PlayRunning() { local float strafeMag; local vector Focus2D, Loc2D, Dest2D; local vector lookDir, moveDir, Y; local name NewAnim; if ( Physics == PHYS_Swimming ) { if ( (vector(Rotation) Dot Acceleration) > 0 ) PlaySwimming(); else PlayWaiting(); return; } BaseEyeHeight = Default.BaseEyeHeight; if ( bAdvancedTactics && !bNoTact ) { if ( bTacticalDir ) LoopAnim('StrafeL'); else LoopAnim('StrafeR'); return; } else if ( Focus != Destination ) { // check for strafe or backup Focus2D = Focus; Focus2D.Z = 0; Loc2D = Location; Loc2D.Z = 0; Dest2D = Destination; Dest2D.Z = 0; lookDir = Normal(Focus2D - Loc2D); moveDir = Normal(Dest2D - Loc2D); strafeMag = lookDir dot moveDir; if ( strafeMag < 0.75 ) { if ( strafeMag < -0.75 ) LoopAnim('BackRun'); else { Y = (lookDir Cross vect(0,0,1)); if ((Y Dot (Dest2D - Loc2D)) > 0) LoopAnim('StrafeL'); else LoopAnim('StrafeR'); } return; } } if (Weapon == None) newAnim = 'RunSM'; else if ( Weapon.bPointing ) { if (Weapon.Mass < 20) newAnim = 'RunSMFR'; else newAnim = 'RunLGFR'; } else { if (Weapon.Mass < 20) newAnim = 'RunSM'; else newAnim = 'RunLG'; } if ( (newAnim == AnimSequence) && IsAnimating() ) return; LoopAnim(NewAnim); } function PlayRising() { BaseEyeHeight = 0.4 * Default.BaseEyeHeight; TweenAnim('DuckWlkS', 0.7); } function PlayFeignDeath() { local float decision; BaseEyeHeight = 0; if ( decision < 0.33 ) TweenAnim('DeathEnd', 0.5); else if ( decision < 0.67 ) TweenAnim('DeathEnd2', 0.5); else TweenAnim('DeathEnd3', 0.5); } function PlayDying(name DamageType, vector HitLoc) { local vector X,Y,Z, HitVec, HitVec2D; local float dotp; local carcass carc; BaseEyeHeight = Default.BaseEyeHeight; PlayDyingSound(); PlayAnim('Dead3',0.7,0.1); } function PlayGutHit(float tweentime) { if ( (AnimSequence == 'GutHit') || (AnimSequence == 'Dead2') ) { if (FRand() < 0.5) TweenAnim('LeftHit', tweentime); else TweenAnim('RightHit', tweentime); } else if ( FRand() < 0.6 ) TweenAnim('GutHit', tweentime); else TweenAnim('Dead2', tweentime); } function PlayHeadHit(float tweentime) { if ( (AnimSequence == 'HeadHit') || (AnimSequence == 'Dead4') ) TweenAnim('GutHit', tweentime); else if ( FRand() < 0.6 ) TweenAnim('HeadHit', tweentime); else TweenAnim('Dead4', tweentime); } function PlayLeftHit(float tweentime) { if ( (AnimSequence == 'LeftHit') || (AnimSequence == 'Dead3') ) TweenAnim('GutHit', tweentime); else if ( FRand() < 0.6 ) TweenAnim('LeftHit', tweentime); else TweenAnim('Dead3', tweentime); } function PlayRightHit(float tweentime) { if ( (AnimSequence == 'RightHit') || (AnimSequence == 'Dead5') ) TweenAnim('GutHit', tweentime); else if ( FRand() < 0.6 ) TweenAnim('RightHit', tweentime); else TweenAnim('Dead5', tweentime); } function PlayLanded(float impactVel) { impactVel = impactVel/JumpZ; impactVel = 0.1 * impactVel * impactVel; BaseEyeHeight = Default.BaseEyeHeight; if ( impactVel > 0.17 ) PlaySound(LandGrunt, SLOT_Talk, FMin(4, 5 * impactVel),false,1600,FRand()*0.4+0.8); if ( !FootRegion.Zone.bWaterZone && (impactVel > 0.01) ) PlaySound(Land, SLOT_Interact, FClamp(4 * impactVel,0.2,4.5), false,1600, 1.0); if ( (impactVel > 0.06) || (GetAnimGroup(AnimSequence) == 'Jumping') ) { if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('LandSMFR', 0.12); else TweenAnim('LandLGFR', 0.12); } else if ( !IsAnimating() ) { if ( GetAnimGroup(AnimSequence) == 'TakeHit' ) AnimEnd(); else { if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('LandSMFR', 0.12); else TweenAnim('LandLGFR', 0.12); } } } function FastInAir() { local float TweenTime; BaseEyeHeight = 0.7 * Default.BaseEyeHeight; if ( GetAnimGroup(AnimSequence) == 'Jumping' ) { if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('DuckWlkS', 1); else TweenAnim('DuckWlkL', 1); return; } else if ( GetAnimGroup(AnimSequence) == 'Ducking' ) TweenTime = 1; else TweenTime = 0.3; if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('JumpSMFR', TweenTime); else TweenAnim('JumpLGFR', TweenTime); } function PlayInAir() { local float TweenTime; BaseEyeHeight = 0.7 * Default.BaseEyeHeight; if ( GetAnimGroup(AnimSequence) == 'Jumping' ) { if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('DuckWlkS', 2); else TweenAnim('DuckWlkL', 2); return; } else if ( GetAnimGroup(AnimSequence) == 'Ducking' ) TweenTime = 2; else TweenTime = 0.7; if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('JumpSMFR', TweenTime); else TweenAnim('JumpLGFR', TweenTime); } function PlayDodge(bool bDuckLeft) { if ( bDuckLeft ) TweenAnim('DodgeL', 0.25); else TweenAnim('DodgeR', 0.25); } function PlayDuck() { BaseEyeHeight = 0; if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('DuckWlkS', 0.25); else TweenAnim('DuckWlkL', 0.25); } function PlayCrawling() { //log("Play duck"); BaseEyeHeight = 0; if ( (Weapon == None) || (Weapon.Mass < 20) ) LoopAnim('DuckWlkS'); else LoopAnim('DuckWlkL'); } function TweenToWaiting(float tweentime) { if ( Physics == PHYS_Swimming ) { BaseEyeHeight = 0.7 * Default.BaseEyeHeight; if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('TreadSM', tweentime); else TweenAnim('TreadLG', tweentime); } else { BaseEyeHeight = Default.BaseEyeHeight; if ( Enemy != None ) ViewRotation = Rotator(Enemy.Location - Location); else { if ( GetAnimGroup(AnimSequence) == 'Waiting' ) return; ViewRotation.Pitch = 0; } ViewRotation.Pitch = ViewRotation.Pitch & 65535; If ( (ViewRotation.Pitch > RotationRate.Pitch) && (ViewRotation.Pitch < 65536 - RotationRate.Pitch) ) { If (ViewRotation.Pitch < 32768) { if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('AimUpSm', 0.3); else TweenAnim('AimUpLg', 0.3); } else { if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('AimDnSm', 0.3); else TweenAnim('AimDnLg', 0.3); } } else if ( (Weapon == None) || (Weapon.Mass < 20) ) TweenAnim('StillSMFR', tweentime); else TweenAnim('StillFRRP', tweentime); } } function TweenToFighter(float tweentime) { TweenToWaiting(tweentime); } function PlayChallenge() { TweenToWaiting(0.17); } function PlayLookAround() { LoopAnim('Look', 0.3 + 0.7 * FRand(), 0.1); } function PlayWaiting() { local name newAnim; if ( Physics == PHYS_Swimming ) { BaseEyeHeight = 0.7 * Default.BaseEyeHeight; if ( (Weapon == None) || (Weapon.Mass < 20) ) LoopAnim('TreadSM'); else LoopAnim('TreadLG'); } else { BaseEyeHeight = Default.BaseEyeHeight; if ( (Weapon != None) && Weapon.bPointing ) { if ( Weapon.bRapidFire &&