Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
실시간 편집
변경 없는 행 숨기기
줄바꿈 비활성화
레이아웃
나란히 보기
합쳐 보기
비교 단위
스마트
단어
글자
구문 강조
언어 선택
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
Untitled diff
생성일
9년 전
비교 결과 만료 없음
초기화
내보내기
공유
설명
0 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
742 행
복사
0 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
742 행
복사
//=============================================================================
//=============================================================================
// DeusExPlayer.
// DeusExPlayer.
//=============================================================================
//=============================================================================
class DeusExPlayer extends PlayerPawnExt
class DeusExPlayer extends PlayerPawnExt
native;
native;
#exec OBJ LOAD FILE=Effects
#exec OBJ LOAD FILE=Effects
// Name and skin assigned to PC by player on the Character Generation screen
// Name and skin assigned to PC by player on the Character Generation screen
var travel String TruePlayerName;
var travel String TruePlayerName;
var travel int PlayerSkin;
var travel int PlayerSkin;
// Combat Difficulty, set only at new game time
// Combat Difficulty, set only at new game time
var travel Float CombatDifficulty;
var travel Float CombatDifficulty;
// Augmentation system vars
// Augmentation system vars
var travel AugmentationManager AugmentationSystem;
var travel AugmentationManager AugmentationSystem;
// Skill system vars
// Skill system vars
var travel SkillManager SkillSystem;
var travel SkillManager SkillSystem;
var() travel int SkillPointsTotal;
var() travel int SkillPointsTotal;
var() travel int SkillPointsAvail;
var() travel int SkillPointsAvail;
// Credits (money) the player has
// Credits (money) the player has
var travel int Credits;
var travel int Credits;
// Energy the player has
// Energy the player has
var travel float Energy;
var travel float Energy;
var travel float EnergyMax;
var travel float EnergyMax;
var travel float EnergyDrain; // amount of energy left to drain
var travel float EnergyDrain; // amount of energy left to drain
var travel float EnergyDrainTotal; // total amount of energy to drain
var travel float EnergyDrainTotal; // total amount of energy to drain
var float MaxRegenPoint; // in multiplayer, the highest that auto regen will take you
var float MaxRegenPoint; // in multiplayer, the highest that auto regen will take you
var float RegenRate; // the number of points healed per second in mp
var float RegenRate; // the number of points healed per second in mp
// Keyring, used to store any keys the player picks up
// Keyring, used to store any keys the player picks up
var travel NanoKeyRing KeyRing; // Inventory Item
var travel NanoKeyRing KeyRing; // Inventory Item
var travel NanoKeyInfo KeyList; // List of Keys
var travel NanoKeyInfo KeyList; // List of Keys
// frob vars
// frob vars
var() float MaxFrobDistance;
var() float MaxFrobDistance;
var Actor FrobTarget;
var Actor FrobTarget;
var float FrobTime;
var float FrobTime;
// HUD Refresh Timer
// HUD Refresh Timer
var float LastRefreshTime;
var float LastRefreshTime;
// Conversation System Vars
// Conversation System Vars
var ConPlay conPlay; // Conversation
var ConPlay conPlay; // Conversation
var DataLinkPlay dataLinkPlay; // Used for DataLinks
var DataLinkPlay dataLinkPlay; // Used for DataLinks
var travel ConHistory conHistory; // Conversation History
var travel ConHistory conHistory; // Conversation History
// Inventory System Vars
// Inventory System Vars
var travel byte invSlots[30]; // 5x6 grid of inventory slots
var travel byte invSlots[30]; // 5x6 grid of inventory slots
var int maxInvRows; // Maximum number of inventory rows
var int maxInvRows; // Maximum number of inventory rows
var int maxInvCols; // Maximum number of inventory columns
var int maxInvCols; // Maximum number of inventory columns
var travel Inventory inHand; // The current object in hand
var travel Inventory inHand; // The current object in hand
var travel Inventory inHandPending; // The pending item waiting to be put in hand
var travel Inventory inHandPending; // The pending item waiting to be put in hand
var travel Inventory ClientinHandPending; // Client temporary inhand pending, for mousewheel use.
var travel Inventory ClientinHandPending; // Client temporary inhand pending, for mousewheel use.
var travel Inventory LastinHand; // Last object inhand, so we can detect inhand changes on the client.
var travel Inventory LastinHand; // Last object inhand, so we can detect inhand changes on the client.
var travel bool bInHandTransition; // The inHand is being swapped out
var travel bool bInHandTransition; // The inHand is being swapped out
// DEUS_EX AMSD Whether to ignore inv slots in multiplayer
// DEUS_EX AMSD Whether to ignore inv slots in multiplayer
var bool bBeltIsMPInventory;
var bool bBeltIsMPInventory;
// Goal Tracking
// Goal Tracking
var travel DeusExGoal FirstGoal;
var travel DeusExGoal FirstGoal;
var travel DeusExGoal LastGoal;
var travel DeusExGoal LastGoal;
// Note Tracking
// Note Tracking
var travel DeusExNote FirstNote;
var travel DeusExNote FirstNote;
var travel DeusExNote LastNote;
var travel DeusExNote LastNote;
// Data Vault Images
// Data Vault Images
var travel DataVaultImage FirstImage;
var travel DataVaultImage FirstImage;
// Log Messages
// Log Messages
var DeusExLog FirstLog;
var DeusExLog FirstLog;
var DeusExLog LastLog;
var DeusExLog LastLog;
// used by ViewModel
// used by ViewModel
var Actor ViewModelActor[8];
var Actor ViewModelActor[8];
// DEUS_EX AMSD For multiplayer option propagation UGH!
// DEUS_EX AMSD For multiplayer option propagation UGH!
// In most cases options will sync on their own. But for
// In most cases options will sync on their own. But for
// initial loadout based on options, we need to send them to the
// initial loadout based on options, we need to send them to the
// server. Easiest thing to do is have a function at startup
// server. Easiest thing to do is have a function at startup
// that sends that info.
// that sends that info.
var bool bFirstOptionsSynced;
var bool bFirstOptionsSynced;
var bool bSecondOptionsSynced;
var bool bSecondOptionsSynced;
// used while crouching
// used while crouching
var travel bool bForceDuck;
var travel bool bForceDuck;
var travel bool bCrouchOn; // used by toggle crouch
var travel bool bCrouchOn; // used by toggle crouch
var travel bool bWasCrouchOn; // used by toggle crouch
var travel bool bWasCrouchOn; // used by toggle crouch
var travel byte lastbDuck; // used by toggle crouch
var travel byte lastbDuck; // used by toggle crouch
// leaning vars
// leaning vars
var bool bCanLean;
var bool bCanLean;
var float curLeanDist;
var float curLeanDist;
var float prevLeanDist;
var float prevLeanDist;
// toggle walk
// toggle walk
var bool bToggleWalk;
var bool bToggleWalk;
// communicate run silent value in multiplayer
// communicate run silent value in multiplayer
var float RunSilentValue;
var float RunSilentValue;
// cheats
// cheats
var bool bWarrenEMPField;
var bool bWarrenEMPField;
var float WarrenTimer;
var float WarrenTimer;
var int WarrenSlot;
var int WarrenSlot;
// used by lots of stuff
// used by lots of stuff
var name FloorMaterial;
var name FloorMaterial;
var name WallMaterial;
var name WallMaterial;
var Vector WallNormal;
var Vector WallNormal;
// drug effects on the player
// drug effects on the player
var travel float drugEffectTimer;
var travel float drugEffectTimer;
// shake variables
// shake variables
var float JoltMagnitude; // magnitude of bounce imposed by heavy footsteps
var float JoltMagnitude; // magnitude of bounce imposed by heavy footsteps
// poison dart effects on the player
// poison dart effects on the player
var float poisonTimer; // time remaining before next poison TakeDamage
var float poisonTimer; // time remaining before next poison TakeDamage
var int poisonCounter; // number of poison TakeDamages remaining
var int poisonCounter; // number of poison TakeDamages remaining
var int poisonDamage; // damage taken from poison effect
var int poisonDamage; // damage taken from poison effect
// bleeding variables
// bleeding variables
var float BleedRate; // how profusely the player is bleeding; 0-1
var float BleedRate; // how profusely the player is bleeding; 0-1
var float DropCounter; // internal; used in tick()
var float DropCounter; // internal; used in tick()
var() float ClotPeriod; // seconds it takes bleedRate to go from 1 to 0
var() float ClotPeriod; // seconds it takes bleedRate to go from 1 to 0
var float FlashTimer; // How long it should take the current flash to fade.
var float FlashTimer; // How long it should take the current flash to fade.
// length of time player can stay underwater
// length of time player can stay underwater
// modified by SkillSwimming, AugAqualung, and Rebreather
// modified by SkillSwimming, AugAqualung, and Rebreather
var float swimDuration;
var float swimDuration;
var travel float swimTimer;
var travel float swimTimer;
var float swimBubbleTimer;
var float swimBubbleTimer;
// conversation info
// conversation info
var Actor ConversationActor;
var Actor ConversationActor;
var Actor lastThirdPersonConvoActor;
var Actor lastThirdPersonConvoActor;
var float lastThirdPersonConvoTime;
var float lastThirdPersonConvoTime;
var Actor lastFirstPersonConvoActor;
var Actor lastFirstPersonConvoActor;
var float lastFirstPersonConvoTime;
var float lastFirstPersonConvoTime;
var Bool bStartingNewGame; // Set to True when we're starting a new game.
var Bool bStartingNewGame; // Set to True when we're starting a new game.
var Bool bSavingSkillsAugs;
var Bool bSavingSkillsAugs;
// Put spy drone here instead of HUD
// Put spy drone here instead of HUD
var bool bSpyDroneActive;
var bool bSpyDroneActive;
var int spyDroneLevel;
var int spyDroneLevel;
var float spyDroneLevelValue;
var float spyDroneLevelValue;
var SpyDrone aDrone;
var SpyDrone aDrone;
// Buying skills for multiplayer
// Buying skills for multiplayer
var bool bBuySkills;
var bool bBuySkills;
// If player wants to see a profile of the killer in multiplayer
// If player wants to see a profile of the killer in multiplayer
var bool bKillerProfile;
var bool bKillerProfile;
// Multiplayer notification messages
// Multiplayer notification messages
const MPFLAG_FirstSpot = 0x01;
const MPFLAG_FirstSpot = 0x01;
const MPSERVERFLAG_FirstPoison = 0x01;
const MPSERVERFLAG_FirstPoison = 0x01;
const MPSERVERFLAG_FirstBurn = 0x02;
const MPSERVERFLAG_FirstBurn = 0x02;
const MPSERVERFLAG_TurretInv = 0x04;
const MPSERVERFLAG_TurretInv = 0x04;
const MPSERVERFLAG_CameraInv = 0x08;
const MPSERVERFLAG_CameraInv = 0x08;
const MPSERVERFLAG_LostLegs = 0x10;
const MPSERVERFLAG_LostLegs = 0x10;
const MPSERVERFLAG_DropItem = 0x20;
const MPSERVERFLAG_DropItem = 0x20;
const MPSERVERFLAG_NoCloakWeapon = 0x40;
const MPSERVERFLAG_NoCloakWeapon = 0x40;
const mpMsgDelay = 4.0;
const mpMsgDelay = 4.0;
var int mpMsgFlags;
var int mpMsgFlags;
var int mpMsgServerFlags;
var int mpMsgServerFlags;
const MPMSG_TeamUnatco =0;
const MPMSG_TeamUnatco =0;
const MPMSG_TeamNsf =1;
const MPMSG_TeamNsf =1;
const MPMSG_TeamHit =2;
const MPMSG_TeamHit =2;
const MPMSG_TeamSpot =3;
const MPMSG_TeamSpot =3;
const MPMSG_FirstPoison =4;
const MPMSG_FirstPoison =4;
const MPMSG_FirstBurn =5;
const MPMSG_FirstBurn =5;
const MPMSG_TurretInv =6;
const MPMSG_TurretInv =6;
const MPMSG_CameraInv =7;
const MPMSG_CameraInv =7;
const MPMSG_CloseKills =8;
const MPMSG_CloseKills =8;
const MPMSG_TimeNearEnd =9;
const MPMSG_TimeNearEnd =9;
const MPMSG_LostLegs =10;
const MPMSG_LostLegs =10;
const MPMSG_DropItem =11;
const MPMSG_DropItem =11;
const MPMSG_KilledTeammate =12;
const MPMSG_KilledTeammate =12;
const MPMSG_TeamLAM =13;
const MPMSG_TeamLAM =13;
const MPMSG_TeamComputer =14;
const MPMSG_TeamComputer =14;
const MPMSG_NoCloakWeapon =15;
const MPMSG_NoCloakWeapon =15;
const MPMSG_TeamHackTurret =16;
const MPMSG_TeamHackTurret =16;
var int mpMsgCode;
var int mpMsgCode;
var float mpMsgTime;
var float mpMsgTime;
var int mpMsgOptionalParam;
var int mpMsgOptionalParam;
var String mpMsgOptionalString;
var String mpMsgOptionalString;
// Variables used when starting new game to show the intro first.
// Variables used when starting new game to show the intro first.
var String strStartMap;
var String strStartMap;
var travel Bool bStartNewGameAfterIntro;
var travel Bool bStartNewGameAfterIntro;
var travel Bool bIgnoreNextShowMenu;
var travel Bool bIgnoreNextShowMenu;
// map that we're about to travel to after we finish interpolating
// map that we're about to travel to after we finish interpolating
var String NextMap;
var String NextMap;
// Configuration Variables
// Configuration Variables
var globalconfig bool bObjectNames; // Object names on/off
var globalconfig bool bObjectNames; // Object names on/off
var globalconfig bool bNPCHighlighting; // NPC highlighting when new convos
var globalconfig bool bNPCHighlighting; // NPC highlighting when new convos
var globalconfig bool bSubtitles; // True if Conversation Subtitles are on
var globalconfig bool bSubtitles; // True if Conversation Subtitles are on
var globalconfig bool bAlwaysRun; // True to default to running
var globalconfig bool bAlwaysRun; // True to default to running
var globalconfig bool bToggleCrouch; // True to let key toggle crouch
var globalconfig bool bToggleCrouch; // True to let key toggle crouch
var globalconfig float logTimeout; // Log Timeout Value
var globalconfig float logTimeout; // Log Timeout Value
var globalconfig byte maxLogLines; // Maximum number of log lines visible
var globalconfig byte maxLogLines; // Maximum number of log lines visible
var globalconfig bool bHelpMessages; // Multiplayer help messages
var globalconfig bool bHelpMessages; // Multiplayer help messages
// Overlay Options (TODO: Move to DeusExHUD.uc when serializable)
// Overlay Options (TODO: Move to DeusExHUD.uc when serializable)
var globalconfig byte translucencyLevel; // 0 - 10?
var globalconfig byte translucencyLevel; // 0 - 10?
var globalconfig bool bObjectBeltVisible;
var globalconfig bool bObjectBeltVisible;
var globalconfig bool bHitDisplayVisible;
var globalconfig bool bHitDisplayVisible;
var globalconfig bool bAmmoDisplayVisible;
var globalconfig bool bAmmoDisplayVisible;
var globalconfig bool bAugDisplayVisible;
var globalconfig bool bAugDisplayVisible;
var globalconfig bool bDisplayAmmoByClip;
var globalconfig bool bDisplayAmmoByClip;
var globalconfig bool bCompassVisible;
var globalconfig bool bCompassVisible;
var globalconfig bool bCrosshairVisible;
var globalconfig bool bCrosshairVisible;
var globalconfig bool bAutoReload;
var globalconfig bool bAutoReload;
var globalconfig bool bDisplayAllGoals;
var globalconfig bool bDisplayAllGoals;
var globalconfig bool bHUDShowAllAugs; // TRUE = Always show Augs on HUD
var globalconfig bool bHUDShowAllAugs; // TRUE = Always show Augs on HUD
var globalconfig int UIBackground; // 0 = Render 3D, 1 = Snapshot, 2 = Black
var globalconfig int UIBackground; // 0 = Render 3D, 1 = Snapshot, 2 = Black
var globalconfig bool bDisplayCompletedGoals;
var globalconfig bool bDisplayCompletedGoals;
var globalconfig bool bShowAmmoDescriptions;
var globalconfig bool bShowAmmoDescriptions;
var globalconfig bool bConfirmSaveDeletes;
var globalconfig bool bConfirmSaveDeletes;
var globalconfig bool bConfirmNoteDeletes;
var globalconfig bool bConfirmNoteDeletes;
var globalconfig bool bAskedToTrain;
var globalconfig bool bAskedToTrain;
// Multiplayer Playerspecific options
// Multiplayer Playerspecific options
var() globalconfig Name AugPrefs[9]; //List of aug preferences.
var() globalconfig Name AugPrefs[9]; //List of aug preferences.
// Used to manage NPC Barks
// Used to manage NPC Barks
var travel BarkManager barkManager;
var travel BarkManager barkManager;
// Color Theme Manager, used to manage all the pretty
// Color Theme Manager, used to manage all the pretty
// colors the player gets to play with for the Menus
// colors the player gets to play with for the Menus
// and HUD windows.
// and HUD windows.
var travel ColorThemeManager ThemeManager;
var travel ColorThemeManager ThemeManager;
var globalconfig String MenuThemeName;
var globalconfig String MenuThemeName;
var globalconfig String HUDThemeName;
var globalconfig String HUDThemeName;
// Translucency settings for various UI Elements
// Translucency settings for various UI Elements
var globalconfig Bool bHUDBordersVisible;
var globalconfig Bool bHUDBordersVisible;
var globalconfig Bool bHUDBordersTranslucent;
var globalconfig Bool bHUDBordersTranslucent;
var globalconfig Bool bHUDBackgroundTranslucent;
var globalconfig Bool bHUDBackgroundTranslucent;
var globalconfig Bool bMenusTranslucent;
var globalconfig Bool bMenusTranslucent;
var localized String InventoryFull;
var localized String InventoryFull;
var localized String TooMuchAmmo;
var localized String TooMuchAmmo;
var localized String TooHeavyToLift;
var localized String TooHeavyToLift;
var localized String CannotLift;
var localized String CannotLift;
var localized String NoRoomToLift;
var localized String NoRoomToLift;
var localized String CanCarryOnlyOne;
var localized String CanCarryOnlyOne;
var localized String CannotDropHere;
var localized String CannotDropHere;
var localized String HandsFull;
var localized String HandsFull;
var localized String NoteAdded;
var localized String NoteAdded;
var localized String GoalAdded;
var localized String GoalAdded;
var localized String PrimaryGoalCompleted;
var localized String PrimaryGoalCompleted;
var localized String SecondaryGoalCompleted;
var localized String SecondaryGoalCompleted;
var localized String EnergyDepleted;
var localized String EnergyDepleted;
var localized String AddedNanoKey;
var localized String AddedNanoKey;
var localized String HealedPointsLabel;
var localized String HealedPointsLabel;
var localized String HealedPointLabel;
var localized String HealedPointLabel;
var localized String SkillPointsAward;
var localized String SkillPointsAward;
var localized String QuickSaveGameTitle;
var localized String QuickSaveGameTitle;
var localized String WeaponUnCloak;
var localized String WeaponUnCloak;
var localized String TakenOverString;
var localized String TakenOverString;
var localized String HeadString;
var localized String HeadString;
var localized String TorsoString;
var localized String TorsoString;
var localized String LegsString;
var localized String LegsString;
var localized String WithTheString;
var localized String WithTheString;
var localized String WithString;
var localized String WithString;
var localized String PoisonString;
var localized String PoisonString;
var localized String BurnString;
var localized String BurnString;
var localized String NoneString;
var localized String NoneString;
var ShieldEffect DamageShield; //visual damage effect for multiplayer feedback
var ShieldEffect DamageShield; //visual damage effect for multiplayer feedback
var float ShieldTimer; //for turning shield to fade.
var float ShieldTimer; //for turning shield to fade.
enum EShieldStatus
enum EShieldStatus
{
{
SS_Off,
SS_Off,
SS_Fade,
SS_Fade,
SS_Strong
SS_Strong
};
};
var EShieldStatus ShieldStatus;
var EShieldStatus ShieldStatus;
var Pawn myBurner;
var Pawn myBurner;
var Pawn myPoisoner;
var Pawn myPoisoner;
var Actor myProjKiller;
var Actor myProjKiller;
var Actor myTurretKiller;
var Actor myTurretKiller;
var Actor myKiller;
var Actor myKiller;
var KillerProfile killProfile;
var KillerProfile killProfile;
var InvulnSphere invulnSph;
var InvulnSphere invulnSph;
// Conversation Invocation Methods
// Conversation Invocation Methods
enum EInvokeMethod
enum EInvokeMethod
{
{
IM_Bump,
IM_Bump,
IM_Frob,
IM_Frob,
IM_Sight,
IM_Sight,
IM_Radius,
IM_Radius,
IM_Named,
IM_Named,
IM_Other
IM_Other
};
};
enum EMusicMode
enum EMusicMode
{
{
MUS_Ambient,
MUS_Ambient,
MUS_Combat,
MUS_Combat,
MUS_Conversation,
MUS_Conversation,
MUS_Outro,
MUS_Outro,
MUS_Dying
MUS_Dying
};
};
var EMusicMode musicMode;
var EMusicMode musicMode;
var byte savedSection; // last section playing before interrupt
var byte savedSection; // last section playing before interrupt
var float musicCheckTimer;
var float musicCheckTimer;
var float musicChangeTimer;
var float musicChangeTimer;
// Used to keep track of # of saves
// Used to keep track of # of saves
var travel int saveCount;
var travel int saveCount;
var travel Float saveTime;
var travel Float saveTime;
// for getting at the debug system
// for getting at the debug system
var DebugInfo GlobalDebugObj;
var DebugInfo GlobalDebugObj;
// Set to TRUE if the player can see the quotes. :)
// Set to TRUE if the player can see the quotes. :)
var globalconfig bool bQuotesEnabled;
var globalconfig bool bQuotesEnabled;
// DEUS_EX AMSD For propagating gametype
// DEUS_EX AMSD For propagating gametype
var GameInfo DXGame;
var GameInfo DXGame;
var float ServerTimeDiff;
var float ServerTimeDiff;
var float ServerTimeLastRefresh;
var float ServerTimeLastRefresh;
// DEUS_EX AMSD For trying higher damage games
// DEUS_EX AMSD For trying higher damage games
var float MPDamageMult;
var float MPDamageMult;
// Nintendo immunity
// Nintendo immunity
var float NintendoImmunityTime;
var float NintendoImmunityTime;
var float NintendoImmunityTimeLeft;
var float NintendoImmunityTimeLeft;
var bool bNintendoImmunity;
var bool bNintendoImmunity;
const NintendoDelay = 6.0;
const NintendoDelay = 6.0;
// For closing comptuers if the server quits
// For closing comptuers if the server quits
var Computers ActiveComputer;
var Computers ActiveComputer;
var globalconfig bool bHDTP_JC;
var globalconfig bool bHDTP_JC;
var globalconfig bool bHDTP_Walton, bHDTP_Anna, bHDTP_UNATCO, bHDTP_MJ12, bHDTP_NSF, bHDTP_RiotCop, bHDTP_Gunther, bHDTP_Paul, bHDTP_Nico;
var globalconfig bool bHDTP_Walton, bHDTP_Anna, bHDTP_UNATCO, bHDTP_MJ12, bHDTP_NSF, bHDTP_RiotCop, bHDTP_Gunther, bHDTP_Paul, bHDTP_Nico;
var globalconfig int bHDTP_ALL; //-1 = none, 0 = use other settings, 1 = all.
var globalconfig int bHDTP_ALL; //-1 = none, 0 = use other settings, 1 = all.
var string HDTPMeshName;
var string HDTPMeshName;
var string HDTPMeshTex[8];
var string HDTPMeshTex[8];
//GMDX: CyberP & dasraiser
//GMDX: CyberP & dasraiser
//SAVEOUT
//SAVEOUT
var config int QuickSaveIndex; //out of some number
var config int QuickSaveIndex; //out of some number
var config int QuickSaveTotal;//this number
var config int QuickSaveTotal;//this number
var config bool bTogAutoSave; //CyberP: enable/disable autosave
var config bool bTogAutoSave; //CyberP: enable/disable autosave
var config int iQuickSaveLast;//index to last saved file
var config int iQuickSaveLast;//index to last saved file
var travel int QuickSaveLast;
var travel int QuickSaveLast;
var travel int QuickSaveCurrent;
var travel int QuickSaveCurrent;
var string QuickSaveName;
var string QuickSaveName;
//hardcore mode
//hardcore mode
var travel bool bHardCoreMode; //if set disable save game options.
var travel bool bHardCoreMode; //if set disable save game options.
var bool bPendingHardCoreSave; //set this to active quicksave
var bool bPendingHardCoreSave; //set this to active quicksave
//misc
//misc
var globalconfig bool bSkipNewGameIntro; //CyberP: for GMDX option menu
var globalconfig bool bSkipNewGameIntro; //CyberP: for GMDX option menu
var config bool bColorCodedAmmo;
var config bool bColorCodedAmmo;
var config bool bExtraHardcore;
var config bool bExtraHardcore;
var config bool bDecap;
var config bool bDecap;
var config bool bNoTranslucency;
var config bool bNoTranslucency;
var config bool bDblClickHolster;
var config bool bDblClickHolster;
var config bool bHalveAmmo;
var config bool bHalveAmmo;
var config bool bHardcoreUnlocked; //CyberP: unlock options once completed the game
var config bool bHardcoreUnlocked; //CyberP: unlock options once completed the game
var config bool bAutoHolster; //CyberP:auto-down weapon if right click deco
var config bool bAutoHolster; //CyberP:auto-down weapon if right click deco
var config bool bRealUI;
var config bool bRealUI;
var config bool bNoConsole;
var config bool bNoConsole;
var config bool bHardcoreAI1;
var config bool bHardcoreAI1;
var config bool bHardcoreAI2;
var config bool bHardcoreAI2;
var config bool bHardcoreAI3;
var config bool bHardcoreAI3;
var config bool bAlternateToolbelt;
var config bool bAlternateToolbelt;
var config bool bAnimBar1;
var config bool bAnimBar1;
var config bool bAnimBar2;
var config bool bAnimBar2;
var config bool bExtraObjectDetails;
var config bool bExtraObjectDetails;
var config bool bA51Camera;
var config bool bA51Camera;
var config bool bCameraSensors;
var config bool bCameraSensors;
var config bool bHardcoreFilterOption;
var config bool bHardcoreFilterOption;
var config bool bRealisticCarc;
var config bool bRealisticCarc;
var config bool bLaserRifle;
var config bool bLaserRifle;
var config bool bRemoveVanillaDeath;
var config bool bRemoveVanillaDeath;
var config bool bHitmarkerOn;
var config bool bHitmarkerOn;
var config bool bMantleOption;
var config bool bMantleOption;
var config bool bUSP;
var config bool bUSP;
var bool bThisMission; //CyberP: getting hacky in here.
var bool bThisMission; //CyberP: getting hacky in here.
var travel int fullUp; //CyberP: eat/drink limit.
var travel int fullUp; //CyberP: eat/drink limit.
var string fatty; //CyberP: eat/drink limit.
var string fatty; //CyberP: eat/drink limit.
var string noUsing; //CyberP: left click interaction
var string noUsing; //CyberP: left click interaction
var bool bLeftClicked; //CyberP: left click interaction
var bool bLeftClicked; //CyberP: left click interaction
var bool bDrainAlert; //CyberP: alert if energy low
var bool bDrainAlert; //CyberP: alert if energy low
var float bloodTime; //CyberP:
var float bloodTime; //CyberP:
var float hitmarkerTime;
var float hitmarkerTime;
var float camInterpol;
var float camInterpol;
var travel bool bWasCrosshair;
var travel bool bWasCrosshair;
var bool bFromCrosshair;
var bool bFromCrosshair;
var transient bool bThrowDecoration;
var transient bool bThrowDecoration;
var int SlotMem; //CyberP: for belt/weapon switching, so the code remembers what weapon we had before holstering
var int SlotMem; //CyberP: for belt/weapon switching, so the code remembers what weapon we had before holstering
var int clickCountCyber; //CyberP: for double clicking to unequip
var int clickCountCyber; //CyberP: for double clicking to unequip
var bool bStunted; //CyberP: for slowing player under various conditions
var bool bStunted; //CyberP: for slowing player under various conditions
var bool bRegenStamina; //CyberP: regen when in water but head above water
var bool bRegenStamina; //CyberP: regen when in water but head above water
var bool bCrouchRegen; //CyberP: regen when crouched and has skill
var bool bCrouchRegen; //CyberP: regen when crouched and has skill
var bool bDoubleClickCheck; //CyberP: to return from double clicking.
var bool bDoubleClickCheck; //CyberP: to return from double clicking.
var travel Inventory assignedWeapon;
var travel Inventory assignedWeapon;
var Inventory primaryWeapon;
var Inventory primaryWeapon;
var float augEffectTime;
var float augEffectTime;
var vector vecta;
var vector vecta;
var rotator rota;
var rotator rota;
//var bool bBoosty; //CyberP: low-tech speed boost
//var bool bBoosty; //CyberP: low-tech speed boost
//Alias=LeanLeft,LeanRight
//Alias=LeanLeft,LeanRight
//Aliases[18]=(Command="Button bLeanRightHook",Alias=LeanRH)
//Aliases[18]=(Command="Button bLeanRightHook",Alias=LeanRH)
//Aliases[19]=(Command="Button bLeanLeftHook",Alias=LeanLH)
//Aliases[19]=(Command="Button bLeanLeftHook",Alias=LeanLH)
var transient bool bLeanKeysDefined;
var transient bool bLeanKeysDefined;
var travel int PerkNamesArray[34]; //CyberP: perk names
var travel int PerkNamesArray[34]; //CyberP: perk names
var travel string BoughtPerks[34];
var travel string BoughtPerks[34];
var config color customColorsMenu[14]; //CyberP: custom color theme
var config color customColorsMenu[14]; //CyberP: custom color theme
var config color customColorsHUD[14];
var config color customColorsHUD[14];
var bool bTiptoes; //based on left+right lean
var bool bTiptoes; //based on left+right lean
var bool bCanTiptoes; //based on legs/crouch/can raise body
var bool bCanTiptoes; //based on legs/crouch/can raise body
var bool bIsTiptoes;
var bool bIsTiptoes;
var bool bPreTiptoes;
var bool bPreTiptoes;
var bool bLeftToe,bRightToe;
var bool bLeftToe,bRightToe;
var bool bRadarTran; //CyberP: radar trans effect
var bool bRadarTran; //CyberP: radar trans effect
var bool bCloakEnabled; //player is cloaked was class'DeusExWeapon'.default.this=T/F wow :)
var bool bCloakEnabled; //player is cloaked was class'DeusExWeapon'.default.this=T/F wow :)
var transient bool bIsCloaked; //weapon is cloaked
var transient bool bIsCloaked; //weapon is cloaked
var int LightLevelDisplay; //CyberP: augIFF light value
var int LightLevelDisplay; //CyberP: augIFF light value
var travel Actor RocketTarget; //GEPDummyTarget (basic actor)
var travel Actor RocketTarget; //GEPDummyTarget (basic actor)
var travel int advBelt;
var travel int advBelt;
var travel float RocketTargetMaxDistance;
var travel float RocketTargetMaxDistance;
var bool bGEPzoomActive;
var bool bGEPzoomActive;
var bool bGEPprojectileInflight;//is projectile flighing
var bool bGEPprojectileInflight;//is projectile flighing
var int GEPSkillLevel;
var int GEPSkillLevel;
var float GEPSkillLevelValue;
var float GEPSkillLevelValue;
var DeusExProjectile aGEPProjectile;//Fired projectile inflight
var DeusExProjectile aGEPProjectile;//Fired projectile inflight
var transient float GEPsteeringX,GEPsteeringY; //used for mouse input control
var transient float GEPsteeringX,GEPsteeringY; //used for mouse input control
var WeaponGEPGun GEPmounted;
var WeaponGEPGun GEPmounted;
//Recoil shockwave
//Recoil shockwave
var() vector RecoilSimLimit; //plus/minus
var() vector RecoilSimLimit; //plus/minus
var() float RecoilDrain;
var() float RecoilDrain;
var vector RecoilShake;
var vector RecoilShake;
var vector RecoilDesired;//lerp to this
var vector RecoilDesired;//lerp to this
var float RecoilTime; //amount of lerp shake before desired set to 0
var float RecoilTime; //amount of lerp shake before desired set to 0
var rotator SAVErotation;
var rotator SAVErotation;
var vector SAVElocation;
var vector SAVElocation;
var bool bStaticFreeze;
var bool bStaticFreeze;
//////////END GMDX
//////////END GMDX
// native Functions
// native Functions
native(1099) final function string GetDeusExVersion();
native(1099) final function string GetDeusExVersion();
native(2100) final function ConBindEvents();
native(2100) final function ConBindEvents();
native(3001) final function name SetBoolFlagFromString(String flagNameString, bool bValue);
native(3001) final function name SetBoolFlagFromString(String flagNameString, bool bValue);
native(3002) final function ConHistory CreateHistoryObject();
native(3002) final function ConHistory CreateHistoryObject();
native(3003) final function ConHistoryEvent CreateHistoryEvent();
native(3003) final function ConHistoryEvent CreateHistoryEvent();
native(3010) final function DeusExLog CreateLogObject();
native(3010) final function DeusExLog CreateLogObject();
native(3011) final function SaveGame(int saveIndex, optional String saveDesc);
native(3011) final function SaveGame(int saveIndex, optional String saveDesc);
native(3012) final function DeleteSaveGameFiles(optional String saveDirectory);
native(3012) final function DeleteSaveGameFiles(optional String saveDirectory);
native(3013) final function GameDirectory CreateGameDirectoryObject();
native(3013) final function GameDirectory CreateGameDirectoryObject();
native(3014) final function DataVaultImageNote CreateDataVaultImageNoteObject();
native(3014) final function DataVaultImageNote CreateDataVaultImageNoteObject();
native(3015) final function DumpLocation CreateDumpLocationObject();
native(3015) final function DumpLocation CreateDumpLocationObject();
native(3016) final function UnloadTexture(Texture texture);
native(3016) final function UnloadTexture(Texture texture);
//native 3017 taken by particleiterator.
//native 3017 taken by particleiterator.
//
//
// network replication
// network replication
//
//
replication
replication
{
{
// server to client
// server to client
reliable if ((Role == ROLE_Authority) && (bNetOwner))
reliable if ((Role == ROLE_Authority) && (bNetOwner))
AugmentationSystem, SkillSystem, SkillPointsTotal, SkillPointsAvail, inHand, inHandPending, KeyRing, Energy,
AugmentationSystem, SkillSystem, SkillPointsTotal, SkillPointsAvail, inHand, inHandPending, KeyRing, Energy,
bSpyDroneActive, DXGame, bBuySkills, drugEffectTimer, killProfile;
bSpyDroneActive, DXGame, bBuySkills, drugEffectTimer, killProfile;
reliable if (Role == ROLE_Authority)
reliable if (Role == ROLE_Authority)
ShieldStatus, RunSilentValue, aDrone, NintendoImmunityTimeLeft;
ShieldStatus, RunSilentValue, aDrone, NintendoImmunityTimeLeft;
// client to server
// client to server
reliable if (Role < ROLE_Authority)
reliable if (Role < ROLE_Authority)
BarkManager, FrobTarget, AugPrefs, bCanLean, curLeanDist, prevLeanDist,
BarkManager, FrobTarget, AugPrefs, bCanLean, curLeanDist, prevLeanDist,
bInHandTransition, bForceDuck, FloorMaterial, WallMaterial, WallNormal, swimTimer, swimDuration;
bInHandTransition, bForceDuck, FloorMaterial, WallMaterial, WallNormal, swimTimer, swimDuration;
// Functions the client can call
// Functions the client can call
reliable if (Role < ROLE_Authority)
reliable if (Role < ROLE_Authority)
DoFrob, ParseLeftClick, ParseRightClick, ReloadWeapon, PlaceItemInSlot, RemoveItemFromSlot, ClearInventorySlots,
DoFrob, ParseLeftClick, ParseRightClick, ReloadWeapon, PlaceItemInSlot, RemoveItemFromSlot, ClearInventorySlots,
SetInvSlots, FindInventorySlot, ActivateBelt, DropItem, SetInHand, AugAdd, ExtinguishFire, CatchFire,
SetInvSlots, FindInventorySlot, ActivateBelt, DropItem, SetInHand, AugAdd, ExtinguishFire, CatchFire,
AllEnergy, ClearPosition, ClearBelt, AddObjectToBelt, RemoveObjectFromBelt, TeamSay,
AllEnergy, ClearPosition, ClearBelt, AddObjectToBelt, RemoveObjectFromBelt, TeamSay,
KeypadRunUntriggers, KeypadRunEvents, KeypadToggleLocks, ReceiveFirstOptionSync, ReceiveSecondOptionSync,CreateDrone, MoveDrone,
KeypadRunUntriggers, KeypadRunEvents, KeypadToggleLocks, ReceiveFirstOptionSync, ReceiveSecondOptionSync,CreateDrone, MoveDrone,
CloseComputerScreen, SetComputerHackTime, UpdateCameraRotation, ToggleCameraState,
CloseComputerScreen, SetComputerHackTime, UpdateCameraRotation, ToggleCameraState,
SetTurretTrackMode, SetTurretState, NewMultiplayerMatch, PopHealth, ServerUpdateLean, BuySkills, PutInHand,
SetTurretTrackMode, SetTurretState, NewMultiplayerMatch, PopHealth, ServerUpdateLean, BuySkills, PutInHand,
MakeCameraAlly, PunishDetection, ServerSetAutoReload, FailRootWindowCheck, FailConsoleCheck, ClientPossessed;
MakeCameraAlly, PunishDetection, ServerSetAutoReload, FailRootWindowCheck, FailConsoleCheck, ClientPossessed;
// Unreliable functions the client can call
// Unreliable functions the client can call
unreliable if (Role < ROLE_Authority)
unreliable if (Role < ROLE_Authority)
MaintainEnergy, UpdateTranslucency;
MaintainEnergy, UpdateTranslucency;
// Functions the server calls in client
// Functions the server calls in client
reliable if ((Role == ROLE_Authority) && (bNetOwner))
reliable if ((Role == ROLE_Authority) && (bNetOwner))
UpdateAugmentationDisplayStatus, AddAugmentationDisplay, RemoveAugmentationDisplay, ClearAugmentationDisplay, ShowHud,
UpdateAugmentationDisplayStatus, AddAugmentationDisplay, RemoveAugmentationDisplay, ClearAugmentationDisplay, ShowHud,
ActivateKeyPadWindow, SetDamagePercent, SetServerTimeDiff, ClientTurnOffScores;
ActivateKeyPadWindow, SetDamagePercent, SetServerTimeDiff, ClientTurnOffScores;
reliable if (Role == ROLE_Authority)
reliable if (Role == ROLE_Authority)
InvokeComputerScreen, ClientDeath, AddChargedDisplay, RemoveChargedDisplay, MultiplayerDeathMsg, MultiplayerNotifyMsg,
InvokeComputerScreen, ClientDeath, AddChargedDisplay, RemoveChargedDisplay, MultiplayerDeathMsg, MultiplayerNotifyMsg,
BuySkillSound, ShowMultiplayerWin, ForceDroneOff ,AddDamageDisplay, ClientSpawnHits, CloseThisComputer, ClientPlayAnimation, ClientSpawnProjectile, LocalLog,
BuySkillSound, ShowMultiplayerWin, ForceDroneOff ,AddDamageDisplay, ClientSpawnHits, CloseThisComputer, ClientPlayAnimation, ClientSpawnProjectile, LocalLog,
VerifyRootWindow, VerifyConsole, ForceDisconnect;
VerifyRootWindow, VerifyConsole, ForceDisconnect;
}
}
exec function cheat()
exec function cheat()
{
{
if (bHardCoreMode) bCheatsEnabled = false;
if (bHardCoreMode) bCheatsEnabled = false;
else bCheatsEnabled = !bCheatsEnabled;
else bCheatsEnabled = !bCheatsEnabled;
}
}
function UpdateHDTPsettings()
function UpdateHDTPsettings()
{
{
local mesh tempmesh;
local mesh tempmesh;
local texture temptex;
local texture temptex;
local int i;
local int i;
if(GetHDTPSettings(self)) //lol recursive
if(GetHDTPSettings(self)) //lol recursive
{
{
if(HDTPMeshname != "")
if(HDTPMeshname != "")
{
{
tempmesh = lodmesh(dynamicloadobject(HDTPMeshname,class'mesh',true));
tempmesh = lodmesh(dynamicloadobject(HDTPMeshname,class'mesh',true));
if(tempmesh != none)
if(tempmesh != none)
{
{
mesh = tempmesh;
mesh = tempmesh;
for(i=0;i<=7;i++)
for(i=0;i<=7;i++)
{
{
if(HDTPMeshtex[i] != "")
if(HDTPMeshtex[i] != "")
{
{
temptex = texture(dynamicloadobject(HDTPMeshtex[i],class'texture',true));
temptex = texture(dynamicloadobject(HDTPMeshtex[i],class'texture',true));
if(temptex != none)
if(temptex != none)
multiskins[i] = temptex;
multiskins[i] = temptex;
}
}
}
}
}
}
}
}
}
}
else
else
{
{
mesh = default.mesh;
mesh = default.mesh;
for(i=0; i<=7;i++)
for(i=0; i<=7;i++)
{
{
multiskins[i]=default.multiskins[i];
multiskins[i]=default.multiskins[i];
}
}
}
}
}
}
function bool GetHDTPSettings(actor Other)
function bool GetHDTPSettings(actor Other)
{
{
if(bHDTP_ALL > 0)
if(bHDTP_ALL > 0)
return true;
return true;
else if(bHDTP_All < 0)
else if(bHDTP_All < 0)
return false;
return false;
else
else
{
{
if((Other.IsA('JCDentonMaleCarcass') || Other.IsA('JCDouble') || Other.IsA('JCDentonMale')) && bHDTP_JC) //changed self to JCdentonmale for hopefully better mod compatibility
if((Other.IsA('JCDentonMaleCarcass') || Other.IsA('JCDouble') || Other.IsA('JCDentonMale')) && bHDTP_JC) //changed self to JCdentonmale for hopefully better mod compatibility
return true;
return true;
//if((Other.IsA('MJ12Troop') || Other.IsA('MJ12TroopCarcass')) && bHDTP_MJ12)
//if((Other.IsA('MJ12Troop') || Other.IsA('MJ12TroopCarcass')) && bHDTP_MJ12)
// return true;
// return true;
else if((Other.IsA('UNATCOTroop') || Other.IsA('UNATCOTroopCarcass')) && bHDTP_UNATCO)
else if((Other.IsA('UNATCOTroop') || Other.IsA('UNATCOTroopCarcass')) && bHDTP_UNATCO)
return true;
return true;
else if((Other.IsA('WaltonSimons') || Other.IsA('WaltonSimonsCarcass')) && bHDTP_WALTON)
else if((Other.IsA('WaltonSimons') || Other.IsA('WaltonSimonsCarcass')) && bHDTP_WALTON)
return true;
return true;
else if((Other.IsA('AnnaNavarre') || Other.IsA('AnnaNavarreCarcass')) && bHDTP_Anna)
else if((Other.IsA('AnnaNavarre') || Other.IsA('AnnaNavarreCarcass')) && bHDTP_Anna)
return true;
return true;
else if((Other.IsA('GuntherHermann') || Other.IsA('GuntherHermannCarcass')) && bHDTP_Gunther)
else if((Other.IsA('GuntherHermann') || Other.IsA('GuntherHermannCarcass')) && bHDTP_Gunther)
return true;
return true;
else if((Other.IsA('RiotCop') || Other.IsA('RiotCopCarcass')) && bHDTP_RiotCop)
else if((Other.IsA('RiotCop') || Other.IsA('RiotCopCarcass')) && bHDTP_RiotCop)
return true;
return true;
else if((Other.IsA('Terrorist') || Other.IsA('TerroristCarcass')) && bHDTP_NSF)
else if((Other.IsA('Terrorist') || Other.IsA('TerroristCarcass')) && bHDTP_NSF)
return true;
return true;
else if((Other.IsA('PaulDenton') || Other.IsA('PaulDentonCarcass')) && bHDTP_Paul)
else if((Other.IsA('PaulDenton') || Other.IsA('PaulDentonCarcass')) && bHDTP_Paul)
return true;
return true;
else if((Other.IsA('NicoletteDuClare') || Other.IsA('NicoletteDuClareCarcass')) && bHDTP_Nico)
else if((Other.IsA('NicoletteDuClare') || Other.IsA('NicoletteDuClareCarcass')) && bHDTP_Nico)
return true;
return true;
else
else
return false;
return false;
}
}
return false;
return false;
}
}
function setupDifficultyMod() //CyberP: Lazy scale based on difficulty. To find all things modified by difficulty level in
function setupDifficultyMod() //CyberP: Lazy scale based on difficulty. To find all things modified by difficulty level in
{ //CyberP: GMDX, search CombatDifficulty & bHardCoreMode.
{ //CyberP: GMDX, search CombatDifficulty & bHardCoreMode.
local ScriptedPawn P; //CyberP: WARNING: is called every login. TODO: call only once per map.
local ScriptedPawn P; //CyberP: WARNING: is called every login. TODO: call only once per map.
local ThrownProjectile TP;
local ThrownProjectile TP;
local AutoTurret T;
local AutoTurret T;
local SecurityCamera SC;
local SecurityCamera SC;
local DeusExWeapon WP;
local DeusExWeapon WP;
local DeusExAmmo AM;
local DeusExAmmo AM;
local DeusExMover MV;
local DeusExMover MV;
local Keypad KP;
local Keypad KP;
log("bHardCoreMode =" @bHardCoreMode);
log("bHardCoreMode =" @bHardCoreMode);
log("CombatDifficulty =" @CombatDifficulty);
log("CombatDifficulty =" @CombatDifficulty);
if (bHDTP_All != -1)
if (bHDTP_All != -1)
bHDTP_All=-1;
bHDTP_All=-1;
bStunted = False; //CyberP: failsafe
bStunted = False; //CyberP: failsafe
ForEach AllActors(class'ScriptedPawn', P)
ForEach AllActors(class'ScriptedPawn', P)
{
{
if (P.bHardcoreOnly == True && bHardCoreMode == False && bHardcoreFilterOption == False) //CyberP: remove this pawn if we are not hardcore
if (P.bHardcoreOnly == True && bHardCoreMode == False && bHardcoreFilterOption == False) //CyberP: remove this pawn if we are not hardcore
P.Destroy();
P.Destroy();
if (P.IsA('HumanMilitary') || P.IsA('HumanThug'))
if (P.IsA('HumanMilitary') || P.IsA('HumanThug'))
{
{
if (!bHardCoreMode && CombatDifficulty > 1)
if (!bHardCoreMode && CombatDifficulty > 1)
{
{
if (P.HearingThreshold < 0.135000)
if (P.HearingThreshold < 0.135000)
P.HearingThreshold = 0.135000;
P.HearingThreshold = 0.135000;
if (P.SurprisePeriod < 1.250000)
if (P.SurprisePeriod < 1.250000)
P.SurprisePeriod = 1.250000;
P.SurprisePeriod = 1.250000;
if (P.VisibilityThreshold < 0.005500)
if (P.VisibilityThreshold < 0.005500)
P.VisibilityThreshold = 0.005500;
P.VisibilityThreshold = 0.005500;
if (P.EnemyTimeout > 10.000000)
if (P.EnemyTimeout > 10.000000)
P.EnemyTimeout = 10.000000;
P.EnemyTimeout = 10.000000;
}
}
else if (CombatDifficulty <= 1)
else if (CombatDifficulty <= 1)
{
{
if (P.VisibilityThreshold < 0.010000)
if (P.VisibilityThreshold < 0.010000)
P.VisibilityThreshold = 0.010000;
P.VisibilityThreshold = 0.010000;
if (P.HearingThreshold < 0.150000)
if (P.HearingThreshold < 0.150000)
P.HearingThreshold = 0.150000;
P.HearingThreshold = 0.150000;
if (P.EnemyTimeout > 8.000000)
if (P.EnemyTimeout > 8.000000)
P.EnemyTimeout = 8.000000;
P.EnemyTimeout = 8.000000;
if (P.SurprisePeriod < 2.000000)
if (P.SurprisePeriod < 2.000000)
P.SurprisePeriod = 2.0;
P.SurprisePeriod = 2.0;
}
}
else if (bHardCoreMode)
else if (bHardCoreMode)
{
{
if (P.BaseAccuracy != 0.000000 && P.BaseAccuracy > 0.050000) //CyberP: all Human Military are more accurate on hardcore mode.
if (P.BaseAccuracy != 0.000000 && P.BaseAccuracy > 0.050000) //CyberP: all Human Military are more accurate on hardcore mode.
P.BaseAccuracy=0.050000;
P.BaseAccuracy=0.050000;
if (P.bDefendHome && P.HomeExtent < 64)
if (P.bDefendHome && P.HomeExtent < 64)
P.EnemyTimeOut = 22.000000; //CyberP: camp for longer
P.EnemyTimeOut = 22.000000; //CyberP: camp for longer
if (P.SurprisePeriod > 0.75)
if (P.SurprisePeriod > 0.75)
P.SurprisePeriod = 0.75;
P.SurprisePeriod = 0.75;
}
}
}
}
else if (P.IsA('Robot'))
else if (P.IsA('Robot'))
{
{
if (bHardCoreMode)
if (bHardCoreMode)
P.EnemyTimeout = 16.000000;
P.EnemyTimeout = 16.000000;
else
else
P.EnemyTimeout = 10.000000;
P.EnemyTimeout = 10.000000;
}
}
if ((P.IsA('MJ12Troop') || P.IsA('MJ12Elite')) && (P.bHasCloak || P.UnfamiliarName == "MJ12 Elite" ))
if ((P.IsA('MJ12Troop') || P.IsA('MJ12Elite')) && (P.bHasCloak || P.UnfamiliarName == "MJ12 Elite" ))
{
{
if (bHardCoreMode)
if (bHardCoreMode)
{
{
P.default.Health=350;
P.default.Health=350;
P.default.HealthHead=350;
P.default.HealthHead=350;
P.default.HealthTorso=350;
P.default.HealthTorso=350;
P.default.HealthLegLeft=350;
P.default.HealthLegLeft=350;
P.default.HealthLegRight=350;
P.default.HealthLegRight=350;
P.default.HealthArmLeft=350;
P.default.HealthArmLeft=350;
P.default.HealthArmRight=350;
P.default.HealthArmRight=350;
P.Health=350;
P.Health=350;
P.HealthHead=350;
P.HealthHead=350;
P.HealthTorso=350;
P.HealthTorso=350;
P.HealthLegLeft=350;
P.HealthLegLeft=350;
P.HealthLegRight=350;
P.HealthLegRight=350;
P.HealthArmLeft=350;
P.HealthArmLeft=350;
P.HealthArmRight=350;
P.HealthArmRight=350;
P.CloakThreshold=140;
P.CloakThreshold=140;
P.GroundSpeed=260.000000;
P.GroundSpeed=260.000000;
}
}
else
else
{
{
P.default.Health=200;
P.default.Health=200;
P.default.HealthHead=200;
P.default.HealthHead=200;
P.default.HealthTorso=200;
P.default.HealthTorso=200;
P.default.HealthLegLeft=200;
P.default.HealthLegLeft=200;
P.default.HealthLegRight=200;
P.default.HealthLegRight=200;
P.default.HealthArmLeft=200;
P.default.HealthArmLeft=200;
P.default.HealthArmRight=200;
P.default.HealthArmRight=200;
P.Health=200;
P.Health=200;
P.HealthHead=200;
P.HealthHead=200;
P.HealthTorso=200;
P.HealthTorso=200;
P.HealthLegLeft=200;
P.HealthLegLeft=200;
P.HealthLegRight=200;
P.HealthLegRight=200;
P.HealthArmLeft=200;
P.HealthArmLeft=200;
P.HealthArmRight=200;
P.HealthArmRight=200;
P.CloakThreshold=100;
P.CloakThreshold=100;
P.GroundSpeed=240.000000;
P.GroundSpeed=240.000000;
P.SurprisePeriod=1.000000;
P.SurprisePeriod=1.000000;
}
}
}
}
else if (P.IsA('MJ12Commando'))
else if (P.IsA('MJ12Commando'))
{
{
if (bHardCoreMode)
if (bHardCoreMode)
{
{
P.default.Health=450;
P.default.Health=450;
P.default.HealthHead=450;
P.default.HealthHead=450;
P.default.HealthTorso=450;
P.default.HealthTorso=450;
P.default.HealthLegLeft=450;
P.default.HealthLegLeft=450;
P.default.HealthLegRight=450;
P.default.HealthLegRight=450;
P.default.HealthArmLeft=450;
P.default.HealthArmLeft=450;
P.default.HealthArmRight=450;
P.default.HealthArmRight=450;
P.Health=450;
P.Health=450;
P.HealthHead=450;
P.HealthHead=450;
P.HealthTorso=450;
P.HealthTorso=450;
P.HealthLegLeft=450;
P.HealthLegLeft=450;
P.HealthLegRight=450;
P.HealthLegRight=450;
P.HealthArmLeft=450;
P.HealthArmLeft=450;
P.HealthArmRight=450;
P.HealthArmRight=450;
P.VisibilityThreshold=0.001000;
P.VisibilityThreshold=0.001000;
}
}
else
else
{
{
P.default.Health=300;
P.default.Health=300;
P.default.HealthHead=300;
P.default.HealthHead=300;
P.default.HealthTorso=300;
P.default.HealthTorso=300;
P.default.HealthLegLeft=300;
P.default.HealthLegLeft=300;
P.default.HealthLegRight=300;
P.default.HealthLegRight=300;
P.default.Hea
P.default.Hea
저장된 비교 결과
원본
파일 열기
//============================================================================= // DeusExPlayer. //============================================================================= class DeusExPlayer extends PlayerPawnExt native; #exec OBJ LOAD FILE=Effects // Name and skin assigned to PC by player on the Character Generation screen var travel String TruePlayerName; var travel int PlayerSkin; // Combat Difficulty, set only at new game time var travel Float CombatDifficulty; // Augmentation system vars var travel AugmentationManager AugmentationSystem; // Skill system vars var travel SkillManager SkillSystem; var() travel int SkillPointsTotal; var() travel int SkillPointsAvail; // Credits (money) the player has var travel int Credits; // Energy the player has var travel float Energy; var travel float EnergyMax; var travel float EnergyDrain; // amount of energy left to drain var travel float EnergyDrainTotal; // total amount of energy to drain var float MaxRegenPoint; // in multiplayer, the highest that auto regen will take you var float RegenRate; // the number of points healed per second in mp // Keyring, used to store any keys the player picks up var travel NanoKeyRing KeyRing; // Inventory Item var travel NanoKeyInfo KeyList; // List of Keys // frob vars var() float MaxFrobDistance; var Actor FrobTarget; var float FrobTime; // HUD Refresh Timer var float LastRefreshTime; // Conversation System Vars var ConPlay conPlay; // Conversation var DataLinkPlay dataLinkPlay; // Used for DataLinks var travel ConHistory conHistory; // Conversation History // Inventory System Vars var travel byte invSlots[30]; // 5x6 grid of inventory slots var int maxInvRows; // Maximum number of inventory rows var int maxInvCols; // Maximum number of inventory columns var travel Inventory inHand; // The current object in hand var travel Inventory inHandPending; // The pending item waiting to be put in hand var travel Inventory ClientinHandPending; // Client temporary inhand pending, for mousewheel use. var travel Inventory LastinHand; // Last object inhand, so we can detect inhand changes on the client. var travel bool bInHandTransition; // The inHand is being swapped out // DEUS_EX AMSD Whether to ignore inv slots in multiplayer var bool bBeltIsMPInventory; // Goal Tracking var travel DeusExGoal FirstGoal; var travel DeusExGoal LastGoal; // Note Tracking var travel DeusExNote FirstNote; var travel DeusExNote LastNote; // Data Vault Images var travel DataVaultImage FirstImage; // Log Messages var DeusExLog FirstLog; var DeusExLog LastLog; // used by ViewModel var Actor ViewModelActor[8]; // DEUS_EX AMSD For multiplayer option propagation UGH! // In most cases options will sync on their own. But for // initial loadout based on options, we need to send them to the // server. Easiest thing to do is have a function at startup // that sends that info. var bool bFirstOptionsSynced; var bool bSecondOptionsSynced; // used while crouching var travel bool bForceDuck; var travel bool bCrouchOn; // used by toggle crouch var travel bool bWasCrouchOn; // used by toggle crouch var travel byte lastbDuck; // used by toggle crouch // leaning vars var bool bCanLean; var float curLeanDist; var float prevLeanDist; // toggle walk var bool bToggleWalk; // communicate run silent value in multiplayer var float RunSilentValue; // cheats var bool bWarrenEMPField; var float WarrenTimer; var int WarrenSlot; // used by lots of stuff var name FloorMaterial; var name WallMaterial; var Vector WallNormal; // drug effects on the player var travel float drugEffectTimer; // shake variables var float JoltMagnitude; // magnitude of bounce imposed by heavy footsteps // poison dart effects on the player var float poisonTimer; // time remaining before next poison TakeDamage var int poisonCounter; // number of poison TakeDamages remaining var int poisonDamage; // damage taken from poison effect // bleeding variables var float BleedRate; // how profusely the player is bleeding; 0-1 var float DropCounter; // internal; used in tick() var() float ClotPeriod; // seconds it takes bleedRate to go from 1 to 0 var float FlashTimer; // How long it should take the current flash to fade. // length of time player can stay underwater // modified by SkillSwimming, AugAqualung, and Rebreather var float swimDuration; var travel float swimTimer; var float swimBubbleTimer; // conversation info var Actor ConversationActor; var Actor lastThirdPersonConvoActor; var float lastThirdPersonConvoTime; var Actor lastFirstPersonConvoActor; var float lastFirstPersonConvoTime; var Bool bStartingNewGame; // Set to True when we're starting a new game. var Bool bSavingSkillsAugs; // Put spy drone here instead of HUD var bool bSpyDroneActive; var int spyDroneLevel; var float spyDroneLevelValue; var SpyDrone aDrone; // Buying skills for multiplayer var bool bBuySkills; // If player wants to see a profile of the killer in multiplayer var bool bKillerProfile; // Multiplayer notification messages const MPFLAG_FirstSpot = 0x01; const MPSERVERFLAG_FirstPoison = 0x01; const MPSERVERFLAG_FirstBurn = 0x02; const MPSERVERFLAG_TurretInv = 0x04; const MPSERVERFLAG_CameraInv = 0x08; const MPSERVERFLAG_LostLegs = 0x10; const MPSERVERFLAG_DropItem = 0x20; const MPSERVERFLAG_NoCloakWeapon = 0x40; const mpMsgDelay = 4.0; var int mpMsgFlags; var int mpMsgServerFlags; const MPMSG_TeamUnatco =0; const MPMSG_TeamNsf =1; const MPMSG_TeamHit =2; const MPMSG_TeamSpot =3; const MPMSG_FirstPoison =4; const MPMSG_FirstBurn =5; const MPMSG_TurretInv =6; const MPMSG_CameraInv =7; const MPMSG_CloseKills =8; const MPMSG_TimeNearEnd =9; const MPMSG_LostLegs =10; const MPMSG_DropItem =11; const MPMSG_KilledTeammate =12; const MPMSG_TeamLAM =13; const MPMSG_TeamComputer =14; const MPMSG_NoCloakWeapon =15; const MPMSG_TeamHackTurret =16; var int mpMsgCode; var float mpMsgTime; var int mpMsgOptionalParam; var String mpMsgOptionalString; // Variables used when starting new game to show the intro first. var String strStartMap; var travel Bool bStartNewGameAfterIntro; var travel Bool bIgnoreNextShowMenu; // map that we're about to travel to after we finish interpolating var String NextMap; // Configuration Variables var globalconfig bool bObjectNames; // Object names on/off var globalconfig bool bNPCHighlighting; // NPC highlighting when new convos var globalconfig bool bSubtitles; // True if Conversation Subtitles are on var globalconfig bool bAlwaysRun; // True to default to running var globalconfig bool bToggleCrouch; // True to let key toggle crouch var globalconfig float logTimeout; // Log Timeout Value var globalconfig byte maxLogLines; // Maximum number of log lines visible var globalconfig bool bHelpMessages; // Multiplayer help messages // Overlay Options (TODO: Move to DeusExHUD.uc when serializable) var globalconfig byte translucencyLevel; // 0 - 10? var globalconfig bool bObjectBeltVisible; var globalconfig bool bHitDisplayVisible; var globalconfig bool bAmmoDisplayVisible; var globalconfig bool bAugDisplayVisible; var globalconfig bool bDisplayAmmoByClip; var globalconfig bool bCompassVisible; var globalconfig bool bCrosshairVisible; var globalconfig bool bAutoReload; var globalconfig bool bDisplayAllGoals; var globalconfig bool bHUDShowAllAugs; // TRUE = Always show Augs on HUD var globalconfig int UIBackground; // 0 = Render 3D, 1 = Snapshot, 2 = Black var globalconfig bool bDisplayCompletedGoals; var globalconfig bool bShowAmmoDescriptions; var globalconfig bool bConfirmSaveDeletes; var globalconfig bool bConfirmNoteDeletes; var globalconfig bool bAskedToTrain; // Multiplayer Playerspecific options var() globalconfig Name AugPrefs[9]; //List of aug preferences. // Used to manage NPC Barks var travel BarkManager barkManager; // Color Theme Manager, used to manage all the pretty // colors the player gets to play with for the Menus // and HUD windows. var travel ColorThemeManager ThemeManager; var globalconfig String MenuThemeName; var globalconfig String HUDThemeName; // Translucency settings for various UI Elements var globalconfig Bool bHUDBordersVisible; var globalconfig Bool bHUDBordersTranslucent; var globalconfig Bool bHUDBackgroundTranslucent; var globalconfig Bool bMenusTranslucent; var localized String InventoryFull; var localized String TooMuchAmmo; var localized String TooHeavyToLift; var localized String CannotLift; var localized String NoRoomToLift; var localized String CanCarryOnlyOne; var localized String CannotDropHere; var localized String HandsFull; var localized String NoteAdded; var localized String GoalAdded; var localized String PrimaryGoalCompleted; var localized String SecondaryGoalCompleted; var localized String EnergyDepleted; var localized String AddedNanoKey; var localized String HealedPointsLabel; var localized String HealedPointLabel; var localized String SkillPointsAward; var localized String QuickSaveGameTitle; var localized String WeaponUnCloak; var localized String TakenOverString; var localized String HeadString; var localized String TorsoString; var localized String LegsString; var localized String WithTheString; var localized String WithString; var localized String PoisonString; var localized String BurnString; var localized String NoneString; var ShieldEffect DamageShield; //visual damage effect for multiplayer feedback var float ShieldTimer; //for turning shield to fade. enum EShieldStatus { SS_Off, SS_Fade, SS_Strong }; var EShieldStatus ShieldStatus; var Pawn myBurner; var Pawn myPoisoner; var Actor myProjKiller; var Actor myTurretKiller; var Actor myKiller; var KillerProfile killProfile; var InvulnSphere invulnSph; // Conversation Invocation Methods enum EInvokeMethod { IM_Bump, IM_Frob, IM_Sight, IM_Radius, IM_Named, IM_Other }; enum EMusicMode { MUS_Ambient, MUS_Combat, MUS_Conversation, MUS_Outro, MUS_Dying }; var EMusicMode musicMode; var byte savedSection; // last section playing before interrupt var float musicCheckTimer; var float musicChangeTimer; // Used to keep track of # of saves var travel int saveCount; var travel Float saveTime; // for getting at the debug system var DebugInfo GlobalDebugObj; // Set to TRUE if the player can see the quotes. :) var globalconfig bool bQuotesEnabled; // DEUS_EX AMSD For propagating gametype var GameInfo DXGame; var float ServerTimeDiff; var float ServerTimeLastRefresh; // DEUS_EX AMSD For trying higher damage games var float MPDamageMult; // Nintendo immunity var float NintendoImmunityTime; var float NintendoImmunityTimeLeft; var bool bNintendoImmunity; const NintendoDelay = 6.0; // For closing comptuers if the server quits var Computers ActiveComputer; var globalconfig bool bHDTP_JC; var globalconfig bool bHDTP_Walton, bHDTP_Anna, bHDTP_UNATCO, bHDTP_MJ12, bHDTP_NSF, bHDTP_RiotCop, bHDTP_Gunther, bHDTP_Paul, bHDTP_Nico; var globalconfig int bHDTP_ALL; //-1 = none, 0 = use other settings, 1 = all. var string HDTPMeshName; var string HDTPMeshTex[8]; //GMDX: CyberP & dasraiser //SAVEOUT var config int QuickSaveIndex; //out of some number var config int QuickSaveTotal;//this number var config bool bTogAutoSave; //CyberP: enable/disable autosave var config int iQuickSaveLast;//index to last saved file var travel int QuickSaveLast; var travel int QuickSaveCurrent; var string QuickSaveName; //hardcore mode var travel bool bHardCoreMode; //if set disable save game options. var bool bPendingHardCoreSave; //set this to active quicksave //misc var globalconfig bool bSkipNewGameIntro; //CyberP: for GMDX option menu var config bool bColorCodedAmmo; var config bool bExtraHardcore; var config bool bDecap; var config bool bNoTranslucency; var config bool bDblClickHolster; var config bool bHalveAmmo; var config bool bHardcoreUnlocked; //CyberP: unlock options once completed the game var config bool bAutoHolster; //CyberP:auto-down weapon if right click deco var config bool bRealUI; var config bool bNoConsole; var config bool bHardcoreAI1; var config bool bHardcoreAI2; var config bool bHardcoreAI3; var config bool bAlternateToolbelt; var config bool bAnimBar1; var config bool bAnimBar2; var config bool bExtraObjectDetails; var config bool bA51Camera; var config bool bCameraSensors; var config bool bHardcoreFilterOption; var config bool bRealisticCarc; var config bool bLaserRifle; var config bool bRemoveVanillaDeath; var config bool bHitmarkerOn; var config bool bMantleOption; var config bool bUSP; var bool bThisMission; //CyberP: getting hacky in here. var travel int fullUp; //CyberP: eat/drink limit. var string fatty; //CyberP: eat/drink limit. var string noUsing; //CyberP: left click interaction var bool bLeftClicked; //CyberP: left click interaction var bool bDrainAlert; //CyberP: alert if energy low var float bloodTime; //CyberP: var float hitmarkerTime; var float camInterpol; var travel bool bWasCrosshair; var bool bFromCrosshair; var transient bool bThrowDecoration; var int SlotMem; //CyberP: for belt/weapon switching, so the code remembers what weapon we had before holstering var int clickCountCyber; //CyberP: for double clicking to unequip var bool bStunted; //CyberP: for slowing player under various conditions var bool bRegenStamina; //CyberP: regen when in water but head above water var bool bCrouchRegen; //CyberP: regen when crouched and has skill var bool bDoubleClickCheck; //CyberP: to return from double clicking. var travel Inventory assignedWeapon; var Inventory primaryWeapon; var float augEffectTime; var vector vecta; var rotator rota; //var bool bBoosty; //CyberP: low-tech speed boost //Alias=LeanLeft,LeanRight //Aliases[18]=(Command="Button bLeanRightHook",Alias=LeanRH) //Aliases[19]=(Command="Button bLeanLeftHook",Alias=LeanLH) var transient bool bLeanKeysDefined; var travel int PerkNamesArray[34]; //CyberP: perk names var travel string BoughtPerks[34]; var config color customColorsMenu[14]; //CyberP: custom color theme var config color customColorsHUD[14]; var bool bTiptoes; //based on left+right lean var bool bCanTiptoes; //based on legs/crouch/can raise body var bool bIsTiptoes; var bool bPreTiptoes; var bool bLeftToe,bRightToe; var bool bRadarTran; //CyberP: radar trans effect var bool bCloakEnabled; //player is cloaked was class'DeusExWeapon'.default.this=T/F wow :) var transient bool bIsCloaked; //weapon is cloaked var int LightLevelDisplay; //CyberP: augIFF light value var travel Actor RocketTarget; //GEPDummyTarget (basic actor) var travel int advBelt; var travel float RocketTargetMaxDistance; var bool bGEPzoomActive; var bool bGEPprojectileInflight;//is projectile flighing var int GEPSkillLevel; var float GEPSkillLevelValue; var DeusExProjectile aGEPProjectile;//Fired projectile inflight var transient float GEPsteeringX,GEPsteeringY; //used for mouse input control var WeaponGEPGun GEPmounted; //Recoil shockwave var() vector RecoilSimLimit; //plus/minus var() float RecoilDrain; var vector RecoilShake; var vector RecoilDesired;//lerp to this var float RecoilTime; //amount of lerp shake before desired set to 0 var rotator SAVErotation; var vector SAVElocation; var bool bStaticFreeze; //////////END GMDX // native Functions native(1099) final function string GetDeusExVersion(); native(2100) final function ConBindEvents(); native(3001) final function name SetBoolFlagFromString(String flagNameString, bool bValue); native(3002) final function ConHistory CreateHistoryObject(); native(3003) final function ConHistoryEvent CreateHistoryEvent(); native(3010) final function DeusExLog CreateLogObject(); native(3011) final function SaveGame(int saveIndex, optional String saveDesc); native(3012) final function DeleteSaveGameFiles(optional String saveDirectory); native(3013) final function GameDirectory CreateGameDirectoryObject(); native(3014) final function DataVaultImageNote CreateDataVaultImageNoteObject(); native(3015) final function DumpLocation CreateDumpLocationObject(); native(3016) final function UnloadTexture(Texture texture); //native 3017 taken by particleiterator. // // network replication // replication { // server to client reliable if ((Role == ROLE_Authority) && (bNetOwner)) AugmentationSystem, SkillSystem, SkillPointsTotal, SkillPointsAvail, inHand, inHandPending, KeyRing, Energy, bSpyDroneActive, DXGame, bBuySkills, drugEffectTimer, killProfile; reliable if (Role == ROLE_Authority) ShieldStatus, RunSilentValue, aDrone, NintendoImmunityTimeLeft; // client to server reliable if (Role < ROLE_Authority) BarkManager, FrobTarget, AugPrefs, bCanLean, curLeanDist, prevLeanDist, bInHandTransition, bForceDuck, FloorMaterial, WallMaterial, WallNormal, swimTimer, swimDuration; // Functions the client can call reliable if (Role < ROLE_Authority) DoFrob, ParseLeftClick, ParseRightClick, ReloadWeapon, PlaceItemInSlot, RemoveItemFromSlot, ClearInventorySlots, SetInvSlots, FindInventorySlot, ActivateBelt, DropItem, SetInHand, AugAdd, ExtinguishFire, CatchFire, AllEnergy, ClearPosition, ClearBelt, AddObjectToBelt, RemoveObjectFromBelt, TeamSay, KeypadRunUntriggers, KeypadRunEvents, KeypadToggleLocks, ReceiveFirstOptionSync, ReceiveSecondOptionSync,CreateDrone, MoveDrone, CloseComputerScreen, SetComputerHackTime, UpdateCameraRotation, ToggleCameraState, SetTurretTrackMode, SetTurretState, NewMultiplayerMatch, PopHealth, ServerUpdateLean, BuySkills, PutInHand, MakeCameraAlly, PunishDetection, ServerSetAutoReload, FailRootWindowCheck, FailConsoleCheck, ClientPossessed; // Unreliable functions the client can call unreliable if (Role < ROLE_Authority) MaintainEnergy, UpdateTranslucency; // Functions the server calls in client reliable if ((Role == ROLE_Authority) && (bNetOwner)) UpdateAugmentationDisplayStatus, AddAugmentationDisplay, RemoveAugmentationDisplay, ClearAugmentationDisplay, ShowHud, ActivateKeyPadWindow, SetDamagePercent, SetServerTimeDiff, ClientTurnOffScores; reliable if (Role == ROLE_Authority) InvokeComputerScreen, ClientDeath, AddChargedDisplay, RemoveChargedDisplay, MultiplayerDeathMsg, MultiplayerNotifyMsg, BuySkillSound, ShowMultiplayerWin, ForceDroneOff ,AddDamageDisplay, ClientSpawnHits, CloseThisComputer, ClientPlayAnimation, ClientSpawnProjectile, LocalLog, VerifyRootWindow, VerifyConsole, ForceDisconnect; } exec function cheat() { if (bHardCoreMode) bCheatsEnabled = false; else bCheatsEnabled = !bCheatsEnabled; } function UpdateHDTPsettings() { local mesh tempmesh; local texture temptex; local int i; if(GetHDTPSettings(self)) //lol recursive { if(HDTPMeshname != "") { tempmesh = lodmesh(dynamicloadobject(HDTPMeshname,class'mesh',true)); if(tempmesh != none) { mesh = tempmesh; for(i=0;i<=7;i++) { if(HDTPMeshtex[i] != "") { temptex = texture(dynamicloadobject(HDTPMeshtex[i],class'texture',true)); if(temptex != none) multiskins[i] = temptex; } } } } } else { mesh = default.mesh; for(i=0; i<=7;i++) { multiskins[i]=default.multiskins[i]; } } } function bool GetHDTPSettings(actor Other) { if(bHDTP_ALL > 0) return true; else if(bHDTP_All < 0) return false; else { if((Other.IsA('JCDentonMaleCarcass') || Other.IsA('JCDouble') || Other.IsA('JCDentonMale')) && bHDTP_JC) //changed self to JCdentonmale for hopefully better mod compatibility return true; //if((Other.IsA('MJ12Troop') || Other.IsA('MJ12TroopCarcass')) && bHDTP_MJ12) // return true; else if((Other.IsA('UNATCOTroop') || Other.IsA('UNATCOTroopCarcass')) && bHDTP_UNATCO) return true; else if((Other.IsA('WaltonSimons') || Other.IsA('WaltonSimonsCarcass')) && bHDTP_WALTON) return true; else if((Other.IsA('AnnaNavarre') || Other.IsA('AnnaNavarreCarcass')) && bHDTP_Anna) return true; else if((Other.IsA('GuntherHermann') || Other.IsA('GuntherHermannCarcass')) && bHDTP_Gunther) return true; else if((Other.IsA('RiotCop') || Other.IsA('RiotCopCarcass')) && bHDTP_RiotCop) return true; else if((Other.IsA('Terrorist') || Other.IsA('TerroristCarcass')) && bHDTP_NSF) return true; else if((Other.IsA('PaulDenton') || Other.IsA('PaulDentonCarcass')) && bHDTP_Paul) return true; else if((Other.IsA('NicoletteDuClare') || Other.IsA('NicoletteDuClareCarcass')) && bHDTP_Nico) return true; else return false; } return false; } function setupDifficultyMod() //CyberP: Lazy scale based on difficulty. To find all things modified by difficulty level in { //CyberP: GMDX, search CombatDifficulty & bHardCoreMode. local ScriptedPawn P; //CyberP: WARNING: is called every login. TODO: call only once per map. local ThrownProjectile TP; local AutoTurret T; local SecurityCamera SC; local DeusExWeapon WP; local DeusExAmmo AM; local DeusExMover MV; local Keypad KP; log("bHardCoreMode =" @bHardCoreMode); log("CombatDifficulty =" @CombatDifficulty); if (bHDTP_All != -1) bHDTP_All=-1; bStunted = False; //CyberP: failsafe ForEach AllActors(class'ScriptedPawn', P) { if (P.bHardcoreOnly == True && bHardCoreMode == False && bHardcoreFilterOption == False) //CyberP: remove this pawn if we are not hardcore P.Destroy(); if (P.IsA('HumanMilitary') || P.IsA('HumanThug')) { if (!bHardCoreMode && CombatDifficulty > 1) { if (P.HearingThreshold < 0.135000) P.HearingThreshold = 0.135000; if (P.SurprisePeriod < 1.250000) P.SurprisePeriod = 1.250000; if (P.VisibilityThreshold < 0.005500) P.VisibilityThreshold = 0.005500; if (P.EnemyTimeout > 10.000000) P.EnemyTimeout = 10.000000; } else if (CombatDifficulty <= 1) { if (P.VisibilityThreshold < 0.010000) P.VisibilityThreshold = 0.010000; if (P.HearingThreshold < 0.150000) P.HearingThreshold = 0.150000; if (P.EnemyTimeout > 8.000000) P.EnemyTimeout = 8.000000; if (P.SurprisePeriod < 2.000000) P.SurprisePeriod = 2.0; } else if (bHardCoreMode) { if (P.BaseAccuracy != 0.000000 && P.BaseAccuracy > 0.050000) //CyberP: all Human Military are more accurate on hardcore mode. P.BaseAccuracy=0.050000; if (P.bDefendHome && P.HomeExtent < 64) P.EnemyTimeOut = 22.000000; //CyberP: camp for longer if (P.SurprisePeriod > 0.75) P.SurprisePeriod = 0.75; } } else if (P.IsA('Robot')) { if (bHardCoreMode) P.EnemyTimeout = 16.000000; else P.EnemyTimeout = 10.000000; } if ((P.IsA('MJ12Troop') || P.IsA('MJ12Elite')) && (P.bHasCloak || P.UnfamiliarName == "MJ12 Elite" )) { if (bHardCoreMode) { P.default.Health=350; P.default.HealthHead=350; P.default.HealthTorso=350; P.default.HealthLegLeft=350; P.default.HealthLegRight=350; P.default.HealthArmLeft=350; P.default.HealthArmRight=350; P.Health=350; P.HealthHead=350; P.HealthTorso=350; P.HealthLegLeft=350; P.HealthLegRight=350; P.HealthArmLeft=350; P.HealthArmRight=350; P.CloakThreshold=140; P.GroundSpeed=260.000000; } else { P.default.Health=200; P.default.HealthHead=200; P.default.HealthTorso=200; P.default.HealthLegLeft=200; P.default.HealthLegRight=200; P.default.HealthArmLeft=200; P.default.HealthArmRight=200; P.Health=200; P.HealthHead=200; P.HealthTorso=200; P.HealthLegLeft=200; P.HealthLegRight=200; P.HealthArmLeft=200; P.HealthArmRight=200; P.CloakThreshold=100; P.GroundSpeed=240.000000; P.SurprisePeriod=1.000000; } } else if (P.IsA('MJ12Commando')) { if (bHardCoreMode) { P.default.Health=450; P.default.HealthHead=450; P.default.HealthTorso=450; P.default.HealthLegLeft=450; P.default.HealthLegRight=450; P.default.HealthArmLeft=450; P.default.HealthArmRight=450; P.Health=450; P.HealthHead=450; P.HealthTorso=450; P.HealthLegLeft=450; P.HealthLegRight=450; P.HealthArmLeft=450; P.HealthArmRight=450; P.VisibilityThreshold=0.001000; } else { P.default.Health=300; P.default.HealthHead=300; P.default.HealthTorso=300; P.default.HealthLegLeft=300; P.default.HealthLegRight=300; P.default.HealthArmLeft=300; P.default.HealthArmRight=300; P.Health=300; P.HealthHead=300; P.HealthTorso=300; P.HealthLegLeft=300; P.HealthLegRight=300; P.HealthArmLeft=300; P.HealthArmRight=300; P.VisibilityThreshold=0.004000; } } else if (P.IsA('MIB')) { if (!bHardCoreMode && P.GroundSpeed>P.default.GroundSpeed) { P.GroundSpeed=360.000000; P.default.Health=450; P.default.HealthHead=450; P.default.HealthTorso=450; P.default.HealthLegLeft=450; P.default.HealthLegRight=450; P.default.HealthArmLeft=450; P.default.HealthArmRight=450; P.Health=450; P.HealthHead=450; P.HealthTorso=450; P.HealthLegLeft=450; P.HealthLegRight=450; P.HealthArmLeft=450; P.HealthArmRight=450; } } else if (P.IsA('WaltonSimons')) { if (!bHardCoreMode) { P.GroundSpeed=360.000000; P.default.Health=700; P.default.HealthHead=700; P.default.HealthTorso=700; P.default.HealthLegLeft=700; P.default.HealthLegRight=700; P.default.HealthArmLeft=700; P.default.HealthArmRight=700; P.Health=700; P.HealthHead=700; P.HealthTorso=700; P.HealthLegLeft=700; P.HealthLegRight=700; P.HealthArmLeft=700; P.HealthArmRight=700; } } else if (P.IsA('Gray')) { if (bHardCoreMode == False) { P.default.Health=250; P.default.HealthHead=250; P.default.HealthTorso=250; P.default.HealthLegLeft=250; P.default.HealthLegRight=250; P.default.HealthArmLeft=250; P.default.HealthArmRight=250; P.Health=250; P.HealthHead=250; P.HealthTorso=250; P.HealthLegLeft=200; P.HealthLegRight=250; P.HealthArmLeft=250; P.HealthArmRight=250; } } } if (bHardCoreMode == False) { ForEach AllActors(class'ThrownProjectile', TP) { if (TP.bNoHardcoreFilter == True) //CyberP: destroy this bomb if we are not hardcore { TP.Destroy(); } else TP.proxRadius=156.000000; //Also lower radius if not hardcore } } else { ForEach AllActors(class'DeusExAmmo', AM) { if (AM.Owner == None) { if (AM.IsA('AmmoDartTaser')) AM.AmmoAmount = 1; else if (AM.IsA('Ammo20mmEMP')) AM.AmmoAmount = 1; else if (AM.IsA('Ammo20mm')) AM.AmmoAmount = 2; } } /*ForEach AllActors(class'DeusExMover', MV) { if (MV.lockStrength < 0.8 && MV.bPickable) MV.lockStrength += 0.1; if (MV.bBreakable && MV.DamageThreshold < 90) MV.DamageThreshold += 10; } ForEach AllActors(class'Keypad', KP) { if (KP.bHackable && KP.hackStrength < 0.8) KP.hackStrength += 0.1; } */ } if (bLaserRifle == False) { ForEach AllActors(class'DeusExWeapon', WP) { if (WP.ItemName == "Laser Rifle") //CyberP: destroy it WP.Destroy(); } } if (bUSP == False) { ForEach AllActors(class'DeusExWeapon', WP) { if (WP.ItemName == "USP.10") WP.Destroy(); } } ForEach AllActors(class'AutoTurret', T) { if (CombatDifficulty <= 1.5) { T.maxRange=2000; T.default.maxRange=2000; } else { T.maxRange=4000; T.default.maxRange=4000; } } ForEach AllActors(class'SecurityCamera', SC) { if (CombatDifficulty < 3.0) { SC.hackStrength=0.100000; SC.cameraRange = 1024; SC.default.cameraRange = 1024; if (SC.swingPeriod < 9.0) SC.swingPeriod+=3.0; } if (bHardcoreMode) SC.hackStrength=0.250000; else SC.hackStrength=0.150000; if (bA51Camera) { SC.hackStrength=0.500000; SC.HitPoints=150; SC.minDamageThreshold=80; } } } // ---------------------------------------------------------------------- // PostBeginPlay() // // set up the augmentation and skill systems // ---------------------------------------------------------------------- function PostBeginPlay() { local DeusExLevelInfo info; local int levelInfoCount; local float mult; Super.PostBeginPlay(); class'DeusExPlayer'.default.DefaultFOV=DefaultFOV; class'DeusExPlayer'.default.DesiredFOV=DesiredFOV; // Check to make sure there's only *ONE* DeusExLevelInfo and // go fucking *BOOM* if we find more than one. levelInfoCount = 0; foreach AllActors(class'DeusExLevelInfo', info) levelInfoCount++; Assert(levelInfoCount <= 1); // give us a shadow if (Level.Netmode == NM_Standalone) CreateShadow(); InitializeSubSystems(); DXGame = Level.Game; ShieldStatus = SS_Off; ServerTimeLastRefresh = 0; if (bHDTP_All != -1) bHDTP_All=-1; //CyberP: no HDTP characters for a number of reasons. // Safeguard so no cheats in multiplayer if ( Level.NetMode != NM_Standalone ) bCheatsEnabled = False; HDTP(); // SAVEOUT //QuickSaveCurrent=int(ConsoleCommand("get DeusEx.JCDentonMale QuickSaveIndex")); //QuickSaveLast=int(ConsoleCommand("get DeusEx.JCDentonMale iQuickSaveLast")); QuickSaveCurrent=QuickSaveIndex; QuickSaveLast=iQuickSaveLast; log("MYCHK::"@QuickSaveCurrent@"::"@QuickSaveLast); bWasCrosshair=bCrosshairVisible; RefreshLeanKeys(); } function ServerSetAutoReload( bool bAuto ) { bAutoReload = bAuto; } // ---------------------------------------------------------------------- function SetServerTimeDiff( float sTime ) { ServerTimeDiff = (sTime - Level.Timeseconds); } // ---------------------------------------------------------------------- // PostNetBeginPlay() // // Take care of the theme manager // ---------------------------------------------------------------------- simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if (Role == ROLE_SimulatedProxy) { DrawShield(); CreatePlayerTracker(); if ( NintendoImmunityTimeLeft > 0.0 ) DrawInvulnShield(); return; } //DEUS_EX AMSD In multiplayer, we need to do this for our local theme manager, since //PostBeginPlay isn't called to set these up, and the Thememanager can be local, it //doesn't have to sync with the server. if (ThemeManager == NONE) { CreateColorThemeManager(); ThemeManager.SetOwner(self); ThemeManager.SetCurrentHUDColorTheme(ThemeManager.GetFirstTheme(1)); ThemeManager.SetCurrentMenuColorTheme(ThemeManager.GetFirstTheme(0)); ThemeManager.SetMenuThemeByName(MenuThemeName); ThemeManager.SetHUDThemeByName(HUDThemeName); if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ChangeStyle(); } ReceiveFirstOptionSync(AugPrefs[0], AugPrefs[1], AugPrefs[2], AugPrefs[3], AugPrefs[4]); ReceiveSecondOptionSync(AugPrefs[5], AugPrefs[6], AugPrefs[7], AugPrefs[8]); ShieldStatus = SS_Off; bCheatsEnabled = False; ServerSetAutoReload( bAutoReload ); } // ---------------------------------------------------------------------- // InitializeSubSystems() // ---------------------------------------------------------------------- function InitializeSubSystems() { // Spawn the BarkManager if (BarkManager == None) BarkManager = Spawn(class'BarkManager', Self); // Spawn the Color Manager CreateColorThemeManager(); ThemeManager.SetOwner(self); // install the augmentation system if not found if (AugmentationSystem == None) { AugmentationSystem = Spawn(class'AugmentationManager', Self); AugmentationSystem.CreateAugmentations(Self); AugmentationSystem.AddDefaultAugmentations(); AugmentationSystem.SetOwner(Self); } else { AugmentationSystem.SetPlayer(Self); AugmentationSystem.SetOwner(Self); } // install the skill system if not found if (SkillSystem == None) { SkillSystem = Spawn(class'SkillManager', Self); SkillSystem.CreateSkills(Self); } else { SkillSystem.SetPlayer(Self); } if ((Level.Netmode == NM_Standalone) || (!bBeltIsMPInventory)) { // Give the player a keyring CreateKeyRing(); } } // ---------------------------------------------------------------------- // PostPostBeginPlay() // ---------------------------------------------------------------------- function PostPostBeginPlay() { Super.PostPostBeginPlay(); // Bind any conversation events to this DeusExPlayer ConBindEvents(); // Restore colors that the user selected (as opposed to those // stored in the savegame) ThemeManager.SetMenuThemeByName(MenuThemeName); ThemeManager.SetHUDThemeByName(HUDThemeName); if ((Level.NetMode != NM_Standalone) && ( killProfile == None )) killProfile = Spawn(class'KillerProfile', Self); } // ---------------------------------------------------------------------- // PreTravel() - Called when a ClientTravel is about to happen // ---------------------------------------------------------------------- function PreTravel() { // Set a flag designating that we're traveling, // so MissionScript can check and not call FirstFrame() for this map. // log("MYCHK:PreTravel:"@self); flagBase.SetBool('PlayerTraveling', True, True, 0); SaveSkillPoints(); if (dataLinkPlay != None) dataLinkPlay.AbortAndSaveHistory(); // If the player is burning (Fire! Fire!), extinguish him // before the map transition. This is done to fix stuff // that's fucked up. ExtinguishFire(); } // ---------------------------------------------------------------------- // TravelPostAccept() // ---------------------------------------------------------------------- event TravelPostAccept() { local DeusExLevelInfo info; local MissionScript scr; local bool bScriptRunning; local InterpolationPoint I; local SavePoint SP; local rotator rofs; //local WeaponGEPGun gepTest; local vector ofst; Super.TravelPostAccept(); // reset the keyboard ResetKeyboard(); RefreshLeanKeys(); info = GetLevelInfo(); // log("MYCHK:PostTravel: ,"@info.Name); if (info != None) { // hack for the DX.dx logo/splash level if (info.MissionNumber == -2) { foreach AllActors(class 'InterpolationPoint', I, 'IntroCam') { if (I.Position == 1) { SetCollision(False, False, False); bCollideWorld = False; Target = I; SetPhysics(PHYS_Interpolating); PhysRate = 1.0; PhysAlpha = 0.0; bInterpolating = True; bStasis = False; ShowHud(False); PutInHand(None); GotoState('Interpolating'); break; } } return; } if (info.MapName == "14_OceanLab_silo" || info.MapName == "06_HongKong_Canal" || info.missionNumber == 15) bThisMission=true; else bThisMission=false; // hack for the DXOnly.dx splash level if (info.MissionNumber == -1) { ShowHud(False); GotoState('Paralyzed'); return; } } // Restore colors if (ThemeManager != None) { ThemeManager.SetMenuThemeByName(MenuThemeName); ThemeManager.SetHUDThemeByName(HUDThemeName); } // Make sure any charged pickups that were active // before travelling are still active. RefreshChargedPickups(); // Make sure the Skills and Augmentation systems // are properly initialized and reset. RestoreSkillPoints(); if (SkillSystem != None) { SkillSystem.SetPlayer(Self); } if (AugmentationSystem != None) { // set the player correctly AugmentationSystem.SetPlayer(Self); AugmentationSystem.RefreshAugDisplay(); } // Nuke any existing conversation if (conPlay != None) conPlay.TerminateConversation(); HDTP(); // Make sure any objects that care abou the PlayerSkin // are notified UpdatePlayerSkin(); // If the player was carrying a decoration, // call TravelPostAccept() so it can initialize itself if (CarriedDecoration != None) CarriedDecoration.TravelPostAccept(); // If the player was carrying a decoration, make sure // it's placed back in his hand (since the location // info won't properly travel) PutCarriedDecorationInHand(); // Reset FOV SetFOVAngle(Default.DesiredFOV); // If the player had a scope view up, make sure it's // properly restore RestoreScopeView(); // make sure the mission script has been spawned correctly if (info != None) { bScriptRunning = False; foreach AllActors(class'MissionScript', scr) bScriptRunning = True; if (!bScriptRunning) info.SpawnScript(); } // make sure the player's eye height is correct BaseEyeHeight = CollisionHeight - (GetDefaultCollisionHeight() - Default.BaseEyeHeight); //GMDX foreach AllActors(class'SavePoint',SP) { if ((!bHardCoreMode)||(SP.bUsedSavePoint)) SP.Destroy(); } //ConsoleCommand("set ini:Engine.Engine.ViewportManager Brightness 1"); if (bHardCoreMode) { bCheatsEnabled=false; bAutoReload=false; } setupDifficultyMod(); //CyberP: set difficulty modifiers //set gep tracking if (RocketTarget==none) RocketTarget=spawn(class'DeusEx.GEPDummyTarget'); SetRocketWireControl(); //end GMDX } //GMDX: set up mounted gep spawn, as no matter what i try it still draws it on spawn :/ function SpawnGEPmounted(bool mountIt) { if (mountIt) { if ((Weapon!=none)&&(Weapon.IsA('WeaponGEPGun'))) { GEPmounted=WeaponGEPGun(Weapon); GEPmounted.SetMount(self); } else log("ERROR: GEP gun in zoom but GEP not in hand"); } else { GEPmounted.SetMount(none); // GEPmounted=none; } /*if (GEPmounted!=none) return true; GEPmounted=spawn(class'WeaponGEPmounted',self,,Location,Rotation); if (GEPmounted!=none) { GEPmounted.bHidden=true;//use this to invoke renderoverlays GEPmounted.bHideWeapon=true; GEPmounted.SetPhysics(PHYS_None); GEPmounted.SetMount(self); return true; } else log("ERROR: could not spawn GEPmounted");//else //bNoGEPmounted=true; return false;*/ } //GMDX remove console from Hardcore mode >:] exec function Say(string Msg ) { if (bHardCoreMode || bNoConsole) return; else super.Say(Msg); } exec function Type() { if (bHardCoreMode) return; else super.Type(); } function Typing( bool bTyping ) { if (bHardCoreMode) Player.Console.GotoState(''); else super.Typing(bTyping); } ///// exec function HDTP(optional string s) { local scriptedpawn P; local deusexcarcass C; if(s != "") { s = Caps(s); if(s == "NICO") bHDTP_Nico = !bHDTP_Nico; else if(s == "WALTON") bHDTP_Walton = !bHDTP_Walton; else if(s == "ANNA") bHDTP_Anna = !bHDTP_Anna; else if(s == "MJ12") bHDTP_MJ12 = false;// was !bHDTP_MJ12; else if(s == "UNATCO") bHDTP_UNATCO = !bHDTP_UNATCO; else if(s == "NSF") bHDTP_NSF = !bHDTP_NSF; else if(s == "COP") bHDTP_RiotCop = !bHDTP_RiotCop; else if(s == "GUNTHER") bHDTP_Gunther = !bHDTP_Gunther; else if(s == "PAUL") bHDTP_Paul = !bHDTP_Paul; else if(s == "JC") bHDTP_JC = !bHDTP_JC; else if(s == "ALL") { bHDTP_All++; if(bHDTP_All > 1) bHDTP_All = -1; } } foreach Allactors(Class'Scriptedpawn',P) P.UpdateHDTPSettings(); foreach Allactors(Class'DeusexCarcass',C) C.UpdateHDTPsettings(); UpdateHDTPsettings(); } // ---------------------------------------------------------------------- // Update Time Played // ---------------------------------------------------------------------- final function UpdateTimePlayed(float deltaTime) { saveTime += deltaTime; } // ---------------------------------------------------------------------- // RestoreScopeView() // ---------------------------------------------------------------------- function RestoreScopeView() { if (inHand != None) { if (inHand.IsA('Binoculars') && (inHand.bActive)) Binoculars(inHand).RefreshScopeDisplay(Self, True); else if ((DeusExWeapon(inHand) != None) && (DeusExWeapon(inHand).bZoomed)) DeusExWeapon(inHand).RefreshScopeDisplay(Self, True, True); } } // ---------------------------------------------------------------------- // RefreshChargedPickups() // ---------------------------------------------------------------------- function RefreshChargedPickups() { local ChargedPickup anItem; // Loop through all the ChargedPicksups and look for charged pickups // that are active. If we find one, add to the user-interface. foreach AllActors(class'ChargedPickup', anItem) { if ((anItem.Owner == Self) && (anItem.IsActive())) { // Make sure tech goggles display is refreshed if (anItem.IsA('TechGoggles')) TechGoggles(anItem).UpdateHUDDisplay(Self); AddChargedDisplay(anItem); } } } // ---------------------------------------------------------------------- // UpdatePlayerSkin() // ---------------------------------------------------------------------- function UpdatePlayerSkin() { local PaulDenton paul; local PaulDentonCarcass paulCarcass; local JCDentonMaleCarcass jcCarcass; local JCDouble jc; // Paul Denton foreach AllActors(class'PaulDenton', paul) break; if (paul != None) paul.SetSkin(Self); // Paul Denton Carcass foreach AllActors(class'PaulDentonCarcass', paulCarcass) break; if (paulCarcass != None) paulCarcass.SetSkin(Self); // JC Denton Carcass foreach AllActors(class'JCDentonMaleCarcass', jcCarcass) break; if (jcCarcass != None) jcCarcass.SetSkin(Self); // JC's stunt double foreach AllActors(class'JCDouble', jc) break; if (jc != None) jc.SetSkin(Self); } // ---------------------------------------------------------------------- // GetLevelInfo() // ---------------------------------------------------------------------- function DeusExLevelInfo GetLevelInfo() { local DeusExLevelInfo info; foreach AllActors(class'DeusExLevelInfo', info) break; // log("MYCHK:LevelInfo: ,"@info.Name); return info; } // // If player chose to dual map the F keys // exec function DualmapF3() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(0); } exec function DualmapF4() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(1); } exec function DualmapF5() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(2); } exec function DualmapF6() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(3); } exec function DualmapF7() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(4); } exec function DualmapF8() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(5); } exec function DualmapF9() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(6); } exec function DualmapF10() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(7); } exec function DualmapF11() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(8); } exec function DualmapF12() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(9); } // // Team Say // exec function TeamSay( string Msg ) { local Pawn P; local String str; if (bHardCoreMode) return; if ( TeamDMGame(DXGame) == None ) { Say(Msg); return; } str = PlayerReplicationInfo.PlayerName $ ": " $ Msg; if ( Role == ROLE_Authority ) log( "TeamSay>" $ str ); for( P=Level.PawnList; P!=None; P=P.nextPawn ) { if( P.bIsPlayer && (P.PlayerReplicationInfo.Team == PlayerReplicationInfo.Team) ) { if ( P.IsA('DeusExPlayer') ) DeusExPlayer(P).ClientMessage( str, 'TeamSay', true ); } } } // ---------------------------------------------------------------------- // RestartLevel() // ---------------------------------------------------------------------- exec function RestartLevel() { ResetPlayer(); Super.RestartLevel(); } // ---------------------------------------------------------------------- // LoadGame() // ---------------------------------------------------------------------- exec function LoadGame(int saveIndex) { // log("MYCHK:LoadGame: ,"@saveIndex); // Reset the FOV if (class'DeusExPlayer'.default.bCloakEnabled == True) class'DeusExPlayer'.default.bCloakEnabled = False; //CyberP: disable the cloak effect else if (class'DeusExPlayer'.default.bRadarTran == True) class'DeusExPlayer'.default.bRadarTran = False; //CyberP: disable the radar effect bCrosshairVisible=True; //CyberP: fuck it DesiredFOV = Default.DesiredFOV; DeusExRootWindow(rootWindow).ClearWindowStack(); ClientTravel("?loadgame=" $ saveIndex, TRAVEL_Absolute, False); } // ---------------------------------------------------------------------- // QuickSave() // ---------------------------------------------------------------------- exec function QuickSave() { local DeusExLevelInfo info; info = GetLevelInfo(); // Don't allow saving if: // // 1) The player is dead // 2) We're on the logo map // 4) We're interpolating (playing outtro) // 3) A datalink is playing // 4) We're in a multiplayer game if (((info != None) && (info.MissionNumber < 0)) || ((IsInState('Dying')) || (IsInState('Paralyzed')) || (IsInState('Interpolating'))) || (dataLinkPlay != None) || (Level.Netmode != NM_Standalone)) { return; } if (bHardCoreMode && !bPendingHardCoreSave) return; bPendingHardCoreSave=false; //SAVEOUT ConsoleCommand("set DeusEx.JCDentonMale QuickSaveIndex "$QuickSaveCurrent); // QuickSaveIndex=QuickSaveCurrent; if (QuickSaveCurrent>=QuickSaveTotal) QuickSaveCurrent=0; QuickSaveCurrent++; QuickSaveLast=-(10+QuickSaveCurrent); QuickSaveName=sprintf("AutoSave%d",QuickSaveCurrent); log("MYCHK:DX_QuickSave: ,"@QuickSaveName@" ,Last:"@QuickSaveLast@" ,Current:"@QuickSaveCurrent); SaveGame(QuickSaveLast, QuickSaveName); ConsoleCommand("set DeusEx.JCDentonMale iQuickSaveLast "$QuickSaveLast); // default.iQuickSaveLast=QuickSaveLast; //original SaveGame(-1, QuickSaveGameTitle); } // ---------------------------------------------------------------------- // QuickLoad() // ---------------------------------------------------------------------- exec function QuickLoad() { //Don't allow in multiplayer. if (Level.Netmode != NM_Standalone) return; if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ConfirmQuickLoad(); } // ---------------------------------------------------------------------- // QuickLoadConfirmed() // ---------------------------------------------------------------------- function QuickLoadConfirmed() { if (Level.Netmode != NM_Standalone) return; log("MYCHK:DX_QuickLoadConfirmed: "@QuickSaveLast); //SAVEOUT LoadGame(QuickSaveLast); //changed so now selects last saved game, even if from menu //original LoadGame(-1); } // ---------------------------------------------------------------------- // BuySkillSound() // ---------------------------------------------------------------------- function BuySkillSound( int code ) { local Sound snd; switch( code ) { case 0: snd = Sound'Menu_OK'; break; case 1: snd = Sound'Menu_Cancel'; break; case 2: snd = Sound'Menu_Focus'; break; case 3: snd = Sound'Menu_BuySkills'; break; } PlaySound( snd, SLOT_Interface, 0.75 ); } //GMDX meh my bloody saveconfig over(um)ride , changed all player.saveconfigs files to point here so i can handle DTS function SaveConfigOverride() { if (Weapon!=none&&DeusExWeapon(Weapon).bLasing) //CyberP: &&Weapon.IsA('WeaponNanoSword') bCrosshairVisible=bWasCrossHair; SaveConfig(); if (Weapon!=none&&DeusExWeapon(Weapon).bLasing) //CyberP: &&Weapon.IsA('WeaponNanoSword') bCrosshairVisible=false; } // ---------------------------------------------------------------------- // StartNewGame() // // Starts a new game given the map passed in // ---------------------------------------------------------------------- exec function StartNewGame(String startMap) { local Inventory item, nextItem; if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ClearWindowStack(); if(KeyRing != None) KeyRing.RemoveAllKeys(); for(item = Inventory; item != None; item = nextItem) { nextItem = item.Inventory; item.Destroy(); } // Set a flag designating that we're traveling, // so MissionScript can check and not call FirstFrame() for this map. flagBase.SetBool('PlayerTraveling', True, True, 0); SaveSkillPoints(); ResetPlayer(); DeleteSaveGameFiles(); bStartingNewGame = True; // Send the player to the specified map! if (startMap == "") Level.Game.SendPlayer(Self, "01_NYC_UNATCOIsland"); // TODO: Must be stored somewhere! else Level.Game.SendPlayer(Self, startMap); } // ---------------------------------------------------------------------- // StartTrainingMission() // ---------------------------------------------------------------------- function StartTrainingMission() { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ClearWindowStack(); // Make sure the player isn't asked to do this more than // once if prompted on the main menu. if (!bAskedToTrain) { bAskedToTrain = True; SaveConfig(); } SkillSystem.ResetSkills(); ResetPlayer(True); DeleteSaveGameFiles(); bStartingNewGame = True; Level.Game.SendPlayer(Self, "00_Training"); } // ---------------------------------------------------------------------- // ShowIntro() // ---------------------------------------------------------------------- function ShowIntro(optional bool bStartNewGame) { //GMDX: fix inventory bug when player dies and starts new game if (IsInState('Dying')) GotoState('PlayerWalking'); if (DeusExRootWindow(rootWindow) != None) { DeusExRootWindow(rootWindow).ClearWindowStack(); DeusExRootWindow(rootWindow).hud.belt.ClearBelt(); } bStartNewGameAfterIntro = bStartNewGame; // Make sure all augmentations are OFF before going into the intro AugmentationSystem.DeactivateAll(); if (bSkipNewGameIntro) PostIntro(); else// Reset the player Level.Game.SendPlayer(Self, "00_Intro"); } // ---------------------------------------------------------------------- // ShowCredits() // ---------------------------------------------------------------------- function ShowCredits(optional bool bLoadIntro) { local DeusExRootWindow root; local CreditsWindow winCredits; root = DeusExRootWindow(rootWindow); if (root != None) { // Show the credits screen and force the game not to pause // if we're showing the credits after the endgame winCredits = CreditsWindow(root.InvokeMenuScreen(Class'CreditsWindow', bLoadIntro)); winCredits.SetLoadIntro(bLoadIntro); } } // ---------------------------------------------------------------------- // StartListenGame() // ---------------------------------------------------------------------- function StartListenGame(string options) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) root.ClearWindowStack(); ConsoleCommand("start "$options$"?listen"); } // ---------------------------------------------------------------------- // StartMultiplayerGame() // ---------------------------------------------------------------------- function StartMultiplayerGame(string command) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) root.ClearWindowStack(); ConsoleCommand(command); } // ---------------------------------------------------------------------- // NewMultiplayerMatch() // ---------------------------------------------------------------------- function NewMultiplayerMatch() { DeusExMPGame( DXGame ).RestartPlayer( Self ); PlayerReplicationInfo.Score = 0; PlayerReplicationInfo.Deaths = 0; PlayerReplicationInfo.Streak = 0; } // ---------------------------------------------------------------------- // ShowMultiplayerWin() // ---------------------------------------------------------------------- function ShowMultiplayerWin( String winnerName, int winningTeam, String Killer, String Killee, String Method ) { local HUDMultiplayer mpScr; local DeusExRootWindow root; if (( Player != None ) && ( Player.Console != None )) Player.Console.ClearMessages(); root = DeusExRootWindow(rootWindow); if ( root != None ) { mpScr = HUDMultiplayer(root.InvokeUIScreen(Class'HUDMultiplayer', True)); root.MaskBackground(True); if ( mpScr != None ) { mpScr.winnerName = winnerName; mpScr.winningTeam = winningTeam; mpScr.winKiller = Killer; mpScr.winKillee = Killee; mpScr.winMethod = Method; } } //Do cleanup if (PlayerIsClient()) { if (AugmentationSystem != None) AugmentationSystem.DeactivateAll(); } } // ---------------------------------------------------------------------- // ResetPlayer() // // Called when a new game is started. // // 1) Erase all flags except those beginning with "SKTemp_" // 2) Dumps inventory // 3) Restore any other defaults // ---------------------------------------------------------------------- function ResetPlayer(optional bool bTraining) { local inventory anItem; local inventory nextItem; ResetPlayerToDefaults(); // Reset Augmentations if (AugmentationSystem != None) { AugmentationSystem.ResetAugmentations(); AugmentationSystem.Destroy(); AugmentationSystem = None; } // Give the player a pistol and a prod if (!bTraining) { anItem = Spawn(class'WeaponPistol'); anItem.Frob(Self, None); anItem.bInObjectBelt = True; anItem = Spawn(class'WeaponProd'); anItem.Frob(Self, None); anItem.bInObjectBelt = True; anItem = Spawn(class'MedKit'); anItem.Frob(Self, None); anItem.bInObjectBelt = True; swimTimer = 100; //CyberP: start with full stamina. } } // ---------------------------------------------------------------------- // ResetPlayerToDefaults() // // Resets all travel variables to their defaults // ---------------------------------------------------------------------- function ResetPlayerToDefaults() { local inventory anItem; local inventory nextItem; local int i; // reset the image linked list FirstImage = None; if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ResetFlags(); // Remove all the keys from the keyring before // it gets destroyed if (KeyRing != None) { KeyRing.RemoveAllKeys(); if ((Role == ROLE_Authority) && (Level.NetMode != NM_Standalone)) { KeyRing.ClientRemoveAllKeys(); } KeyRing = None; } while(Inventory != None) { anItem = Inventory; DeleteInventory(anItem); anItem.Destroy(); } /* anItem = Inventory; while(anItem!= None) { log("DELETE "@anItem); nextItem=anItem.Inventory; DeleteInventory(anItem); anItem.Destroy(); anItem=nextItem; } */ // Clear object belt if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.ClearBelt(); // clear the notes and the goals DeleteAllNotes(); DeleteAllGoals(); // Nuke the history ResetConversationHistory(); // Other defaults Credits = Default.Credits; Energy = Default.Energy; SkillPointsTotal = Default.SkillPointsTotal; SkillPointsAvail = Default.SkillPointsAvail; SetInHandPending(None); SetInHand(None); bInHandTransition = False; RestoreAllHealth(); ClearLog(); // Reset save count/time saveCount = 0; saveTime = 0.0; // Reinitialize all subsystems we've just nuked InitializeSubSystems(); for(i=0;i<ArrayCount(PerkNamesArray);i++) //CyberP: reset perks PerkNamesArray[i] = 0; for(i=0;i<ArrayCount(BoughtPerks);i++) //CyberP: reset perks BoughtPerks[i] = ""; // Give starting inventory. if (Level.Netmode != NM_Standalone) { NintendoImmunityEffect( True ); GiveInitialInventory(); } } // ---------------------------------------------------------------------- // CreateKeyRing() // ---------------------------------------------------------------------- function CreateKeyRing() { if (KeyRing == None) { KeyRing = Spawn(class'NanoKeyRing', Self); KeyRing.InitialState='Idle2'; KeyRing.GiveTo(Self); KeyRing.SetBase(Self); } } singular function RecoilShaker(vector shakeAmount) { local float shakeTime, shakeRoll, shakeVert; RecoilDesired.X=RecoilShake.X+((1.0*shakeAmount.X*2.2)-shakeAmount.X);//2.0)-shakeAmount.X); RecoilDesired.Y=RecoilShake.Y+((1.0*shakeAmount.Y*2.2)-shakeAmount.Y); //CyberP: 2 RecoilDesired.Z=RecoilShake.Z+((1.0*shakeAmount.Z*2.2)-shakeAmount.Z); if (Weapon != none && DeusExWeapon(Weapon).bHandToHand && DeusExWeapon(Weapon).bFiring) { RecoilTime=default.RecoilTime/3; //CyberP: attack effect for melee weapons FovAngle += 1; } else if (Weapon != none && DeusExWeapon(Weapon).bFiring) { if (DeusExWeapon(Weapon).bAutomatic && DeusExWeapon(inHand).bFiring) { RecoilTime=default.RecoilTime/2.5; FovAngle -= 1.5; } else { RecoilTime=default.RecoilTime*0.65; //CyberP: faster shake for guns //if (DeusExWeapon(Weapon).bExtraShaker && !IsLeaning() && PerkNamesArray[12] != 1) //Velocity -= Vector(ViewRotation) * 150; //CyberP: big guns make us step back a bit } } else { RecoilTime=default.RecoilTime; //CyberP: else for flinching and other effects } //SetFOVAngle(FOVAngle); if (RecoilShake.X>RecoilSimLimit.X) RecoilShake.X=RecoilSimLimit.X; if (RecoilShake.Y>RecoilSimLimit.Y) RecoilShake.Y=RecoilSimLimit.Y; if (RecoilShake.Z>RecoilSimLimit.Z) RecoilShake.Z=RecoilSimLimit.Z; if (RecoilShake.X<-RecoilSimLimit.X) RecoilShake.X=-RecoilSimLimit.X; if (RecoilShake.Y<-RecoilSimLimit.Y) RecoilShake.Y=-RecoilSimLimit.Y; if (RecoilShake.Z<-RecoilSimLimit.Z) RecoilShake.Z=-RecoilSimLimit.Z; } function RecoilEffectTick(float deltaTime) { local float invTime; local float shakeTime, ShakeRoll, ShakeVert; if ((RecoilTime>0)||(VSize(RecoilShake)>0.0)) { if (inHand !=none && inHand.IsA('DeusExWeapon') && DeusExWeapon(inHand).bFiring) {invTime=3/default.RecoilTime; if ((!DeusExWeapon(inHand).bSuperheated) && (DeusExWeapon(inHand).bExtraShaker)) //CyberP: hmm, tick... {shakeTime=0.01; shakeRoll=80+80; shakeVert-=2+2; ShakeView(shakeTime, shakeRoll, shakeVert);} } else invTime=1.0/0.140000; RecoilShake.X=Lerp(deltaTime*invTime,RecoilShake.X,RecoilDesired.X); RecoilShake.Y=Lerp(deltaTime*invTime,RecoilShake.Y,RecoilDesired.Y); RecoilShake.Z=Lerp(deltaTime*invTime,RecoilShake.Z,RecoilDesired.Z); RecoilTime-=deltaTime; if (RecoilTime<=0.0) { RecoilTime=0; if ((DeusExWeapon(inHand) != None) && (DeusExWeapon(inHand).bZoomed)) FovAngle = DeusExWeapon(inHand).ScopeFOV; else FovAngle = Default.DesiredFOV; RecoilDesired=vect(0,0,0); if (VSize(RecoilShake)<0.1) RecoilShake=vect(0,0,0); } } /*else if { RecoilShake.X*=(RecoilDrain*deltaTime*(FRand()*0.1+0.9)); RecoilShake.Y*=(RecoilDrain*deltaTime*(FRand()*0.1+0.9)); RecoilShake.Z*=(RecoilDrain*deltaTime*(FRand()*0.1+0.9)); RecoilShake.X +=(FRand()*0.06-0.03); //push to var? RecoilShake.Y +=(FRand()*0.06-0.03); //push to var? RecoilShake.Z +=(FRand()*0.06-0.03); //push to var? }*/ } // ---------------------------------------------------------------------- // DrugEffects() // ---------------------------------------------------------------------- simulated function DrugEffects(float deltaTime) { local float mult, fov; local Rotator rot; local DeusExRootWindow root; local Crosshair cross; root = DeusExRootWindow(rootWindow); if (hitmarkerTime > 0) { if ((root != None) && (root.hud != None)) { cross = root.hud.cross; if (bCrosshairVisible==False) bCrosshairVisible=True; cross.SetBackground(Texture'GMDXSFX.Icons.Hitmarker'); //root.hud.SetBackground(Texture'GMDXSFX.Icons.Hitmarker'); hitmarkerTime -= deltaTime; if (hitmarkerTime < 0.05 || IsInState('Dying')) { hitmarkerTime = 0; if (Weapon != None && Weapon.IsA('DeusExWeapon') && DeusExWeapon(Weapon).bLasing && bCrosshairVisible==True) bCrosshairVisible=False; cross.SetBackground(Texture'CrossSquare'); } } } if (drugEffectTimer > 0) { if ((root != None) && (root.hud != None)) { if (root.hud.background == None) { root.hud.SetBackground(Texture'DrunkFX'); root.hud.SetBackgroundSmoothing(True); root.hud.SetBackgroundStretching(True); root.hud.SetBackgroundStyle(DSTY_Modulated);//(DSTY_Modulated); } } mult = FClamp(drugEffectTimer / 10.0, 0.0, 3.0); rot.Pitch = 1024.0 * Cos(Level.TimeSeconds * mult) * deltaTime * mult; rot.Yaw = 1024.0 * Sin(Level.TimeSeconds * mult) * deltaTime * mult; rot.Roll = 0; rot.Pitch = FClamp(rot.Pitch, -4096, 4096); rot.Yaw = FClamp(rot.Yaw, -4096, 4096); ViewRotation += rot; if ((ViewRotation.Pitch > 16384) && (ViewRotation.Pitch < 32768)) ViewRotation.Pitch = 16384; //CyberP: stop view rot /*if ( Level.NetMode == NM_Standalone ) { fov = Default.DesiredFOV - drugEffectTimer + Rand(2); fov = FClamp(fov, 60, Default.DesiredFOV); DesiredFOV = fov; } else */ //DesiredFOV = Default.DesiredFOV; drugEffectTimer -= deltaTime; if (drugEffectTimer < 0) drugEffectTimer = 0; } else if (bloodTime > 0) { if ((root != None) && (root.hud != None)) { if (root.hud.background == None) { if (FRand() < 0.25) root.hud.SetBackground(Texture'HDTPFlatFXtex2'); else if (FRand() < 0.5) root.hud.SetBackground(Texture'HDTPFlatFXtex3'); else if (FRand() < 0.75) root.hud.SetBackground(Texture'HDTPFlatFXtex5'); else root.hud.SetBackground(Texture'HDTPFlatFXtex6'); root.hud.SetBackgroundSmoothing(True); root.hud.SetBackgroundStretching(True); root.hud.SetBackgroundStyle(DSTY_Modulated);//(DSTY_Modulated); } bloodTime -= deltaTime; if (bloodTime > 0 && bloodTime < 0.2) root.hud.SetBackground(Texture'FadeTop'); else if (bloodTime < 0) bloodTime = 0; } } else if (augEffectTime > 0) //Hmm, may be a problem: if we activate augBallistic to wipe drug effect { if ((root != None) && (root.hud != None)) { if (root.hud.background == None) { root.hud.SetBackground(Texture'Xplsn_EMPG'); root.hud.SetBackgroundSmoothing(True); root.hud.SetBackgroundStretching(True); root.hud.SetBackgroundStyle(DSTY_Modulated);//(DSTY_Modulated); } augEffectTime -= deltaTime; if (augEffectTime < 0) augEffectTime = 0; } } else { if ((root != None) && (root.hud != None)) { if (root.hud.background != None) { root.hud.SetBackground(None); root.hud.SetBackgroundStyle(DSTY_Normal); if (inHand.IsA('DeusExWeapon') && DeusExWeapon(inHand).bZoomed) { } else DesiredFOV = Default.DesiredFOV; } } } } // ---------------------------------------------------------------------- // PlayMusic() // ---------------------------------------------------------------------- function PlayMusic(String musicToPlay, optional int sectionToPlay) { local Music LoadedMusic; local EMusicMode newMusicMode; if (musicToPlay != "") { LoadedMusic = Music(DynamicLoadObject(musicToPlay $ "." $ musicToPlay, class'Music')); if (LoadedMusic != None) { switch(sectionToPlay) { case 0: newMusicMode = MUS_Ambient; break; case 1: newMusicMode = MUS_Combat; break; case 2: newMusicMode = MUS_Conversation; break; case 3: newMusicMode = MUS_Outro; break; case 4: newMusicMode = MUS_Dying; break; default: newMusicMode = MUS_Ambient; break; } ClientSetMusic(LoadedMusic, newMusicMode, 255, MTRAN_FastFade); } } } // ---------------------------------------------------------------------- // PlayMusicWindow() // // Displays the Load Map dialog // ---------------------------------------------------------------------- exec function PlayMusicWindow() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'PlayMusicWindow'); } // ---------------------------------------------------------------------- // UpdateDynamicMusic() // // Pattern definitions: // 0 - Ambient 1 // 1 - Dying // 2 - Ambient 2 (optional) // 3 - Combat // 4 - Conversation // 5 - Outro // ---------------------------------------------------------------------- function UpdateDynamicMusic(float deltaTime) { local bool bCombat; local ScriptedPawn npc; local Pawn CurPawn; local DeusExLevelInfo info; if (Level.Song == None) return; info = GetLevelInfo(); if (info != none) if (info.MapName == "02_NYC_Bar" || info.MapName == "04_NYC_Bar" || info.MapName == "08_NYC_Bar" || info.MapName == "06_HongKong_WanChai_Underworld" || info.MapName == "10_Paris_Club") return; //CyberP: no dynamic music in clubs and bars. // DEUS_EX AMSD In singleplayer, do the old thing. // In multiplayer, we can come out of dying. if (!PlayerIsClient()) { if ((musicMode == MUS_Dying) || (musicMode == MUS_Outro)) return; } else { if (musicMode == MUS_Outro) return; } musicCheckTimer += deltaTime; musicChangeTimer += deltaTime; if (IsInState('Interpolating')) { // don't mess with the music on any of the intro maps info = GetLevelInfo(); if ((info != None) && (info.MissionNumber < 0)) { musicMode = MUS_Outro; return; } if (musicMode != MUS_Outro) { ClientSetMusic(Level.Song, 5, 255, MTRAN_FastFade); musicMode = MUS_Outro; } } else if (IsInState('Conversation')) { if (musicMode != MUS_Conversation) { // save our place in the ambient track if (musicMode == MUS_Ambient) savedSection = SongSection; else savedSection = 255; ClientSetMusic(Level.Song, 4, 255, MTRAN_Fade); musicMode = MUS_Conversation; } } else if (IsInState('Dying')) { if (musicMode != MUS_Dying) { ClientSetMusic(Level.Song, 1, 255, MTRAN_Fade); musicMode = MUS_Dying; } } else { // only check for combat music every second //CyberP: 2 secs if (musicCheckTimer >= 2.0) { musicCheckTimer = 0.0; bCombat = False; // check a 100 foot radius around me for combat // XXXDEUS_EX AMSD Slow Pawn Iterator //foreach RadiusActors(class'ScriptedPawn', npc, 1600) for (CurPawn = Level.PawnList; CurPawn != None; CurPawn = CurPawn.NextPawn) { npc = ScriptedPawn(CurPawn); if ((npc != None) && (VSize(npc.Location - Location) < (1600 + npc.CollisionRadius))) { if ((npc.GetStateName() == 'Attacking') && (npc.Enemy == Self)) { bCombat = True; break; } } } if (bCombat) { musicChangeTimer = 0.0; if (musicMode != MUS_Combat) { // save our place in the ambient track if (musicMode == MUS_Ambient) savedSection = SongSection; else savedSection = 255; ClientSetMusic(Level.Song, 3, 255, MTRAN_FastFade); musicMode = MUS_Combat; } } else if (musicMode != MUS_Ambient) { // wait until we've been out of combat for 5 seconds before switching music if (musicChangeTimer >= 5.0) { // use the default ambient section for this map if (savedSection == 255) savedSection = Level.SongSection; // fade slower for combat transitions if (musicMode == MUS_Combat) ClientSetMusic(Level.Song, savedSection, 255, MTRAN_SlowFade); else ClientSetMusic(Level.Song, savedSection, 255, MTRAN_Fade); savedSection = 255; musicMode = MUS_Ambient; musicChangeTimer = 0.0; } } } } } // ---------------------------------------------------------------------- // MaintainEnergy() // ---------------------------------------------------------------------- function MaintainEnergy(float deltaTime) { local Float energyUse; local Float energyRegen; // make sure we can't continue to go negative if we take damage // after we're already out of energy if (Energy <= 0) { Energy = 0; EnergyDrain = 0; EnergyDrainTotal = 0; } energyUse = 0; // Don't waste time doing this if the player is dead or paralyzed if ((!IsInState('Dying')) && (!IsInState('Paralyzed'))) { if (Energy > 0) { // Decrement energy used for augmentations energyUse = AugmentationSystem.CalcEnergyUse(deltaTime); Energy -= EnergyUse; if (Energy < 6) { if (EnergyUse != 0 && bDrainAlert==False) { PlaySound(sound'GMDXSFX.Generic.biolow',SLOT_None); bDrainAlert=True; //CyberP: alert when energy is low } } if (Energy > 10) bDrainAlert=False; // Calculate the energy drain due to EMP attacks if (EnergyDrain > 0) { energyUse = EnergyDrainTotal * deltaTime; Energy -= EnergyUse; EnergyDrain -= EnergyUse; if (EnergyDrain <= 0) { EnergyDrain = 0; EnergyDrainTotal = 0; } } } //Do check if energy is 0. // If the player's energy drops to zero, deactivate // all augmentations if (Energy <= 0) { //If we were using energy, then tell the client we're out. //Otherwise just make sure things are off. If energy was //already 0, then energy use will still be 0, so we won't //spam. DEUS_EX AMSD if (energyUse > 0) ClientMessage(EnergyDepleted); Energy = 0; EnergyDrain = 0; EnergyDrainTotal = 0; AugmentationSystem.DeactivateAll(); } // If all augs are off, then start regenerating in multiplayer, // up to 25%. if ((energyUse == 0) && (Energy <= MaxRegenPoint) && (Level.NetMode != NM_Standalone)) { energyRegen = RegenRate * deltaTime; Energy += energyRegen; } } } // ---------------------------------------------------------------------- // RefreshSystems() // DEUS_EX AMSD For keeping multiplayer working in better shape // ---------------------------------------------------------------------- simulated function RefreshSystems(float DeltaTime) { local DeusExRootWindow root; if (Level.NetMode == NM_Standalone) return; if (Role == ROLE_Authority) return; if (LastRefreshTime < 0) LastRefreshTime = 0; LastRefreshTime = LastRefreshTime + DeltaTime; if (LastRefreshTime < 0.25) return; if (AugmentationSystem != None) AugmentationSystem.RefreshAugDisplay(); root = DeusExRootWindow(rootWindow); if (root != None) root.RefreshDisplay(LastRefreshTime); RepairInventory(); LastRefreshTime = 0; } function RepairInventory() { local byte LocalInvSlots[30]; // 5x6 grid of inventory slots local int i; local int slotsCol; local int slotsRow; local Inventory curInv; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) return; //clean out our temp inventory. for (i = 0; i < 30; i++) LocalInvSlots[i] = 0; // go through our inventory and fill localinvslots if (Inventory != None) { for (curInv = Inventory; curInv != None; curInv = curInv.Inventory) { // Make sure this item is located in a valid position if (( curInv.invPosX != -1 ) && ( curInv.invPosY != -1 )) { // fill inventory slots for( slotsRow=0; slotsRow < curInv.invSlotsY; slotsRow++ ) for ( slotsCol=0; slotsCol < curInv.invSlotsX; slotsCol++ ) LocalInvSlots[((slotsRow + curInv.invPosY) * maxInvCols) + (slotscol + curInv.invPosX)] = 1; } } } // verify that the 2 inventory grids match for (i = 0; i < 30; i++) if (LocalInvSlots[i] < invSlots[i]) //don't stuff slots, that can get handled elsewhere, just clear ones that need it { log("ERROR!!! Slot "$i$" should be "$LocalInvSlots[i]$", but isn't!!!!, repairing"); invSlots[i] = LocalInvSlots[i]; } } // ---------------------------------------------------------------------- // Bleed() // // Let the blood flow // ---------------------------------------------------------------------- function Bleed(float deltaTime) { local float dropPeriod; local float adjustedRate; local vector bloodVector; if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) { bleedrate = 0; dropCounter = 0; return; } // Copied from ScriptedPawn::Tick() bleedRate = FClamp(bleedRate, 0.0, 1.0); if (bleedRate > 0) { adjustedRate = (1.0-bleedRate)*1.0+0.1; // max 10 drops per second dropPeriod = adjustedRate / FClamp(VSize(Velocity)/512.0, 0.05, 1.0); dropCounter += deltaTime; while (dropCounter >= dropPeriod) { bloodVector = vect(0,0,1)*CollisionHeight*0.5; // so folks don't bleed from the crotch spawn(Class'BloodDrop',,,bloodVector+Location); dropCounter -= dropPeriod; } bleedRate -= deltaTime/clotPeriod; } if (bleedRate <= 0) { dropCounter = 0; bleedRate = 0; } } // ---------------------------------------------------------------------- // UpdatePoison() // // Get all woozy 'n' stuff // ---------------------------------------------------------------------- function UpdatePoison(float deltaTime) { if (Health <= 0) // no more pain -- you're already dead! return; if (InConversation()) // kinda hacky... return; if (poisonCounter > 0) { poisonTimer += deltaTime; if (poisonTimer >= 3.0) // pain every two seconds //CyberP: three seconds { poisonTimer = 0; poisonCounter--; TakeDamage(poisonDamage * 0.5, myPoisoner, Location, vect(0,0,0), 'PoisonEffect'); //CyberP: since we have thrice as effective tranq darts, reduce poison damage to player by half. 15 dam per interval on hardcore } if ((poisonCounter <= 0) || (Health <= 0)) StopPoison(); } } // ---------------------------------------------------------------------- // StartPoison() // // Gakk! We've been poisoned! // ---------------------------------------------------------------------- function StartPoison( Pawn poisoner, int Damage ) { myPoisoner = poisoner; if (myPoisoner.weapon.IsA('WeaponGreaselSpit') && FRand() < 0.3) PlaySound(sound'MaleCough',SLOT_Pain); //CyberP: cough to greasel spit if (Health <= 0) // no more pain -- you're already dead! return; if (InConversation()) // kinda hacky... return; // CyberP: less poison if if (PerkNamesArray[20]==1) poisonCounter = 3; else poisonCounter = 4; // take damage no more than four times (over 8 seconds) poisonTimer = 0; // reset pain timer if (poisonDamage < Damage) // set damage amount poisonDamage = Damage; // CyberP: Don't do drug effects if if (PerkNamesArray[20]==1 && poisonCounter > 0) drugEffectTimer = 0; else drugEffectTimer += 3; // make the player vomit for the next four seconds // In multiplayer, don't let the effect last longer than 30 seconds if ( Level.NetMode != NM_Standalone ) { if ( drugEffectTimer > 30 ) drugEffectTimer = 30; } } // ---------------------------------------------------------------------- // StopPoison() // // Stop the pain // ---------------------------------------------------------------------- function StopPoison() { myPoisoner = None; poisonCounter = 0; poisonTimer = 0; poisonDamage = 0; } // ---------------------------------------------------------------------- // SpawnEMPSparks() // // Spawn sparks for items affected by Warren's EMP Field // ---------------------------------------------------------------------- function SpawnEMPSparks(Actor empActor, Rotator rot) { local ParticleGenerator sparkGen; if ((empActor == None) || empActor.bDeleteMe) return; sparkGen = Spawn(class'ParticleGenerator', empActor,, empActor.Location, rot); if (sparkGen != None) { sparkGen.SetBase(empActor); sparkGen.LifeSpan = 3; sparkGen.particleTexture = Texture'Effects.Fire.SparkFX1'; sparkGen.particleDrawScale = 0.1; sparkGen.bRandomEject = True; sparkGen.ejectSpeed = 100.0; sparkGen.bGravity = True; sparkGen.bParticlesUnlit = True; sparkGen.frequency = 1.0; sparkGen.riseRate = 10; sparkGen.spawnSound = Sound'Spark2'; } } // ---------------------------------------------------------------------- // UpdateWarrenEMPField() // // Update Warren's EMP field // ---------------------------------------------------------------------- function UpdateWarrenEMPField(float deltaTime) { local float empRadius; local Robot curRobot; local AlarmUnit curAlarm; local AutoTurret curTurret; local LaserTrigger curLaser; local BeamTrigger curBeam; local SecurityCamera curCamera; local int option; if (bWarrenEMPField) { WarrenTimer -= deltaTime; if (WarrenTimer <= 0) { WarrenTimer = 0.15; empRadius = 600; if (WarrenSlot == 0) { foreach RadiusActors(Class'Robot', curRobot, empRadius) { if ((curRobot.LastRendered() < 2.0) && (curRobot.CrazedTimer <= 0) && (curRobot.EMPHitPoints > 0)) { if (curRobot.GetPawnAllianceType(self) == ALLIANCE_Hostile) option = Rand(2); else option = 0; if (option == 0) curRobot.TakeDamage(curRobot.EMPHitPoints*2, self, curRobot.Location, vect(0,0,0), 'EMP'); else curRobot.TakeDamage(100, self, curRobot.Location, vect(0,0,0), 'NanoVirus'); SpawnEMPSparks(curRobot, Rotator(Location-curRobot.Location)); } } } else if (WarrenSlot == 1) { foreach RadiusActors(Class'AlarmUnit', curAlarm, empRadius) { if ((curAlarm.LastRendered() < 2.0) && !curAlarm.bConfused) { curAlarm.TakeDamage(100, self, curAlarm.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curAlarm, curAlarm.Rotation); } } } else if (WarrenSlot == 2) { foreach RadiusActors(Class'AutoTurret', curTurret, empRadius) { if ((curTurret.LastRendered() < 2.0) && !curTurret.bConfused) { curTurret.TakeDamage(100, self, curTurret.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curTurret, Rotator(Location-curTurret.Location)); } } } else if (WarrenSlot == 3) { foreach RadiusActors(Class'LaserTrigger', curLaser, empRadius) { if ((curLaser.LastRendered() < 2.0) && !curLaser.bConfused) { curLaser.TakeDamage(100, self, curLaser.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curLaser, curLaser.Rotation); } } } else if (WarrenSlot == 4) { foreach RadiusActors(Class'BeamTrigger', curBeam, empRadius) { if ((curBeam.LastRendered() < 2.0) && !curBeam.bConfused) { curBeam.TakeDamage(100, self, curBeam.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curBeam, curBeam.Rotation); } } } else if (WarrenSlot == 5) { foreach RadiusActors(Class'SecurityCamera', curCamera, empRadius) { if ((curCamera.LastRendered() < 2.0) && !curCamera.bConfused) { curCamera.TakeDamage(100, self, curCamera.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curCamera, Rotator(Location-curCamera.Location)); } } } WarrenSlot++; if (WarrenSlot >= 6) WarrenSlot = 0; } } } // ---------------------------------------------------------------------- // UpdateTranslucency() // DEUS_EX AMSD Try to make the player harder to see if he is in darkness. // ---------------------------------------------------------------------- function UpdateTranslucency(float DeltaTime) { local float DarkVis; local float CamoVis; local AdaptiveArmor armor; local bool bMakeTranslucent; local DeusExMPGame Game; // Don't do it in multiplayer. if (Level.NetMode == NM_Standalone) return; Game = DeusExMPGame(Level.Game); if (Game == None) { return; } bMakeTranslucent = false; //DarkVis = AIVisibility(TRUE); DarkVis = 1.0; CamoVis = 1.0; //Check cloaking. if (AugmentationSystem.GetAugLevelValue(class'AugCloak') != -1.0) { bMakeTranslucent = TRUE; CamoVis = Game.CloakEffect; } // If you have a weapon out, scale up the camo and turn off the cloak. // Adaptive armor leaves you completely invisible, but drains quickly. if ((inHand != None) && (inHand.IsA('DeusExWeapon')) && (CamoVis < 1.0)) { CamoVis = 1.0; bMakeTranslucent=FALSE; ClientMessage(WeaponUnCloak); AugmentationSystem.FindAugmentation(class'AugCloak').Deactivate(); } // go through the actor list looking for owned AdaptiveArmor // since they aren't in the inventory anymore after they are used if (UsingChargedPickup(class'AdaptiveArmor')) { CamoVis = CamoVis * Game.CloakEffect; bMakeTranslucent = TRUE; } ScaleGlow = Default.ScaleGlow * CamoVis * DarkVis; //Translucent is < 0.1, untranslucent if > 0.2, not same edge to prevent sharp breaks. if (bMakeTranslucent) { Style = STY_Translucent; if (Self.IsA('JCDentonMale')) { MultiSkins[6] = Texture'BlackMaskTex'; MultiSkins[7] = Texture'BlackMaskTex'; } } else if (Game.bDarkHiding) { if (CamoVis * DarkVis < Game.StartHiding) Style = STY_Translucent; if (CamoVis * DarkVis > Game.EndHiding) Style = Default.Style; } else if (!bMakeTranslucent) { if (Self.IsA('JCDentonMale')) { MultiSkins[6] = Default.MultiSkins[6]; MultiSkins[7] = Default.MultiSkins[7]; } Style = Default.Style; } } // ---------------------------------------------------------------------- // RestoreSkillPoints() // // Restore skill point variables // ---------------------------------------------------------------------- function RestoreSkillPoints() { local name flagName; bSavingSkillsAugs = False; // Get the skill points available flagName = rootWindow.StringToName("SKTemp_SkillPointsAvail"); if (flagBase.CheckFlag(flagName, FLAG_Int)) { SkillPointsAvail = flagBase.GetInt(flagName); flagBase.DeleteFlag(flagName, FLAG_Int); } // Get the skill points total flagName = rootWindow.StringToName("SKTemp_SkillPointsTotal"); if (flagBase.CheckFlag(flagName, FLAG_Int)) { SkillPointsTotal = flagBase.GetInt(flagName); flagBase.DeleteFlag(flagName, FLAG_Int); } } // ---------------------------------------------------------------------- // SaveSkillPoints() // // Saves out skill points, used when starting a new game // ---------------------------------------------------------------------- function SaveSkillPoints() { local name flagName; // Save/Restore must be done as atomic unit if (bSavingSkillsAugs) return; bSavingSkillsAugs = True; // Save the skill points available flagName = rootWindow.StringToName("SKTemp_SkillPointsAvail"); flagBase.SetInt(flagName, SkillPointsAvail); // Save the skill points available flagName = rootWindow.StringToName("SKTemp_SkillPointsTotal"); flagBase.SetInt(flagName, SkillPointsTotal); } // ---------------------------------------------------------------------- // AugAdd() // // Augmentation system functions // exec functions for command line for demo // ---------------------------------------------------------------------- exec function AugAdd(class<Augmentation> aWantedAug) { local Augmentation anAug; if (!bCheatsEnabled) return; if (AugmentationSystem != None) { anAug = AugmentationSystem.GivePlayerAugmentation(aWantedAug); if (anAug == None) ClientMessage(GetItemName(String(aWantedAug)) $ " is not a valid augmentation!"); } } // ---------------------------------------------------------------------- // ActivateAugmentation() // ---------------------------------------------------------------------- exec function ActivateAugmentation(int num) { local Augmentation anAug; local int count, wantedSlot, slotIndex; local bool bFound; if (RestrictInput()) return; if (Energy == 0) { ClientMessage(EnergyDepleted); PlaySound(AugmentationSystem.FirstAug.DeactivateSound, SLOT_None); return; } if (AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(num); } // ---------------------------------------------------------------------- // ActivateAllAugs() // ---------------------------------------------------------------------- exec function ActivateAllAugs() { if (AugmentationSystem != None) AugmentationSystem.ActivateAll(); } // ---------------------------------------------------------------------- // DeactivateAllAugs() // ---------------------------------------------------------------------- exec function DeactivateAllAugs() { if (AugmentationSystem != None) AugmentationSystem.DeactivateAll(); } // ---------------------------------------------------------------------- // SwitchAmmo() // ---------------------------------------------------------------------- exec function SwitchAmmo() { if (inHand.IsA('DeusExWeapon')) DeusExWeapon(inHand).CycleAmmo(); } // ---------------------------------------------------------------------- // RemoveInventoryType() // ---------------------------------------------------------------------- function RemoveInventoryType(Class<Inventory> removeType) { local Inventory item; item = FindInventoryType(removeType); if (item != None) DeleteInventory(item); } // ---------------------------------------------------------------------- // AddAugmentationDisplay() // ---------------------------------------------------------------------- function AddAugmentationDisplay(Augmentation aug) { //DEUS_EX AMSD Added none check here. if ((rootWindow != None) && (aug != None)) DeusExRootWindow(rootWindow).hud.activeItems.AddIcon(aug.SmallIcon, aug); } // ---------------------------------------------------------------------- // RemoveAugmentationDisplay() // ---------------------------------------------------------------------- function RemoveAugmentationDisplay(Augmentation aug) { DeusExRootWindow(rootWindow).hud.activeItems.RemoveIcon(aug); } // ---------------------------------------------------------------------- // ClearAugmentationDisplay() // ---------------------------------------------------------------------- function ClearAugmentationDisplay() { DeusExRootWindow(rootWindow).hud.activeItems.ClearAugmentationDisplay(); } // ---------------------------------------------------------------------- // UpdateAugmentationDisplayStatus() // ---------------------------------------------------------------------- function UpdateAugmentationDisplayStatus(Augmentation aug) { DeusExRootWindow(rootWindow).hud.activeItems.UpdateAugIconStatus(aug); } // ---------------------------------------------------------------------- // AddChargedDisplay() // ---------------------------------------------------------------------- function AddChargedDisplay(ChargedPickup item) { if ( (PlayerIsClient()) || (Level.NetMode == NM_Standalone) ) DeusExRootWindow(rootWindow).hud.activeItems.AddIcon(item.ChargedIcon, item); } // ---------------------------------------------------------------------- // RemoveChargedDisplay() // ---------------------------------------------------------------------- function RemoveChargedDisplay(ChargedPickup item) { if ( (PlayerIsClient()) || (Level.NetMode == NM_Standalone) ) DeusExRootWindow(rootWindow).hud.activeItems.RemoveIcon(item); } // ---------------------------------------------------------------------- // ActivateKeypadWindow() // DEUS_EX AMSD Has to be here because player doesn't own keypad, so // func rep doesn't work right. // ---------------------------------------------------------------------- function ActivateKeypadWindow(Keypad KPad, bool bHacked) { KPad.ActivateKeypadWindow(Self, bHacked); } function KeypadRunUntriggers(Keypad KPad) { KPad.RunUntriggers(Self); } function KeypadRunEvents(Keypad KPad, bool bSuccess) { KPad.RunEvents(Self, bSuccess); } function KeypadToggleLocks(Keypad KPad) { KPad.ToggleLocks(Self); } // ---------------------------------------------------------------------- // Multiplayer computer functions // ---------------------------------------------------------------------- //server->client (computer to frobber) function InvokeComputerScreen(Computers computerToActivate, float CompHackTime, float ServerLevelTime) { local NetworkTerminal termwindow; local DeusExRootWindow root; computerToActivate.LastHackTime = CompHackTime + (Level.TimeSeconds - ServerLevelTime); ActiveComputer = ComputerToActivate; //only allow for clients or standalone if ((Level.NetMode != NM_Standalone) && (!PlayerIsClient())) { ActiveComputer = None; CloseComputerScreen(computerToActivate); return; } root = DeusExRootWindow(rootWindow); if (root != None) { termwindow = NetworkTerminal(root.InvokeUIScreen(computerToActivate.terminalType, True)); if (termwindow != None) { computerToActivate.termwindow = termwindow; termWindow.SetCompOwner(computerToActivate); // If multiplayer, start hacking if there are no users if ((Level.NetMode != NM_Standalone) && (!termWindow.bHacked) && (computerToActivate.NumUsers() == 0) && (termWindow.winHack != None) && (termWindow.winHack.btnHack != None)) { termWindow.winHack.StartHack(); termWindow.winHack.btnHack.SetSensitivity(False); termWindow.FirstScreen=None; } termWindow.ShowFirstScreen(); } } if ((termWindow == None) || (root == None)) { CloseComputerScreen(computerToActivate); ActiveComputer = None; } } // CloseThisComputer is for the client (used at the end of a mp match) function CloseThisComputer( Computers comp ) { if ((comp != None) && ( comp.termwindow != None )) comp.termwindow.CloseScreen("EXIT"); } //client->server (window to player) function CloseComputerScreen(Computers computerToClose) { computerToClose.CloseOut(); } //client->server (window to player) function SetComputerHackTime(Computers computerToSet, float HackTime, float ClientLevelTime) { computerToSet.lastHackTime = HackTime + (Level.TimeSeconds - ClientLevelTime); } //client->server (window to player) function UpdateCameraRotation(SecurityCamera camera, Rotator rot) { camera.DesiredRotation = rot; } //client->server (window to player) function ToggleCameraState(SecurityCamera cam, ElectronicDevices compOwner) { if (cam.bActive) { cam.UnTrigger(compOwner, self); cam.team = -1; } else { MakeCameraAlly(cam); cam.Trigger(compOwner, self); } // Make sure the camera isn't in bStasis=True // so it responds to our every whim. cam.bStasis = False; } //client->server (window to player) function SetTurretState(AutoTurret turret, bool bActive, bool bDisabled) { turret.bActive = bActive; turret.bDisabled = bDisabled; turret.bComputerReset = False; } //client->server (window to player) function SetTurretTrackMode(ComputerSecurity computer, AutoTurret turret, bool bTrackPlayers, bool bTrackPawns) { local String str; turret.bTrackPlayersOnly = bTrackPlayers; turret.bTrackPawnsOnly = bTrackPawns; turret.bComputerReset = False; //in multiplayer, behave differently //set the safe target to ourself. if (Level.NetMode != NM_Standalone) { //we abuse the names of the booleans here. turret.SetSafeTarget( Self ); if (Role == ROLE_Authority) { if ( TeamDMGame(DXGame) != None ) { computer.team = PlayerReplicationInfo.team; turret.team = PlayerReplicationInfo.Team; if ( !turret.bDisabled ) { str = TakenOverString $ turret.titleString $ "."; TeamSay( str ); } } else { computer.team = PlayerReplicationInfo.PlayerID; turret.team = PlayerReplicationInfo.PlayerID; } } } } //client->server (window to player) function MakeCameraAlly(SecurityCamera camera) { Camera.SafeTarget = Self; if (Level.Game.IsA('TeamDMGame')) Camera.Team = PlayerReplicationInfo.Team; else Camera.Team = PlayerReplicationInfo.PlayerID; } //client->server (window to player) function PunishDetection(int DamageAmount) { if (DamageAmount > 0) TakeDamage(DamageAmount, None, vect(0,0,0), vect(0,0,0), 'EMP'); } // ---------------------------------------------------------------------- // AddDamageDisplay() // // Turn on the correct damage type icon on the HUD // Note that these icons naturally fade out after a few seconds, // so there is no need to turn them off // ---------------------------------------------------------------------- function AddDamageDisplay(name damageType, vector hitOffset) { DeusExRootWindow(rootWindow).hud.damageDisplay.AddIcon(damageType, hitOffset); } // ---------------------------------------------------------------------- // SetDamagePercent() // // Set the percentage amount of damage that's being absorbed // ---------------------------------------------------------------------- function SetDamagePercent(float percent) { DeusExRootWindow(rootWindow).hud.damageDisplay.SetPercent(percent); } // ---------------------------------------------------------------------- // default sound functions // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- // PlayBodyThud() // // this is called by MESH NOTIFY // ---------------------------------------------------------------------- function PlayBodyThud() { PlaySound(sound'BodyThud', SLOT_Interact); } // ---------------------------------------------------------------------- // GetWallMaterial() // // gets the name of the texture group that we are facing // ---------------------------------------------------------------------- function name GetWallMaterial(out vector wallNormal) { local vector EndTrace, HitLocation, HitNormal; local actor target; local int texFlags, grabDist; local name texName, texGroup; // if we are falling, then increase our grabbing distance if (Physics == PHYS_Falling) grabDist = 3.0; else grabDist = 1.5; // trace out in front of us EndTrace = Location + (Vector(Rotation) * CollisionRadius * grabDist); foreach TraceTexture(class'Actor', target, texName, texGroup, texFlags, HitLocation, HitNormal, EndTrace) { if ((target == Level) || target.IsA('Mover')) break; } wallNormal = HitNormal; return texGroup; } // ---------------------------------------------------------------------- // GetFloorMaterial() // // gets the name of the texture group that we are standing on // ---------------------------------------------------------------------- function name GetFloorMaterial() { local vector EndTrace, HitLocation, HitNormal; local actor target; local int texFlags; local name texName, texGroup; // trace down to our feet EndTrace = Location - CollisionHeight * 2 * vect(0,0,1); foreach TraceTexture(class'Actor', target, texName, texGroup, texFlags, HitLocation, HitNormal, EndTrace) { if ((target == Level) || target.IsA('Mover')) break; } if (target != None && target.IsA('DeusExMover')) //CyberP: special case for movers. { if (target.IsA('BreakableGlass')) texGroup = 'Glass'; else if (DeusExMover(target).FragmentClass == Class'DeusEx.WoodFragment') texGroup = 'Wood'; else if (DeusExMover(target).FragmentClass == Class'DeusEx.MetalFragment') texGroup = 'Metal'; else texGroup = 'Stucco'; } return texGroup; } // ---------------------------------------------------------------------- // PlayFootStep() // // plays footstep sounds based on the texture group // yes, I know this looks nasty -- I'll have to figure out a cleaner // way to do this // ---------------------------------------------------------------------- simulated function PlayFootStep() { local Sound stepSound; local float rnd; local float speedFactor, massFactor; local float volume, pitch, range; local float radius, mult; local float volumeMultiplier,volumeMod; local DeusExPlayer pp; local bool bOtherPlayer; local float shakeTime, shakeRoll, shakeVert; // Only do this on ourself, since this takes into account aug stealth and such if ( Level.NetMode != NM_StandAlone ) pp = DeusExPlayer( GetPlayerPawn() ); if ( pp != Self ) bOtherPlayer = True; else bOtherPlayer = False; rnd = FRand(); volumeMultiplier = 1.0; if (IsInState('PlayerSwimming') || (Physics == PHYS_Swimming)) { volumeMultiplier = 0.5; if (rnd < 0.5) stepSound = Sound'Swimming'; else stepSound = Sound'Treading'; } else if (FootRegion.Zone.bWaterZone) { volumeMultiplier = 1.0; if (rnd < 0.33) stepSound = Sound'WaterStep1'; else if (rnd < 0.66) stepSound = Sound'WaterStep2'; else stepSound = Sound'WaterStep3'; } else { switch(FloorMaterial) { case 'Textile': case 'Paper': volumeMultiplier = 0.6; if (rnd < 0.25) stepSound = Sound'CarpetStep1'; else if (rnd < 0.5) stepSound = Sound'CarpetStep2'; else if (rnd < 0.75) stepSound = Sound'CarpetStep3'; else stepSound = Sound'CarpetStep4'; break; case 'Earth': volumeMultiplier = 0.8; if (rnd < 0.25) stepSound = Sound'DIRT1'; else if (rnd < 0.5) stepSound = Sound'DIRT2'; else if (rnd < 0.75) stepSound = Sound'DIRT3'; else stepSound = Sound'DIRT4'; break; case 'Foliage': volumeMultiplier = 0.7; if (rnd < 0.25) stepSound = Sound'GrassStep1'; else if (rnd < 0.5) stepSound = Sound'GrassStep2'; else if (rnd < 0.75) stepSound = Sound'GrassStep3'; else stepSound = Sound'GrassStep4'; break; case 'Metal': volumeMultiplier = 0.9; if (bThisMission) { if (rnd < 0.25) stepSound = Sound'GRATE1'; else if (rnd < 0.5) stepSound = Sound'GRATE2'; else if (rnd < 0.75) stepSound = Sound'GRATE3'; else stepSound = Sound'GRATE4'; } else { if (rnd < 0.25) stepSound = Sound'MetalStep1'; else if (rnd < 0.5) stepSound = Sound'MetalStep2'; else if (rnd < 0.75) stepSound = Sound'MetalStep3'; else stepSound = Sound'MetalStep4'; } break; case 'Ladder': volumeMultiplier = 1.0; if (rnd < 0.25) stepSound = Sound'GRATE1'; else if (rnd < 0.5) stepSound = Sound'GRATE2'; else if (rnd < 0.75) stepSound = Sound'GRATE3'; else stepSound = Sound'GRATE4'; break; case 'Glass': volumeMultiplier = 0.7; if (rnd < 0.25) stepSound = Sound'GLASS1'; else if (rnd < 0.5) stepSound = Sound'GLASS2'; else if (rnd < 0.75) stepSound = Sound'GLASS3'; else stepSound = Sound'GLASS4'; break; case 'Ceramic': case 'Tiles': volumeMultiplier = 0.75; if (rnd < 0.25) stepSound = Sound'TileStep1'; else if (rnd < 0.5) stepSound = Sound'TileStep2'; else if (rnd < 0.75) stepSound = Sound'TileStep3'; else stepSound = Sound'TileStep4'; break; case 'Wood': volumeMultiplier = 0.8; if (rnd < 0.25) stepSound = Sound'WoodStep1'; else if (rnd < 0.5) stepSound = Sound'WoodStep2'; else if (rnd < 0.75) stepSound = Sound'WoodStep3'; else stepSound = Sound'WoodStep4'; break; case 'Stucco': volumeMultiplier = 0.7; if (rnd < 0.25) stepSound = Sound'CARDB1'; else if (rnd < 0.5) stepSound = Sound'CARDB2'; else if (rnd < 0.75) stepSound = Sound'CARDB3'; else stepSound = Sound'CARDB4'; break; case 'Brick': case 'Concrete': volumeMultiplier = 0.95; if (rnd < 0.25) stepSound = Sound'STEP1'; else if (rnd < 0.5) stepSound = Sound'STEP2'; else if (rnd < 0.75) stepSound = Sound'STEP3'; else stepSound = Sound'STEP4'; break; case 'Stone': default: volumeMultiplier = 0.8; if (rnd < 0.25) stepSound = Sound'StoneStep1'; else if (rnd < 0.5) stepSound = Sound'StoneStep2'; else if (rnd < 0.75) stepSound = Sound'StoneStep3'; else stepSound = Sound'StoneStep4'; break; } } // compute sound volume, range and pitch, based on mass and speed if (IsInState('PlayerSwimming') || (Physics == PHYS_Swimming)) speedFactor = WaterSpeed/180.0; else speedFactor = VSize(Velocity)/200.0; //CyberP: was 180 massFactor = Mass/150.0; radius = 375.0; volume = (speedFactor+0.2) * massFactor; //CyberP: SpeedF bonus Was +0.2 range = radius * volume; pitch = (volume+0.5); volume = FClamp(volume, 0, 1.0) * 0.5; // Hack to compensate for increased footstep volume. range = FClamp(range, 0.01, radius*4); pitch = FClamp(pitch, 1.0, 1.5); // AugStealth decreases our footstep volume volume *= RunSilentValue; //CyberP: new sounds for landing from height. if (Velocity.Z < -350) { if (FloorMaterial=='Wood' && Velocity.Z > -500) stepSound=sound'WoodLand'; else if (FloorMaterial=='Concrete' || FloorMaterial=='Stone' || FloorMaterial=='Tile') stepSound=sound'pcconcfall1'; else if (FloorMaterial=='Wood') stepSound=sound'DSOOF2'; else if (FloorMaterial=='Textile' || FloorMaterial=='Paper') stepSound=sound'CarpetLand'; else if (FloorMaterial=='Earth' || FloorMaterial=='Foliage') stepSound=sound'pl_jumpland1'; volume*=1.5; } if (Velocity.Z < -500) { if (((bThisMission) && (FloorMaterial=='Metal'))|| FloorMaterial=='Ladder') PlaySound(sound'bouncemetal',SLOT_None,volume*1.25,,,0.6); else if (FloorMaterial=='Metal') PlaySound(sound'MetalDoorClose',SLOT_None,volume*1.25,,,1.5); } //GMDX: modded for skill system stealth volumeMod=0.9; if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')>=1) { if (abs(Velocity.z)>20) volumeMod*=0.1; //no point really having landed caclucate when footstep overrides it, so a nasty hack is afoot. //if (SkillSystem.GetSkillLevel(class'SkillStealth')>1) volume *= 0.6; } //if (bJustLanded) log("PlayFootStep bJustLanded vol="@volume@": mod="@volumeMod@": Z="@Velocity.Z); if (bIsWalking) volume *= 0.3; //CyberP: can walk up behind enemies. PlaySound(stepSound, SLOT_Interact, volume, , range, pitch); AISendEvent('LoudNoise', EAITYPE_Audio, volume*volumeMultiplier*volumeMod, range*volumeMultiplier); } // ---------------------------------------------------------------------- // IsHighlighted() // // checks to see if we should highlight this actor // ---------------------------------------------------------------------- function bool IsHighlighted(actor A) { if (bBehindView) return False; if (A != None) { if (A.bDeleteMe || A.bHidden) return False; if (A.IsA('Pawn')) { if (!bNPCHighlighting) return False; } if (A.IsA('DeusExMover') && !DeusExMover(A).bHighlight) return False; else if (A.IsA('Mover') && !A.IsA('DeusExMover')) return False; else if (A.IsA('DeusExDecoration') && !DeusExDecoration(A).bHighlight) return False; else if (A.IsA('DeusExCarcass') && !DeusExCarcass(A).bHighlight) return False; else if (A.IsA('ThrownProjectile') && !ThrownProjectile(A).bHighlight) return False; else if (A.IsA('DeusExProjectile') && !DeusExProjectile(A).bStuck) return False; else if (A.IsA('ScriptedPawn') && !ScriptedPawn(A).bHighlight) return False; } return True; } // ---------------------------------------------------------------------- // IsFrobbable() // // is this actor frobbable? // ---------------------------------------------------------------------- function bool IsFrobbable(actor A) { if ((!A.bHidden)) //GMDX: so you it doesnt hightlight spoof &&(!A.IsA('WeaponGEPmounted')) if (A.IsA('Mover') || A.IsA('DeusExDecoration') || A.IsA('Inventory') || A.IsA('ScriptedPawn') || A.IsA('DeusExCarcass') || A.IsA('DeusExProjectile')) return True; return False; } // ---------------------------------------------------------------------- // HighlightCenterObject() // // checks to see if an object can be frobbed, if so, then highlight it // ---------------------------------------------------------------------- function HighlightCenterObject() { local Actor target, smallestTarget; local Vector HitLoc, HitNormal, StartTrace, EndTrace; local DeusExRootWindow root; local float minSize; local bool bFirstTarget; local int skillz; local float shakeTime, shakeRoll, shakeVert; local float rnd; if (IsInState('Dying')) return; root = DeusExRootWindow(rootWindow); // only do the trace every tenth of a second if (FrobTime >= 0.1) { /*if (WallMaterial == 'Ladder' || FloorMaterial == 'Ladder') //CyberP: hack for ladder climbing sfx. Meh, inconsistent { if (Velocity.Z != 0 && FRand() < 0.25) { rnd = FRand(); if (rnd < 0.25) PlaySound(Sound'GMDXSFX.Player.pl_ladder1',SLOT_None); else if (rnd < 0.5) PlaySound(Sound'GMDXSFX.Player.pl_ladder2',SLOT_None); else if (rnd < 0.75) PlaySound(Sound'GMDXSFX.Player.pl_ladder3',SLOT_None); else PlaySound(Sound'GMDXSFX.Player.pl_ladder4',SLOT_None); } } */ if (inHand != None && inHand.IsA('Multitool')) { if (self.IsA('DeusExPlayer') && PerkNamesArray[16]==1) MaxFrobDistance = 768; } else { MaxFrobDistance = 112; } // figure out how far ahead we should trace StartTrace = Location; EndTrace = Location + (Vector(ViewRotation) * MaxFrobDistance); // adjust for the eye height StartTrace.Z += BaseEyeHeight; EndTrace.Z += BaseEyeHeight; smallestTarget = None; minSize = 99999; bFirstTarget = True; if (bIsCrouching) { if (PerkNamesArray[29]==1) bCrouchRegen=True; if (Velocity.X != 0 || Velocity.Y != 0) { shakeTime = 0.1; shakeRoll = 24+24; shakeVert = 3; ShakeView(shakeTime, shakeRoll, shakeVert); } } else { bCrouchRegen=false; } if (inHand != none && inHand.IsA('Multitool')) { foreach TraceActors(class'Actor', target, HitLoc, HitNormal, EndTrace, StartTrace) { if (IsFrobbable(target) && (target != CarriedDecoration)) { if (target.IsA('HackableDevices')) { } else { MaxFrobDistance=112; StartTrace = Location; EndTrace = Location + (Vector(ViewRotation) * MaxFrobDistance); StartTrace.Z += BaseEyeHeight; EndTrace.Z += BaseEyeHeight; } } } } // find the object that we are looking at // make sure we don't select the object that we're carrying // use the last traced object as the target...this will handle // smaller items under larger items for example // ScriptedPawns always have precedence, though foreach TraceActors(class'Actor', target, HitLoc, HitNormal, EndTrace, StartTrace) { if (IsFrobbable(target) && (target != CarriedDecoration)) { if (target.IsA('ScriptedPawn')) { smallestTarget = target; break; } else if (target.IsA('Mover') && bFirstTarget) { smallestTarget = target; break; } else if (target.CollisionRadius < minSize) { minSize = target.CollisionRadius; smallestTarget = target; bFirstTarget = False; } } } FrobTarget = smallestTarget; // reset our frob timer FrobTime = 0; } } // ---------------------------------------------------------------------- // Landed() // // copied from Engine.PlayerPawn new landing code for Deus Ex // zero damage if falling from 15 feet or less // scaled damage from 15 to 60 feet // death over 60 feet // ---------------------------------------------------------------------- function Landed(vector HitNormal) { local vector legLocation; local int augLevel; local float augReduce, dmg, skillStealthMod; local float shakeTime, shakeRoll, shakeVert; //Note - physics changes type to PHYS_Walking by default for landed pawns PlayLanded(Velocity.Z); // PlaySound(Land, SLOT_Interact, 1); //this is aweful sound, leaving it to footstep if (Velocity.Z < -1.4 * JumpZ) { //MakeNoise(-0.5 * Velocity.Z/(FMax(JumpZ, 150.0))); if ((Velocity.Z < -800) && (ReducedDamageType != 'All')) if ( Role == ROLE_Authority ) { // check our jump augmentation and reduce falling damage if we have it // jump augmentation doesn't exist anymore - use Speed instaed // reduce an absolute amount of damage instead of a relative amount augReduce = 0; if (AugmentationSystem != None) { if (AugmentationSystem.GetAugLevelValue(class'AugStealth') != -1.0) //CyberP: silent running also reduces falling dam too augLevel = AugmentationSystem.GetClassLevel(class'AugStealth'); else augLevel = AugmentationSystem.GetClassLevel(class'AugSpeed'); if (augLevel >= 0) augReduce = 15 * (augLevel+1); } dmg = Max((-0.16 * (Velocity.Z + 700)) - augReduce, 0); legLocation = Location + vect(-1,0,-1); // damage left leg TakeDamage(dmg, None, legLocation, vect(0,0,0), 'fell'); legLocation = Location + vect(1,0,-1); // damage right leg TakeDamage(dmg, None, legLocation, vect(0,0,0), 'fell'); dmg = Max((-0.06 * (Velocity.Z + 700)) - augReduce, 0); legLocation = Location + vect(0,0,1); // damage torso TakeDamage(dmg, None, legLocation, vect(0,0,0), 'fell'); if (dmg > 20) PlaySound(sound'pl_fallpain3',SLOT_None,2.0); } } if (Velocity.Z < -460)//(Abs(Velocity.Z) >= 1.5 * JumpZ)//GMDX add compression to jump/fall (cosmetic) //CyberP: edited { camInterpol = 0.4; if (inHand != none && (inHand.IsA('NanoKeyRing') || inHand.IsA('DeusExPickup'))) { } else { RecoilTime=default.RecoilTime; RecoilShake.Z-=lerp(min(Abs(Velocity.Z),4.0*310)/(4.0*310),0,14.0); //CyberP: 7 RecoilShake.Y-=lerp(min(Abs(Velocity.Z),4.0*310)/(4.0*310),0,6.0); RecoilShaker(vect(3,4,14)); shakeTime= 0.15; shakeRoll = 0; shakeVert = -8; shakeView(shakeTime,shakeRoll,shakeVert); } } //if ( (Level.Game != None) && (Level.Game.Difficulty > 0) && (Abs(Velocity.Z) > 0.75 * 400) ) //{//GMDX: skill system stealth mod //if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')==0 && //AugmentationSystem != None && AugmentationSystem.GetAugLevelValue('AugStealth') == -1.0) // AISendEvent('LoudNoise', EAITYPE_Audio,, 512); //skillStealthMod=0.075; //else skillStealthMod=0.8;//0.15; //skillStealthMod*= Level.Game.Difficulty * (0.01+fMin(abs(Velocity.Z/100.0),3)); //MakeNoise(skillStealthMod ); //log("LANDED VOL: "@skillStealthMod@" "@fMin(abs(Velocity.Z),640)); //if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')==0) //CyberP: fuck it, we'll just have it not send at all //AISendEvent('LoudNoise', EAITYPE_Audio, skillStealthMod, fMin(Abs(Velocity.Z*1.5),536)); //} bJustLanded = true; } // ---------------------------------------------------------------------- // SupportActor() // // Copied directly from ScriptedPawn.uc // Called when something lands on us // ---------------------------------------------------------------------- function SupportActor(Actor standingActor) { local vector newVelocity; local float angle; local float zVelocity; local float baseMass; local float standingMass; local vector damagePoint; local float damage; zVelocity = standingActor.Velocity.Z; standingMass = FMax(1, standingActor.Mass); baseMass = FMax(1, Mass); damagePoint = Location + vect(0,0,1)*(CollisionHeight-1); damage = (1 - (standingMass/baseMass) * (zVelocity/100)); // Have we been stomped? if ((zVelocity*standingMass < -7500) && (damage > 0)) TakeDamage(damage, standingActor.Instigator, damagePoint, 0.2*standingActor.Velocity, 'stomped'); // Bounce the actor off the player angle = FRand()*Pi*2; newVelocity.X = cos(angle); newVelocity.Y = sin(angle); newVelocity.Z = 0; newVelocity *= FRand()*25 + 25; newVelocity += standingActor.Velocity; newVelocity.Z = 90; standingActor.Velocity = newVelocity; standingActor.SetPhysics(PHYS_Falling); } // ---------------------------------------------------------------------- // SpawnCarcass() // // copied from Engine.PlayerPawn // modified to let carcasses have inventories // ---------------------------------------------------------------------- function Carcass SpawnCarcass() { local DeusExCarcass carc; local Inventory item; local Vector loc; // don't spawn a carcass if we've been gibbed if (Health < -40) //CyberP: gib return None; carc = DeusExCarcass(Spawn(CarcassType)); if (carc != None) { carc.Initfor(self); // move it down to the ground loc = Location; loc.z -= CollisionHeight; loc.z += carc.CollisionHeight; carc.SetLocation(loc); if (Player != None) carc.bPlayerCarcass = true; MoveTarget = carc; //for Player 3rd person views // give the carcass the player's inventory for (item=Inventory; item!=None; item=Inventory) { DeleteInventory(item); // carc.AddInventory(item); //CyberP: commented out to prevent suicide inventory exploit. } } return carc; } // ---------------------------------------------------------------------- // Reloading() // // Called when one of the player's weapons is reloading // ---------------------------------------------------------------------- function Reloading(DeusExWeapon weapon, float reloadTime) { if (!IsLeaning() && !bIsCrouching && (Physics != PHYS_Swimming) && !IsInState('Dying')) PlayAnim('Reload', 1.0 / reloadTime, 0.1); } function DoneReloading(DeusExWeapon weapon); // ---------------------------------------------------------------------- // HealPlayer() // ---------------------------------------------------------------------- function int HealPlayer(int baseHealPoints, optional Bool bUseMedicineSkill) { local float mult; local int adjustedHealAmount, aha2, tempaha; local int origHealAmount; local float dividedHealAmount; if (bUseMedicineSkill) adjustedHealAmount = CalculateSkillHealAmount(baseHealPoints); else adjustedHealAmount = baseHealPoints; origHealAmount = adjustedHealAmount; if (adjustedHealAmount > 0) { if (bUseMedicineSkill) { PlaySound(sound'MedicalHiss', SLOT_None,,, 256); ClientFlash(4,vect(0,0,200)); //CyberP: flash when using medkits. } // Heal by 3 regions via multiplayer game if (( Level.NetMode == NM_DedicatedServer ) || ( Level.NetMode == NM_ListenServer )) { // DEUS_EX AMSD If legs broken, heal them a little bit first if (HealthLegLeft == 0) { aha2 = adjustedHealAmount; if (aha2 >= 5) aha2 = 5; tempaha = aha2; adjustedHealAmount = adjustedHealAmount - aha2; HealPart(HealthLegLeft, aha2); HealPart(HealthLegRight,tempaha); mpMsgServerFlags = mpMsgServerFlags & (~MPSERVERFLAG_LostLegs); } HealPart(HealthHead, adjustedHealAmount); if ( adjustedHealAmount > 0 ) { aha2 = adjustedHealAmount; HealPart(HealthTorso, aha2); aha2 = adjustedHealAmount; HealPart(HealthArmRight,aha2); HealPart(HealthArmLeft, adjustedHealAmount); } if ( adjustedHealAmount > 0 ) { aha2 = adjustedHealAmount; HealPart(HealthLegRight, aha2); HealPart(HealthLegLeft, adjustedHealAmount); } } else { HealPartMedicalSkill(HealthHead, adjustedHealAmount); //GMDX upgraded out HealPartMedicalSkill(HealthTorso, adjustedHealAmount); //GMDX upgraded out HealPart(HealthLegRight, adjustedHealAmount); HealPart(HealthLegLeft, adjustedHealAmount); HealPart(HealthArmRight, adjustedHealAmount); HealPart(HealthArmLeft, adjustedHealAmount); } GenerateTotalHealth(); adjustedHealAmount = origHealAmount - adjustedHealAmount; if (origHealAmount == baseHealPoints) { if (adjustedHealAmount == 1) ClientMessage(Sprintf(HealedPointLabel, adjustedHealAmount)); else ClientMessage(Sprintf(HealedPointsLabel, adjustedHealAmount)); } else { ClientMessage(Sprintf(HealedPointsLabel, adjustedHealAmount)); } } return adjustedHealAmount; } // ---------------------------------------------------------------------- // ChargePlayer() // ---------------------------------------------------------------------- function int ChargePlayer(int baseChargePoints) { local int chargedPoints; chargedPoints = Min(EnergyMax - Int(Energy), baseChargePoints); Energy += chargedPoints; return chargedPoints; } // ---------------------------------------------------------------------- // CalculateSkillHealAmount() // ---------------------------------------------------------------------- function int CalculateSkillHealAmount(int baseHealPoints) { local float mult; local int adjustedHealAmount; // check skill use if (SkillSystem != None) { mult = SkillSystem.GetSkillLevelValue(class'SkillMedicine'); // apply the skill adjustedHealAmount = baseHealPoints * mult; } return adjustedHealAmount; } // ---------------------------------------------------------------------- // HealPart() // ---------------------------------------------------------------------- function HealPart(out int points, out int amt) { local int spill; points += amt; spill = points - 100; if (spill > 0) points = 100; else spill = 0; amt = spill; } // ---------------------------------------------------------------------- // by dasraiser for GMDX // HealPart()Extended // Medical Upgrade for Head Torso Base on Medical Skill Upgrade // ---------------------------------------------------------------------- function HealPartMedicalSkill(out int points, out int amt) { local int spill; local Skill sk; if (SkillSystem!=None) { sk = SkillSystem.GetSkillFromClass(Class'DeusEx.SkillMedicine'); if (sk==None) HealPart(points,amt); //deal with default if no medical skill!! else { points += amt; spill = points - (100+sk.CurrentLevel*10); if (spill > 0) points = (100+sk.CurrentLevel*10); else spill = 0; amt = spill; } } else HealPart(points,amt); //deal with default if no skill system!! } // ---------------------------------------------------------------------- // HandleWalking() // // subclassed from PlayerPawn so we can control run/walk defaults // ---------------------------------------------------------------------- function HandleWalking() { Super.HandleWalking(); if (bAlwaysRun && !(bExtraHardcore && bHardCoreMode)) //&& !bHardCoreMode bIsWalking = (bRun != 0) || (bDuck != 0); else bIsWalking = (bRun == 0) || (bDuck != 0); // handle the toggle walk key if (bToggleWalk && !bExtraHardcore) //&& !bHardCoreMode bIsWalking = !bIsWalking; if (bToggleCrouch) { if (!bCrouchOn && !bWasCrouchOn && (bDuck != 0)) { bCrouchOn = True; if ((InHand != None && InHand.IsA('DeusExPickup')) || CarriedDecoration != None) { } else { RecoilTime*=3.0; RecoilShake.Z-=lerp(min(Abs(4),4.0*4)/(4.0*4),3,5); RecoilShaker(vect(0,0,-1.5)); } } else if (bCrouchOn && !bWasCrouchOn && (bDuck == 0)) { bWasCrouchOn = True; } else if (bCrouchOn && bWasCrouchOn && (bDuck == 0) && (lastbDuck != 0)) { bCrouchOn = False; bWasCrouchOn = False; } if (bCrouchOn) { bIsCrouching = True; bDuck = 1; } lastbDuck = bDuck; } } // ---------------------------------------------------------------------- // DoJump() // // copied from Engine.PlayerPawn // Modified to let you jump if you are carrying something rather light // You can also jump if you are crouching, just at a much lower height // ---------------------------------------------------------------------- function DoJump( optional float F ) { local DeusExWeapon w; local float scaleFactor, augLevel; local int MusLevel; MusLevel = AugmentationSystem.GetClassLevel(class'AugMuscle'); if (MusLevel==-1) MusLevel=30; else MusLevel=(MusLevel+3)*50; if ((CarriedDecoration != None) && (CarriedDecoration.Mass > MusLevel)) return; else if (bForceDuck || IsLeaning()) return; //CyberP: effect when jumping if (!bIsCrouching && Physics == PHYS_Walking) { RecoilTime=default.RecoilTime + 0.9; if (Weapon != none && inHand != none) { if (Weapon.IsA('WeaponPlasmaRifle') || Weapon.IsA('WeaponGEPGun') || Weapon.IsA('WeaponFlamethrower') || inHand.IsA('DeusExPickup')) { RecoilShake.Z-=lerp(min(Abs(4),4.0*4)/(4.0*4),2,4.0); RecoilShaker(vect(0,0,1)); } else { RecoilShake.Z-=lerp(min(Abs(30),4.0*30)/(4.0*30),12,14.0); RecoilShaker(vect(0,0,4)); } } } if (Physics == PHYS_Walking) { camInterpol = 0.4; if ((Role == ROLE_Authority )&&(FRand()<0.33)) PlaySound(JumpSound, SLOT_None, 1.5, true, 1200, 1.0 - 0.2*FRand() ); if ( (Level.Game != None) && (Level.Game.Difficulty > 0) ) MakeNoise(0.1 * Level.Game.Difficulty); PlayInAir(); if (bStunted) Velocity.Z = JumpZ*0.75; else Velocity.Z = JumpZ; swimTimer -= 0.8; if (swimTimer < 0) swimTimer = 0; if ( Level.NetMode != NM_Standalone ) { if (AugmentationSystem == None) augLevel = -1.0; else augLevel = AugmentationSystem.GetAugLevelValue(class'AugSpeed'); w = DeusExWeapon(InHand); if ((augLevel != -1.0) && ( w != None ) && ( w.Mass > 30.0)) { scaleFactor = 1.0 - FClamp( ((w.Mass - 30.0)/55.0), 0.0, 0.5 ); Velocity.Z *= scaleFactor; } } // reduce the jump velocity if you are crouching // if (bIsCrouching) // Velocity.Z *= 0.9; if ( Base != Level ) Velocity.Z += Base.Velocity.Z; SetPhysics(PHYS_Falling); if ( bCountJumps && (Role == ROLE_Authority) ) Inventory.OwnerJumped(); } } function bool IsLeaning() { return (curLeanDist != 0); } // ---------------------------------------------------------------------- // SetBasedPawnSize() // ---------------------------------------------------------------------- function bool SetBasedPawnSize(float newRadius, float newHeight) { local float oldRadius, oldHeight; local bool bSuccess; local vector centerDelta, lookDir, upDir; local float deltaEyeHeight; local Decoration savedDeco; if (newRadius < 0) newRadius = 0; if (newHeight < 0) newHeight = 0; oldRadius = CollisionRadius; oldHeight = CollisionHeight; if ( Level.NetMode == NM_Standalone ) { if ((oldRadius == newRadius) && (oldHeight == newHeight)) return true; } centerDelta = vect(0, 0, 1)*(newHeight-oldHeight); deltaEyeHeight = GetDefaultCollisionHeight() - Default.BaseEyeHeight; if ( Level.NetMode != NM_Standalone ) { if ((oldRadius == newRadius) && (oldHeight == newHeight) && (BaseEyeHeight == newHeight - deltaEyeHeight)) return true; } if (CarriedDecoration != None) savedDeco = CarriedDecoration; bSuccess = false; if ((newHeight <= CollisionHeight) && (newRadius <= CollisionRadius)) // shrink { SetCollisionSize(newRadius, newHeight); if (Move(centerDelta)) bSuccess = true; else SetCollisionSize(oldRadius, oldHeight); } else { if (Move(centerDelta)) { SetCollisionSize(newRadius, newHeight); bSuccess = true; } } if (bSuccess) { // make sure we don't lose our carried decoration if (savedDeco != None) { savedDeco.SetPhysics(PHYS_None); savedDeco.SetBase(Self); savedDeco.SetCollision(False, False, False); // reset the decoration's location lookDir = Vector(Rotation); lookDir.Z = 0; upDir = vect(0,0,0); upDir.Z = CollisionHeight / 2; // put it up near eye level savedDeco.SetLocation(Location + upDir + (0.5 * CollisionRadius + CarriedDecoration.CollisionRadius) * lookDir); } // PrePivotOffset = vect(0, 0, 1)*(GetDefaultCollisionHeight()-newHeight); PrePivot -= centerDelta; // DesiredPrePivot -= centerDelta; BaseEyeHeight = newHeight - deltaEyeHeight; // Complaints that eye height doesn't seem like your crouching in multiplayer if (( Level.NetMode != NM_Standalone ) && (bIsCrouching || bForceDuck) ) EyeHeight -= (centerDelta.Z * 2.5); else EyeHeight -= centerDelta.Z; } return (bSuccess); } // ---------------------------------------------------------------------- // ResetBasedPawnSize() // ---------------------------------------------------------------------- function bool ResetBasedPawnSize() { return SetBasedPawnSize(Default.CollisionRadius, GetDefaultCollisionHeight()); } // ---------------------------------------------------------------------- // GetDefaultCollisionHeight() // ---------------------------------------------------------------------- function float GetDefaultCollisionHeight() { return (Default.CollisionHeight-4.5); } // ---------------------------------------------------------------------- // GetCurrentGroundSpeed() // ---------------------------------------------------------------------- function float GetCurrentGroundSpeed() { local float augValue, speed; // Remove this later and find who's causing this to Access None MB if ( AugmentationSystem == None ) return 0; augValue = AugmentationSystem.GetAugLevelValue(class'AugSpeed'); if (augValue == -1.0) augValue = 1.0; if (( Level.NetMode != NM_Standalone ) && Self.IsA('Human') ) speed = Human(Self).mpGroundSpeed * augValue; else speed = Default.GroundSpeed * augValue; return speed; } // ---------------------------------------------------------------------- // CreateDrone // ---------------------------------------------------------------------- function CreateDrone() { local Vector loc; loc = (2.0 + class'SpyDrone'.Default.CollisionRadius + CollisionRadius) * Vector(ViewRotation); loc.Z = BaseEyeHeight; loc += Location; aDrone = Spawn(class'SpyDrone', Self,, loc, ViewRotation); if (aDrone != None) { aDrone.Speed = 3 * spyDroneLevelValue; aDrone.MaxSpeed = 3 * spyDroneLevelValue; aDrone.Damage = 5 * spyDroneLevelValue; aDrone.blastRadius = 8 * spyDroneLevelValue; // window construction now happens in Tick() } } // ---------------------------------------------------------------------- // MoveDrone // ---------------------------------------------------------------------- simulated function MoveDrone( float DeltaTime, Vector loc ) { // if the wanted velocity is zero, apply drag so we slow down gradually if (VSize(loc) == 0) { aDrone.Velocity *= 0.9; } else { aDrone.Velocity += deltaTime * aDrone.MaxSpeed * loc; } // add slight bobbing // DEUS_EX AMSD Only do the bobbing in singleplayer, we want stationary drones stationary. if (Level.Netmode == NM_Standalone) aDrone.Velocity += deltaTime * Sin(Level.TimeSeconds * 2.0) * vect(0,0,1); } function ServerUpdateLean( Vector desiredLoc ) { local Vector gndCheck, traceSize, HitNormal, HitLocation; local Actor HitActor, HitActorGnd; // First check to see if anything is in the way traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = CollisionHeight; HitActor = Trace( HitLocation, HitNormal, desiredLoc, Location, True, traceSize ); // Make we don't lean off the edge of something if ( HitActor == None ) // Don't bother if we're going to fail to set anyway { gndCheck = desiredLoc - vect(0,0,1) * CollisionHeight; HitActorGnd = Trace( HitLocation, HitNormal, gndCheck, desiredLoc, True, traceSize ); } if ( (HitActor == None) && (HitActorGnd != None) ) SetLocation( desiredLoc ); // SetRotation( rot ); } // ---------------------------------------------------------------------- // GMDX:dasraiser insert lean to Tiptoes // RefreshKey copied from HUDMultiSkill.uc for Tiptoes Lean // ---------------------------------------------------------------------- function RefreshLeanKeys() { local String KeyName, Alias,KeyLeanLeft,AliasLeanLeft,KeyLeanRight,AliasLeanRight; // local int EI_KL,EI_KR; local int i; local int Nfound; //GMDX as EInputKey enum not same as Actor! //^^var int LeanLeftKey, LeanRightKey; bLeanKeysDefined=false; for ( i=0; i<255; i++ ) { KeyName = ConsoleCommand ( "KEYNAME "$i ); if ( KeyName != "" ) { Alias = ConsoleCommand( "KEYBINDING "$KeyName ); if ( InStr(Alias,"LeanRight" )!=-1) { //EI_KR=i; KeyLeanRight=KeyName; AliasLeanRight=Alias; Nfound++; } else if ( InStr(Alias,"LeanLeft" )!=-1) { //EI_KL=i; KeyLeanLeft=KeyName; AliasLeanLeft=Alias; Nfound++; } if (Nfound==2) break; } } if (Nfound==2) { bLeanKeysDefined=true; // log("Set InputExt "$KeyLeanRight$" "$AliasLeanRight$" | bLeanRightHook 1 | OnRelease bLeanRightHook 0"); // log("Set InputExt "$KeyLeanLeft$" "$AliasLeanLeft$" | bLeanLeftHook 1 | OnRelease bLeanLeftHook 0"); ConsoleCommand("SET InputExt "$KeyLeanRight$" LeanRight | SetTiptoesRight 1 | OnRelease SetTiptoesRight 0"); ConsoleCommand("SET InputExt "$KeyLeanLeft$" LeanLeft | SetTiptoesLeft 1 | OnRelease SetTiptoesLeft 0"); } else log("Lean Keys UNDEFINED, disabling tiptoes"); } exec function SetTiptoesLeft(bool B) { if (bLeanKeysDefined) bLeftToe=B; else bLeftToe=false; if (bLeftToe&&bRightToe) bPreTiptoes=true; else bPreTiptoes=false; //log("Exec LeftTip"@bLeftToe@bPreTiptoes@bLeanKeysDefined); } exec function SetTiptoesRight(bool B) { if (bLeanKeysDefined) bRightToe=B; else bLeftToe=false; if (bLeftToe&&bRightToe) bPreTiptoes=true; else bPreTiptoes=false; //log("Exec RightTip"@bRightToe@bPreTiptoes); } // ---------------------------------------------------------------------- // state PlayerWalking // ---------------------------------------------------------------------- state PlayerWalking { // lets us affect the player's movement function ProcessMove ( float DeltaTime, vector newAccel, eDodgeDir DodgeMove, rotator DeltaRot) { local int newSpeed, defSpeed; local name mat; local vector HitLocation, HitNormal, checkpoint, downcheck; local Actor HitActor, HitActorDown; local bool bCantStandUp; local Vector loc, traceSize; local float alpha, maxLeanDist; local float legTotal, weapSkill; local int augValue; local int ResetSize; local float mult, mult2, mult3; if (bStaticFreeze) { SetRotation(SAVErotation); return; } // if the spy drone augmentation is active if (bSpyDroneActive) { if ( aDrone != None ) { // put away whatever is in our hand if (inHand != None) PutInHand(None); // make the drone's rotation match the player's view aDrone.SetRotation(ViewRotation); // move the drone loc = Normal((aUp * vect(0,0,1) + aForward * vect(1,0,0) + aStrafe * vect(0,1,0)) >> ViewRotation); // opportunity for client to translate movement to server MoveDrone( DeltaTime, loc ); // freeze the player Velocity = vect(0,0,0); } return; } defSpeed = GetCurrentGroundSpeed(); ResetSize=0; // log("TIPTOES "@bLeanLeftHook@bLeanRightHook@IsLeaning()@bIsCrouching@bForceDuck); //GMDX:tiptoes if (!bPreTiptoes) bIsTiptoes=false; bTiptoes=bPreTiptoes&&(!IsLeaning()||bIsTiptoes); // crouching makes you two feet tall if (bIsCrouching || bForceDuck) { if ( Level.NetMode != NM_Standalone ) SetBasedPawnSize(Default.CollisionRadius, 30.0); else SetBasedPawnSize(Default.CollisionRadius, 16); // check to see if we could stand up if we wanted to checkpoint = Location; // check normal standing height checkpoint.Z = checkpoint.Z - CollisionHeight + 2 * GetDefaultCollisionHeight(); traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = 1; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, True, traceSize); if (HitActor == None) bCantStandUp = False; else bCantStandUp = True; } else ResetSize++; if (bTiptoes) { //check we can go on tiptoes checkpoint = Location; if (bForceDuck||bIsCrouching) checkpoint.Z = checkpoint.Z + 14 +18; else checkpoint.Z = checkpoint.Z + 5.3 + GetDefaultCollisionHeight(); traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = 1; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, True, traceSize); if (HitActor == None) bCanTiptoes = True; else bCanTiptoes = False; //log("bCanTiptoes "@bCanTiptoes); } else ResetSize++; if (ResetSize==2) { // DEUS_EX AMSD Changed this to grab defspeed, because GetCurrentGroundSpeed takes 31k cycles to run. GroundSpeed = defSpeed; // make sure the collision height is fudged for the floor problem - CNN if (!IsLeaning()) { ResetBasedPawnSize(); //log("Size Reset"); } } if (bCantStandUp) bForceDuck = True; else bForceDuck = False; // if the player's legs are damaged, then reduce our speed accordingly newSpeed = defSpeed; if ( Level.NetMode == NM_Standalone ) { if (HealthLegLeft < 1) newSpeed -= (defSpeed/2) * 0.25; else if (HealthLegLeft < 34) newSpeed -= (defSpeed/2) * 0.15; else if (HealthLegLeft < 67) newSpeed -= (defSpeed/2) * 0.10; if (HealthLegRight < 1) newSpeed -= (defSpeed/2) * 0.25; else if (HealthLegRight < 34) newSpeed -= (defSpeed/2) * 0.15; else if (HealthLegRight < 67) newSpeed -= (defSpeed/2) * 0.10; if (HealthTorso < 67) newSpeed -= (defSpeed/2) * 0.05; } // let the player pull themselves along with their hands even if both of // their legs are blown off if ((HealthLegLeft < 1) && (HealthLegRight < 1)) { newSpeed = defSpeed * 0.8; bIsWalking = True; bForceDuck = True; bCanTiptoes=false; } // make crouch speed faster than normal else if (bIsCrouching || bForceDuck) { mult3=1; //CyberP: faster crouch speed. Comment out all except bIsWalking = True to remove if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')>=1) mult3= 1 + (SkillSystem.GetSkillLevel(class'SkillStealth')* 0.15); newSpeed = defSpeed * mult3; bIsWalking = True; } // CNN - Took this out because it sucks ASS! // if the legs are seriously damaged, increase the head bob // (unless the player has turned it off) // if (Bob > 0.0) // { // legTotal = (HealthLegLeft + HealthLegRight) / 2.0; // if (legTotal < 20) // Bob = Default.Bob * FClamp(0.05*(70 - legTotal), 1.0, 3.0); // else // Bob = Default.Bob; // } if ( AugmentationSystem != None ) augValue = AugmentationSystem.GetClassLevel(class'AugMuscle'); if (augValue==3) augValue = 0; else augValue=1; //CyberP: slow the player under certain conditions if (bStunted && Physics == PHYS_Walking) { bIsWalking = True; newSpeed = defSpeed; } // slow the player down if he's carrying something heavy // Like a DEAD BODY! AHHHHHH!!! if (CarriedDecoration != None) { newSpeed -= CarriedDecoration.Mass * 2*augValue; } // don't slow the player down if he's skilled at the corresponding weapon skill else if ((DeusExWeapon(Weapon) != None) && (Weapon.Mass > 30) && (AugmentationSystem != None)) { if (DeusExWeapon(Weapon).GetWeaponSkill() > -0.25 && AugmentationSystem.GetAugLevelValue(class'AugMuscle') == -1) { bIsWalking = True; newSpeed = defSpeed; } } else if ((inHand != None) && inHand.IsA('POVCorpse')) { newSpeed -= inHand.Mass * 3*augValue; } /*// Multiplayer movement adjusters //CyberP: no multiplayer if ( Level.NetMode != NM_Standalone ) { if ( Weapon != None ) { weapSkill = DeusExWeapon(Weapon).GetWeaponSkill(); // Slow down heavy weapons in multiplayer if ((DeusExWeapon(Weapon) != None) && (Weapon.Mass > 30) ) { newSpeed = defSpeed; newSpeed -= ((( Weapon.Mass - 30.0 ) / (class'WeaponGEPGun'.Default.Mass - 30.0 )) * (0.70 + weapSkill) * defSpeed ); } // Slow turn rate of GEP gun in multiplayer to discourage using it as the most effective close quarters weapon if ((WeaponGEPGun(Weapon) != None) && (!WeaponGEPGun(Weapon).bZoomed)) TurnRateAdjuster = FClamp( 0.20 + -(weapSkill*0.5), 0.25, 1.0 ); else TurnRateAdjuster = 1.0; } else TurnRateAdjuster = 1.0; } */ // if we are moving really slow, force us to walking if ((newSpeed <= defSpeed / 3) && !bForceDuck) { bIsWalking = True; newSpeed = defSpeed; } // if we are moving backwards, we should move slower // DEUS_EX AMSD Turns out this wasn't working right in multiplayer, I have a fix // for it, but it would change all our balance. //if ((aForward < 0) && (Level.NetMode == NM_Standalone)) // newSpeed *= 0.65; //CyberP: if (bTiptoes&&bCanTiptoes) //!bIsTiptoes fuuk why so much spamming size { bIsTiptoes=true; if (bIsCrouching || bForceDuck) SetBasedPawnSize(Default.CollisionRadius, 16+18); else SetBasedPawnSize(Default.CollisionRadius, GetDefaultCollisionHeight()+5.3); newSpeed*=0.6; } mult = SkillSystem.GetSkillLevelValue(class'SkillSwimming'); swimDuration = UnderWaterTime * mult; if (bIsWalking && !bIsCrouching && !bForceDuck) //CyberP: faster walking { mult3=1; //CyberP: faster walk speed. Comment out all except newSpeed *= 1.7 to remove if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')>=1) mult3= 1 + (SkillSystem.GetSkillLevel(class'SkillStealth')* 0.15); //newSpeed = defSpeed * mult3; newSpeed *= 1.7; //1.5 newSpeed *= mult3; } if (Physics == PHYS_Walking && !bCrouchOn) //CyberP: stamina system { if (bIsWalking == false && !bIsCrouching && (Velocity.X != 0 || Velocity.Y != 0 )) { if (bHardCoreMode) swimTimer -= deltaTime; else swimTimer -= deltaTime*0.3; if (swimTimer < 0) {swimTimer = 0; bIsWalking = true; } if (swimTimer < 0.0001 && FRand() < 0.7) PlaySound(sound'MaleBreathe', SLOT_None); } } if (Physics == PHYS_Walking) //CyberP: stamina system { if (bIsWalking == true || (Velocity.X == 0 && Velocity.Y == 0)) { if (bIsCrouching) { if (bCrouchRegen) { mult2 = AugmentationSystem.GetAugLevelValue(class'AugAqualung'); if (mult2 == -1.0 && PerkNamesArray[27] == 1) swimTimer += deltaTime*3.3; else if (mult2 == -1.0) swimTimer += deltaTime*2.2; else if (mult2 == 30) swimTimer += deltaTime*5; else if (mult2 == 60) swimTimer += deltaTime*10; else if (mult2 == 120) swimTimer += deltaTime*20; else if (mult2 == 240) swimTimer += deltaTime*40; if (swimTimer < 1) {bStunted = true; SetTimer(3,false);} if (swimTimer < 0) swimTimer = 0; if (swimTimer > swimDuration) swimTimer = swimDuration; } } else { mult2 = AugmentationSystem.GetAugLevelValue(class'AugAqualung'); if (mult2 == -1.0 && PerkNamesArray[27] == 1) swimTimer += deltaTime*3.3; else if (mult2 == -1.0) swimTimer += deltaTime*2.2; else if (mult2 == 30) swimTimer += deltaTime*5; else if (mult2 == 60) swimTimer += deltaTime*10; else if (mult2 == 120) swimTimer += deltaTime*20; else if (mult2 == 240) swimTimer += deltaTime*40; if (swimTimer < 1) {bStunted = true; SetTimer(3,false);} if (swimTimer < 0) swimTimer = 0; if (swimTimer > swimDuration) swimTimer = swimDuration; } } } //if (bBoosty) // { // newSpeed *= 30; // } GroundSpeed = FMax(newSpeed, 100); // if we are moving or crouching, we can't lean // uncomment below line to disallow leaning during crouch if ((VSize(Velocity) < 10) && (aForward == 0) && !(bPreTiptoes||bIsTiptoes||CarriedDecoration != None)) // && !bIsCrouching && !bForceDuck) bCanLean = True; else bCanLean = False; // check leaning buttons (axis aExtra0 is used for leaning) maxLeanDist = 40; if (IsLeaning()&&!bIsTiptoes) { if ( PlayerIsClient() || (Level.NetMode == NM_Standalone) ) ViewRotation.Roll = curLeanDist * 20; if (!bIsCrouching && !bForceDuck) { SetBasedPawnSize(CollisionRadius, GetDefaultCollisionHeight() - Abs(curLeanDist) / 3.0); //log("Size REset"); } } if (bCanLean && (aExtra0 != 0)) { // lean DropDecoration(); // drop the decoration that we are carrying if (AnimSequence != 'CrouchWalk') PlayCrawling(); if (SkillSystem.GetSkillLevel(class'SkillStealth') >=3) alpha = maxLeanDist * aExtra0 * 2.0 * (DeltaTime*2); else alpha = maxLeanDist * aExtra0 * 2.0 * DeltaTime; loc = vect(0,0,0); loc.Y = alpha; if (Abs(curLeanDist + alpha) < maxLeanDist) { // check to make sure the destination not blocked checkpoint = (loc >> Rotation) + Location; traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = CollisionHeight; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, True, traceSize); // check down as well to make sure there's a floor there downcheck = checkpoint - vect(0,0,1) * CollisionHeight; HitActorDown = Trace(HitLocation, HitNormal, downcheck, checkpoint, True, traceSize); if ((HitActor == None) && (HitActorDown != None)) { if ( PlayerIsClient() || (Level.NetMode == NM_Standalone)) { SetLocation(checkpoint); ServerUpdateLean( checkpoint ); curLeanDist += alpha; } } } else { if ( PlayerIsClient() || (Level.NetMode == NM_Standalone) ) curLeanDist = aExtra0 * maxLeanDist; } } else if (IsLeaning()) //if (!bCanLean && IsLeaning()) // uncomment this to not hold down lean { // un-lean if (AnimSequence == 'CrouchWalk') PlayRising(); if ( PlayerIsClient() || (Level.NetMode == NM_Standalone)) { prevLeanDist = curLeanDist; alpha = FClamp(7.0 * DeltaTime, 0.001, 0.9); curLeanDist *= 1.0 - alpha; if (Abs(curLeanDist) < 1.0) curLeanDist = 0; } loc = vect(0,0,0); loc.Y = -(prevLeanDist - curLeanDist); // check to make sure the destination not blocked checkpoint = (loc >> Rotation) + Location; traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = CollisionHeight; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, True, traceSize); // check down as well to make sure there's a floor there downcheck = checkpoint - vect(0,0,1) * CollisionHeight; HitActorDown = Trace(HitLocation, HitNormal, downcheck, checkpoint, True, traceSize); if ((HitActor == None) && (HitActorDown != None)) { if ( PlayerIsClient() || (Level.NetMode == NM_Standalone)) { SetLocation( checkpoint ); ServerUpdateLean( checkpoint ); } } } Super.ProcessMove(DeltaTime, newAccel, DodgeMove, DeltaRot); } function ZoneChange(ZoneInfo NewZone) { local vector loc; local int i; // if we jump into water, empty our hands if (NewZone.bWaterZone) { DropDecoration(); //loc = Location + VRand() * 4; //loc.Z += CollisionHeight * 0.9; if (Velocity.Z < -440) //CyberP: effects for jumping in water from height. { PlaySound(sound'SplashLarge', SLOT_Pain); ClientFlash(12,vect(160,200,255)); for (i=0;i<38;i++) { loc = Location + VRand() * 35; loc.Z = Location.Z + FRand(); loc += Vector(ViewRotation) * CollisionRadius * 1.02; loc.Z -= CollisionHeight + FRand(); Spawn(class'AirBubble', Self,, loc); } if (inHand != none && (inHand.IsA('NanoKeyRing') || inHand.IsA('DeusExPickup'))) { } else { RecoilTime=default.RecoilTime; RecoilShake.Z-=lerp(min(Abs(Velocity.Z),4.0*JumpZ)/(4.0*JumpZ),0,14.0); //CyberP: 7 RecoilShake.Y-=lerp(min(Abs(Velocity.Z),4.0*JumpZ)/(4.0*JumpZ),0,6.0); RecoilShaker(vect(6,8,18)); } } Super.ZoneChange(NewZone); } } event PlayerTick(float deltaTime) { //DEUS_EX AMSD Additional updates //Because of replication delay, aug icons end up being a step behind generally. So refresh them //every freaking tick. RefreshSystems(deltaTime); DrugEffects(deltaTime); RecoilEffectTick(deltaTime); Bleed(deltaTime); HighlightCenterObject(); // CyberP: scare NPCs if holding TNT if (CarriedDecoration != None) { if (CarriedDecoration.IsA('CrateExplosiveSmall')) { AISendEvent('WeaponFire', EAITYPE_Visual); } } UpdateDynamicMusic(deltaTime); UpdateWarrenEMPField(deltaTime); // DEUS_EX AMSD Move these funcions to a multiplayer tick // so that only that call gets propagated to the server. MultiplayerTick(deltaTime); // DEUS_EX AMSD For multiplayer... FrobTime += deltaTime; if (camInterpol > 0) { if (camInterpol > 0.2) ViewRotation.Pitch -= deltaTime * 2000; else ViewRotation.Pitch += deltaTime * 2000; if ((ViewRotation.Pitch > 16384) && (ViewRotation.Pitch < 32768)) ViewRotation.Pitch = 16384; camInterpol -= deltaTime; } // save some texture info FloorMaterial = GetFloorMaterial(); WallMaterial = GetWallMaterial(WallNormal); // Check if player has walked outside a first-person convo. CheckActiveConversationRadius(); // Check if all the people involved in a conversation are // still within a reasonable radius. CheckActorDistances(); // handle poison //DEUS_EX AMSD Now handled in multiplayertick //UpdatePoison(deltaTime); // Update Time Played UpdateTimePlayed(deltaTime); Super.PlayerTick(deltaTime); } } // ---------------------------------------------------------------------- // state PlayerFlying // ---------------------------------------------------------------------- state PlayerFlying { function ZoneChange(ZoneInfo NewZone) { // if we jump into water, empty our hands if (NewZone.bWaterZone) DropDecoration(); Super.ZoneChange(NewZone); } event PlayerTick(float deltaTime) { //DEUS_EX AMSD Additional updates //Because of replication delay, aug icons end up being a step behind generally. So refresh them //every freaking tick. RefreshSystems(deltaTime); DrugEffects(deltaTime); RecoilEffectTick(deltaTime); HighlightCenterObject(); UpdateDynamicMusic(deltaTime); // DEUS_EX AMSD For multiplayer... MultiplayerTick(deltaTime); FrobTime += deltaTime; // Check if player has walked outside a first-person convo. CheckActiveConversationRadius(); // Check if all the people involved in a conversation are // still within a reasonable radius. CheckActorDistances(); // Update Time Played UpdateTimePlayed(deltaTime); Super.PlayerTick(deltaTime); } } // ---------------------------------------------------------------------- // event HeadZoneChange // ---------------------------------------------------------------------- event HeadZoneChange(ZoneInfo newHeadZone) { local float mult, augLevel; // hack to get the zone's ambientsound working until Tim fixes it if (newHeadZone.AmbientSound != None) newHeadZone.SoundRadius = 255; if (HeadRegion.Zone.AmbientSound != None) HeadRegion.Zone.SoundRadius = 0; if (newHeadZone.bWaterZone && !HeadRegion.Zone.bWaterZone) { // make sure we're not crouching when we start swimming bIsCrouching = False; bCrouchOn = False; bWasCrouchOn = False; bDuck = 0; lastbDuck = 0; Velocity = vect(0,0,0); Acceleration = vect(0,0,0); mult = SkillSystem.GetSkillLevelValue(class'SkillSwimming'); swimDuration = UnderWaterTime * mult; bRegenStamina = false; AmbientSound = Sound'swimmingloop'; SoundPitch = 46; SwimTimer = swimDuration; //swimTimer = swimDuration; if (( Level.NetMode != NM_Standalone ) && Self.IsA('Human') ) { if ( AugmentationSystem != None ) augLevel = AugmentationSystem.GetAugLevelValue(class'AugAqualung'); if ( augLevel == -1.0 ) WaterSpeed = Human(Self).Default.mpWaterSpeed * mult; else WaterSpeed = Human(Self).Default.mpWaterSpeed * 2.0 * mult; } else WaterSpeed = Default.WaterSpeed * mult; } else { bRegenStamina = true; SwimTimer += 0.5; AmbientSound = none; SoundPitch = 64; } Super.HeadZoneChange(newHeadZone); } // ---------------------------------------------------------------------- // state PlayerSwimming // ---------------------------------------------------------------------- state PlayerSwimming { function GrabDecoration() { // we can't grab decorations underwater } function ZoneChange(ZoneInfo NewZone) { // if we jump into water, empty our hands if (NewZone.bWaterZone) { DropDecoration(); if (bOnFire) ExtinguishFire(); } Super.ZoneChange(NewZone); } event PlayerTick(float deltaTime) { local vector loc; local float mult2; //DEUS_EX AMSD Additional updates //Because of replication delay, aug icons end up being a step behind generally. So refresh them //every freaking tick. RefreshSystems(deltaTime); RecoilEffectTick(deltaTime); DrugEffects(deltaTime); HighlightCenterObject(); UpdateDynamicMusic(deltaTime); // DEUS_EX AMSD For multiplayer... MultiplayerTick(deltaTime); FrobTime += deltaTime; if (bOnFire) ExtinguishFire(); if (bRegenStamina) { mult2 = AugmentationSystem.GetAugLevelValue(class'AugAqualung'); if (mult2 == -1.0 && PerkNamesArray[27] == 1) swimTimer += deltaTime*3.3; else if (mult2 == -1.0) swimTimer += deltaTime*2.2; else if (mult2 == 30) swimTimer += deltaTime*5; else if (mult2 == 60) swimTimer += deltaTime*10; else if (mult2 == 120) swimTimer += deltaTime*20; else if (mult2 == 240) swimTimer += deltaTime*40; if (swimTimer > SwimDuration) swimTimer = SwimDuration; if (swimTimer < 0) swimTimer = 0; } // save some texture info FloorMaterial = GetFloorMaterial(); WallMaterial = GetWallMaterial(WallNormal); // don't let the player run if swimming bIsWalking = True; // update our swimming info swimTimer -= deltaTime; swimTimer = FMax(0, swimTimer); if ( Role == ROLE_Authority ) { if (swimTimer > 0) PainTime = swimTimer; } // Check if player has walked outside a first-person convo. CheckActiveConversationRadius(); // Check if all the people involved in a conversation are // still within a reasonable radius. CheckActorDistances(); // Randomly spawn an air bubble every 0.2 seconds // Place them in front of the player's eyes swimBubbleTimer += deltaTime; if (swimBubbleTimer >= 0.2) { swimBubbleTimer = 0; if (FRand() < 0.2) { loc = Location + VRand() * 4; loc += Vector(ViewRotation) * CollisionRadius * 2; loc.Z += CollisionHeight * 0.9; Spawn(class'AirBubble', Self,, loc); } } // handle poison //DEUS_EX AMSD Now handled in multiplayertick //UpdatePoison(deltaTime); // Update Time Played UpdateTimePlayed(deltaTime); Super.PlayerTick(deltaTime); } function BeginState() { local float mult, augLevel; // set us to be two feet high SetBasedPawnSize(Default.CollisionRadius, 16); // get our skill info mult = SkillSystem.GetSkillLevelValue(class'SkillSwimming'); swimDuration = UnderWaterTime * mult; //swimTimer = swimDuration; swimBubbleTimer = 0; WaterSpeed = Default.WaterSpeed * mult; Super.BeginState(); } } // ---------------------------------------------------------------------- // state Dying // // make sure the death animation finishes // ---------------------------------------------------------------------- state Dying { ignores all; event PlayerTick(float deltaTime) { local float time; if (PlayerIsClient()) ClientDeath(); UpdateDynamicMusic(deltaTime); time = Level.TimeSeconds - FrobTime; HeadRegion.Zone.ViewFog.X = time*0.01; if (bRemoveVanillaDeath && time > 64.0 && HeadRegion.Zone.ViewFog.X != 0) { if ((MenuUIWindow(DeusExRootWindow(rootWindow).GetTopWindow()) == None) && (ToolWindow(DeusExRootWindow(rootWindow).GetTopWindow()) == None)) ConsoleCommand("OPEN DXONLY"); } Super.PlayerTick(deltaTime); } exec function Fire(optional float F) { if ( Level.NetMode != NM_Standalone ) Super.Fire(); } exec function ShowMainMenu() { // reduce the white glow when the menu is up if (InstantFog != vect(0,0,0)) { InstantFog = vect(0.1,0.1,0.1); InstantFlash = 0.01; // force an update ViewFlash(1.0); } HeadRegion.Zone.ViewFog.X = 0; Global.ShowMainMenu(); } function BeginState() { local DeusExRootWindow root; local BloodPool pool; local Vector HitLocation, HitNormal, EndTrace; local Actor hit; root = DeusExRootWindow(rootWindow); ClientFlash(900000,vect(255,0,0)); if (bCrouchOn || bWasCrouchOn || bIsCrouching || bForceDuck) MeleeRange=51.000000; //CyberP: change this unused var to avoid adding yet more global vars if (root != None) root.ClearWindowStack(); FrobTime = Level.TimeSeconds; if (!bRemoveVanillaDeath || Health < -40) ShowHud(False); else if (bRemoveVanillaDeath) { KillShadow(); EndTrace = Location - vect(0,0,320); if (!HeadRegion.Zone.bWaterZone) { hit = Trace(HitLocation, HitNormal, EndTrace, Location, False); pool = spawn(class'BloodPool',,, HitLocation, Rotator(HitNormal)); if (pool != none) { pool.maxDrawScale = CollisionRadius / 520.0; pool.ReattachDecal(); } } } ClientDeath(); } function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { } function Landed(vector HitNormal) { if (Velocity.Z < -800) { PlaySound(sound'pl_fallpain3',SLOT_None,1.5); HeadRegion.Zone.ViewFog.X = 255; } } function PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation) { local vector ViewVect, HitLocation, HitNormal, whiteVec; local float ViewDist; local actor HitActor; local float time; ViewActor = Self; if (bHidden && (!bRemoveVanillaDeath || Health < -40)) { // spiral up and around carcass and fade to white in five seconds time = Level.TimeSeconds - FrobTime; if ( ((myKiller != None) && (killProfile != None) && (!killProfile.bKilledSelf)) || ((killProfile != None) && killProfile.bValid && (!killProfile.bKilledSelf))) { if ( killProfile.bValid && killProfile.bTurretKilled ) ViewVect = killProfile.killerLoc - Location; else if ( killProfile.bValid && killProfile.bProximityKilled ) ViewVect = killProfile.killerLoc - Location; else if (( !killProfile.bKilledSelf ) && ( myKiller != None )) ViewVect = myKiller.Location - Location; CameraLocation = Location; CameraRotation = Rotator(ViewVect); } else if (time < 8.0) { whiteVec.X = time / 16.0; whiteVec.Y = time / 16.0; whiteVec.Z = time / 16.0; CameraRotation.Pitch = -16384; CameraRotation.Yaw = (time * 2000.0); // 8192.0) % 65536; CyberP: slow down the spinning ViewDist = 32 + time * 32; InstantFog = whiteVec; InstantFlash = 0.5; ViewFlash(1.0); // make sure we don't go through the ceiling ViewVect = vect(0,0,1); HitActor = Trace(HitLocation, HitNormal, Location + ViewDist * ViewVect, Location); if ( HitActor != None ) CameraLocation = HitLocation; else CameraLocation = Location + ViewDist * ViewVect; } else { if ( Level.NetMode != NM_Standalone ) { // Don't fade to black in multiplayer } else { // then, fade out to black in four seconds and bring up // the main menu automatically whiteVec.X = FMax(0.5 - (time-8.0) / 8.0, -1.0); whiteVec.Y = FMax(0.5 - (time-8.0) / 8.0, -1.0); whiteVec.Z = FMax(0.5 - (time-8.0) / 8.0, -1.0); CameraRotation.Pitch = -16384; CameraRotation.Yaw = (time * 2000.0); //% 65536; cyberP: same changes as above. ViewDist = 32 + 8.0 * 32; InstantFog = whiteVec; InstantFlash = whiteVec.X; ViewFlash(1.0); // start the splash screen after a bit // only if we don't have a menu open // DEUS_EX AMSD Don't do this in multiplayer!!!! if (Level.NetMode == NM_Standalone) { if (whiteVec == vect(-1.0,-1.0,-1.0)) if ((MenuUIWindow(DeusExRootWindow(rootWindow).GetTopWindow()) == None) && (ToolWindow(DeusExRootWindow(rootWindow).GetTopWindow()) == None)) ConsoleCommand("OPEN DXONLY"); } } // make sure we don't go through the ceiling ViewVect = vect(0,0,1); HitActor = Trace(HitLocation, HitNormal, Location + ViewDist * ViewVect, Location); if ( HitActor != None ) CameraLocation = HitLocation; else CameraLocation = Location + ViewDist * ViewVect; } } else if (bRemoveVanillaDeath) { time = Level.TimeSeconds - FrobTime; CameraLocation = Location; CameraRotation = ViewRotation; ViewFlash(1.0); bHidden = True; if (time < 0.35 && !HeadRegion.Zone.bWaterZone && ((AnimSequence == 'DeathFront' && Physics != PHYS_Falling) || bJustLanded)) { //CameraRotation.Pitch = (time * -17000); //CameraRotation.Yaw = (time * 1000.0); //CameraLocation += Vector(ViewRotation) * (time * 60); //CameraLocation.Z -= (time * 5); CameraRotation.Pitch = (time * 7000); CameraRotation.Roll = (time * 34000.0); if (MeleeRange != 51.000000) CameraLocation.Z -= (time * 127); else CameraLocation.Z -= (time * 48); rota = CameraRotation; vecta = CameraLocation; } else if (time < 1.1 && !HeadRegion.Zone.bWaterZone && (AnimSequence == 'DeathBack' || (AnimSequence == 'DeathFront' && Physics == PHYS_Falling))) { if (time < 0.5) CameraRotation.Pitch = (time * 16000); else if (time < 0.6) CameraRotation.Pitch = (time * 16500); else if (time < 0.7) CameraRotation.Pitch = (time * 17000); else if (time < 0.8) CameraRotation.Pitch = (time * 17500); else CameraRotation.Pitch = (time * 18000); CameraRotation.Yaw += (time * 6000.0); if (MeleeRange != 51.000000) CameraLocation.Z -= (time * 30); else CameraLocation.Z -= (time * 13); rota = CameraRotation; vecta = CameraLocation; } else if (time < 8.0 && HeadRegion.Zone.bWaterZone) { CameraRotation.Pitch -= (time * 2000); CameraRotation.Yaw -= (time * 1000); rota = CameraRotation; vecta = CameraLocation; } else { CameraRotation = rota; CameraLocation = vecta; } } else { // use FrobTime as the cool DeathCam timer FrobTime = Level.TimeSeconds; // make sure we don't go through the wall ViewDist = 190; ViewVect = vect(1,0,0) >> Rotation; HitActor = Trace( HitLocation, HitNormal, Location - ViewDist * vector(CameraRotation), Location, false, vect(12,12,2)); if ( HitActor != None ) CameraLocation = HitLocation; else CameraLocation = Location - ViewDist * ViewVect; } // don't fog view if we are "paused" if (DeusExRootWindow(rootWindow).bUIPaused) { InstantFog = vect(0,0,0); InstantFlash = 0; ViewFlash(1.0); } } Begin: // Dead players comes back to life with scope view, so this is here to prevent that if ( DeusExWeapon(inHand) != None ) { DeusExWeapon(inHand).bZoomed = False; DeusExWeapon(inHand).RefreshScopeDisplay(Self, True, False); } if ( DeusExRootWindow(rootWindow).hud.augDisplay != None ) { DeusExRootWindow(rootWindow).hud.augDisplay.bVisionActive = False; DeusExRootWindow(rootWindow).hud.augDisplay.activeCount = 0; } // Don't come back to life drugged or posioned poisonCounter = 0; poisonTimer = 0; drugEffectTimer = 0; if (AugmentationSystem != None) AugmentationSystem.DeactivateAll(); //CyberP: deactivate augs // Don't come back to life crouched bCrouchOn = False; bWasCrouchOn = False; bIsCrouching = False; bForceDuck = False; lastbDuck = 0; bDuck = 0; ClientFlash(900000,vect(160,0,0)); IncreaseClientFlashLength(4); FrobTime = Level.TimeSeconds; bBehindView = True; //CyberP: was true Velocity = vect(0,0,0); Acceleration = vect(0,0,0); DesiredFOV = Default.DesiredFOV; FinishAnim(); KillShadow(); FlashTimer = 0; // hide us and spawn the carcass bHidden = True; if (!bRemoveVanillaDeath) SpawnCarcass(); //DEUS_EX AMSD Players should not leave physical versions of themselves around :) if (Level.NetMode != NM_Standalone) HidePlayer(); } // ---------------------------------------------------------------------- // state Interpolating // ---------------------------------------------------------------------- state Interpolating { ignores all; function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { } // check to see if we are done interpolating, if so, then travel to the next map event InterpolateEnd(Actor Other) { if (InterpolationPoint(Other).bEndOfPath) if (NextMap != "") { // DEUS_EX_DEMO // // If this is the demo, show the demo splash screen, which // will exit the game after the player presses a key/mouseclick // if (NextMap == "02_NYC_BatteryPark") // ShowDemoSplash(); // else Level.Game.SendPlayer(Self, NextMap); } } exec function Fire(optional float F) { local DeusExLevelInfo info; // only bring up the menu if we're not in a mission outro info = GetLevelInfo(); if ((info != None) && (info.MissionNumber < 0)) ShowMainMenu(); } event PlayerTick(float deltaTime) { UpdateInHand(); UpdateDynamicMusic(deltaTime); ShowHud(False); } Begin: if (bOnFire) ExtinguishFire(); bDetectable = False; // put away your weapon if (Weapon != None) { Weapon.bHideWeapon = True; Weapon = None; PutInHand(None); } // can't carry decorations across levels if (CarriedDecoration != None) { CarriedDecoration.Destroy(); CarriedDecoration = None; } PlayAnim('Still'); } state StaticFreeze { ignores all; event PlayerTick(float deltaTime) { UpdateInHand(); // ViewFlash(deltaTime); if (aGEPProjectile==none) { bStaticFreeze=false; GotoState('PlayerWalking'); } } Begin: } // ---------------------------------------------------------------------- // state Paralyzed // ---------------------------------------------------------------------- state Paralyzed { ignores all; function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { } exec function Fire(optional float F) { ShowMainMenu(); } event PlayerTick(float deltaTime) { UpdateInHand(); ShowHud(False); ViewFlash(deltaTime); } Begin: if (bOnFire) ExtinguishFire(); bDetectable = False; // put away your weapon if (Weapon != None) { Weapon.bHideWeapon = True; Weapon = None; PutInHand(None); } // can't carry decorations across levels if (CarriedDecoration != None) { CarriedDecoration.Destroy(); CarriedDecoration = None; } SetPhysics(PHYS_None); PlayAnim('Still'); Stop; Letterbox: if (bOnFire) ExtinguishFire(); bDetectable = False; // put away your weapon if (Weapon != None) { Weapon.bHideWeapon = True; Weapon = None; PutInHand(None); } // can't carry decorations across levels if (CarriedDecoration != None) { CarriedDecoration.Destroy(); CarriedDecoration = None; } SetPhysics(PHYS_None); PlayAnim('Still'); if (rootWindow != None) rootWindow.NewChild(class'CinematicWindow'); } // ---------------------------------------------------------------------- // RenderOverlays() // render our in-hand object // ---------------------------------------------------------------------- simulated event RenderOverlays( canvas Canvas ) { // if ((aGEPProjectile!=none)&&(aGEPProjectile.IsA('Rocket'))&&(Rocket(aGEPProjectile).bFlipFlopCanvas)) return; if ((GEPmounted!=none)&&(GEPmounted.bFlipFlopCanvas)) return; Super.RenderOverlays(Canvas); if (!IsInState('Interpolating') && !IsInState('Paralyzed')) if ((inHand != None) && (!inHand.IsA('Weapon'))) inHand.RenderOverlays(Canvas); if ((aGEPProjectile!=none)&&(aGEPProjectile.IsA('Rocket'))&&(bGEPprojectileInflight)) { if (!bStaticFreeze) { SAVErotation=Rotation; SAVElocation=Location; bStaticFreeze=true; } // Rocket(aGEPProjectile).RenderPortal(Canvas); } else bStaticFreeze=false; } // ---------------------------------------------------------------------- // RestrictInput() // // Are we in a state which doesn't allow certain exec functions? // ---------------------------------------------------------------------- function bool RestrictInput() { if (IsInState('Interpolating') || IsInState('Dying') || IsInState('Paralyzed') || (FlagBase.GetBool('PlayerTraveling') )) return True; return False; } // ---------------------------------------------------------------------- // DroneExplode // ---------------------------------------------------------------------- function DroneExplode() { local AugDrone anAug; if (aDrone != None) { aDrone.Explode(aDrone.Location, vect(0,0,1)); //DEUS_EX AMSD Don't blow up OTHER player drones... anAug = AugDrone(AugmentationSystem.FindAugmentation(class'AugDrone')); //foreach AllActors(class'AugDrone', anAug) if (anAug != None) anAug.Deactivate(); } } // ---------------------------------------------------------------------- // BuySkills() // ---------------------------------------------------------------------- exec function BuySkills() { if ( Level.NetMode != NM_Standalone ) { // First turn off scores if we're heading into skill menu if ( !bBuySkills ) ClientTurnOffScores(); bBuySkills = !bBuySkills; BuySkillSound( 2 ); } } // ---------------------------------------------------------------------- // KillerProfile() // ---------------------------------------------------------------------- exec function KillerProfile() { bKillerProfile = !bKillerProfile; } // ---------------------------------------------------------------------- // ClientTurnOffScores() // ---------------------------------------------------------------------- function ClientTurnOffScores() { if ( bShowScores ) bShowScores = False; } // ---------------------------------------------------------------------- /// ShowScores() //CyberP: this function is now used in singleplayer for secondary weapon use // ---------------------------------------------------------------------- exec function ShowScores() { if ( bBuySkills && !bShowScores ) BuySkills(); if (Level.NetMode == NM_Standalone) { if (RestrictInput()) return; if (Weapon != None && inHand != none && assignedWeapon != None && assignedWeapon != inHand) { if (inHand.IsA('DeusExWeapon')) primaryWeapon = DeusExWeapon(inHand); inHandPending = assignedWeapon; if (inHandPending.IsA('DeusExWeapon')) DeusExWeapon(inHandPending).bBeginQuickMelee=true; } else if (inHand != none && assignedWeapon != None && assignedWeapon == inHand) { if (inHand.IsA('DeusExWeapon') && DeusExWeapon(inHand).bBeginQuickMelee) { if (DeusExWeapon(inHand).AccurateRange > 200 && DeusExWeapon(inHand).AmmoLeftInClip() == 0 ) //CyberP/|Totalitarian|: hack fix bug return; else DeusExWeapon(inHand).quickMeleeCombo = 0.4; } } else if (inHand == none && inHandPending == None && CarriedDecoration == None) { if (assignedWeapon != None) inHandPending = assignedWeapon; } } bShowScores = !bShowScores; } // ---------------------------------------------------------------------- // ParseLeftClick() // ---------------------------------------------------------------------- exec function ParseLeftClick() { local int AugMuscleOn; local DeusExPickup pickup; local int MedSkillLevel; local string bioboost; local DeusExRootWindow root; local bool bThrownDecor; //local Decoration Decor; //CyberP: see commented out block further down. // // ParseLeftClick deals with things in your HAND // // Precedence: // - Detonate spy drone // - Fire (handled automatically by user.ini bindings) // - Use inHand // //log("ParseLeftClick"); if (RestrictInput()) return; //log("ParseLeftClick1"); // if the spy drone augmentation is active, blow it up if (bSpyDroneActive) { DroneExplode(); return; } if (inHand != None) if (inHand.IsA('DeusExWeapon')) //CyberP: cancel reloading - shotguns only if (DeusExWeapon(inHand).IsInState('Reload')) DeusExWeapon(inHand).bCancelLoading = True; //log("ParseLeftClick2"); if ((inHand != None) && !bInHandTransition &&(!inHand.IsA('POVcorpse'))) { // log("ParseLeftClick3"); if (inHand.bActivatable) inHand.Activate(); else if (FrobTarget != None) { // log("ParseLeftClick4"); // special case for using keys or lockpicks on doors if (FrobTarget.IsA('DeusExMover')) if (inHand.IsA('NanoKeyRing') || inHand.IsA('Lockpick')) DoFrob(Self, inHand); // special case for using multitools on hackable things if (FrobTarget.IsA('HackableDevices')) { if (inHand.IsA('Multitool')) { if (( Level.Netmode != NM_Standalone ) && (TeamDMGame(DXGame) != None) && FrobTarget.IsA('AutoTurretGun') && (AutoTurretGun(FrobTarget).team==PlayerReplicationInfo.team) ) { MultiplayerNotifyMsg( MPMSG_TeamHackTurret ); return; } else DoFrob(Self, inHand); } } } } else { if (AugmentationSystem != None) AugMuscleOn = AugmentationSystem.GetAugLevelValue(class'AugMuscle'); if (AugMuscleOn> -1.0) { if ((inHand != None) && !bInHandTransition &&(InHand.IsA('POVcorpse'))) { bThrownDecor=true; if (bRealisticCarc || bHardCoreMode) bThrowDecoration=False; else bThrowDecoration=True; DropItem(); } else { if (CarriedDecoration != None) bThrownDecor=true; bThrowDecoration=true; DropDecoration(); // play a throw anim PlayAnim('Attack',,0.1); } } } /*if (inHand == None && FrobTarget != none && FrobTarget.IsA('DeusExDecoration') && Decoration(FrobTarget).bPushable == False) { Decoration(FrobTarget).bPushable = True; GrabDecoration(); } */ //CyberP: this allowed us to pick up objects like datacubes, lamps. vending machines and such, but it is not worth the effort. if (inHand == None && FrobTarget != none && FrobTarget.IsA('DeusExPickup')) { if (FrobTarget.IsA('Sodacan')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(2, False); PlaySound(sound'MaleBurp'); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('SoyFood')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(5, False); PlaySound(sound'EatingChips',SLOT_None,3.0); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Candybar')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(3, False); PlaySound(sound'CandyEat',SLOT_None,2); bioboost="Recharged 3 Bioelectrical Energy Units"; ClientMessage(bioboost); Energy += 3; if (Energy > EnergyMax) Energy = EnergyMax; fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Flare')) { Flare(FrobTarget).LightFlare(); } else if (FrobTarget.IsA('FireExtinguisher')) { if (FireExtinguisher(FrobTarget).bAltActivate==False) { FireExtinguisher(FrobTarget).bAltActivate=True; FireExtinguisher(FrobTarget).Activate(); } } else if (FrobTarget.IsA('WineBottle')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(2, False); drugEffectTimer += 5.0; PlaySound(sound'drinkwine',SLOT_None); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Liquor40oz')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(2, False); drugEffectTimer += 7.0; PlaySound(sound'drinkwine',SLOT_None); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('LiquorBottle')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(2, False); drugEffectTimer += 4.0; PlaySound(sound'drinkwine',SLOT_None); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('VialCrack')) { if (fullUp >= 10) {ClientMessage(fatty); return;} HealPlayer(-10, False); drugEffectTimer += 60.0; fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Medkit')) { if (SkillSystem != none) MedSkillLevel = SkillSystem.GetSkillLevel(class'SkillMedicine'); if (MedSkillLevel < 1.0) MedSkillLevel = 0; HealPlayer((MedSkillLevel+1)*30, False); PlaySound(sound'MedicalHiss', SLOT_None,,, 256); ClientFlash(4,vect(0,0,200)); DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('BioelectricCell')) { PlaySound(sound'BioElectricHiss', SLOT_None,,, 256); if (PerkNamesArray[8]==1) BioelectricCell(FrobTarget).rechargeAmount=25; ClientMessage(Sprintf(BioelectricCell(FrobTarget).msgRecharged, BioelectricCell(FrobTarget).rechargeAmount)); Energy += BioelectricCell(FrobTarget).rechargeAmount; //25; if (Energy > EnergyMax) Energy = EnergyMax; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Cigarettes')) { Cigarettes(FrobTarget).bDontUse = True; Cigarettes(FrobTarget).GoToState('Activated'); } else if (FrobTarget.IsA('SkilledTool') || FrobTarget.IsA('ChargedPickup') || FrobTarget.IsA('WeaponMod') || FrobTarget.IsA('AugmentationUpgradeCannister') || FrobTarget.IsA('AugmentationCannister') || FrobTarget.IsA('Binoculars')) { bLeftClicked = True; ParseRightClick(); } else ClientMessage(noUsing); } else if (inHand == None && FrobTarget != none && FrobTarget.IsA('DeusExWeapon')) { bLeftClicked = True; ParseRightClick(); } else if (inHand == None && FrobTarget != none && FrobTarget.IsA('DeusExAmmo')) { ClientMessage(noUsing); } // log("ParseLeftClick5"); } // ---------------------------------------------------------------------- // ParseRightClick() // ---------------------------------------------------------------------- exec function ParseRightClick() { // // ParseRightClick deals with things in the WORLD // // Precedence: // - Pickup highlighted Inventory // - Frob highlighted object // - Grab highlighted Decoration // - Put away (or drop if it's a deco) inHand // local AutoTurret turret; local int ViewIndex; local bool bPlayerOwnsIt; local Inventory oldFirstItem; local Inventory oldInHand; local Decoration oldCarriedDecoration; local Vector loc; local DeusExWeapon ExWep; local DeusExRootWindow root; if (RestrictInput()) return; if (bSpyDroneActive) { if (aDrone != none) aDrone.AISendEvent('LoudNoise', EAITYPE_Audio, TransientSoundVolume, 768); if (FRand() < 0.25) PlaySound(sound'CatDie'); else if (FRand() < 0.5) PlaySound(sound'DogLargeBark1'); else if (FRand() < 0.75) PlaySound(sound'SeagullCry'); else PlaySound(sound'RatSqueak1'); return; } oldFirstItem = Inventory; oldInHand = inHand; oldCarriedDecoration = CarriedDecoration; if (FrobTarget != None) loc = FrobTarget.Location; if (FrobTarget != None) { // First check if this is a NanoKey, in which case we just // want to add it to the NanoKeyRing without disrupting // what the player is holding if ((FrobTarget.IsA('ScriptedPawn') || FrobTarget.IsA('DeusExMover')) && bAlternateToolbelt) //CyberP: no, first we do this for the invisible war toolbelt. { if ((ScriptedPawn(FrobTarget) != None && ScriptedPawn(FrobTarget).GetPawnAllianceType(self) == ALLIANCE_Hostile) || (DeusExMover(FrobTarget) != None && DeusExMover(FrobTarget).bFrobbable == False)) { if (CarriedDecoration == None) //CyberP: DX:IW toolbelt { if (inHand != None && inHand.IsA('POVCorpse')) { } else { if (inHand == None) { root = DeusExRootWindow(rootWindow); if (root != None && root.hud.belt.GetObjectFromBelt(advBelt) != inHand) { root.ActivateObjectInBelt(advBelt); return; } } else PutInHand(None); } } } else DoFrob(Self, None); } else if (FrobTarget.IsA('NanoKey')) { PickupNanoKey(NanoKey(FrobTarget)); FrobTarget.Destroy(); FrobTarget = None; return; } else if (FrobTarget.IsA('Inventory')) { // If this is an item that can be stacked, check to see if // we already have one, in which case we don't need to // allocate more space in the inventory grid. // // TODO: This logic may have to get more involved if/when // we start allowing other types of objects to get stacked. if (SkillSystem != none) { if ((FrobTarget.IsA('WeaponGEPGun') || FrobTarget.IsA('WeaponFlamethrower') || FrobTarget.IsA('WeaponPlasmaRifle')) && PerkNamesArray[24]==1) { DeusExWeapon(FrobTarget).invSlotsX=3; DeusExWeapon(FrobTarget).invSlotsY=1; } } if (PerkNamesArray[30]==1) { if (FrobTarget.IsA('BioelectricCell')) BioelectricCell(FrobTarget).MaxCopies=25; else if (FrobTarget.IsA('Medkit')) Medkit(FrobTarget).MaxCopies=20; } if (HandleItemPickup(FrobTarget, True) == False) return; // if the frob succeeded, put it in the player's inventory //DEUS_EX AMSD ARGH! Because of the way respawning works, the item I pick up //is NOT the same as the frobtarget if I do a pickup. So how do I tell that //I've successfully picked it up? Well, if the first item in my inventory //changed, I picked up a new item. if ( ((Level.NetMode == NM_Standalone) && (Inventory(FrobTarget).Owner == Self)) || ((Level.NetMode != NM_Standalone) && (oldFirstItem != Inventory)) ) { if (Level.NetMode == NM_Standalone) FindInventorySlot(Inventory(FrobTarget)); else FindInventorySlot(Inventory); FrobTarget = None; } } else if (FrobTarget.IsA('Decoration') && Decoration(FrobTarget).bPushable) { if (swimTimer <= 1) { } else { GrabDecoration(); } } else { if (( Level.NetMode != NM_Standalone ) && ( TeamDMGame(DXGame) != None )) { if ( FrobTarget.IsA('LAM') || FrobTarget.IsA('GasGrenade') || FrobTarget.IsA('EMPGrenade')) { if ((ThrownProjectile(FrobTarget).team == PlayerReplicationInfo.team) && ( ThrownProjectile(FrobTarget).Owner != Self )) { if ( ThrownProjectile(FrobTarget).bDisabled ) // You can re-enable a grenade for a teammate { ThrownProjectile(FrobTarget).ReEnable(); return; } MultiplayerNotifyMsg( MPMSG_TeamLAM ); return; } } if ( FrobTarget.IsA('ComputerSecurity') && (PlayerReplicationInfo.team == ComputerSecurity(FrobTarget).team) ) { // Let controlling player re-hack his/her own computer bPlayerOwnsIt = False; foreach AllActors(class'AutoTurret',turret) { for (ViewIndex = 0; ViewIndex < ArrayCount(ComputerSecurity(FrobTarget).Views); ViewIndex++) { if (ComputerSecurity(FrobTarget).Views[ViewIndex].turretTag == turret.Tag) { if (( turret.safeTarget == Self ) || ( turret.savedTarget == Self )) { bPlayerOwnsIt = True; break; } } } } if ( !bPlayerOwnsIt ) { MultiplayerNotifyMsg( MPMSG_TeamComputer ); return; } } } // otherwise, just frob it DoFrob(Self, None); } } else { // if there's no FrobTarget, put away an inventory item or drop a decoration // or drop the corpse if (bAlternateToolbelt && CarriedDecoration == None) //CyberP: DX:IW toolbelt { if (inHand != None && inHand.IsA('POVCorpse')) { } else { root = DeusExRootWindow(rootWindow); if (root != None && root.hud.belt.GetObjectFromBelt(advBelt) != inHand) { root.ActivateObjectInBelt(advBelt); return; } } } if ((inHand != None) && inHand.IsA('POVCorpse')) { DropItem(); } else if (CarriedDecoration != None) { PutInHand(None); } else if (clickCountCyber >= 1) { PutInHand(None); } else if (!bDblClickHolster) { PutInHand(None); } else { SetTimer(0.3,false); bDoubleClickCheck=True; clickCountCyber++; } } if ((oldInHand == None) && (inHand != None)) PlayPickupAnim(loc); else if ((oldCarriedDecoration == None) && (CarriedDecoration != None)) PlayPickupAnim(loc); } // ---------------------------------------------------------------------- // PlayPickupAnim() // ---------------------------------------------------------------------- function PlayPickupAnim(Vector locPickup) { if (Location.Z - locPickup.Z < 16) PlayAnim('PushButton',,0.1); else PlayAnim('Pickup',,0.1); } // ---------------------------------------------------------------------- // HandleItemPickup() // ---------------------------------------------------------------------- function bool HandleItemPickup(Actor FrobTarget, optional bool bSearchOnly) { local bool bCanPickup; local bool bSlotSearchNeeded; local Inventory foundItem; bSlotSearchNeeded = True; bCanPickup = True; // Special checks for objects that do not require phsyical inventory // in order to be picked up: // // - NanoKeys // - DataVaultImages // - Credits if ((FrobTarget.IsA('DataVaultImage')) || (FrobTarget.IsA('NanoKey')) || (FrobTarget.IsA('Credits'))) { bSlotSearchNeeded = False; } else if (FrobTarget.IsA('DeusExPickup')) { // If an object of this type already exists in the player's inventory *AND* // the object is stackable, then we don't need to search. if ((FindInventoryType(FrobTarget.Class) != None) && (DeusExPickup(FrobTarget).bCanHaveMultipleCopies)) bSlotSearchNeeded = False; } else { // If this isn't ammo or a weapon that we already have, // check if there's enough room in the player's inventory // to hold this item. foundItem = GetWeaponOrAmmo(Inventory(FrobTarget)); if (foundItem != None) { bSlotSearchNeeded = False; // if this is an ammo, and we're full of it, abort the pickup if (foundItem.IsA('Ammo')) { if (Ammo(foundItem).AmmoAmount >= Ammo(foundItem).MaxAmmo) { ClientMessage(TooMuchAmmo); bCanPickup = False; } } //GMDX: hmm // If this is a grenade or LAM (what a pain in the ass) then also check // to make sure we don't have too many grenades already else if ((foundItem.IsA('WeaponEMPGrenade')) || (foundItem.IsA('WeaponGasGrenade')) || (foundItem.IsA('WeaponNanoVirusGrenade')) || (foundItem.IsA('WeaponLAM'))) { if (DeusExWeapon(foundItem).AmmoType.AmmoAmount >= DeusExWeapon(foundItem).AmmoType.MaxAmmo) { ClientMessage(TooMuchAmmo); bCanPickup = False; } } // Otherwise, if this is a single-use weapon, prevent the player // from picking up //CyberP: also check if ammo is full when picking up weapons else if (foundItem.IsA('Weapon')) { // If these fields are set as checked, then this is a // single use weapon, and if we already have one in our // inventory another cannot be picked up (puke). bCanPickup = ! ( (Weapon(foundItem).ReloadCount == 0) && (Weapon(foundItem).PickupAmmoCount == 0) && (Weapon(foundItem).AmmoName != None) ); /*if (Weapon(foundItem).IsA('WeaponHideAGun')) {bCanPickup = True; bSearchSlotNeeded = True; }*/ if (!bCanPickup) ClientMessage(Sprintf(CanCarryOnlyOne, foundItem.itemName)); DeusExWeapon(foundItem).SetMaxAmmo(); if (DeusExWeapon(foundItem).AmmoType.AmmoAmount >= DeusExWeapon(foundItem).MaxiAmmo) { ClientMessage(TooMuchAmmo); bCanPickup = False; } } } } if (bSlotSearchNeeded && bCanPickup) { // log("MYCHK::DXPlayer::HIP::ADD TO::"@FrobTarget); if (FindInventorySlot(Inventory(FrobTarget), bSearchOnly) == False) { // log("MYCHK::DXPlayer::HIP::ADD TO FAILED::"@foundItem); ClientMessage(Sprintf(InventoryFull, Inventory(FrobTarget).itemName)); bCanPickup = False; ServerConditionalNotifyMsg( MPMSG_DropItem ); } } if (bCanPickup) { //if (FrobTarget.IsA('WeaponLAW')) // PlaySound(sound'WeaponPickup', SLOT_Interact, 0.5+FRand()*0.25, , 256, 0.95+FRand()*0.1); DoFrob(Self, inHand); if ( FrobTarget.IsA('DeusExWeapon') && bLeftClicked) //CyberP: for left click interaction { PutInHand(FoundItem); //bLeftClicked = False; } // This is bad. We need to reset the number so restocking works if ( Level.NetMode != NM_Standalone ) { if ( FrobTarget.IsA('DeusExWeapon') && (DeusExWeapon(FrobTarget).PickupAmmoCount == 0) ) { DeusExWeapon(FrobTarget).PickupAmmoCount = DeusExWeapon(FrobTarget).Default.mpPickupAmmoCount * 3; } } } return bCanPickup; } // ---------------------------------------------------------------------- // CreateNanoKeyInfo() // ---------------------------------------------------------------------- function NanoKeyInfo CreateNanoKeyInfo() { local NanoKeyInfo newKey; newKey = new(Self) Class'NanoKeyInfo'; return newKey; } // ---------------------------------------------------------------------- // PickupNanoKey() // // Picks up a NanoKey // // 1. Add KeyID to list of keys // 2. Destroy NanoKey (since the user can't have it in his/her inventory) // ---------------------------------------------------------------------- function PickupNanoKey(NanoKey newKey) { KeyRing.GiveKey(newKey.KeyID, newKey.Description); //DEUS_EX AMSD In multiplayer, propagate the key to the client if the server if ((Role == ROLE_Authority) && (Level.NetMode != NM_Standalone)) { KeyRing.GiveClientKey(newKey.KeyID, newKey.Description); } ClientMessage(Sprintf(AddedNanoKey, newKey.Description)); } // ---------------------------------------------------------------------- // RemoveNanoKey() // ---------------------------------------------------------------------- exec function RemoveNanoKey(Name KeyToRemove) { if (!bCheatsEnabled) return; KeyRing.RemoveKey(KeyToRemove); if ((Role == ROLE_Authority) && (Level.NetMode != NM_Standalone)) { KeyRing.RemoveClientKey(KeyToRemove); } } // ---------------------------------------------------------------------- // GiveNanoKey() // ---------------------------------------------------------------------- exec function GiveNanoKey(Name newKeyID, String newDescription) { if (!bCheatsEnabled) return; KeyRing.GiveKey(newKeyID, newDescription); //DEUS_EX AMSD In multiplayer, propagate the key to the client if the server if ((Role == ROLE_Authority) && (Level.NetMode != NM_Standalone)) { KeyRing.GiveClientKey(newKeyID, newDescription); } } // ---------------------------------------------------------------------- // DoFrob() // // Frob the target // ---------------------------------------------------------------------- function DoFrob(Actor Frobber, Inventory frobWith) { local DeusExRootWindow root; local Ammo ammo; local Inventory item; local Actor A; // if the object destroyed itself, get out //CyberP: copy-pasted this from below if (FrobTarget == None) return; // make sure nothing is based on us if we're an inventory if (FrobTarget.IsA('Inventory')) foreach FrobTarget.BasedActors(class'Actor', A) A.SetBase(None); // log("MYCHK::DXPlayer::DoFrob:Frobber:"@Frobber@": frobWith:"@frobWith@": FrobTarget:"@FrobTarget); FrobTarget.Frob(Frobber, frobWith); // if the object destroyed itself, get out if (FrobTarget == None) return; // if the inventory item aborted it's own pickup, get out if (FrobTarget.IsA('Inventory') && (FrobTarget.Owner != Self)) return; // alert NPCs that I'm messing with stuff if (FrobTarget.bOwned) AISendEvent('Futz', EAITYPE_Visual); // play an animation PlayPickupAnim(FrobTarget.Location); // set the base so the inventory follows us around correctly if (FrobTarget.IsA('Inventory')) FrobTarget.SetBase(Frobber); } // ---------------------------------------------------------------------- // PutInHand() // // put the object in the player's hand and draw it in front of the player // ---------------------------------------------------------------------- exec function PutInHand(optional Inventory inv) { if (RestrictInput()) return; if (bGEPprojectileInflight) return; // can't put anything in hand if you're using a spy drone if ((inHand == None) && bSpyDroneActive) return; // can't do anything if you're carrying a corpse if ((inHand != None) && inHand.IsA('POVCorpse')) return; if (inv != None) { // can't put ammo in hand if (inv.IsA('Ammo')) return; // Can't put an active charged item in hand //cyberP: overruled for armor system //if ((inv.IsA('ChargedPickup')) && (ChargedPickup(inv).IsActive())) // return; } if (CarriedDecoration != None) DropDecoration(); bLeftClicked = False; //CyberP: fail safe SetInHandPending(inv); } // ---------------------------------------------------------------------- // UpdateBeltText() // ---------------------------------------------------------------------- function UpdateBeltText(Inventory item) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); // Update object belt text if ((item.bInObjectBelt) && (root != None)) root.hud.belt.UpdateObjectText(item.beltPos); } // ---------------------------------------------------------------------- // UpdateAmmoBeltText() // // Loops through all the weapons in the player's inventory and updates // the ammo for any that matches the ammo type passed in. // ---------------------------------------------------------------------- function UpdateAmmoBeltText(Ammo ammo) { local Inventory inv; inv = Inventory; while(inv != None) { if ((inv.IsA('DeusExWeapon')) && (DeusExWeapon(inv).AmmoType == ammo)) UpdateBeltText(inv); inv = inv.Inventory; } } // ---------------------------------------------------------------------- // SetInHand() // ---------------------------------------------------------------------- function SetInHand(Inventory newInHand) { local DeusExRootWindow root; inHand = newInHand; // Notify the hud root = DeusExRootWindow(rootWindow); if (root != None) root.hud.belt.UpdateInHand(); } // ---------------------------------------------------------------------- // SetInHandPending() // ---------------------------------------------------------------------- function SetInHandPending(Inventory newInHandPending) { local DeusExRootWindow root; if ( newInHandPending == None ) ClientInHandPending = None; inHandPending = newInHandPending; root = DeusExRootWindow(rootWindow); if (root != None) root.hud.belt.UpdateInHand(); } // ---------------------------------------------------------------------- // UpdateInHand() // // Called every frame // Checks the state of inHandPending and deals with animation and crap // 1. Check for pending item // 2. Play down anim (and deactivate) for inHand and wait for it to finish // 3. Assign inHandPending to inHand (and SelectedItem) // 4. Play up anim for inHand // ---------------------------------------------------------------------- function UpdateInHand() { local bool bSwitch; local rotator rot; //sync up clientinhandpending. if (inHandPending != inHand) ClientInHandPending = inHandPending; //DEUS_EX AMSD Don't let clients do this. if (Role < ROLE_Authority) return; if (inHand != inHandPending) { bInHandTransition = True; bSwitch = False; if (inHand != None) { // turn it off if it is on if (inHand.bActive && !inHand.IsA('ChargedPickup')) //CyberP: armor system inHand.Activate(); if (inHand.IsA('SkilledTool')) { if (inHand.IsInState('Idle')) { SkilledTool(inHand).PutDown(); } else if (inHand.IsInState('Idle2')) { bSwitch = True; } } else if (inHand.IsA('DeusExWeapon')) { if (inHand.IsInState('Idle') || inHand.IsInState('Reload')) DeusExWeapon(inHand).PutDown(); else if (inHand.IsInState('DownWeapon') && (Weapon == None)) bSwitch = True; } else { bSwitch = True; } } else { bSwitch = True; } // OK to actually switch? if (bSwitch) { SetInHand(inHandPending); SelectedItem = inHandPending; if (inHand != None) { if (inHand.IsA('SkilledTool')) SkilledTool(inHand).BringUp(); else if (inHand.IsA('DeusExWeapon')) SwitchWeapon(DeusExWeapon(inHand).InventoryGroup); } } } else { bInHandTransition = False; // Added this code because it's now possible to reselect an in-hand // item while we're putting it down, so we need to bring it back up... if (inHand != None) { // if we put the item away, bring it back up if (inHand.IsA('SkilledTool')) { if (inHand.IsInState('Idle2')) SkilledTool(inHand).BringUp(); } else if (inHand.IsA('DeusExWeapon')) { if (inHand.IsInState('DownWeapon') && (Weapon == None)) SwitchWeapon(DeusExWeapon(inHand).InventoryGroup); } } } UpdateCarcassEvent(); } // ---------------------------------------------------------------------- // UpdateCarcassEvent() // // Small hack for sending carcass events // ---------------------------------------------------------------------- function UpdateCarcassEvent() { if ((inHand != None) && (inHand.IsA('POVCorpse'))) { AIStartEvent('WeaponDrawn', EAITYPE_Visual);//AIStartEvent('Carcass', EAITYPE_Visual); } else { AIEndEvent('WeaponDrawn', EAITYPE_Visual); AIEndEvent('Carcass', EAITYPE_Visual); } } // ---------------------------------------------------------------------- // IsEmptyItemSlot() // // Returns True if the item will fit in this slot // ---------------------------------------------------------------------- function Bool IsEmptyItemSlot( Inventory anItem, int col, int row ) { local int slotsCol; local int slotsRow; local Bool bEmpty; local Inventory inv; local DeusExRootWindow root; local PersonaScreenInventory winInv; if ( anItem == None ) return False; //=== If cheats are off, then don't let us do the "overlap" trick root = DeusExRootWindow(rootWindow); winInv = PersonaScreenInventory(root.GetTopWindow()); if(winInv == None || !winInv.bDragging) { inv = Inventory; while(inv != None) { SetInvSlots(inv, 1); inv = inv.Inventory; } } // First make sure the item can fit horizontally // and vertically if (( col + anItem.invSlotsX > maxInvCols ) || ( row + anItem.invSlotsY > maxInvRows )) return False; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) return True; // Now check this and the needed surrounding slots // to see if all the slots are empty bEmpty = True; for( slotsRow=0; slotsRow < anItem.invSlotsY; slotsRow++ ) { for ( slotsCol=0; slotsCol < anItem.invSlotsX; slotsCol++ ) { if ( invSlots[((slotsRow + row) * maxInvCols) + (slotsCol + col)] == 1 ) { bEmpty = False; break; } } if ( !bEmpty ) break; } return bEmpty; } // ---------------------------------------------------------------------- // IsEmptyItemSlotXY() // // Returns True if the item will fit in this slot // ---------------------------------------------------------------------- function Bool IsEmptyItemSlotXY( int invSlotsX, int invSlotsY, int col, int row ) { local int slotsCol; local int slotsRow; local Bool bEmpty; // First make sure the item can fit horizontally // and vertically if (( col + invSlotsX > maxInvCols ) || ( row + invSlotsY > maxInvRows )) return False; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) return True; // Now check this and the needed surrounding slots // to see if all the slots are empty bEmpty = True; for( slotsRow=0; slotsRow < invSlotsY; slotsRow++ ) { for ( slotsCol=0; slotsCol < invSlotsX; slotsCol++ ) { if ( invSlots[((slotsRow + row) * maxInvCols) + (slotsCol + col)] == 1 ) { bEmpty = False; break; } } if ( !bEmpty ) break; } return bEmpty; } // ---------------------------------------------------------------------- // SetInvSlots() // ---------------------------------------------------------------------- function SetInvSlots( Inventory anItem, int newValue ) { local int slotsCol; local int slotsRow; if ( anItem == None ) return; // Make sure this item is located in a valid position if (( anItem.invPosX != -1 ) && ( anItem.invPosY != -1 )) { // fill inventory slots for( slotsRow=0; slotsRow < anItem.invSlotsY; slotsRow++ ) for ( slotsCol=0; slotsCol < anItem.invSlotsX; slotsCol++ ) invSlots[((slotsRow + anItem.invPosY) * maxInvCols) + (slotsCol + anItem.invPosX)] = newValue; } } // ---------------------------------------------------------------------- // PlaceItemInSlot() // ---------------------------------------------------------------------- function PlaceItemInSlot( Inventory anItem, int col, int row ) { // Save in the original Inventory item also anItem.invPosX = col; anItem.invPosY = row; SetInvSlots(anItem, 1); } // ---------------------------------------------------------------------- // RemoveItemFromSlot() // // Removes an inventory item from the inventory grid // ---------------------------------------------------------------------- function RemoveItemFromSlot(Inventory anItem) { if (anItem != None) { SetInvSlots(anItem, 0); anItem.invPosX = -1; anItem.invPosY = -1; } } // ---------------------------------------------------------------------- // ClearInventorySlots() // // Not for the foolhardy // ---------------------------------------------------------------------- function ClearInventorySlots() { local int slotIndex; for(slotIndex=0; slotIndex<arrayCount(invSlots); slotIndex++) invSlots[slotIndex] = 0; } // ---------------------------------------------------------------------- // FindInventorySlot() // // Searches through the inventory slot grid and attempts to find a // valid location for the item passed in. Returns True if the item // is placed, otherwise returns False. // ---------------------------------------------------------------------- function Bool FindInventorySlot(Inventory anItem, optional Bool bSearchOnly) { local bool bPositionFound; local int row; local int col; local int newSlotX; local int newSlotY; local int beltpos; local ammo foundAmmo; if (anItem == None) return False; // Special checks for objects that do not require phsyical inventory // in order to be picked up: // // - NanoKeys // - DataVaultImages // - Credits // - Ammo if ((anItem.IsA('DataVaultImage')) || (anItem.IsA('NanoKey')) || (anItem.IsA('Credits')) || (anItem.IsA('Ammo'))) return True; bPositionFound = False; // DEUS_EX AMSD In multiplayer, due to propagation delays, the inventory refreshers in the // personascreeninventory can keep bouncing items back and forth. So just return true and // place the item where it already was. if ((anItem.invPosX != -1) && (anItem.invPosY != -1) && (Level.NetMode != NM_Standalone) && (!bSearchOnly)) { SetInvSlots(anItem,1); log("Trying to place item "$anItem$" when already placed at "$anItem.invPosX$", "$anItem.invPosY$"."); return True; } // Loop through all slots, looking for a fit for (row=0; row<maxInvRows; row++) { if (row + anItem.invSlotsY > maxInvRows) break; // Make sure the item can fit vertically for(col=0; col<maxInvCols; col++) { if (IsEmptyItemSlot(anItem, col, row )) { bPositionFound = True; break; } } if (bPositionFound) break; } if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { bPositionFound = False; beltpos = 0; if (DeusExRootWindow(rootWindow) != None) { for (beltpos = 0; beltpos < ArrayCount(DeusExRootWindow(rootWindow).hud.belt.objects); beltpos++) { if ( (DeusExRootWindow(rootWindow).hud.belt.objects[beltpos].item == None) && (anItem.TestMPBeltSpot(beltpos)) ) { bPositionFound = True; } } } else { log("no belt to check"); } } if ((bPositionFound) && (!bSearchOnly)) { PlaceItemInSlot(anItem, col, row); if (bLeftClicked) { PutInHand(anItem); //CyberP: left click interaction bLeftClicked = False; } } return bPositionFound; } // ---------------------------------------------------------------------- // FindInventorySlotXY() // // Searches for an available slot given the number of horizontal and // vertical slots this item takes up. // ---------------------------------------------------------------------- function Bool FindInventorySlotXY(int invSlotsX, int invSlotsY, out int newSlotX, out int newSlotY) { local bool bPositionFound; local int row; local int col; bPositionFound = False; // Loop through all slots, looking for a fit for (row=0; row<maxInvRows; row++) { if (row + invSlotsY > maxInvRows) break; // Make sure the item can fit vertically for(col=0; col<maxInvCols; col++) { if (IsEmptyItemSlotXY(invSlotsX, invSlotsY, col, row)) { newSlotX = col; newSlotY = row; bPositionFound = True; break; } } if (bPositionFound) break; } return bPositionFound; } // ---------------------------------------------------------------------- // DumpInventoryGrid() // // Dumps the inventory grid to the log file. Useful for debugging only. // ---------------------------------------------------------------------- exec function DumpInventoryGrid() { local int slotsCol; local int slotsRow; local String gridRow; log("DumpInventoryGrid()"); log("============================================================="); log(" 1 2 3 4 5"); log("-----------------"); for( slotsRow=0; slotsRow < maxInvRows; slotsRow++ ) { gridRow = "Row #" $ slotsRow $ ": "; for ( slotsCol=0; slotsCol < maxInvCols; slotsCol++ ) { if ( invSlots[(slotsRow * maxInvCols) + slotsCol] == 1) gridRow = gridRow $ "X "; else gridRow = gridRow $ " "; } log(gridRow); } log("============================================================="); } // ---------------------------------------------------------------------- // Belt functions following are just callbacks to handle multiplayer // belt updating. First arg is true if it's the invbelt, false if it's // the hudbelt. // ---------------------------------------------------------------------- function ClearPosition(int pos) { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.ClearPosition(pos); } function ClearBelt() { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.ClearBelt(); } function RemoveObjectFromBelt(Inventory item) { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.RemoveObjectFromBelt(item); } function AddObjectToBelt(Inventory item, int pos, bool bOverride) { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.AddObjectToBelt(item,pos,bOverride); } // ---------------------------------------------------------------------- // GetWeaponOrAmmo() // // Checks to see if the player already has this weapon or ammo // in his inventory. Returns the item if found, or None if not. // ---------------------------------------------------------------------- function Inventory GetWeaponOrAmmo(Inventory queryItem) { // First check to see if this item is actually a weapon or ammo if ((Weapon(queryItem) != None) || (Ammo(queryItem) != None)) return FindInventoryType(queryItem.Class); else return None; } /// ///////////////////////////////////////////////////////// //CheckBob() //CyberP: overrides code in playerPawn. Uncomment and modify headbob. ///////////////////////////////////////////////////////// /// /*function CheckBob(float DeltaTime, float Speed2D, vector Y) { local float OldBobTime; if (!bModdedHeadBob) { Super.CheckBob(DeltaTime, Speed2D, Y); return; } OldBobTime = BobTime; if ( Speed2D < 10 ) BobTime += 0.2 * DeltaTime; else BobTime += DeltaTime * (0.5 + 0.8 * Speed2D/GroundSpeed); //0.5 + 0.8 WalkBob = Y * 0.65 * Bob * Speed2D * sin(6 * BobTime); AppliedBob = AppliedBob * (1 - FMin(1, 2 * deltatime -70)); if ( LandBob > 0.01 ) { AppliedBob += FMin(1, 2 * deltatime) * LandBob; LandBob *= (1 - 8*Deltatime); } if ( Speed2D < 160 ) WalkBob.Z = 0; // AppliedBob + Bob * 30 * sin(12 * BobTime); // take out the "breathe" effect - DEUS_EX CNN else WalkBob.Z = AppliedBob/9 + Bob * (Speed2D/4) * cos(12 * BobTime); } */ // ---------------------------------------------------------------------- // Summon() // // automatically prepend DeusEx. to the summoned class // ---------------------------------------------------------------------- exec function Summon(string ClassName) { if (!bCheatsEnabled) return; if(!bAdmin && (Level.Netmode != NM_Standalone)) return; if(instr(ClassName, ".") == -1) ClassName = "DeusEx." $ ClassName; Super.Summon(ClassName); } // ---------------------------------------------------------------------- // SpawnMass() // // Spawns a bunch of actors around the player // ---------------------------------------------------------------------- exec function SpawnMass(Name ClassName, optional int TotalCount) { local actor spawnee; local vector spawnPos; local vector center; local rotator direction; local int maxTries; local int count; local int numTries; local float maxRange; local float range; local float angle; local class<Actor> spawnClass; local string holdName; if (!bCheatsEnabled) return; if (!bAdmin && (Level.Netmode != NM_Standalone)) return; if (instr(ClassName, ".") == -1) holdName = "DeusEx." $ ClassName; else holdName = "" $ ClassName; // barf spawnClass = class<actor>(DynamicLoadObject(holdName, class'Class')); if (spawnClass == None) { ClientMessage("Illegal actor name "$GetItemName(String(ClassName))); return; } if (totalCount <= 0) totalCount = 10; if (totalCount > 250) totalCount = 250; maxTries = totalCount*2; count = 0; numTries = 0; maxRange = sqrt(totalCount/3.1416)*4*SpawnClass.Default.CollisionRadius; direction = ViewRotation; direction.pitch = 0; direction.roll = 0; center = Location + Vector(direction)*(maxRange+SpawnClass.Default.CollisionRadius+CollisionRadius+20); while ((count < totalCount) && (numTries < maxTries)) { angle = FRand()*3.14159265359*2; range = sqrt(FRand())*maxRange; spawnPos.X = sin(angle)*range; spawnPos.Y = cos(angle)*range; spawnPos.Z = 0; spawnee = spawn(SpawnClass,,,center+spawnPos, Rotation); if (spawnee != None) count++; numTries++; } ClientMessage(count$" actor(s) spawned"); } // ---------------------------------------------------------------------- // ToggleWalk() // ---------------------------------------------------------------------- exec function ToggleWalk() { if (RestrictInput()) return; bToggleWalk = !bToggleWalk; } // ---------------------------------------------------------------------- // ReloadWeapon() // // reloads the currently selected weapon // ---------------------------------------------------------------------- exec function ReloadWeapon() { local DeusExWeapon W; if (RestrictInput()) return; //GMDX: bumped to restricted // if (bGEPprojectileInflight) return;// cant reload during projectil flight W = DeusExWeapon(Weapon); //CyberP: cannot reload when ammo in mag but none in reserves. if (W != None && (W.AmmoLeftInClip() != W.AmmoType.AmmoAmount || W.IsA('WeaponHideAGun') || W.GoverningSkill == class'DeusEx.SkillDemolition')) W.ReloadAmmo(); } // ---------------------------------------------------------------------- // ToggleScope() // // turns the scope on or off for the current weapon // ---------------------------------------------------------------------- exec function ToggleScope() { local DeusExWeapon W; //log("ToggleScope "@IsInState('Interpolating')@" "@IsInState('Dying')@" "@IsInState('Paralyzed')); if (RestrictInput()) return; W = DeusExWeapon(Weapon); if (W != None) { if (W.IsInState('Idle') || (W.bZoomed == False && W.AnimSequence == 'Shoot') || (W.bZoomed == True && RecoilTime==0)) //CyberP: far less restrictive { if (W.AnimSequence == 'Idle1' || W.AnimSequence == 'Idle2' || W.AnimSequence == 'Idle3') W.PlayAnim('Still'); if (W.bZoomed==False&&W.IsA('WeaponRifle')) WeaponRifle(W).activateAn = True; else if (W.bZoomed==False&&W.IsA('WeaponPistol') && W.bHasScope) WeaponPistol(W).activateAn = True; else if (W.bZoomed==False&&W.IsA('WeaponMiniCrossbow') && W.bHasScope) WeaponMiniCrossbow(W).activateAn = True; else if (W.bZoomed==False&&W.IsA('WeaponStealthPistol') && W.bHasScope) WeaponStealthPistol(W).activateAn = True; else if (W.bZoomed==False&&W.IsA('WeaponAssaultGun') && W.bHasScope) WeaponAssaultGun(W).activateAn = True; else W.ScopeToggle(); if (W.bZoomed&&W.IsA('WeaponGEPGun')) { bFromCrosshair=true; if (W.bLasing) W.LaserOff(); } } } } //GMDX: tester for rocket tracking //copied part from PutCarriedDecorationInHand() //major cheat :P //copied inpart from laseremitter function bool CalcGEPLaserTrace(rotator newCamera,float newDistance,out vector HitLocOut) { local vector StartTrace, EndTrace, HitLoc, HitNormal, Reflection; local actor target; local int i, texFlags; local name texName, texGroup; local bool HitObject; StartTrace = Location; StartTrace.Z += BaseEyeHeight; EndTrace = StartTrace + Vector(newCamera)*newDistance; HitObject = false; // trace the path of the reflected beam and draw points at each hit foreach TraceTexture(class'Actor', target, texName, texGroup, texFlags, HitLoc, HitNormal, EndTrace, StartTrace) { if ((target.DrawType == DT_None) || target.bHidden) { // do nothing - keep on tracing } else if ((target == Level) || target.IsA('Mover')) { HitObject=true; HitLocOut=HitLoc; break; } else { HitObject=true; HitLocOut=HitLoc; break; } } return HitObject; } function bool UpdateRocketTarget(rotator newCamera,float newDistance,optional bool bForcedUpdate) { local vector lookDir, upDir,accVec; local Vector Start, X, Y, Z; if (RocketTarget==none) return false; if (bForcedUpdate||((InHand!=none)&&(InHand.IsA('WeaponGEPGun'))&&(WeaponGEPGun(InHand).bLasing)))// ||(WeaponGEPGun(InHand).bZoomed)))) { if (CalcGEPLaserTrace(newCamera,newDistance,lookDir)) return RocketTarget.SetLocation(lookDir); upDir = Location; upDir.Z += BaseEyeHeight; lookDir = Vector(newCamera)*newDistance; return RocketTarget.SetLocation(upDir + lookDir); } return false; } function SetRocketWireControl() { if (RocketTarget!=none) { RocketTarget.SetPhysics(PHYS_None); RocketTarget.SetBase(self); if (!UpdateRocketTarget(Rotation,RocketTargetMaxDistance,true)) log("Error: Could not base initialize Rocket Target!"); } else log("Error: Could not spawn Rocket Target!"); } /* function SetRocketPOVControl() { if ((RocketTarget!=none)&&(InHand.IsA('WeaponGEPGun'))) { RocketTarget.SetPhysics(PHYS_None); if (!bGEPprojectileInflight) RocketTarget.SetBase(InHand); // else // RocketTarget.SetBase(aGEPProjectile); if (UpdateRocketTarget(InHand.Rotation,0,true)) { log("GEP Loc="@Location@" : Its="@RocketTarget.Location); } else log("Error: Could not base initialize Rocket Target to GEP!"); } else log("Error: Could not spawn Rocket Target!"); } */ /* function SetRocketPOV(bool bSetToGEP) { if (bSetToGEP) { SetRocketPOVControl(); } else { SetRocketWireControl(); } } */ function UpdateTrackingSteering(float deltaT) { local float smx,smy; local float vlen; //Handle mouse inputs smX=SmoothMouseX*0.01; smY=SmoothMouseY*0.01; if ((smX<0)&&(GEPSteeringX>smX)) GEPsteeringX=smX; else if ((smX>0)&&(GEPSteeringX<smX)) GEPsteeringX=smX; //if (Abs(GEPsteeringX)<0.1) GEPsteeringX=0.0; if ((smY<0)&&(GEPSteeringY>smY)) GEPsteeringY=smY; else if ((smY>0)&&(GEPSteeringY<smY)) GEPsteeringY=smY; GEPsteeringX *=(0.7+(0.3-Fmax(0.3*deltaT*3.0,0.3))); GEPsteeringY *=(0.7+(0.3-Fmax(0.3*deltaT*3.0,0.3))); /*scaleGEP.X=GEPsteeringX; scaleGEP.Y=GEPsteeringY; vlen=Vsize(scaleGEP)*(0.8+(0.2-0.2*deltaT)); GEPsteeringX = GEPsteeringX*3.0*deltaT; //drain to zero GEPsteeringY = GEPsteeringY*3.0*deltaT; //drain to zero */ // if (Abs(GEPsteeringY)<0.1) GEPsteeringY=0.0; } //GMDX: end Rocket Target system // check to see if the player can lift a certain decoration taking // into account his muscle augs function bool CanBeLifted(Decoration deco) { local int augLevel, augMult; local float maxLift; //gmdx modded so aug has effect maxLift = 50; if (AugmentationSystem != None) { augLevel = AugmentationSystem.GetClassLevel(class'AugMuscle'); augMult = 1; if (augLevel >= 0) augMult = augLevel+3; maxLift *= augMult; } if (!deco.bPushable || (deco.Mass > maxLift) || (deco.StandingCount > 0)) { if (deco.bPushable) ClientMessage(TooHeavyToLift); else ClientMessage(CannotLift); return False; } return True; } // ---------------------------------------------------------------------- // GrabDecoration() // // This overrides GrabDecoration() in Pawn.uc // lets the strength augmentation affect how much the player can lift // ---------------------------------------------------------------------- function GrabDecoration() { // can't grab decorations while leaning if (IsLeaning()) return; // log("GrabDecoration::"@FrobTarget@FrobTarget.Owner@FrobTarget.Base); if ((FrobTarget!=none)&&(FrobTarget.Base!=none)&&(FrobTarget.Base.IsA('GMDXProjectileWrap'))) { FrobTarget.Base.Destroy(); return;//GMDX stop catching of mythical deco that has no collide settings! will expand to allow catch maybe! } // can't grab decorations while holding something else if (inHand != None) { if (carriedDecoration != None || inHand.IsA('POVcorpse')) {ClientMessage(HandsFull); return;} else if (!bAutoHolster) {ClientMessage(HandsFull); return;} else if (bAutoHolster) {PutInHand(None);} } if (carriedDecoration == None) if ((FrobTarget != None) && FrobTarget.IsA('Decoration') && (Weapon == None || inHandPending == None)) //CyberP: added || inHandPending == None if (CanBeLifted(Decoration(FrobTarget))) { CarriedDecoration = Decoration(FrobTarget); PutCarriedDecorationInHand(); } } // ---------------------------------------------------------------------- // PutCarriedDecorationInHand() // ---------------------------------------------------------------------- function PutCarriedDecorationInHand() { local vector lookDir, upDir; local float shakeTime, shakeVert, shakeRoll; if (CarriedDecoration != None) { lookDir = Vector(Rotation); lookDir.Z = 0; upDir = vect(0,0,0); if (CarriedDecoration.CollisionHeight < 8.000000) upDir.Z = CollisionHeight / 1.75; //CyberP: a bit higher for small objects. else upDir.Z = CollisionHeight / 2.5; // put it up near eye level //CyberP: chest level. was 2 CarriedDecoration.SetPhysics(PHYS_Falling); if ( CarriedDecoration.SetLocation(Location + upDir + (0.5 * CollisionRadius + CarriedDecoration.CollisionRadius) * lookDir) ) { if (CarriedDecoration.Mass > 40) //CyberP: pickup sounds { if (FRand() < 0.5) PlaySound(Sound'objpickup3',SLOT_None); else PlaySound(Sound'genericlargeequip',SLOT_None); } else if (FRand() < 0.33) PlaySound(Sound'genericlargeequip',SLOT_None); else if (FRand() < 0.66) PlaySound(Sound'genericsmallequip',SLOT_None); else PlaySound(Sound'genericsmallunequip',SLOT_None); CarriedDecoration.SetPhysics(PHYS_None); CarriedDecoration.SetBase(self); CarriedDecoration.SetCollision(False, False, False); CarriedDecoration.bCollideWorld = False; // make it translucent if (!bNoTranslucency || AugmentationSystem.GetAugLevelValue(class'AugCloak') != -1.0) { CarriedDecoration.Style = STY_Translucent; CarriedDecoration.ScaleGlow = 0.2; //GMDX was 1.0 CarriedDecoration.bUnlit = True; } FrobTarget = None; } else { ClientMessage(NoRoomToLift); CarriedDecoration = None; } } } function ThrowDecoration(Decoration WrapDeco) { local GMDXProjectileWrap PW; if (WrapDeco==none) return; //log("CARRIED DECO "@WrapDeco); // PW.default.Mesh=CarriedDecoration.Mesh; // PW.default.Mass=CarriedDecoration.Mass; // PW.default.CollisionHeight=CarriedDecoration.CollisionHeight; // PW.default.CollisionRadius=CarriedDecoration.CollisionRadius; // PW.default.ImpactSound=CarriedDecoration.PushSound; // PW.default.Buoyancy=CarriedDecoration.Buoyancy; PW=Spawn(class'GMDXProjectileWrap'); if(PW!=none) { //log("CARRIED DECO, spawn prj"); // if (WrapDeco.IsA('Carcass')) PW.InitWrapDecoration(WrapDeco,self);//,false); swimTimer -= 1; RecoilShaker(vect(3,0,1)); if (swimTimer < 0) swimTimer = 0; // else // PW.InitWrapDecoration(WrapDeco,self);//,true); } } // ---------------------------------------------------------------------- // DropDecoration() // // This overrides DropDecoration() in Pawn.uc // lets the player throw a decoration instead of just dropping it // ---------------------------------------------------------------------- function DropDecoration() { local Vector X, Y, Z, dropVect, origLoc, HitLocation, HitNormal, extent; local float velscale, size, mult; local bool bSuccess; local Actor hitActor; bSuccess = False; if (CarriedDecoration != None) { origLoc = CarriedDecoration.Location; GetAxes(Rotation, X, Y, Z); // if we are highlighting something, try to place the object on the target if ((FrobTarget != None) && !FrobTarget.IsA('Pawn') && !FrobTarget.IsA('DeusExWeapon') && !FrobTarget.IsA('Pickup') && !FrobTarget.IsA('Decoration')) { CarriedDecoration.Velocity = vect(0,0,0); // try to drop the object about one foot above the target size = FrobTarget.CollisionRadius - CarriedDecoration.CollisionRadius * 2; dropVect.X = size/2 - FRand() * size; dropVect.Y = size/2 - FRand() * size; dropVect.Z = FrobTarget.CollisionHeight + CarriedDecoration.CollisionHeight + 16; dropVect += FrobTarget.Location; } else { // throw velocity is based on augmentation if (AugmentationSystem != None) { mult = 1.3;//AugmentationSystem.GetAugLevelValue(class'AugMuscle'); //CyberP: we don't need this anymore if (mult == -1.0) mult = 1.0; } //if (IsLeaning()) // CarriedDecoration.Velocity = vect(0,0,0); //else CarriedDecoration.Velocity = Vector(ViewRotation) * mult * 500 + vect(0,0,180) + 40 * VRand(); // scale it based on the mass velscale = FClamp(CarriedDecoration.Mass / 20.0, 1.0, 40.0); CarriedDecoration.Velocity /= velscale; dropVect = Location + (CarriedDecoration.CollisionRadius + CollisionRadius + 2) * X; //was 4, now 2 dropVect.Z += BaseEyeHeight; //if (FRand() < 0.3) // PlaySound(Sound'MaleLand',SLOT_None); if (CarriedDecoration.Mass <= 40 && CarriedDecoration.CollisionHeight < 23.000000 && CarriedDecoration.CollisionRadius <= 22.500000) { CarriedDecoration.bFixedRotationDir = True; CarriedDecoration.RotationRate.Pitch = (32768 - Rand(65536)) * 1.5; if (FRand() < 0.2) CarriedDecoration.RotationRate.Yaw = (32768 - Rand(65536)) * 1.0; else if (FRand() < 0.7) { } else CarriedDecoration.RotationRate.Yaw -= (32768 - Rand(65536)) * 1.0; } } // is anything blocking the drop point? (like thin doors) if (FastTrace(dropVect)) { CarriedDecoration.SetCollision(True, True, True); CarriedDecoration.bCollideWorld = True; // check to see if there's space there extent.X = CarriedDecoration.CollisionRadius; extent.Y = CarriedDecoration.CollisionRadius; extent.Z = 1; hitActor = Trace(HitLocation, HitNormal, dropVect, CarriedDecoration.Location, True, extent); if ((hitActor == None) && CarriedDecoration.SetLocation(dropVect)) bSuccess = True; else { CarriedDecoration.SetCollision(False, False, False); CarriedDecoration.bCollideWorld = False; } } // if we can drop it here, then drop it if (bSuccess) { CarriedDecoration.bWasCarried = True; CarriedDecoration.SetBase(None); CarriedDecoration.SetPhysics(PHYS_Falling); CarriedDecoration.Instigator = Self; AIEndEvent('WeaponDrawn', EAITYPE_Visual); // turn off translucency CarriedDecoration.Style = CarriedDecoration.Default.Style; CarriedDecoration.bUnlit = CarriedDecoration.Default.bUnlit; if (CarriedDecoration.IsA('DeusExDecoration')) DeusExDecoration(CarriedDecoration).ResetScaleGlow(); if (bThrowDecoration) ThrowDecoration(CarriedDecoration); CarriedDecoration = None; } else { // otherwise, don't drop it and display a message CarriedDecoration.SetLocation(origLoc); ClientMessage(CannotDropHere); } } bThrowDecoration=false; } // ---------------------------------------------------------------------- // DropItem() // // throws an item where you are currently looking // or places it on your currently highlighted object // if None is passed in, it drops what's inHand // ---------------------------------------------------------------------- exec function bool DropItem(optional Inventory inv, optional bool bDrop) { local Inventory item, previtem; local Inventory previousItemInHand; local Vector X, Y, Z, dropVect; local float size, mult; local DeusExCarcass carc; local class<DeusExCarcass> carcClass; local bool bDropped; local bool bRemovedFromSlots; local int itemPosX, itemPosY, tex; bDropped = True; if (RestrictInput()) return False; if (inv == None) { previousItemInHand = inHand; item = inHand; } else { item = inv; } if ((item!=none)&&(!item.IsA('POVcorpse'))) bThrowDecoration=false; if (item != None) { GetAxes(Rotation, X, Y, Z); dropVect = Location + (CollisionRadius + 2*item.CollisionRadius) * X; dropVect.Z += BaseEyeHeight; // check to see if we're blocked by terrain if (!FastTrace(dropVect)) { ClientMessage(CannotDropHere); return False; } // don't drop it if it's in a strange state if (item.IsA('DeusExWeapon')) { if (!DeusExWeapon(item).IsInState('Idle') && !DeusExWeapon(item).IsInState('Idle2') && !DeusExWeapon(item).IsInState('DownWeapon') && !DeusExWeapon(item).IsInState('Reload')) { return False; } else // make sure the scope/laser are turned off { DeusExWeapon(item).ScopeOff(); DeusExWeapon(item).LaserOff(); if (DeusExWeapon(item) == assignedWeapon) assignedWeapon = None; } } // Don't allow active ChargedPickups to be dropped if ((item.IsA('ChargedPickup')) && (ChargedPickup(item).IsActive())) { return False; } // don't let us throw away the nanokeyring if (item.IsA('NanoKeyRing')) { return False; } // take it out of our hand if (item == inHand) PutInHand(None); // handle throwing pickups that stack if (item.IsA('DeusExPickup')) { // turn it off if it is on if (DeusExPickup(item).bActive) DeusExPickup(item).Activate(); tex = deusExPickUp(item).textureset; //our current tex DeusExPickup(item).NumCopies--; UpdateBeltText(item); if (DeusExPickup(item).NumCopies > 0) { // put it back in our hand, but only if it was in our // hand originally!!! if (previousItemInHand == item) PutInHand(previousItemInHand); previtem = item; item = Spawn(item.Class, Owner); if(item != none) { if(deusExPickUp(item).bhasMultipleSkins) { deusExPickUp(item).textureSet = tex; deusExPickUp(item).SetSkin(); deusExPickUp(previtem).UpdateCurrentSkin(); } } } else { if(deusExPickUp(item).bhasMultipleSkins) { deusExPickUp(item).textureSet = tex; deusExPickUp(item).SetSkin(); } // Keep track of this so we can undo it // if necessary bRemovedFromSlots = True; itemPosX = item.invPosX; itemPosY = item.invPosY; // Remove it from the inventory slot grid RemoveItemFromSlot(item); // make sure we have one copy to throw! DeusExPickup(item).NumCopies = 1; } } else { // Keep track of this so we can undo it // if necessary bRemovedFromSlots = True; itemPosX = item.invPosX; itemPosY = item.invPosY; // Remove it from the inventory slot grid RemoveItemFromSlot(item); } // if we are highlighting something, try to place the object on the target //CyberP: more lenience when dropping if ((FrobTarget != None) && !item.IsA('POVCorpse') && !FrobTarget.IsA('Pawn') && !FrobTarget.IsA('Pickup') && !FrobTarget.IsA('DeusExWeapon') && !FrobTarget.IsA('Decoration')) { item.Velocity = vect(0,0,0); // play the correct anim PlayPickupAnim(FrobTarget.Location); // try to drop the object about one foot above the target size = FrobTarget.CollisionRadius - item.CollisionRadius * 2; dropVect.X = size/2 - FRand() * size; dropVect.Y = size/2 - FRand() * size; dropVect.Z = FrobTarget.CollisionHeight + item.CollisionHeight + 16; if (FastTrace(dropVect)) { item.DropFrom(FrobTarget.Location + dropVect); } else { ClientMessage(CannotDropHere); bDropped = False; } } else { // throw velocity is based on augmentation if (AugmentationSystem != None) { mult = AugmentationSystem.GetAugLevelValue(class'AugMuscle'); if (mult == -1.0) mult = 0.7; } if (bDrop) { item.Velocity = VRand() * 30; // play the correct anim PlayPickupAnim(item.Location); } else { if (item.Mass > 20) mult -= 0.15; item.Velocity = Vector(ViewRotation) * (mult*1.5) * 600 + vect(0,0,150); //CyberP: z vect was 240 // play a throw anim PlayAnim('Attack',,0.1); } GetAxes(ViewRotation, X, Y, Z); dropVect = Location + 0.8 * CollisionRadius * X; dropVect.Z += BaseEyeHeight; // if we are a corpse, spawn the actual carcass if (item.IsA('POVCorpse')) { if (POVCorpse(item).carcClassString != "") { carcClass = class<DeusExCarcass>(DynamicLoadObject(POVCorpse(item).carcClassString, class'Class')); if (carcClass != None) { carc = Spawn(carcClass); if (carc != None) { carc.Mesh = carc.Mesh2; carc.KillerAlliance = POVCorpse(item).KillerAlliance; carc.KillerBindName = POVCorpse(item).KillerBindName; carc.Alliance = POVCorpse(item).Alliance; carc.bNotDead = POVCorpse(item).bNotDead; carc.Tag = POVCorpse(item).CarcassTag; //CyberP: tag carc.bEmitCarcass = POVCorpse(item).bEmitCarcass; carc.CumulativeDamage = POVCorpse(item).CumulativeDamage; carc.MaxDamage = POVCorpse(item).MaxDamage; carc.itemName = POVCorpse(item).CorpseItemName; carc.CarcassName = POVCorpse(item).CarcassName; carc.Velocity = item.Velocity * 0.5; item.Velocity = vect(0,0,0); carc.bHidden = False; carc.bNotFirstFall = True; carc.bEmitCarcass = true; //CyberP: emitcarc carc.SetPhysics(PHYS_Falling); carc.SetScaleGlow(); Carc.UpdateHDTPSettings(); Carc.Inventory = PovCorpse(item).Inv; //GMDX //if (FRand() < 0.3) //PlaySound(Sound'DeusExSounds.Player.MaleLand', SLOT_None, 0.9, false, 800, 0.85); if (carc.SetLocation(dropVect)) { // must circumvent PutInHand() since it won't allow // things in hand when you're carrying a corpse SetInHandPending(None); item.Destroy(); item = None; if (bThrowDecoration) { bThrowDecoration=false; ThrowDecoration(carc); // play a throw anim PlayAnim('Attack',,0.1); } } else carc.bHidden = True; } } } } else { if (FastTrace(dropVect)) { item.DropFrom(dropVect); item.bFixedRotationDir = True; item.RotationRate.Pitch = (32768 - Rand(65536)) * 4.0 * (mult); item.RotationRate.Yaw = (32768 - Rand(65536)) * 4.0 * (mult); } } } // if we failed to drop it, put it back inHand if (item != None) { if (((inHand == None) || (inHandPending == None)) && (item.Physics != PHYS_Falling)) { PutInHand(item); ClientMessage(CannotDropHere); bDropped = False; } else { item.Instigator = Self; } } } else if (CarriedDecoration != None) { bThrowDecoration=false; DropDecoration(); // play a throw anim PlayAnim('Attack',,0.1); } // If the drop failed and we removed the item from the inventory // grid, then we need to stick it back where it came from so // the inventory doesn't get fucked up. if ((bRemovedFromSlots) && (item != None) && (!bDropped)) { //DEUS_EX AMSD Use the function call for this, helps multiplayer PlaceItemInSlot(item, itemPosX, itemPosY); } return bDropped; } // ---------------------------------------------------------------------- // RemoveItemDuringConversation() // ---------------------------------------------------------------------- function RemoveItemDuringConversation(Inventory item) { if (item != None) { // take it out of our hand if (item == inHand) PutInHand(None); // Make sure it's removed from the inventory grid RemoveItemFromSlot(item); // Make sure the item is deactivated! if (item.IsA('DeusExWeapon')) { DeusExWeapon(item).ScopeOff(); DeusExWeapon(item).LaserOff(); } else if (item.IsA('DeusExPickup')) { // turn it off if it is on if (DeusExPickup(item).bActive) DeusExPickup(item).Activate(); } if (conPlay != None) conPlay.SetInHand(None); } } // ---------------------------------------------------------------------- // WinStats() // ---------------------------------------------------------------------- exec function WinStats(bool bStatsOn) { if (rootWindow != None) rootWindow.ShowStats(bStatsOn); } // ---------------------------------------------------------------------- // ToggleWinStats() // ---------------------------------------------------------------------- exec function ToggleWinStats() { if (!bCheatsEnabled) return; if (rootWindow != None) rootWindow.ShowStats(!rootWindow.bShowStats); } // ---------------------------------------------------------------------- // WinFrames() // ---------------------------------------------------------------------- exec function WinFrames(bool bFramesOn) { if (!bCheatsEnabled) return; if (rootWindow != None) rootWindow.ShowFrames(bFramesOn); } // ---------------------------------------------------------------------- // ToggleWinFrames() // ---------------------------------------------------------------------- exec function ToggleWinFrames() { if (!bCheatsEnabled) return; if (rootWindow != None) rootWindow.ShowFrames(!rootWindow.bShowFrames); } // ---------------------------------------------------------------------- // ShowClass() // ---------------------------------------------------------------------- exec function ShowClass(Class<Actor> newClass) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.SetViewClass(newClass); } // ---------------------------------------------------------------------- // ShowEyes() // ---------------------------------------------------------------------- exec function ShowEyes(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowEyes(bShow); } // ---------------------------------------------------------------------- // ShowArea() // ---------------------------------------------------------------------- exec function ShowArea(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowArea(bShow); } // ---------------------------------------------------------------------- // ShowCylinder() // ---------------------------------------------------------------------- exec function ShowCylinder(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowCylinder(bShow); } // ---------------------------------------------------------------------- // ShowMesh() // ---------------------------------------------------------------------- exec function ShowMesh(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowMesh(bShow); } // ---------------------------------------------------------------------- // ShowZone() // ---------------------------------------------------------------------- exec function ShowZone(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowZone(bShow); } // ---------------------------------------------------------------------- // ShowLOS() // ---------------------------------------------------------------------- exec function ShowLOS(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowLOS(bShow); } // ---------------------------------------------------------------------- // ShowVisibility() // ---------------------------------------------------------------------- exec function ShowVisibility(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowVisibility(bShow); } // ---------------------------------------------------------------------- // ShowData() // ---------------------------------------------------------------------- exec function ShowData(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowData(bShow); } // ---------------------------------------------------------------------- // ShowEnemyResponse() // ---------------------------------------------------------------------- exec function ShowEnemyResponse(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowEnemyResponse(bShow); } // ---------------------------------------------------------------------- // ShowER() // ---------------------------------------------------------------------- exec function ShowER(bool bShow) { // Convenience form of ShowEnemyResponse() ShowEnemyResponse(bShow); } // ---------------------------------------------------------------------- // ShowState() // ---------------------------------------------------------------------- exec function ShowState(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowState(bShow); } // ---------------------------------------------------------------------- // ShowEnemy() // ---------------------------------------------------------------------- exec function ShowEnemy(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowEnemy(bShow); } // ---------------------------------------------------------------------- // ShowInstigator() // ---------------------------------------------------------------------- exec function ShowInstigator(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowInstigator(bShow); } // ---------------------------------------------------------------------- // ShowBase() // ---------------------------------------------------------------------- exec function ShowBase(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowBase(bShow); } // ---------------------------------------------------------------------- // ShowLight() // ---------------------------------------------------------------------- exec function ShowLight(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowLight(bShow); } // ---------------------------------------------------------------------- // ShowDist() // ---------------------------------------------------------------------- exec function ShowDist(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowDist(bShow); } // ---------------------------------------------------------------------- // ShowBindName() // ---------------------------------------------------------------------- exec function ShowBindName(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowBindName(bShow); } // ---------------------------------------------------------------------- // ShowPos() // ---------------------------------------------------------------------- exec function ShowPos(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowPos(bShow); } // ---------------------------------------------------------------------- // ShowHealth() // ---------------------------------------------------------------------- exec function ShowHealth(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowHealth(bShow); } // ---------------------------------------------------------------------- // ShowPhysics() // ---------------------------------------------------------------------- exec function ShowPhysics(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowPhysics(bShow); } // ---------------------------------------------------------------------- // ShowMass() // ---------------------------------------------------------------------- exec function ShowMass(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowMass(bShow); } // ---------------------------------------------------------------------- // ShowVelocity() // ---------------------------------------------------------------------- exec function ShowVelocity(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowVelocity(bShow); } // ---------------------------------------------------------------------- // ShowAcceleration() // ---------------------------------------------------------------------- exec function ShowAcceleration(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowAcceleration(bShow); } // ---------------------------------------------------------------------- // ShowHud() // ---------------------------------------------------------------------- exec function ShowHud(bool bShow) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) root.ShowHud(bShow); } // ---------------------------------------------------------------------- // ToggleObjectBelt() // ---------------------------------------------------------------------- exec function ToggleObjectBelt() { local DeusExRootWindow root; bObjectBeltVisible = !bObjectBeltVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleHitDisplay() // ---------------------------------------------------------------------- exec function ToggleHitDisplay() { local DeusExRootWindow root; bHitDisplayVisible = !bHitDisplayVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleAmmoDisplay() // ---------------------------------------------------------------------- exec function ToggleAmmoDisplay() { local DeusExRootWindow root; bAmmoDisplayVisible = !bAmmoDisplayVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleAugDisplay() // ---------------------------------------------------------------------- exec function ToggleAugDisplay() { local DeusExRootWindow root; bAugDisplayVisible = !bAugDisplayVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleCompass() // ---------------------------------------------------------------------- exec function ToggleCompass() { local DeusExRootWindow root; bCompassVisible = !bCompassVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleLaser() // // turns the laser sight on or off for the current weapon // ---------------------------------------------------------------------- exec function ToggleLaser() { local DeusExWeapon W; if (RestrictInput()||bGEPzoomActive) return; W = DeusExWeapon(Weapon); if (W==none) return; if (!W.bHasLaser||W.IsA('WeaponNanoSword')||!W.IsInState('idle')) return; SetLaser(!W.bLasing,true); } function SetLaser(bool bNewOn,optional bool bCheckXhair) { local DeusExWeapon W; W = DeusExWeapon(Weapon); if (W==none||(W!=none&&!W.bHasLaser)) return; bFromCrosshair=true; if (bNewOn) { W.LaserOn(); if (bCheckXhair) SetCrosshair(false,false); } else { W.LaserOff(); if (bCheckXhair) SetCrosshair(bWasCrosshair,false); } } function SetCrosshair(bool bNewOn,optional bool bCheckLasing) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root == None) return; bCrosshairVisible=bNewOn; root.UpdateHud(); if (bNewOn&&bCheckLasing) SetLaser(false,false); } // ---------------------------------------------------------------------- // ToggleCrosshair() // ---------------------------------------------------------------------- exec function ToggleCrosshair() { local DeusExWeapon W; if (RestrictInput()) return; W = DeusExWeapon(Weapon); if (W!=none&&(W.IsA('WeaponNanoSword')||!W.IsInState('idle'))) return; bCrosshairVisible = !bCrosshairVisible; bWasCrosshair=bCrosshairVisible; SetCrosshair(bCrosshairVisible,true); } // ---------------------------------------------------------------------- // ShowInventoryWindow() // ---------------------------------------------------------------------- exec function ShowInventoryWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Inventory screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenInventory'); } // ---------------------------------------------------------------------- // ShowSkillsWindow() // ---------------------------------------------------------------------- exec function ShowSkillsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Skills screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenSkills'); } // ---------------------------------------------------------------------- // ShowHealthWindow() // ---------------------------------------------------------------------- exec function ShowHealthWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Health screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenHealth'); } // ---------------------------------------------------------------------- // ShowImagesWindow() // ---------------------------------------------------------------------- exec function ShowImagesWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Images screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenImages'); } // ---------------------------------------------------------------------- // ShowConversationsWindow() // ---------------------------------------------------------------------- exec function ShowConversationsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Conversations screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenConversations'); } // ---------------------------------------------------------------------- // ShowAugmentationsWindow() // ---------------------------------------------------------------------- exec function ShowAugmentationsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Augmentations screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenAugmentations'); } // ---------------------------------------------------------------------- // ShowGoalsWindow() // ---------------------------------------------------------------------- exec function ShowGoalsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Goals screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenGoals'); } // ---------------------------------------------------------------------- // ShowLogsWindow() // ---------------------------------------------------------------------- exec function ShowLogsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Logs screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenLogs'); } // ---------------------------------------------------------------------- // ShowAugmentationAddWindow() // ---------------------------------------------------------------------- exec function ShowAugmentationAddWindow() { if (RestrictInput()) return; InvokeUIScreen(Class'HUDMedBotAddAugsScreen'); } // ---------------------------------------------------------------------- // ShowQuotesWindow() // ---------------------------------------------------------------------- exec function ShowQuotesWindow() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'QuotesWindow'); } // ---------------------------------------------------------------------- // ShowRGBDialog() // ---------------------------------------------------------------------- exec function ShowRGBDialog() { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) root.PushWindow(Class'MenuScreenRGB'); } // ---------------------------------------------------------------------- // ActivateBelt() // ---------------------------------------------------------------------- exec function ActivateBelt(int objectNum) { local DeusExRootWindow root; if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && bBuySkills) { root = DeusExRootWindow(rootWindow); if ( root != None ) { if ( root.hud.hms.OverrideBelt( Self, objectNum )) return; } } if (CarriedDecoration == None) { root = DeusExRootWindow(rootWindow); if (root != None) root.ActivateObjectInBelt(objectNum); } } // ---------------------------------------------------------------------- // NextBeltItem() // ---------------------------------------------------------------------- exec function NextBeltItem() { local DeusExRootWindow root; local int slot, startSlot; if (RestrictInput()) return; if (inHand != None && inHand.IsA('DeusExWeapon')) { if (DeusExWeapon(inHand).bZoomed) { if (FovAngle < 60) { DeusExWeapon(inHand).ScopeFOV += 2; DeusExWeapon(inHand).RefreshScopeDisplay(Self,False,True); } return; } } if (!bAlternateToolbelt) { if (CarriedDecoration == None) { slot = 0; root = DeusExRootWindow(rootWindow); if (root != None) { if (inHand == None) slot = SlotMem-1; else if (ClientInHandPending != None) slot = ClientInHandPending.beltPos; else if (inHandPending != None) slot = inHandPending.beltPos; else if (inHand != None) slot = inHand.beltPos; startSlot = slot; do { if (++slot >= 10) slot = 0; } until (root.ActivateObjectInBelt(slot) || (startSlot == slot)); clientInHandPending = root.hud.belt.GetObjectFromBelt(slot); switch( inHandPending.beltPos ) { case 1:SlotMem = 1;break; case 2:SlotMem = 2;break; case 3:SlotMem = 3;break; case 4:SlotMem = 4;break; case 5:SlotMem = 5;break; case 6:SlotMem = 6;break; case 7:SlotMem = 7;break; case 8:SlotMem = 8;break; case 9:SlotMem = 9;break; default:SlotMem = 1;break; } } } } else { if (CarriedDecoration == None) { //slot = advBelt; root = DeusExRootWindow(rootWindow); if (root != None) { if (++advBelt >= 10) advBelt = 0; root.hud.belt.UpdateInHand2(advBelt); clientInHandPending = root.hud.belt.GetObjectFromBelt(advBelt); } } } } // ---------------------------------------------------------------------- // PrevBeltItem() // ---------------------------------------------------------------------- exec function PrevBeltItem() { local DeusExRootWindow root; local int slot, startSlot; if (RestrictInput()) return; if (inHand != None && inHand.IsA('DeusExWeapon')) { if (DeusExWeapon(inHand).bZoomed) { if (FovAngle > 20) { DeusExWeapon(inHand).ScopeFOV -= 2; DeusExWeapon(inHand).RefreshScopeDisplay(Self,False,True); } return; } } if (!bAlternateToolbelt) { if (CarriedDecoration == None) { slot = 1; root = DeusExRootWindow(rootWindow); if (root != None) { if (inHand == none) slot = SlotMem+1; else if (ClientInHandPending != None) slot = ClientInHandPending.beltPos; else if (inHandPending != None) slot = inHandPending.beltPos; else if (inHand != None) slot = inHand.beltPos; startSlot = slot; do { if (--slot <= -1) slot = 9; } until (root.ActivateObjectInBelt(slot) || (startSlot == slot)); clientInHandPending = root.hud.belt.GetObjectFromBelt(slot); switch( inHandPending.beltPos ) { case 1:SlotMem = 1;break; case 2:SlotMem = 2;break; case 3:SlotMem = 3;break; case 4:SlotMem = 4;break; case 5:SlotMem = 5;break; case 6:SlotMem = 6;break; case 7:SlotMem = 7;break; case 8:SlotMem = 8;break; case 9:SlotMem = 9;break; default:SlotMem = 0;break; } } } } else { if (CarriedDecoration == None) { //slot = advBelt; root = DeusExRootWindow(rootWindow); if (root != None) { if (--advBelt <= -1) advBelt = 9; root.hud.belt.UpdateInHand2(advBelt); clientInHandPending = root.hud.belt.GetObjectFromBelt(advBelt); } } } } // ---------------------------------------------------------------------- // ShowMainMenu() // ---------------------------------------------------------------------- exec function ShowMainMenu() { local DeusExRootWindow root; local DeusExLevelInfo info; local MissionEndgame Script; if (bIgnoreNextShowMenu) { bIgnoreNextShowMenu = False; return; } info = GetLevelInfo(); // Special case baby! // // If the Intro map is loaded and we get here, that means the player // pressed Escape and we want to either A) start a new game // or B) return to the dx.dx screen. Either way we're going to // abort the Intro by doing this. // // If this is one of the Endgames (which have a mission # of 99) // then we also want to call the Endgame's "FinishCinematic" // function // force the texture caches to flush ConsoleCommand("FLUSH"); if ((info != None) && (info.MissionNumber == 98)) { bIgnoreNextShowMenu = True; PostIntro(); } else if ((info != None) && (info.MissionNumber == 99)) { foreach AllActors(class'MissionEndgame', Script) break; if (Script != None) Script.FinishCinematic(); } else { root = DeusExRootWindow(rootWindow); if (root != None) { //GMDX: stop lockpick and multitool cheat if (!IsInState('Dying')&&InHand!=None&&InHand.IsA('SkilledTool')&&(InHand.IsA('Lockpick')||InHand.IsA('MultiTool'))) { if (SkilledTool(InHand).IsInState('UseIt')) return; //just can InvokeMenu :P } root.InvokeMenu(Class'MenuMain'); } } } // ---------------------------------------------------------------------- // PostIntro() // ---------------------------------------------------------------------- function PostIntro() { if (bStartNewGameAfterIntro) { bStartNewGameAfterIntro = False; StartNewGame(strStartMap); } else { Level.Game.SendPlayer(Self, "dxonly"); } } // ---------------------------------------------------------------------- // EditFlags() // // Displays the Flag Edit dialog // ---------------------------------------------------------------------- exec function EditFlags() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'FlagEditWindow'); } // ---------------------------------------------------------------------- // InvokeConWindow() // // Displays the Invoke Conversation Window // ---------------------------------------------------------------------- exec function InvokeConWindow() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'InvokeConWindow'); } // ---------------------------------------------------------------------- // LoadMap() // // Displays the Load Map dialog // ---------------------------------------------------------------------- exec function LoadMap() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'LoadMapWindow'); } // ---------------------------------------------------------------------- // Overrides from PlayerPawn // ---------------------------------------------------------------------- exec function Walk() { if (RestrictInput()) return; if (!bCheatsEnabled) return; Super.Walk(); } exec function Fly() { if (RestrictInput()) return; if (!bCheatsEnabled) return; Super.Fly(); } exec function Ghost() { if (RestrictInput()) return; if (!bCheatsEnabled) return; Super.Ghost(); } exec function Fire(optional float F) { if (RestrictInput()) { if (bHidden) ShowMainMenu(); return; } Super.Fire(F); } // ---------------------------------------------------------------------- // Tantalus() // // Instantly kills/destroys the object directly in front of the player // (just like the Tantalus Field in Star Trek) // ---------------------------------------------------------------------- exec function Tantalus() { local Actor hitActor; local Vector hitLocation, hitNormal; local Vector position, line; local ScriptedPawn hitPawn; local DeusExMover hitMover; local DeusExDecoration hitDecoration; local bool bTakeDamage; local int damage; if (!bCheatsEnabled) return; bTakeDamage = false; damage = 1; position = Location; position.Z += BaseEyeHeight; line = Vector(ViewRotation) * 4000; hitActor = Trace(hitLocation, hitNormal, position+line, position, true); if (hitActor != None) { hitMover = DeusExMover(hitActor); hitPawn = ScriptedPawn(hitActor); hitDecoration = DeusExDecoration(hitActor); if (hitMover != None) { if (hitMover.bBreakable) { hitMover.doorStrength = 0; bTakeDamage = true; } } else if (hitPawn != None) { if (!hitPawn.bInvincible) { hitPawn.HealthHead = 0; hitPawn.HealthTorso = 0; hitPawn.HealthLegLeft = 0; hitPawn.HealthLegRight = 0; hitPawn.HealthArmLeft = 0; hitPawn.HealthArmRight = 0; hitPawn.Health = 0; bTakeDamage = true; } } else if (hitDecoration != None) { if (!hitDecoration.bInvincible) { hitDecoration.HitPoints = 0; bTakeDamage = true; } } else if (hitActor != Level) { damage = 5000; bTakeDamage = true; } } if (bTakeDamage) hitActor.TakeDamage(damage, self, hitLocation, line, 'Tantalus'); } // ---------------------------------------------------------------------- // OpenSesame() // // Opens any door immediately in front of you, locked or not // ---------------------------------------------------------------------- exec function OpenSesame() { local Actor hitActor; local Vector hitLocation, hitNormal; local Vector position, line; local DeusExMover hitMover; local DeusExMover triggerMover; local HackableDevices device; if (!bCheatsEnabled) return; position = Location; position.Z += BaseEyeHeight; line = Vector(ViewRotation) * 4000; hitActor = Trace(hitLocation, hitNormal, position+line, position, true); hitMover = DeusExMover(hitActor); device = HackableDevices(hitActor); if (hitMover != None) { if ((hitMover.Tag != '') && (hitMover.Tag != 'DeusExMover')) { foreach AllActors(class'DeusExMover', triggerMover, hitMover.Tag) { triggerMover.bLocked = false; triggerMover.Trigger(self, self); } } else { hitMover.bLocked = false; hitMover.Trigger(self, self); } } else if (device != None) { if (device.bHackable) { if (device.hackStrength > 0) { device.hackStrength = 0; device.HackAction(self, true); } } } } // ---------------------------------------------------------------------- // Legend() // // Displays the "Behind The Curtain" menu // ---------------------------------------------------------------------- exec function Legend() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'BehindTheCurtain'); } // ---------------------------------------------------------------------- // AddInventory() // ---------------------------------------------------------------------- function bool AddInventory(inventory item) { local bool retval; local DeusExRootWindow root; if (item == none) //CyberP: Patches up a really terrible bug. Origin: Unknown return(false); retval = super.AddInventory(item); // Force the object be added to the object belt // unless it's ammo // // Don't add Ammo and don't add Images! if ((item != None) && !item.IsA('Ammo') && (!item.IsA('DataVaultImage')) && (!item.IsA('Credits'))) { root = DeusExRootWindow(rootWindow); if ( item.bInObjectBelt ) { if (root != None) { root.hud.belt.AddObjectToBelt(item, item.beltPos, True); } } if (retval) { if (root != None) { root.AddInventory(item); } } } return (retval); } // ---------------------------------------------------------------------- // DeleteInventory() // ---------------------------------------------------------------------- function bool DeleteInventory(inventory item) { local bool retval; local DeusExRootWindow root; local PersonaScreenInventory winInv; // If the item was inHand, clear the inHand if (inHand == item) { SetInHand(None); SetInHandPending(None); } // Make sure the item is removed from the inventory grid RemoveItemFromSlot(item); root = DeusExRootWindow(rootWindow); if (root != None) { // If the inventory screen is active, we need to send notification // that the item is being removed winInv = PersonaScreenInventory(root.GetTopWindow()); if (winInv != None) winInv.InventoryDeleted(item); // Remove the item from the object belt if (root != None) root.DeleteInventory(item); else //In multiplayer, we often don't have a root window when creating corpse, so hand delete { item.bInObjectBelt = false; item.beltPos = -1; } } return Super.DeleteInventory(item); } // ---------------------------------------------------------------------- // JoltView() // ---------------------------------------------------------------------- event JoltView(float newJoltMagnitude) { if (Abs(JoltMagnitude) < Abs(newJoltMagnitude)) JoltMagnitude = newJoltMagnitude; } // ---------------------------------------------------------------------- // UpdateEyeHeight() // ---------------------------------------------------------------------- event UpdateEyeHeight(float DeltaTime) { Super.UpdateEyeHeight(DeltaTime); if (JoltMagnitude != 0) { if ((Physics == PHYS_Walking) && (Bob != 0)) EyeHeight += (JoltMagnitude * 5); JoltMagnitude = 0; } } // ---------------------------------------------------------------------- // PlayerCalcView() // ---------------------------------------------------------------------- event PlayerCalcView( out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { local vector unX,unY,unZ; if (bStaticFreeze) { CameraLocation = SAVElocation; CameraLocation.Z += EyeHeight; CameraLocation += WalkBob; CameraRotation=SAVErotation; SetLocation(SAVElocation); SetRotation(SAVErotation); GotoState('StaticFreeze'); return; } // check for spy drone and freeze player's view if (bSpyDroneActive) { if (aDrone != None) { // First-person view. CameraLocation = Location; CameraLocation.Z += EyeHeight; CameraLocation += WalkBob; return; } } // Check if we're in first-person view or third-person. If we're in first-person then // we'll just render the normal camera view. Otherwise we want to place the camera // as directed by the conPlay.cameraInfo object. if ( bBehindView && (!InConversation()) ) { Super.PlayerCalcView(ViewActor, CameraLocation, CameraRotation); return; } if ( (!InConversation()) || ( conPlay.GetDisplayMode() == DM_FirstPerson ) ) { // First-person view. ViewActor = Self; CameraRotation = ViewRotation; CameraLocation = Location; CameraLocation.Z += EyeHeight; CameraLocation += WalkBob; //GMDX if (!bGEPzoomActive) UpdateRocketTarget(CameraRotation,RocketTargetMaxDistance);//wire guided (laser) GetAxes(Normalize(Rotation),unX,unY,unZ); unX*=RecoilShake.X; unY*=RecoilShake.Y; unZ*=RecoilShake.Z; CameraLocation += (unX+unY+unZ); return; } // Allow the ConCamera object to calculate the camera position and // rotation for us (in other words, take this sloppy routine and // hide it elsewhere). if (conPlay.cameraInfo.CalculateCameraPosition(ViewActor, CameraLocation, CameraRotation) == False) Super.PlayerCalcView(ViewActor, CameraLocation, CameraRotation); } // ---------------------------------------------------------------------- // PlayerInput() // ---------------------------------------------------------------------- event PlayerInput( float DeltaTime ) { if (!InConversation()) Super.PlayerInput(DeltaTime); } // ---------------------------------------------------------------------- // state Conversation // ---------------------------------------------------------------------- state Conversation { ignores SeePlayer, HearNoise, Bump; event PlayerTick(float deltaTime) { local rotator tempRot; local float yawDelta; UpdateInHand(); UpdateDynamicMusic(deltaTime); DrugEffects(deltaTime); RecoilEffectTick(deltaTime); Bleed(deltaTime); MaintainEnergy(deltaTime); // must update viewflash manually incase a flash happens during a convo ViewFlash(deltaTime); // Check if player has walked outside a first-person convo. CheckActiveConversationRadius(); // Check if all the people involved in a conversation are // still within a reasonable radius. CheckActorDistances(); Super.PlayerTick(deltaTime); LipSynch(deltaTime); // Keep turning towards the person we're speaking to if (ConversationActor != None) { LookAtActor(ConversationActor, true, true, true, 0, 0.5); // Hacky way to force the player to turn... tempRot = rot(0,0,0); tempRot.Yaw = (DesiredRotation.Yaw - Rotation.Yaw) & 65535; if (tempRot.Yaw > 32767) tempRot.Yaw -= 65536; yawDelta = RotationRate.Yaw * deltaTime; if (tempRot.Yaw > yawDelta) tempRot.Yaw = yawDelta; else if (tempRot.Yaw < -yawDelta) tempRot.Yaw = -yawDelta; SetRotation(Rotation + tempRot); } // Update Time Played UpdateTimePlayed(deltaTime); } function LoopHeadConvoAnim() { } function EndState() { conPlay = None; // Re-enable the PC's detectability MakePlayerIgnored(false); MoveTarget = None; bBehindView = false; StopBlendAnims(); ConversationActor = None; } Begin: // Make sure we're stopped Velocity.X = 0; Velocity.Y = 0; Velocity.Z = 0; Acceleration = Velocity; PlayRising(); // Make sure the player isn't on fire! if (bOnFire) ExtinguishFire(); // Make sure the PC can't be attacked while in conversation MakePlayerIgnored(true); LookAtActor(conPlay.startActor, true, false, true, 0, 0.5); SetRotation(DesiredRotation); PlayTurning(); // TurnToward(conPlay.startActor); // TweenToWaiting(0.1); // FinishAnim(); if (!conPlay.StartConversation(Self)) { AbortConversation(True); } else { // Put away whatever the PC may be holding conPlay.SetInHand(InHand); PutInHand(None); UpdateInHand(); if ( conPlay.GetDisplayMode() == DM_ThirdPerson ) bBehindView = true; } } // ---------------------------------------------------------------------- // InConversation() // // Returns True if the player is currently engaged in conversation // ---------------------------------------------------------------------- function bool InConversation() { if ( conPlay == None ) { return False; } else { if (conPlay.con != None) return ((conPlay.con.bFirstPerson == False) && (!conPlay.GetForcePlay())); else return False; } } // ---------------------------------------------------------------------- // CanStartConversation() // // Returns true if we can start a conversation. Basically this means // that // // 1) If in conversation, bCannotBeInterrutped set to False // 2) If in conversation, if we're not in a third-person convo // 3) The player isn't in 'bForceDuck' mode // 4) The player isn't DEAD! // 5) The player isn't swimming // 6) The player isn't CheatFlying (ghost) // 7) The player isn't in PHYS_Falling // 8) The game is in 'bPlayersOnly' mode // 9) UI screen of some sort isn't presently active. // ---------------------------------------------------------------------- function bool CanStartConversation() { if (((conPlay != None) && (conPlay.CanInterrupt() == False)) || ((conPlay != None) && (conPlay.con.bFirstPerson != True)) || (( bForceDuck == True ) && ((HealthLegLeft > 0) || (HealthLegRight > 0))) || ( IsInState('Dying') ) || ( IsInState('PlayerSwimming') ) || ( IsInState('CheatFlying') ) || ( Physics == PHYS_Falling ) || ( Level.bPlayersOnly ) || (!DeusExRootWindow(rootWindow).CanStartConversation())) return False; else return True; } // ---------------------------------------------------------------------- // GetDisplayName() // // Returns a name that can be displayed in the conversation. // // The first time we speak to someone we'll use the Unfamiliar name. // For subsequent conversations, use the Familiar name. As a fallback, // the BindName will be used if both of the other two fields // are blank. // // If this is a DeusExDecoration and the Familiar/Unfamiliar names // are blank, then use the decoration's ItemName instead. This is // for use in the FrobDisplayWindow. // ---------------------------------------------------------------------- function String GetDisplayName(Actor actor, optional Bool bUseFamiliar) { local String displayName; // Sanity check if ((actor == None) || (player == None) || (rootWindow == None)) return ""; // If we've spoken to this person already, use the // Familiar Name if ((actor.FamiliarName != "") && ((actor.LastConEndTime > 0) || (bUseFamiliar))) displayName = actor.FamiliarName; if ((displayName == "") && (actor.UnfamiliarName != "")) displayName = actor.UnfamiliarName; if (displayName == "") { if (actor.IsA('DeusExDecoration')) displayName = DeusExDecoration(actor).itemName; else displayName = actor.BindName; } return displayName; } // ---------------------------------------------------------------------- // EndConversation() // // Called by ConPlay when a conversation has finished. // ---------------------------------------------------------------------- function EndConversation() { local DeusExLevelInfo info; Super.EndConversation(); // If we're in a bForcePlay (cinematic) conversation, // force the CinematicWindow to be displayd if ((conPlay != None) && (conPlay.GetForcePlay())) { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).NewChild(class'CinematicWindow'); } conPlay = None; // Check to see if we need to resume any DataLinks that may have // been aborted when we started this conversation ResumeDataLinks(); StopBlendAnims(); // We might already be dead at this point (someone drop a LAM before // entering the conversation?) so we want to make sure the player // doesn't suddenly jump into a non-DEATH state. // // Also make sure the player is actually in the Conversation state // before attempting to kick him out of it. if ((Health > 0) && ((IsInState('Conversation')) || (IsInState('FirstPersonConversation')) || (NextState == 'Interpolating'))) { if (NextState == '') GotoState('PlayerWalking'); else GotoState(NextState); } } // ---------------------------------------------------------------------- // ResumeDataLinks() // ---------------------------------------------------------------------- function ResumeDataLinks() { if ( dataLinkPlay != None ) dataLinkPlay.ResumeDataLinks(); } // ---------------------------------------------------------------------- // AbortConversation() // ---------------------------------------------------------------------- function AbortConversation(optional bool bNoPlayedFlag) { if (conPlay != None) conPlay.TerminateConversation(False, bNoPlayedFlag); } // ---------------------------------------------------------------------- // StartConversationByName() // // Starts a conversation by looking for the name passed in. // // Calls StartConversation() if a match is found. // ---------------------------------------------------------------------- function bool StartConversationByName( Name conName, Actor conOwner, optional bool bAvoidState, optional bool bForcePlay ) { local ConListItem conListItem; local Conversation con; local Int dist; local Bool bConversationStarted; bConversationStarted = False; if (conOwner == None) return False; conListItem = ConListItem(conOwner.conListItems); while( conListItem != None ) { if ( conListItem.con.conName == conName ) { con = conListItem.con; break; } conListItem = conListItem.next; } // Now check to see that we're in a respectable radius. if (con != None) { dist = VSize(Location - conOwner.Location); // 800 = default sound radius, from unscript.cpp // // If "bForcePlay" is set, then force the conversation // to play! if ((dist <= 800) || (bForcePlay)) bConversationStarted = StartConversation(conOwner, IM_Named, con, bAvoidState, bForcePlay); } return bConversationStarted; } // ---------------------------------------------------------------------- // StartAIBarkConversation() // // Starts an AI Bark conversation, which really isn't a conversation // as much as a simple bark. // ---------------------------------------------------------------------- function bool StartAIBarkConversation( Actor conOwner, EBarkModes barkMode ) { if ((conOwner == None) || (conOwner.conListItems == None) || (barkManager == None) || ((conPlay != None) && (conPlay.con.bFirstPerson != True))) return False; else return (barkManager.StartBark(DeusExRootWindow(rootWindow), ScriptedPawn(conOwner), barkMode)); } // ---------------------------------------------------------------------- // StartConversation() // // Checks to see if a valid conversation exists for this moment in time // between the ScriptedPawn and the PC. If so, then it triggers the // conversation system and returns TRUE when finished. // ---------------------------------------------------------------------- function bool StartConversation( Actor invokeActor, EInvokeMethod invokeMethod, optional Conversation con, optional bool bAvoidState, optional bool bForcePlay ) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); // First check to see the actor has any conversations or if for some // other reason we're unable to start a conversation (typically if // we're alread in a conversation or there's a UI screen visible) if ((!bForcePlay) && ((invokeActor.conListItems == None) || (!CanStartConversation()))) return False; // Make sure the other actor can converse if ((!bForcePlay) && ((ScriptedPawn(invokeActor) != None) && (!ScriptedPawn(invokeActor).CanConverse()))) return False; // If we have a conversation passed in, use it. Otherwise check to see // if the passed in actor actually has a valid conversation that can be // started. if ( con == None ) con = GetActiveConversation(invokeActor, invokeMethod); // If we have a conversation, put the actor into "Conversation Mode". // Otherwise just return false. // // TODO: Scan through the conversation and put *ALL* actors involved // in the conversation into the "Conversation" state?? if ( con != None ) { // Check to see if this conversation is already playing. If so, // then don't start it again. This prevents a multi-bark conversation // from being abused. if ((conPlay != None) && (conPlay.con == con)) return False; // Now check to see if there's a conversation playing that is owned // by the InvokeActor *and* the player has a speaking part *and* // it's a first-person convo, in which case we want to abort here. if (((conPlay != None) && (conPlay.invokeActor == invokeActor)) && (conPlay.con.bFirstPerson) && (conPlay.con.IsSpeakingActor(Self))) return False; // Check if the person we're trying to start the conversation // with is a Foe and this is a Third-Person conversation. // If so, ABORT! if ((!bForcePlay) && ((!con.bFirstPerson) && (ScriptedPawn(invokeActor) != None) && (ScriptedPawn(invokeActor).GetPawnAllianceType(Self) == ALLIANCE_Hostile))) return False; // If the player is involved in this conversation, make sure the // scriptedpawn even WANTS to converse with the player. // // I have put a hack in here, if "con.bCanBeInterrupted" // (which is no longer used as intended) is set, then don't // call the ScriptedPawn::CanConverseWithPlayer() function if ((!bForcePlay) && ((con.IsSpeakingActor(Self)) && (!con.bCanBeInterrupted) && (ScriptedPawn(invokeActor) != None) && (!ScriptedPawn(invokeActor).CanConverseWithPlayer(Self)))) return False; // Hack alert! If this is a Bark conversation (as denoted by the // conversation name, since we don't have a field in ConEdit), // then force this conversation to be first-person if (Left(con.conName, Len(con.conOwnerName) + 5) == (con.conOwnerName $ "_Bark")) //CyberP: we can make all conversations first person this way con.bFirstPerson = True; // Make sure the player isn't ducking. If the player can't rise // to start a third-person conversation (blocked by geometry) then // immediately abort the conversation, as this can create all // sorts of complications (such as the player standing through // geometry!!) if ((!con.bFirstPerson) && (ResetBasedPawnSize() == False)) return False; // If ConPlay exists, end the current conversation playing if (conPlay != None) { // If we're already playing a third-person conversation, don't interrupt with // another *radius* induced conversation (frobbing is okay, though). if ((conPlay.con != None) && (conPlay.con.bFirstPerson) && (invokeMethod == IM_Radius)) return False; conPlay.InterruptConversation(); conPlay.TerminateConversation(); } // If this is a first-person conversation _and_ a DataLink is already // playing, then abort. We don't want to give the user any more // distractions while a DL is playing, since they're pretty important. if ( dataLinkPlay != None ) { if (con.bFirstPerson) return False; else dataLinkPlay.AbortAndSaveHistory(); } // Found an active conversation, so start it conPlay = Spawn(class'ConPlay'); conPlay.SetStartActor(invokeActor); conPlay.SetConversation(con); conPlay.SetForcePlay(bForcePlay); conPlay.SetInitialRadius(VSize(Location - invokeActor.Location)); // If this conversation was invoked with IM_Named, then save away // the current radius so we don't abort until we get outside // of this radius + 100. if ((invokeMethod == IM_Named) || (invokeMethod == IM_Frob)) { conPlay.SetOriginalRadius(con.radiusDistance); con.radiusDistance = VSize(invokeActor.Location - Location); } // If the invoking actor is a ScriptedPawn, then force this person // into the conversation state if ((!bForcePlay) && (ScriptedPawn(invokeActor) != None )) ScriptedPawn(invokeActor).EnterConversationState(con.bFirstPerson, bAvoidState); // Do the same if this is a DeusExDecoration if ((!bForcePlay) && (DeusExDecoration(invokeActor) != None )) DeusExDecoration(invokeActor).EnterConversationState(con.bFirstPerson, bAvoidState); // If this is a third-person convo, we're pretty much going to // pause the game. If this is a first-person convo, then just // keep on going.. // // If this is a third-person convo *AND* 'bForcePlay' == True, // then use first-person mode, as we're playing an intro/endgame // sequence and we can't have the player in the convo state (bad bad bad!) if ((!con.bFirstPerson) && (!bForcePlay)) { GotoState('Conversation'); } else { if (!conPlay.StartConversation(Self, invokeActor, bForcePlay)) { AbortConversation(True); } } return True; } else { return False; } } // ---------------------------------------------------------------------- // GetActiveConversation() // // This routine searches all the conversations in this chain until it // finds one that is valid for this situation. It returns the // conversation or None if none are found. // ---------------------------------------------------------------------- function Conversation GetActiveConversation( Actor invokeActor, EInvokeMethod invokeMethod ) { local ConListItem conListItem; local Conversation con; local Name flagName; local bool bAbortConversation; // If we don't have a valid invokeActor or the flagbase // hasn't yet been initialized, immediately abort. if ((invokeActor == None) || (flagBase == None)) return None; bAbortConversation = True; // Force there to be a one second minimum between conversations // with the same NPC if ((invokeActor.LastConEndTime != 0) && ((Level.TimeSeconds - invokeActor.LastConEndTime) < 1.0)) return None; // In a loop, go through the conversations, checking each. conListItem = ConListItem(invokeActor.ConListItems); while ( conListItem != None ) { con = conListItem.con; bAbortConversation = False; // Ignore Bark conversations, as these are started manually // by the AI system. Do this by checking to see if the first // part of the conversation name is in the form, // // ConversationOwner_Bark if (Left(con.conName, Len(con.conOwnerName) + 5) == (con.conOwnerName $ "_Bark")) bAbortConversation = True; if (!bAbortConversation) { // Now check the invocation method to make sure // it matches what was passed in switch( invokeMethod ) { // Removed Bump conversation starting functionality, all convos // must now be "Frobbed" to start (excepting Radius, of course). case IM_Bump: case IM_Frob: bAbortConversation = !(con.bInvokeFrob || con.bInvokeBump); break; case IM_Sight: bAbortConversation = !con.bInvokeSight; break; case IM_Radius: if ( con.bInvokeRadius ) { // Calculate the distance between the player and the owner // and if the player is inside that radius, we've passed // this check. bAbortConversation = !CheckConversationInvokeRadius(invokeActor, con); // First check to make sure that at least 10 seconds have passed // before playing a radius-induced conversation after a letterbox // conversation with the player // // Check: // // 1. Player finished letterbox convo in last 10 seconds // 2. Conversation was with this NPC // 3. This new radius conversation is with same NPC. if ((!bAbortConversation) && ((Level.TimeSeconds - lastThirdPersonConvoTime) < 10) && (lastThirdPersonConvoActor == invokeActor)) bAbortConversation = True; // Now check if this conversation ended in the last ten seconds or so // We want to prevent the user from getting trapped inside the same // radius conversation if ((!bAbortConversation) && (con.lastPlayedTime > 0)) bAbortConversation = ((Level.TimeSeconds - con.lastPlayedTime) < 10); // Now check to see if the player just ended a radius, third-person // conversation with this NPC in the last 5 seconds. If so, punt, // because we don't want these to chain together too quickly. if ((!bAbortConversation) && ((Level.TimeSeconds - lastFirstPersonConvoTime) < 5) && (lastFirstPersonConvoActor == invokeActor)) bAbortConversation = True; } else { bAbortConversation = True; } break; case IM_Other: default: break; } } // Now check to see if these two actors are too far apart on their Z // axis so we don't get conversations triggered when someone jumps on // someone else, or when actors are on two different levels. if (!bAbortConversation) { bAbortConversation = !CheckConversationHeightDifference(invokeActor, 20); // If the height check failed, look to see if the actor has a LOS view // to the player in which case we'll allow the conversation to continue if (bAbortConversation) bAbortConversation = !CanActorSeePlayer(invokeActor); } // Check if this conversation is only to be played once if (( !bAbortConversation ) && ( con.bDisplayOnce )) { flagName = rootWindow.StringToName(con.conName $ "_Played"); bAbortConversation = (flagBase.GetBool(flagName) == True); } if ( !bAbortConversation ) { // Then check to make sure all the flags that need to be // set are. bAbortConversation = !CheckFlagRefs(con.flagRefList); } if ( !bAbortConversation ) break; conListItem = conListItem.next; } if (bAbortConversation) return None; else return con; } // ---------------------------------------------------------------------- // CheckConversationInvokeRadius() // // Returns True if this conversation can be invoked given the // invoking actor and the conversation passed in. // ---------------------------------------------------------------------- function bool CheckConversationInvokeRadius(Actor invokeActor, Conversation con) { local Int invokeRadius; local Int dist; dist = VSize(Location - invokeActor.Location); invokeRadius = Max(16, con.radiusDistance); return (dist <= invokeRadius); } // ---------------------------------------------------------------------- // CheckConversationHeightDifference() // // Checks to make sure the player and the invokeActor are fairly close // to each other on the Z Plane. Returns True if they are an // acceptable distance, otherwise returns False. // ---------------------------------------------------------------------- function bool CheckConversationHeightDifference(Actor invokeActor, int heightOffset) { local Int dist; dist = Abs(Location.Z - invokeActor.Location.Z) - Abs(Default.CollisionHeight - CollisionHeight); if (dist > (Abs(CollisionHeight - invokeActor.CollisionHeight) + heightOffset)) return False; else return True; } // ---------------------------------------------------------------------- // CanActorSeePlayer() // ---------------------------------------------------------------------- function bool CanActorSeePlayer(Actor invokeActor) { return FastTrace(invokeActor.Location); } // ---------------------------------------------------------------------- // CheckActiveConversationRadius() // // If there's a first-person conversation active, checks to make sure // that the player has not walked far away from the conversation owner. // If so, the conversation is aborted. // ---------------------------------------------------------------------- function CheckActiveConversationRadius() { local int checkRadius; // Ignore if conPlay.GetForcePlay() returns True if ((conPlay != None) && (!conPlay.GetForcePlay()) && (conPlay.ConversationStarted()) && (conPlay.displayMode == DM_FirstPerson) && (conPlay.StartActor != None)) { // If this was invoked via a radius, then check to make sure the player doesn't // exceed that radius plus if (conPlay.con.bInvokeRadius) checkRadius = conPlay.con.radiusDistance + 100; else checkRadius = 300; // Add the collisioncylinder since some objects are wider than others checkRadius += conPlay.StartActor.CollisionRadius; if (VSize(conPlay.startActor.Location - Location) > checkRadius) { // Abort the conversation conPlay.TerminateConversation(True); } } } // ---------------------------------------------------------------------- // CheckActorDistances() // // Checks to see how far all the actors are away from each other // to make sure the conversation should continue. // ---------------------------------------------------------------------- function bool CheckActorDistances() { if ((conPlay != None) && (!conPlay.GetForcePlay()) && (conPlay.ConversationStarted()) && (conPlay.displayMode == DM_ThirdPerson)) { if (!conPlay.con.CheckActorDistances(Self)) conPlay.TerminateConversation(True); } } // ---------------------------------------------------------------------- // CheckFlagRefs() // // Loops through the flagrefs passed in and sees if the current flag // settings in the game match this set of flags. Returns True if so, // otherwise False. // ---------------------------------------------------------------------- function bool CheckFlagRefs( ConFlagRef flagRef ) { local ConFlagRef currentRef; // Loop through our list of FlagRef's, checking the value of each. // If we hit a bad match, then we'll stop right away since there's // no point of continuing. currentRef = flagRef; while( currentRef != None ) { if ( flagBase.GetBool(currentRef.flagName) != currentRef.value ) return False; currentRef = currentRef.nextFlagRef; } // If we made it this far, then the flags check out. return True; } // ---------------------------------------------------------------------- // StartDataLinkTransmission() // // Locates and starts the DataLink passed in // ---------------------------------------------------------------------- function Bool StartDataLinkTransmission( String datalinkName, Optional DataLinkTrigger datalinkTrigger) { local Conversation activeDataLink; local bool bDataLinkPlaySpawned; // Don't allow DataLinks to start if we're in PlayersOnly mode if ( Level.bPlayersOnly ) return False; activeDataLink = GetActiveDataLink(datalinkName); if ( activeDataLink != None ) { // Search to see if there's an active DataLinkPlay object // before creating one if ( dataLinkPlay == None ) { datalinkPlay = Spawn(class'DataLinkPlay'); bDataLinkPlaySpawned = True; } // Call SetConversation(), which returns if (datalinkPlay.SetConversation(activeDataLink)) { datalinkPlay.SetTrigger(datalinkTrigger); if (datalinkPlay.StartConversation(Self)) { return True; } else { // Datalink must already be playing, or in queue if (bDataLinkPlaySpawned) { datalinkPlay.Destroy(); datalinkPlay = None; } return False; } } else { // Datalink must already be playing, or in queue if (bDataLinkPlaySpawned) { datalinkPlay.Destroy(); datalinkPlay = None; } return False; } } else { return False; } } // ---------------------------------------------------------------------- // GetActiveDataLink() // // Loops through the conversations belonging to the player and checks // to see if the datalink conversation passed in can be found. Also // checks to the "PlayedOnce" flag to prevent datalink transmissions // from playing more than one (unless intended). // ---------------------------------------------------------------------- function Conversation GetActiveDataLink(String datalinkName) { local Name flagName; local ConListItem conListItem; local Conversation con; local bool bAbortDataLink; local bool bDatalinkFound; local bool bDataLinkNameFound; // Abort immediately if the flagbase isn't yet initialized if ((flagBase == None) || (rootWindow == None)) return None; conListItem = ConListItem(conListItems); // In a loop, go through the conversations, checking each. while ( conListItem != None ) { con = conListItem.con; if ( Caps(datalinkName) == Caps(con.conName) ) { // Now check if this DataLink is only to be played // once bDataLinkNameFound = True; bAbortDataLink = False; if ( con.bDisplayOnce ) { flagName = rootWindow.StringToName(con.conName $ "_Played"); bAbortDataLink = (flagBase.GetBool(flagName) == True); } // Check the flags for this DataLink if (( !bAbortDataLink ) && ( CheckFlagRefs( con.flagRefList ) == True )) { bDatalinkFound = True; break; } } conListItem = conListItem.next; } if (bDatalinkFound) { return con; } else { // Print a warning if this DL couldn't be found based on its name if (bDataLinkNameFound == False) { log("WARNING! INFOLINK NOT FOUND!! Name = " $ datalinkName); ClientMessage("WARNING! INFOLINK NOT FOUND!! Name = " $ datalinkName); } return None; } } // ---------------------------------------------------------------------- // AddNote() // // Adds a new note to the list of notes the player is carrying around. // ---------------------------------------------------------------------- function DeusExNote AddNote( optional String strNote, optional Bool bUserNote, optional bool bShowInLog ) { local DeusExNote newNote; newNote = new(Self) Class'DeusExNote'; newNote.text = strNote; newNote.SetUserNote( bUserNote ); // Insert this new note at the top of the notes list if (FirstNote == None) LastNote = newNote; else newNote.next = FirstNote; FirstNote = newNote; // Optionally show the note in the log if ( bShowInLog ) { ClientMessage(NoteAdded); DeusExRootWindow(rootWindow).hud.msgLog.PlayLogSound(Sound'LogNoteAdded'); } return newNote; } // ---------------------------------------------------------------------- // GetNote() // // Loops through the notes and searches for the TextTag passed in // ---------------------------------------------------------------------- function DeusExNote GetNote(Name textTag) { local DeusExNote note; note = FirstNote; while( note != None ) { if (note.textTag == textTag) break; note = note.next; } return note; } // ---------------------------------------------------------------------- // DeleteNote() // // Deletes the specified note // Returns True if the note successfully deleted // ---------------------------------------------------------------------- function Bool DeleteNote( DeusExNote noteToDelete ) { local DeusExNote note; local DeusExNote previousNote; local Bool bNoteDeleted; bNoteDeleted = False; note = FirstNote; previousNote = None; while( note != None ) { if ( note == noteToDelete ) { if ( note == FirstNote ) FirstNote = note.next; if ( note == LastNote ) LastNote = previousNote; if ( previousNote != None ) previousNote.next = note.next; note = None; bNoteDeleted = True; break; } previousNote = note; note = note.next; } return bNoteDeleted; } // ---------------------------------------------------------------------- // DeleteAllNotes() // // Deletes *ALL* Notes // ---------------------------------------------------------------------- function DeleteAllNotes() { local DeusExNote note; local DeusExNote noteNext; note = FirstNote; while( note != None ) { noteNext = note.next; DeleteNote(note); note = noteNext; } FirstNote = None; LastNote = None; } // ---------------------------------------------------------------------- // NoteAdd() // ---------------------------------------------------------------------- exec function NoteAdd( String noteText, optional bool bUserNote ) { local DeusExNote newNote; newNote = AddNote( noteText ); newNote.SetUserNote( bUserNote ); } // ---------------------------------------------------------------------- // AddGoal() // // Adds a new goal to the list of goals the player is carrying around. // ---------------------------------------------------------------------- function DeusExGoal AddGoal( Name goalName, bool bPrimaryGoal ) { local DeusExGoal newGoal; // First check to see if this goal already exists. If so, we'll just // return it. Otherwise create a new goal newGoal = FindGoal( goalName ); if ( newGoal == None ) { newGoal = new(Self) Class'DeusExGoal'; newGoal.SetName( goalName ); // Insert goal at the Top so goals are displayed in // Newest order first. if (FirstGoal == None) LastGoal = newGoal; else newGoal.next = FirstGoal; FirstGoal = newGoal; newGoal.SetPrimaryGoal( bPrimaryGoal ); ClientMessage(GoalAdded); DeusExRootWindow(rootWindow).hud.msgLog.PlayLogSound(Sound'LogGoalAdded'); } return newGoal; } // ---------------------------------------------------------------------- // FindGoal() // ---------------------------------------------------------------------- function DeusExGoal FindGoal( Name goalName ) { local DeusExGoal goal; goal = FirstGoal; while( goal != None ) { if ( goalName == goal.goalName ) break; goal = goal.next; } return goal; } // ---------------------------------------------------------------------- // GoalAdd() // // Adds a new goal to the list of goals the player is carrying around. // ---------------------------------------------------------------------- exec function GoalAdd( Name goalName, String goalText, optional bool bPrimaryGoal ) { local DeusExGoal newGoal; if (!bCheatsEnabled) return; newGoal = AddGoal( goalName, bPrimaryGoal ); newGoal.SetText( goalText ); } // ---------------------------------------------------------------------- // GoalSetPrimary() // // Sets a goal as a Primary Goal // ---------------------------------------------------------------------- exec function GoalSetPrimary( Name goalName, bool bPrimaryGoal ) { local DeusExGoal goal; if (!bCheatsEnabled) return; goal = FindGoal( goalName ); if ( goal != None ) goal.SetPrimaryGoal( bPrimaryGoal ); } // ---------------------------------------------------------------------- // GoalCompleted() // // Looks up the goal and marks it as completed. // ---------------------------------------------------------------------- function GoalCompleted( Name goalName ) { local DeusExGoal goal; // Loop through all the goals until we hit the one we're // looking for. goal = FindGoal( goalName ); if ( goal != None ) { // Only mark a goal as completed once! if (!goal.IsCompleted()) { goal.SetCompleted(); DeusExRootWindow(rootWindow).hud.msgLog.PlayLogSound(Sound'LogGoalCompleted'); // Let the player know if ( goal.bPrimaryGoal ) ClientMessage(PrimaryGoalCompleted); else ClientMessage(SecondaryGoalCompleted); } } } // ---------------------------------------------------------------------- // DeleteGoal() // // Deletes the specified note // Returns True if the note successfully deleted // ---------------------------------------------------------------------- function Bool DeleteGoal( DeusExGoal goalToDelete ) { local DeusExGoal goal; local DeusExGoal previousGoal; local Bool bGoalDeleted; bGoalDeleted = False; goal = FirstGoal; previousGoal = None; while( goal != None ) { if ( goal == goalToDelete ) { if ( goal == FirstGoal ) FirstGoal = goal.next; if ( goal == LastGoal ) LastGoal = previousGoal; if ( previousGoal != None ) previousGoal.next = goal.next; goal = None; bGoalDeleted = True; break; } previousGoal = goal; goal = goal.next; } return bGoalDeleted; } // ---------------------------------------------------------------------- // DeleteAllGoals() // // Deletes *ALL* Goals // ---------------------------------------------------------------------- function DeleteAllGoals() { local DeusExGoal goal; local DeusExGoal goalNext; goal = FirstGoal; while( goal != None ) { goalNext = goal.next; DeleteGoal(goal); goal = goalNext; } FirstGoal = None; LastGoal = None; } // ---------------------------------------------------------------------- // ResetGoals() // // Called when progressing to the next mission. Deletes all // completed Primary Goals as well as *ALL* Secondary Goals // (regardless of status) // ---------------------------------------------------------------------- function ResetGoals() { local DeusExGoal goal; local DeusExGoal goalNext; goal = FirstGoal; while( goal != None ) { goalNext = goal.next; // Delete: // 1) Completed Primary Goals // 2) ALL Secondary Goals if ((!goal.IsPrimaryGoal()) || (goal.IsPrimaryGoal() && goal.IsCompleted())) DeleteGoal(goal); goal = goalNext; } } // ---------------------------------------------------------------------- // AddImage() // // Inserts a new image in the user's list of images. First checks to // make sure the player doesn't already have the image. If not, // sticks the image at the top of the list. // ---------------------------------------------------------------------- function bool AddImage(DataVaultImage newImage) { local DataVaultImage image; if (newImage == None) return False; // First make sure the player doesn't already have this image!! image = FirstImage; while(image != None) { if (newImage.imageDescription == image.imageDescription) return False; image = image.NextImage; } // If the player doesn't yet have an image, make this his // first image. newImage.nextImage = FirstImage; newImage.prevImage = None; if (FirstImage != None) FirstImage.prevImage = newImage; FirstImage = newImage; return True; } // ---------------------------------------------------------------------- // AddLog() // // Adds a log message to our FirstLog linked list // ---------------------------------------------------------------------- function DeusExLog AddLog(String logText) { local DeusExLog newLog; newLog = CreateLogObject(); newLog.SetLogText(logText); // Add this Note to the list of player Notes if ( FirstLog != None ) LastLog.next = newLog; else FirstLog = newLog; LastLog = newLog; return newLog; } // ---------------------------------------------------------------------- // ClearLog() // // Removes log objects // ---------------------------------------------------------------------- function ClearLog() { local DeusExLog log; local DeusExLog nextLog; log = FirstLog; while( log != None ) { nextLog = log.next; CriticalDelete(log); log = nextLog; } FirstLog = None; LastLog = None; } // ---------------------------------------------------------------------- // SetLogTimeout() // ---------------------------------------------------------------------- function SetLogTimeout(Float newLogTimeout) { logTimeout = newLogTimeout; // Update the HUD Log Display if (DeusExRootWindow(rootWindow).hud != None) DeusExRootWindow(rootWindow).hud.msgLog.SetLogTimeout(newLogTimeout); } // ---------------------------------------------------------------------- // GetLogTimeout() // ---------------------------------------------------------------------- function Float GetLogTimeout() { if (Level.NetMode == NM_Standalone) return logTimeout; else return (FMax(5.0,logTimeout)); } // ---------------------------------------------------------------------- // SetMaxLogLines() // ---------------------------------------------------------------------- function SetMaxLogLines(Byte newLogLines) { maxLogLines = newLogLines; // Update the HUD Log Display if (DeusExRootWindow(rootWindow).hud != None) DeusExRootWindow(rootWindow).hud.msgLog.SetMaxLogLines(newLogLines); } // ---------------------------------------------------------------------- // GetMaxLogLines() // ---------------------------------------------------------------------- function Byte GetMaxLogLines() { return maxLogLines; } // ---------------------------------------------------------------------- // PopHealth() - This is used from the health screen (Medkits applied to body parts were not in sync with server) // ---------------------------------------------------------------------- function PopHealth( float health0, float health1, float health2, float health3, float health4, float health5 ) { HealthHead = health0; HealthTorso = health1; HealthArmRight = health2; HealthArmLeft = health3; HealthLegRight = health4; HealthLegLeft = health5; } // ---------------------------------------------------------------------- // GenerateTotalHealth() // // this will calculate a weighted average of all of the body parts // and put that value in the generic Health // NOTE: head and torso are both critical // ---------------------------------------------------------------------- function GenerateTotalHealth() { local float ave, avecrit; ave = (HealthLegLeft + HealthLegRight + HealthArmLeft + HealthArmRight) / 4.0; if ((HealthHead <= 0) || (HealthTorso <= 0)) avecrit = 0; else avecrit = (HealthHead + HealthTorso) / 2.0; if (avecrit == 0) Health = 0; else Health = (ave + avecrit) / 2.0; //GMDX: TODO: check mini display for colouring etc, max value=115 } // ---------------------------------------------------------------------- // MultiplayerDeathMsg() // ---------------------------------------------------------------------- function MultiplayerDeathMsg( Pawn killer, bool killedSelf, bool valid, String killerName, String killerMethod ) { local MultiplayerMessageWin mmw; local DeusExRootWindow root; myKiller = killer; if ( killProfile != None ) { killProfile.bKilledSelf = killedSelf; killProfile.bValid = valid; } root = DeusExRootWindow(rootWindow); if ( root != None ) { mmw = MultiplayerMessageWin(root.InvokeUIScreen(Class'MultiplayerMessageWin', True)); if ( mmw != None ) { mmw.bKilled = true; mmw.killerName = killerName; mmw.killerMethod = killerMethod; mmw.bKilledSelf = killedSelf; mmw.bValidMethod = valid; } } } function ShowProgress() { local MultiplayerMessageWin mmw; local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) { if (root.GetTopWindow() != None) mmw = MultiplayerMessageWin(root.GetTopWindow()); if ((mmw != None) && (mmw.bDisplayProgress == false)) { mmw.Destroy(); mmw = None; } if ( mmw == None ) { mmw = MultiplayerMessageWin(root.InvokeUIScreen(Class'MultiplayerMessageWin', True)); if ( mmw != None ) { mmw.bKilled = false; mmw.bDisplayProgress = true; mmw.lockoutTime = Level.TimeSeconds + 0.2; } } } } // ---------------------------------------------------------------------- // ServerConditionalNoitfyMsg // ---------------------------------------------------------------------- function ServerConditionalNotifyMsg( int code, optional int param, optional string str ) { switch( code ) { case MPMSG_FirstPoison: if ( (mpMsgServerFlags & MPSERVERFLAG_FirstPoison) == MPSERVERFLAG_FirstPoison ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_FirstPoison; break; case MPMSG_FirstBurn: if ( (mpMsgServerFlags & MPSERVERFLAG_FirstBurn) == MPSERVERFLAG_FirstBurn ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_FirstBurn; break; case MPMSG_TurretInv: if ( ( mpMsgServerFlags & MPSERVERFLAG_TurretInv ) == MPSERVERFLAG_TurretInv ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_TurretInv; break; case MPMSG_CameraInv: if ( ( mpMsgServerFlags & MPSERVERFLAG_CameraInv ) == MPSERVERFLAG_CameraInv ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_CameraInv; break; case MPMSG_LostLegs: if ( ( mpMsgServerFlags & MPSERVERFLAG_LostLegs) == MPSERVERFLAG_LostLegs ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_LostLegs; break; case MPMSG_DropItem: if ( ( mpMsgServerFlags & MPSERVERFLAG_DropItem) == MPSERVERFLAG_DropItem ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_DropItem; break; case MPMSG_NoCloakWeapon: if ( ( mpMsgServerFlags & MPSERVERFLAG_NoCloakWeapon) == MPSERVERFLAG_NoCloakWeapon ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_NoCloakWeapon; break; } // If we made it here we need to notify MultiplayerNotifyMsg( code, param, str ); } // ---------------------------------------------------------------------- // MultiplayerNotifyMsg() // ---------------------------------------------------------------------- function MultiplayerNotifyMsg( int code, optional int param, optional string str ) { if ( !bHelpMessages ) { switch( code ) { case MPMSG_TeamUnatco: case MPMSG_TeamNsf: case MPMSG_TeamHit: case MPMSG_TeamSpot: case MPMSG_FirstPoison: case MPMSG_FirstBurn: case MPMSG_TurretInv: case MPMSG_CameraInv: case MPMSG_LostLegs: case MPMSG_DropItem: case MPMSG_KilledTeammate: case MPMSG_TeamLAM: case MPMSG_TeamComputer: case MPMSG_NoCloakWeapon: case MPMSG_TeamHackTurret: return; // Pass on these case MPMSG_CloseKills: case MPMSG_TimeNearEnd: break; // Go ahead with these } } switch( code ) { case MPMSG_TeamSpot: if ( (mpMsgFlags & MPFLAG_FirstSpot) == MPFLAG_FirstSpot ) return; else mpMsgFlags = mpMsgFlags | MPFLAG_FirstSpot; break; case MPMSG_CloseKills: if ((param == 0) || (str ~= "")) { log("Warning: Passed bad params to multiplayer notify msg." ); return; } mpMsgOptionalParam = param; mpMsgOptionalString = str; break; case MPMSG_TimeNearEnd: if ((param == 0) || (str ~= "")) { log("Warning: Passed bad params to multiplayer notify msg." ); return; } mpMsgOptionalParam = param; mpMsgOptionalString = str; break; case MPMSG_DropItem: case MPMSG_TeamUnatco: case MPMSG_TeamNsf: if (( DeusExRootWindow(rootWindow) != None ) && ( DeusExRootWindow(rootWindow).hud != None ) && (DeusExRootWindow(rootWindow).hud.augDisplay != None )) DeusExRootWindow(rootWindow).hud.augDisplay.RefreshMultiplayerKeys(); break; } mpMsgCode = code; mpMsgTime = Level.Timeseconds + mpMsgDelay; if (( code == MPMSG_TeamUnatco ) || ( code == MPMSG_TeamNsf )) mpMsgTime += 2.0; } // // GetSkillInfoFromProjKiller // function GetSkillInfoFromProj( DeusExPlayer killer, Actor proj ) { local class<Skill> skillClass; if ( proj.IsA('GasGrenade') || proj.IsA('LAM') || proj.IsA('EMPGrenade') || proj.IsA('TearGas')) skillClass = class'SkillDemolition'; else if ( proj.IsA('Rocket') || proj.IsA('RocketLAW') || proj.IsA('RocketWP') || proj.IsA('Fireball') || proj.IsA('PlasmaBolt') || proj.IsA('PlasmaGamma')) skillClass = class'SkillWeaponHeavy'; else if ( proj.IsA('Dart') || proj.IsA('DartFlare') || proj.IsA('DartPoison') || proj.IsA('Shuriken')) skillClass = class'SkillWeaponLowTech'; else if ( proj.IsA('HECannister20mm') || proj.IsA('SpiderConstructorLaunched2') || proj.IsA('RubberBullet')) skillClass = class'SkillWeaponRifle'; else if ( proj.IsA('DeusExDecoration') ) { killProfile.activeSkill = NoneString; killProfile.activeSkillLevel = 0; return; } if ( killer.SkillSystem != None ) { killProfile.activeSkill = skillClass.Default.skillName; killProfile.activeSkillLevel = killer.SkillSystem.GetSkillLevel(skillClass); } } function GetWeaponName( DeusExWeapon w, out String name ) { if ( w != None ) { if ( WeaponGEPGun(w) != None ) name = WeaponGEPGun(w).shortName; else if ( WeaponLAM(w) != None ) name = WeaponLAM(w).shortName; else name = w.itemName; } else name = NoneString; } // // CreateKillerProfile // 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 Skill askill; local String wShortString; if ( killProfile == None ) { log("Warning:"$Self$" has a killProfile that is None!" ); return; } else 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; anAug = pkiller.AugmentationSystem.FirstAug; while ( anAug != None ) { if ( anAug.bHasIt && anAug.bIsActive && !anAug.bAlwaysActive && (augCnt < ArrayCount(killProfile.activeAugs))) { killProfile.activeAugs[augCnt] = anAug.augmentationName; augCnt += 1; } anAug = anAug.next; } } else killProfile.numActiveAugs = 0; // My weapon and skill GetWeaponName( DeusExWeapon(inHand), killProfile.myActiveWeapon ); if ( DeusExWeapon(inHand) != None ) { if ( SkillSystem != None ) { askill = SkillSystem.GetSkillFromClass(DeusExWeapon(inHand).GoverningSkill); killProfile.myActiveSkill = askill.skillName; killProfile.myActiveSkillLevel = askill.CurrentLevel; } } 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; anAug = AugmentationSystem.FirstAug; while ( anAug != None ) { if ( anAug.bHasIt && anAug.bIsActive && !anAug.bAlwaysActive && (augCnt < ArrayCount(killProfile.myActiveAugs))) { killProfile.myActiveAugs[augCnt] = anAug.augmentationName; augCnt += 1; } anAug = anAug.next; } } 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 $ "!"; askill = pkiller.SkillSystem.GetSkillFromClass(w.GoverningSkill); killProfile.activeSkill = askill.skillName; killProfile.activeSkillLevel = askill.CurrentLevel; } 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; } } // ---------------------------------------------------------------------- // TakeDamage() // ---------------------------------------------------------------------- function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { local int actualDamage; local bool bAlreadyDead, bPlayAnim, bDamageGotReduced; local Vector offset, dst; local float headOffsetZ, headOffsetY, armOffset; local float origHealth, fdst; local DeusExLevelInfo info; local DeusExWeapon dxw; local String bodyString; local int MPHitLoc; local GMDXFlickerLight lightFlicker; local float augLVL; local DeusExRootWindow root; local GMDXImpactSpark AST; if ( bNintendoImmunity ) return; bodyString = ""; origHealth = Health; if (Level.NetMode != NM_Standalone) Damage *= MPDamageMult; else if (damageType=='Drowned') { if (PerkNamesArray[5]!=1) drugEffectTimer += 3.5; //freak player :) Damage=12; //GMDX mod drowning damage, taked that hard coded 5hpts } //log("MYCHK DXP_TD:"@self@"take damage in state"@GetStateName()@" : "@Damage@" : "@damageType@" : "@instigatedBy); // use the hitlocation to determine where the pawn is hit // transform the worldspace hitlocation into objectspace // in objectspace, remember X is front to back // Y is side to side, and Z is top to bottom offset = (hitLocation - Location) << Rotation; // add a HUD icon for this damage type if ((damageType == 'Poison') || (damageType == 'PoisonEffect')) // hack AddDamageDisplay('PoisonGas', offset); else AddDamageDisplay(damageType, offset); // nanovirus damage doesn't affect us if (damageType == 'NanoVirus') return; // handle poison if ((damageType == 'Poison') || ((Level.NetMode != NM_Standalone) && (damageType=='TearGas')) ) { // Notify player if they're getting burned for the first time if ( Level.NetMode != NM_Standalone ) ServerConditionalNotifyMsg( MPMSG_FirstPoison ); StartPoison( instigatedBy, Damage ); } // reduce our damage correctly if (ReducedDamageType == damageType) actualDamage = float(actualDamage) * (1.0 - ReducedDamagePct); // check for augs or inventory items bDamageGotReduced = DXReduceDamage(Damage, damageType, hitLocation, actualDamage, False); /// DEUS_EX AMSD Multiplayer shield if (Level.NetMode != NM_Standalone) if (bDamageGotReduced) { ShieldStatus = SS_Strong; ShieldTimer = 1.0; } if (ReducedDamageType == 'All') //God mode actualDamage = 0; //CyberP: add flinch effects if ((DamageType == 'Shot' || DamageType == 'AutoShot' || DamageType == 'Shocked')) { if (inHand != None && inHand.IsA('DeusExWeapon') && !DeusExWeapon(inHand).bFiring && FRand() < 0.18) { if (AugmentationSystem != None) augLVL = AugmentationSystem.GetAugLevelValue(class'AugBallistic'); if (AugmentationSystem != None && augLVL >= 0.0) { } else { RecoilTime=default.RecoilTime; RecoilShake.Z-=lerp(min(Abs(ActualDamage),2.0*ActualDamage)/(1.0*ActualDamage),0,4.0); //CyberP: 7 RecoilShake.Y-=lerp(min(Abs(ActualDamage),2.0*ActualDamage)/(1.0*ActualDamage),0,3.0); RecoilShaker(vect(1,2,-2)); } } if (inHand != None && inHand.IsA('WeaponSword')) { if ((DamageType == 'Shot' || DamageType == 'AutoShot') && FRand() < 0.03) { PlaySound(sound'bouncemetal',SLOT_None); actualDamage = 0; return; } } } // Multiplayer only code if ( Level.NetMode != NM_Standalone ) { if ( ( instigatedBy != None ) && (instigatedBy.IsA('DeusExPlayer')) ) { // Special case the sniper rifle if ((DeusExPlayer(instigatedBy).Weapon != None) && ( DeusExPlayer(instigatedBy).Weapon.class == class'WeaponRifle' )) { dxw = DeusExWeapon(DeusExPlayer(instigatedBy).Weapon); if ( (dxw != None ) && ( !dxw.bZoomed )) actualDamage *= WeaponRifle(dxw).mpNoScopeMult; // Reduce damage if we're not using the scope } if ( (TeamDMGame(DXGame) != None) && (TeamDMGame(DXGame).ArePlayersAllied(DeusExPlayer(instigatedBy),Self)) ) { // Don't notify if the player hurts themselves if ( DeusExPlayer(instigatedBy) != Self ) { actualDamage *= TeamDMGame(DXGame).fFriendlyFireMult; if (( damageType != 'TearGas' ) && ( damageType != 'PoisonEffect' )) DeusExPlayer(instigatedBy).MultiplayerNotifyMsg( MPMSG_TeamHit ); } } } } // EMP attacks drain BE energy if (damageType == 'EMP') { EnergyDrain += actualDamage; EnergyDrainTotal += actualDamage; PlayTakeHitSound(actualDamage, damageType, 1); if ((damageType == 'EMP') && (damage > 25)) { PlaySound(sound'CloakDown', SLOT_None,,,,2.0); PlaySound(sound'tinnitus', SLOT_None); ClientFlash(800000,vect(255,255,255)); IncreaseClientFlashLength(4); ShowHud(false); return; } } if (damageType == 'Exploded' || damageType == 'Shocked') { if (AugmentationSystem != None) { if (AugmentationSystem.GetAugLevelValue(class'AugShield') == -1.0 && PerkNamesArray[6] != 1) { bStunted = True; SetTimer(0.4,false); } } } bPlayAnim = True; // if we're burning, don't play a hit anim when taking burning damage if (damageType == 'Burned') bPlayAnim = False; if (Physics == PHYS_None) SetMovementPhysics(); if (Physics == PHYS_Walking) momentum.Z = 0.4 * VSize(momentum); if ( instigatedBy == self ) momentum *= 0.6; momentum = momentum/Mass; // AddVelocity( momentum ); // doesn't do anything anyway // calculate our hit extents headOffsetZ = CollisionHeight * 0.78; headOffsetY = CollisionRadius * 0.35; armOffset = CollisionRadius * 0.35; // We decided to just have 3 hit locations in multiplayer MBCODE if (( Level.NetMode == NM_DedicatedServer ) || ( Level.NetMode == NM_ListenServer )) { MPHitLoc = GetMPHitLocation(HitLocation); if (MPHitLoc == 0) return; else if (MPHitLoc == 1 ) { // MP Headshot is 2x damage // narrow the head region actualDamage *= 2; HealthHead -= actualDamage; bodyString = HeadString; if (bPlayAnim) PlayAnim('HitHead', , 0.1); } else if ((MPHitLoc == 3) || (MPHitLoc == 4)) // Leg region { HealthLegRight -= actualDamage; HealthLegLeft -= actualDamage; if (MPHitLoc == 4) { if (bPlayAnim) PlayAnim('HitLegRight', , 0.1); } else if (MPHitLoc == 3) { if (bPlayAnim) PlayAnim('HitLegLeft', , 0.1); } // Since the legs are in sync only bleed up damage from one leg (otherwise it's double damage) if (HealthLegLeft < 0) { HealthArmRight += HealthLegLeft; HealthTorso += HealthLegLeft; HealthArmLeft += HealthLegLeft; bodyString = TorsoString; HealthLegLeft = 0; HealthLegRight = 0; } } else // arms and torso now one region { HealthArmLeft -= actualDamage; HealthTorso -= actualDamage; HealthArmRight -= actualDamage; bodyString = TorsoString; if (MPHitLoc == 6) { if (bPlayAnim) PlayAnim('HitArmRight', , 0.1); } else if (MPHitLoc == 5) { if (bPlayAnim) PlayAnim('HitArmLeft', , 0.1); } else { if (bPlayAnim) PlayAnim('HitTorso', , 0.1); } } } else // Normal damage code path for single player { if (offset.z > headOffsetZ) // head { // narrow the head region if ((Abs(offset.x) < headOffsetY) || (Abs(offset.y) < headOffsetY)) { HealthHead -= actualDamage * 2; if (bPlayAnim) PlayAnim('HitHead', , 0.1); // elec effect if (damageType == 'Shocked' && AST == None) { root = DeusExRootWindow(rootWindow); if ((root != None) && (root.hud != None)) { if (root.hud.background == None) { root.hud.SetBackground(Texture'Wepn_Prod_FX'); //root.hud.SetBackgroundSmoothing(True); root.hud.SetBackgroundStretching(True); root.hud.SetBackgroundStyle(DSTY_Translucent); AST=Spawn(class'GMDXImpactSpark'); if (AST != None) { AST.LifeSpan=4.000000; AST.DrawScale=0.000001; AST.Velocity=vect(0,0,0); AST.AmbientSound=Sound'Ambient.Ambient.Electricity3'; AST.SoundVolume=224; AST.SoundRadius=64; AST.SoundPitch=80; } } } } } } else if (offset.z < 0.0) // legs { if (offset.y > 0.0) { HealthLegRight -= actualDamage; if (bPlayAnim) PlayAnim('HitLegRight', , 0.1); } else { HealthLegLeft -= actualDamage; if (bPlayAnim) PlayAnim('HitLegLeft', , 0.1); } // if this part is already dead, damage the adjacent part 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 // arms and torso { if (offset.y > armOffset) { HealthArmRight -= actualDamage; if (bPlayAnim) PlayAnim('HitArmRight', , 0.1); } else if (offset.y < -armOffset) { HealthArmLeft -= actualDamage; if (bPlayAnim) PlayAnim('HitArmLeft', , 0.1); } else { HealthTorso -= actualDamage * 2; if (bPlayAnim) { PlayAnim('HitTorso', , 0.1); } } // if this part is already dead, damage the adjacent part if (HealthArmLeft < 0) { HealthTorso += HealthArmLeft; HealthArmLeft = 0; } if (HealthArmRight < 0) { HealthTorso += HealthArmRight; HealthArmRight = 0; } } } // check for a back hit and play the correct anim if ((offset.x < 0.0) && bPlayAnim) { if (offset.z > headOffsetZ) // head from the back { // narrow the head region if ((Abs(offset.x) < headOffsetY) || (Abs(offset.y) < headOffsetY)) PlayAnim('HitHeadBack', , 0.1); } else PlayAnim('HitTorsoBack', , 0.1); } // check for a water hit if (Region.Zone.bWaterZone) { if ((offset.x < 0.0) && bPlayAnim) PlayAnim('WaterHitTorsoBack',,0.1); else PlayAnim('WaterHitTorso',,0.1); } GenerateTotalHealth(); if ((damageType != 'Stunned') && (damageType != 'TearGas') && (damageType != 'HalonGas') && (damageType != 'PoisonGas') && (damageType != 'Radiation') && (damageType != 'EMP') && (damageType != 'NanoVirus') && (damageType != 'Drowned') && (damageType != 'KnockedOut')) bleedRate += (origHealth-Health)/30.0; // 30 points of damage = bleed profusely if (CarriedDecoration != None && FRand() < 0.3 && AugmentationSystem.GetAugLevelValue(class'AugMuscle') != 2) DropDecoration(); // don't let the player die in the training mission info = GetLevelInfo(); if ((info != None) && (info.MissionNumber == 0)) { if (Health <= 0) { HealthTorso = FMax(HealthTorso, 10); HealthHead = FMax(HealthHead, 10); GenerateTotalHealth(); } } if (Health > 0) { if ((Level.NetMode != NM_Standalone) && (HealthLegLeft==0) && (HealthLegRight==0)) ServerConditionalNotifyMsg( MPMSG_LostLegs ); if (instigatedBy != None) damageAttitudeTo(instigatedBy); PlayDXTakeDamageHit(actualDamage, hitLocation, damageType, momentum, bDamageGotReduced); AISendEvent('Distress', EAITYPE_Visual); } else { NextState = ''; if (inHand != None && FRand() < 0.3) DropItem(); PlayDeathHit(actualDamage, hitLocation, damageType, momentum); if ( Level.NetMode != NM_Standalone ) CreateKillerProfile( instigatedBy, actualDamage, damageType, bodyString ); if (DamageType == 'Exploded') //CyberP: always gib to explosives { Health = -1000; Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentSmoking'); } else if (DamageType == 'Burned' && instigatedBy.Weapon != None && (instigatedBy.Weapon.IsA('WeaponHideAGun') || instigatedBy.Weapon.IsA('WeaponPlasmaRifle') || instigatedBy.Weapon.IsA('WeaponRobotPlasmaGun'))) { Health = -1000; Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); } else if ( actualDamage > mass ) Health = -1 * actualDamage; Enemy = instigatedBy; Died(instigatedBy, damageType, HitLocation); return; } MakeNoise(1.0); if ((DamageType == 'Flamed') && !bOnFire) { // Notify player if they're getting burned for the first time if ( Level.NetMode != NM_Standalone ) ServerConditionalNotifyMsg( MPMSG_FirstBurn ); CatchFire( instigatedBy ); } myProjKiller = None; } // ---------------------------------------------------------------------- // GetMPHitLocation() // Returns 1 for head, 2 for torso, 3 for left leg, 4 for right leg, 5 for // left arm, 6 for right arm, 0 for nothing. // ---------------------------------------------------------------------- simulated function int GetMPHitLocation(Vector HitLocation) { local float HeadOffsetZ; local float HeadOffsetY; local float ArmOffset; local vector Offset; offset = (hitLocation - Location) << Rotation; // calculate our hit extents headOffsetZ = CollisionHeight * 0.78; headOffsetY = CollisionRadius * 0.35; armOffset = CollisionRadius * 0.35; if (offset.z > headOffsetZ ) { // narrow the head region if ((Abs(offset.x) < headOffsetY) || (Abs(offset.y) < headOffsetY)) { // Headshot, return 1; return 1; } else { return 0; } } else if (offset.z < 0.0) // Leg region { if (offset.y > 0.0) { //right leg return 4; } else { //left leg return 3; } } else // arms and torso now one region { if (offset.y > armOffset) { return 6; } else if (offset.y < -armOffset) { return 5; } else { return 2; } } return 0; } // ---------------------------------------------------------------------- // DXReduceDamage() // // Calculates reduced damage from augmentations and from inventory items // Also calculates a scalar damage reduction based on the mission number // ---------------------------------------------------------------------- function bool DXReduceDamage(int Damage, name damageType, vector hitLocation, out int adjustedDamage, bool bCheckOnly) { local float newDamage; local float augLevel, skillLevel; local float pct; local HazMatSuit suit; local BallisticArmor armor; local bool bReduced; bReduced = False; newDamage = Float(Damage); if ((damageType == 'TearGas') || (damageType == 'PoisonGas') || (damageType == 'Radiation') || (damageType == 'HalonGas') || (damageType == 'PoisonEffect') || (damageType == 'Poison') || (damageType == 'Burned') || (damageType == 'Shocked')) { if (AugmentationSystem != None) augLevel = AugmentationSystem.GetAugLevelValue(class'AugEnviro'); if (augLevel >= 0.0) newDamage *= augLevel; // get rid of poison if we're maxed out if (newDamage ~= 0.0) { StopPoison(); drugEffectTimer -= 4; // stop the drunk effect if (drugEffectTimer < 0) drugEffectTimer = 0; } // go through the actor list looking for owned HazMatSuits // since they aren't in the inventory anymore after they are used if (UsingChargedPickup(class'HazMatSuit')) { skillLevel = SkillSystem.GetSkillLevelValue(class'SkillEnviro'); newDamage *= 0.4;//0.75 * skillLevel; foreach AllActors(class'HazMatSuit', suit) if ((suit.Owner == Self) && suit.bActive) suit.Charge -= (Damage * 20 * skillLevel); } } if ((damageType == 'Shot') || (damageType == 'Sabot') || (damageType == 'AutoShot')) { // go through the actor list looking for owned BallisticArmor // since they aren't in the inventory anymore after they are used if (UsingChargedPickup(class'BallisticArmor')) { skillLevel = SkillSystem.GetSkillLevelValue(class'SkillEnviro'); newDamage *= 0.65; //GMDX: removed too easy * skillLevel; //CyberP: foreach durable armor foreach AllActors(class'BallisticArmor', armor) if ((armor.Owner == Self) && armor.bActive) armor.Charge -= (Damage * 18 * skillLevel); } } if (damageType == 'HalonGas') { if (bOnFire && !bCheckOnly) ExtinguishFire(); } if ((damageType == 'Shot') || (damageType == 'AutoShot') || (damageType == 'KnockedOut')) { if (AugmentationSystem != None) //CyberP: now includes ballistic passive aug { augLevel = AugmentationSystem.GetAugLevelValue(class'AugBallistic'); if (augLevel < 0.0 && Energy > 0) augLevel = AugmentationSystem.GetAugLevelValue(class'AugBallisticPassive'); } if (augLevel >= 0.0) newDamage *= augLevel; } //if (damageType == 'EMP') //{ // if (AugmentationSystem != None) // augLevel = AugmentationSystem.GetAugLevelValue(class'AugEMP'); // // if (augLevel >= 0.0) // newDamage *= augLevel; // } if ((damageType == 'Burned') || (damageType == 'Flamed') || (damageType == 'Exploded') || (damageType == 'Shocked') || (damageType == 'EMP')) { if (AugmentationSystem != None) augLevel = AugmentationSystem.GetAugLevelValue(class'AugShield'); if (augLevel >= 0.0) newDamage *= augLevel; if (augLevel == 0.3) Spawn(class'SphereEffectShield2'); } if (newDamage < Damage) { if (!bCheckOnly) { pct = 1.0 - (newDamage / Float(Damage)); SetDamagePercent(pct); ClientFlash(0.01, vect(80, 0, 0)); } bReduced = True; } else { if (!bCheckOnly) SetDamagePercent(0.0); } // // Reduce or increase the damage based on the combat difficulty setting // if ((damageType == 'Shot') || (damageType == 'AutoShot') || (damageType == 'KnockedOut')) { newDamage *= CombatDifficulty; // always take at least one point of damage if ((newDamage <= 1) && (Damage > 0)) newDamage = 1; if (AugmentationSystem.GetAugLevelValue(class'AugBallisticPassive') >= 0.0) { Energy -= newDamage * 0.125; if (Energy < 0) Energy = 0; } } if (!bHardCoreMode) //CyberP: now we also reduce all other damage types based on difficulty. { //CyberP: easy = reduced by half. Medium = 1/4. Hardcore & realistic = No reduction if ((damageType == 'Shocked') || (damageType == 'Burned') || (damageType == 'Exploded') || (damageType == 'Poison') || (damageType == 'Radiation') || (damageType == 'TearGas') || (damageType == 'PoisonEffect')) { if (CombatDifficulty < 1) newDamage *= 0.5; else if (CombatDifficulty < 3) newDamage *= 0.75; } } adjustedDamage = Int(newDamage); return bReduced; } // ---------------------------------------------------------------------- // Died() // // Checks to see if a conversation is playing when the PC dies. // If so, nukes it. // ---------------------------------------------------------------------- function Died(pawn Killer, name damageType, vector HitLocation) { if (conPlay != None) conPlay.TerminateConversation(); if (bOnFire) ExtinguishFire(); if (AugmentationSystem != None) AugmentationSystem.DeactivateAll(); if ((Level.NetMode == NM_DedicatedServer) || (Level.NetMode == NM_ListenServer)) ClientDeath(); Super.Died(Killer, damageType, HitLocation); } // ---------------------------------------------------------------------- // ClientDeath() // // Does client side cleanup on death. // ---------------------------------------------------------------------- function ClientDeath() { if (!PlayerIsClient()) return; //FlashTimer = 0; // Reset skill notification DeusExRootWindow(rootWindow).hud.hms.bNotifySkills = False; DeusExRootWindow(rootWindow).hud.activeItems.winItemsContainer.RemoveAllIcons(); DeusExRootWindow(rootWindow).hud.belt.ClearBelt(); // This should get rid of the scope death problem in multiplayer if (( DeusExRootWindow(rootWindow).scopeView != None ) && DeusExRootWindow(rootWindow).scopeView.bViewVisible ) DeusExRootWindow(rootWindow).scopeView.DeactivateView(); if ( DeusExRootWindow(rootWindow).hud.augDisplay != None ) { DeusExRootWindow(rootWindow).hud.augDisplay.bVisionActive = False; DeusExRootWindow(rootWindow).hud.augDisplay.activeCount = 0; } if ( bOnFire ) ExtinguishFire(); // Don't come back to life drugged or posioned poisonCounter = 0; poisonTimer = 0; drugEffectTimer = 0; // Don't come back to life crouched bCrouchOn = False; bWasCrouchOn = False; bIsCrouching = False; bForceDuck = False; lastbDuck = 0; bDuck = 0; // No messages carry over mpMsgCode = 0; mpMsgTime = 0; bleedrate = 0; dropCounter = 0; } // ---------------------------------------------------------------------- // Timer() // // continually burn and do damage // ---------------------------------------------------------------------- function Timer() { local int damage; if (bDoubleClickCheck) { clickCountCyber = 0; bDoubleClickCheck=False; bStunted = False; if (!bOnFire) return; } bStunted = False; //CyberP: called from takedamage. if (!InConversation() && bOnFire) { if ( Level.NetMode != NM_Standalone ) damage = Class'WeaponFlamethrower'.Default.mpBurnDamage; else damage = Class'WeaponFlamethrower'.Default.BurnDamage; TakeDamage(damage, myBurner, Location, vect(0,0,0), 'Burned'); if (HealthTorso <= 0) { TakeDamage(10, myBurner, Location, vect(0,0,0), 'Burned'); ExtinguishFire(); } } } // ---------------------------------------------------------------------- // CatchFire() // ---------------------------------------------------------------------- function CatchFire( Pawn burner ) { local Fire f; local int i; local vector loc; myBurner = burner; burnTimer = 0; if (bOnFire || Region.Zone.bWaterZone) return; bOnFire = True; burnTimer = 0; for (i=0; i<8; i++) { loc.X = 0.5*CollisionRadius * (1.0-2.0*FRand()); loc.Y = 0.5*CollisionRadius * (1.0-2.0*FRand()); loc.Z = 0.6*CollisionHeight * (1.0-2.0*FRand()); loc += Location; // DEUS_EX AMSD reduce the number of smoke particles in multiplayer // by creating smokeless fire (better for server propagation). if ((Level.NetMode == NM_Standalone) || (i <= 0)) f = Spawn(class'Fire', Self,, loc); else f = Spawn(class'SmokelessFire', Self,, loc); if (f != None) { f.DrawScale = 0.5*FRand() + 1.0; //DEUS_EX AMSD Reduce the penalty in multiplayer if (Level.NetMode != NM_Standalone) f.DrawScale = f.DrawScale * 0.5; // turn off the sound and lights for all but the first one if (i > 0) { f.AmbientSound = None; f.LightType = LT_None; } // turn on/off extra fire and smoke // MP already only generates a little. if ((FRand() < 0.5) && (Level.NetMode == NM_Standalone)) f.smokeGen.Destroy(); if ((FRand() < 0.5) && (Level.NetMode == NM_Standalone)) f.AddFire(); } } // set the burn timer SetTimer(1.0, True); } // ---------------------------------------------------------------------- // ExtinguishFire() // ---------------------------------------------------------------------- function ExtinguishFire() { local Fire f; bOnFire = False; burnTimer = 0; SetTimer(0, False); foreach BasedActors(class'Fire', f) f.Destroy(); } // ---------------------------------------------------------------------- // SpawnBlood() // ---------------------------------------------------------------------- function SpawnBlood(Vector HitLocation, float Damage) { local int i; if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) { return; } //spawn(class'BloodSpurt',,,HitLocation); //spawn(class'BloodDrop',,,HitLocation); for (i=0; i<int(Damage); i+=10) spawn(class'BloodDrop',,,HitLocation); } // ---------------------------------------------------------------------- // PlayDXTakeDamageHit() // DEUS_EX AMSD Created as a separate function to avoid extra calls to // DXReduceDamage, which is slow in multiplayer // ---------------------------------------------------------------------- function PlayDXTakeDamageHit(float Damage, vector HitLocation, name damageType, vector Momentum, bool DamageReduced) { local float rnd; //log("MYCHK PDXTDH:"@self@"take damage in state"@GetStateName()@" : "@Damage@" : "@damageType); PlayHit(Damage,HitLocation,damageType,Momentum); // if we actually took the full damage, flash the screen and play the sound // DEUS_EX AMSD DXReduceDamage is slow. Pass in the result from earlier. if (!DamageReduced) { if ( (damage > 0) || (ReducedDamageType == 'All') ) { // No client flash on plasma bolts in multiplayer if (( Level.NetMode != NM_Standalone ) && ( myProjKiller != None ) && (PlasmaBolt(myProjKiller)!=None) ) { } else {//gmdx changed 0.002 on burned rnd = FClamp(Damage, 20, 100); if (damageType == 'Burned') ClientFlash(0.0001, vect(75,37,37)); //vect(100,50,50) else if (damageType == 'Flamed') ClientFlash(rnd * 0.002, vect(200,100,100)); else if (damageType == 'Radiation') ClientFlash(rnd * 0.002, vect(100,100,0)); else if (damageType == 'PoisonGas') ClientFlash(rnd * 0.002, vect(50,150,0)); else if (damageType == 'TearGas') ClientFlash(rnd * 0.002, vect(150,150,0)); else if (damageType == 'Drowned') ClientFlash(rnd * 0.002, vect(0,100,200)); else if (damageType == 'EMP') ClientFlash(rnd * 0.002, vect(0,200,200)); else ClientFlash(rnd * 0.002, vect(50,0,0)); } ShakeView(0.15 + 0.002 * Damage, Damage * 30, 0.3 * Damage); } } } // ---------------------------------------------------------------------- // PlayHit() // ---------------------------------------------------------------------- function PlayHit(float Damage, vector HitLocation, name damageType, vector Momentum) { if ((Damage > 0) && (damageType == 'Shot') || (damageType == 'Exploded') || (damageType == 'AutoShot')) SpawnBlood(HitLocation, Damage); if (Damage >=1) //CyberP: Don't scream (and subsequently send AIEvents) if the damage is really weak. PlayTakeHitSound(Damage, damageType, 1); } // ---------------------------------------------------------------------- // PlayDeathHit() // ---------------------------------------------------------------------- function PlayDeathHit(float Damage, vector HitLocation, name damageType, vector Momentum) { PlayDying(damageType, HitLocation); } // ---------------------------------------------------------------------- // SkillPointsAdd() // ---------------------------------------------------------------------- function SkillPointsAdd(int numPoints) { if (numPoints > 0) { SkillPointsAvail += numPoints; SkillPointsTotal += numPoints; if ((DeusExRootWindow(rootWindow) != None) && (DeusExRootWindow(rootWindow).hud != None) && (DeusExRootWindow(rootWindow).hud.msgLog != None)) { ClientMessage(Sprintf(SkillPointsAward, numPoints)); DeusExRootWindow(rootWindow).hud.msgLog.PlayLogSound(Sound'LogSkillPoints'); } } } // ---------------------------------------------------------------------- // perksManager() //CyberP: // ---------------------------------------------------------------------- function perksManager(string Perky, int perkLevel) { local Medkit med; local BioelectricCell cell; local Robot robo; if (perkLevel == 1) { switch(Perky) { case "SONIC-TRANSDUCER SENSOR": PerkNamesArray[0]= 1; break; case "FOCUSED: PISTOLS": PerkNamesArray[1]= 1; break; case "FOCUSED: RIFLES": PerkNamesArray[2]= 1; break; case "PERFECT STANCE: HEAVY WEAPONS": PerkNamesArray[3]= 1; break; case "SHARP-EYED": PerkNamesArray[4]= 1; break; case "CLARITY": PerkNamesArray[5]= 1; break; case "STEADY-FOOTED": PerkNamesArray[6]= 1; break; case "MODDER": PerkNamesArray[7]= 1; break; case "BIOGENIC": PerkNamesArray[8]= 1; break; case "NIMBLE": PerkNamesArray[9]= 1; break; case "SABOTAGE": PerkNamesArray[10]= 1; break; default: break; } } else if (perkLevel == 2) { switch(Perky) { case "HUMAN COMBUSTION": PerkNamesArray[11]= 1; break; case "QUICKDRAW": PerkNamesArray[12]= 1; break; case "H.E ROCKET": PerkNamesArray[13]= 1; break; case "PIERCING": PerkNamesArray[14]= 1; break; case "SHORT FUSE": PerkNamesArray[15]= 1; break; case "WIRELESS STRENGTH": PerkNamesArray[16]= 1; break; case "ATHLETE'S APPETITE": PerkNamesArray[17]= 1; fullUp=-9999; break; case "NERVES OF STEEL": PerkNamesArray[18]= 1; break; case "TOXICOLOGIST": PerkNamesArray[19]= 1; break; case "HARDENED": PerkNamesArray[20]= 1; break; case "MISFEATURE EXPLOIT": PerkNamesArray[21]= 1; break; default: break; } } else if (perkLevel == 3) { switch(Perky) { case "PERFECT STANCE: PISTOLS": PerkNamesArray[22]= 1; break; case "PERFECT STANCE: RIFLES": PerkNamesArray[23]= 1; break; case "IN BULK": PerkNamesArray[24]= 1; break; case "INVENTIVE": PerkNamesArray[25]= 1; break; case "KNOCKOUT GAS": PerkNamesArray[26]= 1; break; case "ENDURANCE": PerkNamesArray[27]= 1; break; case "TECH SPECIALIST": PerkNamesArray[28]= 1; break; case "CREEPER": PerkNamesArray[29]= 1; break; case "COMBAT MEDIC'S BAG": PerkNamesArray[30]= 1; foreach AllActors(class'Medkit',med) med.MaxCopies = 20; foreach AllActors(class'BioelectricCell',cell) cell.MaxCopies = 25; break; case "CRACKED": PerkNamesArray[31]= 1; break; case "LOCKSPORT": PerkNamesArray[32]= 1; break; case "NEAT HACK": PerkNamesArray[33]= 1; break; default: break; } } } // ---------------------------------------------------------------------- // MakePlayerIgnored() // ---------------------------------------------------------------------- function MakePlayerIgnored(bool bNewIgnore) { bIgnore = bNewIgnore; // to restore original behavior, uncomment the next line //bDetectable = !bNewIgnore; } // ---------------------------------------------------------------------- // CalculatePlayerVisibility() // ---------------------------------------------------------------------- function float CalculatePlayerVisibility(ScriptedPawn P) { local float vis; local AdaptiveArmor armor; local DeusExWeapon wep; wep = DeusExWeapon(Weapon); vis = 1.0; if ((P != None) && (AugmentationSystem != None)) { if (P.IsA('Robot')) { // if the aug is on, give the player full invisibility if (AugmentationSystem.GetAugLevelValue(class'AugRadarTrans') != -1.0) vis = 0.0; } else { // if the aug is on, give the player full invisibility if (AugmentationSystem.GetAugLevelValue(class'AugCloak') != -1.0) vis = 0.0; } // go through the actor list looking for owned AdaptiveArmor // since they aren't in the inventory anymore after they are used if (UsingChargedPickup(class'AdaptiveArmor')) { vis = 0.0; } if (wep != None && wep.bLasing) { vis = 1.0; //CyberP: if laser on, can be seen even if cloaked/radartrans } } return vis; } // ---------------------------------------------------------------------- // ClientFlash() // // copied from Engine.PlayerPawn // modified to add the new flash to the current flash // ---------------------------------------------------------------------- // MBCODE: changed to simulated so that player can experience flash client side // DEUS_EX AMSD: Added so we can change the flash time duration. simulated function ClientFlash( float scale, vector fog) { DesiredFlashScale += scale; DesiredFlashFog += 0.001 * fog; //CyberP: 0.001 } function IncreaseClientFlashLength(float NewFlashTime) { FlashTimer = FMax(NewFlashTime,FlashTimer); } // ---------------------------------------------------------------------- // ViewFlash() // modified so that flash doesn't always go away in exactly half a second. // --------------------------------------------------------------------- function ViewFlash(float DeltaTime) { local float delta; local vector goalFog; local float goalscale, ReductionFactor; ReductionFactor = 2; if (FlashTimer > 0) { if (FlashTimer < Deltatime) { FlashTimer = 0; } else { ReductionFactor = 0; FlashTimer -= Deltatime; } } if ( bNoFlash ) { InstantFlash = 0; InstantFog = vect(0,0,0); } delta = FMin(0.1, DeltaTime); goalScale = 1 + DesiredFlashScale + ConstantGlowScale + HeadRegion.Zone.ViewFlash.X; goalFog = DesiredFlashFog + ConstantGlowFog + HeadRegion.Zone.ViewFog; DesiredFlashScale -= DesiredFlashScale * ReductionFactor * delta; DesiredFlashFog -= DesiredFlashFog * ReductionFactor * delta; FlashScale.X += (goalScale - FlashScale.X + InstantFlash) * 10 * delta; FlashFog += (goalFog - FlashFog + InstantFog) * 10 * delta; InstantFlash = 0; InstantFog = vect(0,0,0); if ( FlashScale.X > 0.981 ) FlashScale.X = 1; FlashScale = FlashScale.X * vect(1,1,1); if ( FlashFog.X < 0.019 ) FlashFog.X = 0; if ( FlashFog.Y < 0.019 ) FlashFog.Y = 0; if ( FlashFog.Z < 0.019 ) FlashFog.Z = 0; } // ---------------------------------------------------------------------- // ViewModelAdd() // // lets an artist (or whoever) view a model and play animations on it // from within the game // ---------------------------------------------------------------------- exec function ViewModelAdd(int num, string ClassName) { local class<actor> ViewModelClass; local rotator newrot; local vector loc; if (!bCheatsEnabled) return; if(instr(ClassName, ".") == -1) ClassName = "DeusEx." $ ClassName; if ((num >= 0) && (num <= 8)) { if (num > 0) num--; if (ViewModelActor[num] == None) { ViewModelClass = class<actor>(DynamicLoadObject(ClassName, class'Class')); if (ViewModelClass != None) { newrot = Rotation; newrot.Roll = 0; newrot.Pitch = 0; loc = Location + (ViewModelClass.Default.CollisionRadius + CollisionRadius + 32) * Vector(newrot); loc.Z += ViewModelClass.Default.CollisionHeight; ViewModelActor[num] = Spawn(ViewModelClass,,, loc, newrot); if (ViewModelActor[num] != None) ViewModelActor[num].SetPhysics(PHYS_None); if (ScriptedPawn(ViewModelActor[num]) != None) ViewModelActor[num].GotoState('Paralyzed'); } } else ClientMessage("There is already a ViewModel in that slot!"); } } // ---------------------------------------------------------------------- // ViewModelDestroy() // // destroys the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelDestroy(int num) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) { ViewModelActor[i].Destroy(); ViewModelActor[i] = None; } } else { i = num - 1; if (ViewModelActor[i] != None) { ViewModelActor[i].Destroy(); ViewModelActor[i] = None; } } } } // ---------------------------------------------------------------------- // ViewModelPlay() // // plays an animation on the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelPlay(int num, name anim, optional float fps) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].PlayAnim(anim, fps); } } else { i = num - 1; if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].PlayAnim(anim, fps); } } } } // ---------------------------------------------------------------------- // ViewModelLoop() // // loops an animation on the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelLoop(int num, name anim, optional float fps) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].LoopAnim(anim, fps); } } else { i = num - 1; if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].LoopAnim(anim, fps); } } } } // ---------------------------------------------------------------------- // ViewModelBlendPlay() // // plays a blended animation on the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelBlendPlay(int num, name anim, optional float fps, optional int slot) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].PlayBlendAnim(anim, fps, , slot); } } else { i = num - 1; if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].PlayBlendAnim(anim, fps, , slot); } } } } // ---------------------------------------------------------------------- // ViewModelBlendStop() // // stops the blended animation on the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelBlendStop(int num) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) ViewModelActor[i].StopBlendAnims(); } else { i = num - 1; if (ViewModelActor[i] != None) ViewModelActor[i].StopBlendAnims(); } } } exec function ViewModelGiveWeapon(int num, string weaponClass) { local class<Actor> NewClass; local Actor obj; local int i; local ScriptedPawn pawn; if (!bCheatsEnabled) return; if (instr(weaponClass, ".") == -1) weaponClass = "DeusEx." $ weaponClass; if ((num >= 0) && (num <= 8)) { NewClass = class<Actor>(DynamicLoadObject(weaponClass, class'Class')); if (NewClass != None) { obj = Spawn(NewClass,,, Location + (CollisionRadius+NewClass.Default.CollisionRadius+30) * Vector(Rotation) + vect(0,0,1) * 15); if ((obj != None) && obj.IsA('DeusExWeapon')) { if (num == 0) { for (i=0; i<8; i++) { pawn = ScriptedPawn(ViewModelActor[i]); if (pawn != None) { DeusExWeapon(obj).GiveTo(pawn); obj.SetBase(pawn); pawn.Weapon = DeusExWeapon(obj); pawn.PendingWeapon = DeusExWeapon(obj); } } } else { i = num - 1; pawn = ScriptedPawn(ViewModelActor[i]); if (pawn != None) { DeusExWeapon(obj).GiveTo(pawn); obj.SetBase(pawn); pawn.Weapon = DeusExWeapon(obj); pawn.PendingWeapon = DeusExWeapon(obj); } } } else { if (obj != None) obj.Destroy(); } } } } // ---------------------------------------------------------------------- // aliases to ViewModel functions // ---------------------------------------------------------------------- exec function VMA(int num, string ClassName) { ViewModelAdd(num, ClassName); } exec function VMD(int num) { ViewModelDestroy(num); } exec function VMP(int num, name anim, optional float fps) { ViewModelPlay(num, anim, fps); } exec function VML(int num, name anim, optional float fps) { ViewModelLoop(num, anim, fps); } exec function VMBP(int num, name anim, optional float fps, optional int slot) { ViewModelBlendPlay(num, anim, fps, slot); } exec function VMBS(int num) { ViewModelBlendStop(num); } exec function VMGW(int num, string weaponClass) { ViewModelGiveWeapon(num, weaponClass); } // ---------------------------------------------------------------------- // Cheat functions // // ---------------------------------------------------------------------- // AllHealth() // ---------------------------------------------------------------------- exec function AllHealth() { if (!bCheatsEnabled) return; RestoreAllHealth(); } // ---------------------------------------------------------------------- // RestoreAllHealth() // mod by dasraiser for GMDX MedSkill additional health // ---------------------------------------------------------------------- function RestoreAllHealth() { local int spill; local Skill sk; local float MedSkillAdd; MedSkillAdd=0.0; if (SkillSystem!=None) { sk = SkillSystem.GetSkillFromClass(Class'DeusEx.SkillMedicine'); if (sk!=None) MedSkillAdd=sk.CurrentLevel*10; } HealthHead = default.HealthHead+MedSkillAdd; HealthTorso = default.HealthTorso+MedSkillAdd; HealthLegLeft = default.HealthLegLeft; HealthLegRight = default.HealthLegRight; HealthArmLeft = default.HealthArmLeft; HealthArmRight = default.HealthArmRight; Health = default.Health; } // ---------------------------------------------------------------------- // DamagePart() // ---------------------------------------------------------------------- exec function DamagePart(int partIndex, optional int amount) { if (!bCheatsEnabled) return; if (amount == 0) amount = 1000; switch(partIndex) { case 0: // head HealthHead -= Min(HealthHead, amount); break; case 1: // torso HealthTorso -= Min(HealthTorso, amount); break; case 2: // left arm HealthArmLeft -= Min(HealthArmLeft, amount); break; case 3: // right arm HealthArmRight -= Min(HealthArmRight, amount); break; case 4: // left leg HealthLegLeft -= Min(HealthLegLeft, amount); break; case 5: // right leg HealthLegRight -= Min(HealthLegRight, amount); break; } } // ---------------------------------------------------------------------- // DamageAll() // ---------------------------------------------------------------------- exec function DamageAll(optional int amount) { if (!bCheatsEnabled) return; if (amount == 0) amount = 1000; HealthHead -= Min(HealthHead, amount); HealthTorso -= Min(HealthTorso, amount); HealthArmLeft -= Min(HealthArmLeft, amount); HealthArmRight -= Min(HealthArmRight, amount); HealthLegLeft -= Min(HealthLegLeft, amount); HealthLegRight -= Min(HealthLegRight, amount); } // ---------------------------------------------------------------------- // AllEnergy() // ---------------------------------------------------------------------- exec function AllEnergy() { if (!bCheatsEnabled) return; Energy = default.Energy; } // ---------------------------------------------------------------------- // AllCredits() // ---------------------------------------------------------------------- exec function AllCredits() { if (!bCheatsEnabled) return; Credits = 100000; } // --------------------------------------------------------------------- // AllSkills() // ---------------------------------------------------------------------- exec function AllSkills() { if (!bCheatsEnabled) return; AllSkillPoints(); SkillSystem.AddAllSkills(); } // ---------------------------------------------------------------------- // AllSkillPoints() // ---------------------------------------------------------------------- exec function AllSkillPoints() { if (!bCheatsEnabled) return; SkillPointsTotal = 115900; SkillPointsAvail = 115900; } // ---------------------------------------------------------------------- // AllAugs() // ---------------------------------------------------------------------- exec function AllAugs() { local Augmentation anAug; local int i; if (!bCheatsEnabled) return; if (AugmentationSystem != None) { AugmentationSystem.AddAllAugs(); AugmentationSystem.SetAllAugsToMaxLevel(); } } // ---------------------------------------------------------------------- // AllWeapons() // ---------------------------------------------------------------------- exec function AllWeapons() { local Vector loc; if (!bCheatsEnabled) return; loc = Location + 2 * CollisionRadius * Vector(ViewRotation); Spawn(class'WeaponAssaultGun',,, loc); Spawn(class'WeaponAssaultShotgun',,, loc); Spawn(class'WeaponBaton',,, loc); Spawn(class'WeaponCombatKnife',,, loc); Spawn(class'WeaponCrowbar',,, loc); Spawn(class'WeaponEMPGrenade',,, loc); Spawn(class'WeaponFlamethrower',,, loc); Spawn(class'WeaponGasGrenade',,, loc); Spawn(class'WeaponGEPGun',,, loc); Spawn(class'WeaponHideAGun',,, loc); Spawn(class'WeaponLAM',,, loc); Spawn(class'WeaponLAW',,, loc); Spawn(class'WeaponMiniCrossbow',,, loc); Spawn(class'WeaponNanoSword',,, loc); Spawn(class'WeaponNanoVirusGrenade',,, loc); Spawn(class'WeaponPepperGun',,, loc); Spawn(class'WeaponPistol',,, loc); Spawn(class'WeaponPlasmaRifle',,, loc); Spawn(class'WeaponProd',,, loc); Spawn(class'WeaponRifle',,, loc); Spawn(class'WeaponSawedOffShotgun',,, loc); Spawn(class'WeaponShuriken',,, loc); Spawn(class'WeaponStealthPistol',,, loc); Spawn(class'WeaponSword',,, loc); } // ---------------------------------------------------------------------- // AllImages() // ---------------------------------------------------------------------- exec function AllImages() { local Vector loc; local Inventory item; if (!bCheatsEnabled) return; item = Spawn(class'Image01_GunFireSensor'); item.Frob(Self, None); item = Spawn(class'Image01_LibertyIsland'); item.Frob(Self, None); item = Spawn(class'Image01_TerroristCommander'); item.Frob(Self, None); item = Spawn(class'Image02_Ambrosia_Flyer'); item.Frob(Self, None); item = Spawn(class'Image02_NYC_Warehouse'); item.Frob(Self, None); item = Spawn(class'Image02_BobPage_ManOfYear'); item.Frob(Self, None); item = Spawn(class'Image03_747Diagram'); item.Frob(Self, None); item = Spawn(class'Image03_NYC_Airfield'); item.Frob(Self, None); item = Spawn(class'Image03_WaltonSimons'); item.Frob(Self, None); item = Spawn(class'Image04_NSFHeadquarters'); item.Frob(Self, None); item = Spawn(class'Image04_UNATCONotice'); item.Frob(Self, None); item = Spawn(class'Image05_GreaselDisection'); item.Frob(Self, None); item = Spawn(class'Image05_NYC_MJ12Lab'); item.Frob(Self, None); item = Spawn(class'Image06_HK_Market'); item.Frob(Self, None); item = Spawn(class'Image06_HK_MJ12Helipad'); item.Frob(Self, None); item = Spawn(class'Image06_HK_MJ12Lab'); item.Frob(Self, None); item = Spawn(class'Image06_HK_Versalife'); item.Frob(Self, None); item = Spawn(class'Image06_HK_WanChai'); item.Frob(Self, None); item = Spawn(class'Image08_JoeGreenMIBMJ12'); item.Frob(Self, None); item = Spawn(class'Image09_NYC_Ship_Bottom'); item.Frob(Self, None); item = Spawn(class'Image09_NYC_Ship_Top'); item.Frob(Self, None); item = Spawn(class'Image10_Paris_Catacombs'); item.Frob(Self, None); item = Spawn(class'Image10_Paris_CatacombsTunnels'); item.Frob(Self, None); item = Spawn(class'Image10_Paris_Metro'); item.Frob(Self, None); item = Spawn(class'Image11_Paris_Cathedral'); item.Frob(Self, None); item = Spawn(class'Image11_Paris_CathedralEntrance'); item.Frob(Self, None); item = Spawn(class'Image12_Vandenberg_Command'); item.Frob(Self, None); item = Spawn(class'Image12_Vandenberg_Sub'); item.Frob(Self, None); item = Spawn(class'Image12_Tiffany_HostagePic'); item.Frob(Self, None); item = Spawn(class'Image14_OceanLab'); item.Frob(Self, None); item = Spawn(class'Image14_Schematic'); item.Frob(Self, None); item = Spawn(class'Image15_Area51Bunker'); item.Frob(Self, None); item = Spawn(class'Image15_GrayDisection'); item.Frob(Self, None); item = Spawn(class'Image15_BlueFusionDevice'); item.Frob(Self, None); item = Spawn(class'Image15_Area51_Sector3'); item.Frob(Self, None); item = Spawn(class'Image15_Area51_Sector4'); item.Frob(Self, None); } // ---------------------------------------------------------------------- // Trig() // ---------------------------------------------------------------------- exec function Trig(name ev) { local Actor A; if (!bCheatsEnabled) return; if (ev != '') foreach AllActors(class'Actor', A, ev) A.Trigger(Self, Self); } // ---------------------------------------------------------------------- // UnTrig() // ---------------------------------------------------------------------- exec function UnTrig(name ev) { local Actor A; if (!bCheatsEnabled) return; if (ev != '') foreach AllActors(class'Actor', A, ev) A.UnTrigger(Self, Self); } // ---------------------------------------------------------------------- // SetState() // ---------------------------------------------------------------------- exec function SetState(name state) { local ScriptedPawn P; local Actor hitActor; local vector loc, line, HitLocation, hitNormal; if (!bCheatsEnabled) return; loc = Location; loc.Z += BaseEyeHeight; line = Vector(ViewRotation) * 2000; hitActor = Trace(hitLocation, hitNormal, loc+line, loc, true); P = ScriptedPawn(hitActor); if (P != None) { P.GotoState(state); ClientMessage("Setting "$P.BindName$" to the "$state$" state"); } } // ---------------------------------------------------------------------- // DXDumpInfo() // // Dumps the following player information to the log file // - inventory (with item counts) // - health (as %) // - energy (as %) // - credits // - skill points (avail and max) // - skills // - augmentations // ---------------------------------------------------------------------- exec function DXDumpInfo() { local DumpLocation dumploc; local DeusExLevelInfo info; local string userName, mapName, strCopies; local Inventory item, nextItem; local DeusExWeapon W; local Skill skill; local Augmentation aug; local bool bHasAugs; dumploc = CreateDumpLocationObject(); if (dumploc != None) { userName = dumploc.GetCurrentUser(); CriticalDelete(dumploc); } if (userName == "") userName = "NO USERNAME"; mapName = "NO MAPNAME"; foreach AllActors(class'DeusExLevelInfo', info) mapName = info.MapName; log(""); log("**** DXDumpInfo - User: "$userName$" - Map: "$mapName$" ****"); log(""); log(" Inventory:"); if (Inventory != None) { item = Inventory; do { nextItem = item.Inventory; if (item.bDisplayableInv || item.IsA('Ammo')) { W = DeusExWeapon(item); if ((W != None) && W.bHandToHand && (W.ProjectileClass != None)) strCopies = " ("$W.AmmoType.AmmoAmount$" rds)"; else if (item.IsA('Ammo') && (Ammo(item).PickupViewMesh != Mesh'TestBox')) strCopies = " ("$Ammo(item).AmmoAmount$" rds)"; else if (item.IsA('Pickup') && (Pickup(item).NumCopies > 1)) strCopies = " ("$Pickup(item).NumCopies$")"; else strCopies = ""; log(" "$item.GetItemName(String(item.Class))$strCopies); } item = nextItem; } until (item == None); } else log(" Empty"); GenerateTotalHealth(); log(""); log(" Health:"); log(" Overall - "$Health$"%"); log(" Head - "$HealthHead$"%"); log(" Torso - "$HealthTorso$"%"); log(" Left arm - "$HealthArmLeft$"%"); log(" Right arm - "$HealthArmRight$"%"); log(" Left leg - "$HealthLegLeft$"%"); log(" Right leg - "$HealthLegRight$"%"); log(""); log(" BioElectric Energy:"); log(" "$Int(Energy)$"%"); log(""); log(" Credits:"); log(" "$Credits); log(""); log(" Skill Points:"); log(" Available - "$SkillPointsAvail); log(" Total Earned - "$SkillPointsTotal); log(""); log(" Skills:"); if (SkillSystem != None) { skill = SkillSystem.FirstSkill; while (skill != None) { if (skill.SkillName != "") log(" "$skill.SkillName$" - "$skill.skillLevelStrings[skill.CurrentLevel]); skill = skill.next; } } bHasAugs = False; log(""); log(" Augmentations:"); if (AugmentationSystem != None) { aug = AugmentationSystem.FirstAug; while (aug != None) { if (aug.bHasIt && (aug.AugmentationLocation != LOC_Default) && (aug.AugmentationName != "")) { bHasAugs = True; log(" "$aug.AugmentationName$" - Location: "$aug.AugLocsText[aug.AugmentationLocation]$" - Level: "$aug.CurrentLevel+1); } aug = aug.next; } } if (!bHasAugs) log(" None"); log(""); log("**** DXDumpInfo - END ****"); log(""); ClientMessage("Info dumped for user "$userName); } // ---------------------------------------------------------------------- // InvokeUIScreen() // // Calls DeusExRootWindow::InvokeUIScreen(), but first make sure // a modifier (Alt, Shift, Ctrl) key isn't being held down. // ---------------------------------------------------------------------- function InvokeUIScreen(Class<DeusExBaseWindow> windowClass) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) { if ( root.IsKeyDown( IK_Alt ) || root.IsKeyDown( IK_Shift ) || root.IsKeyDown( IK_Ctrl )) return; //GMDX: stop lockpick and multitool cheat if (InHand!=None&&InHand.IsA('SkilledTool')&&(InHand.IsA('Lockpick')||InHand.IsA('MultiTool'))) { if (SkilledTool(InHand).IsInState('UseIt')) return; //just cant InvokeUIScreen :P } if (bRealUI || bHardCoreMode) root.InvokeUIScreen(windowClass,true); else root.InvokeUIScreen(windowClass); } } // ---------------------------------------------------------------------- // ResetConversationHistory() // // Clears any conversation history, used primarily when starting a // new game or travelling to new missions // ---------------------------------------------------------------------- function ResetConversationHistory() { if (conHistory != None) { CriticalDelete(conHistory); conHistory = None; } } // ====================================================================== // ====================================================================== // COLOR THEME MANAGER FUNCTIONS // ====================================================================== // ====================================================================== // ---------------------------------------------------------------------- // CreateThemeManager() // ---------------------------------------------------------------------- function CreateColorThemeManager() { if (ThemeManager == None) { ThemeManager = Spawn(Class'ColorThemeManager', Self); // Add all default themes. // Menus ThemeManager.AddTheme(Class'ColorThemeMenu_Default'); ThemeManager.AddTheme(Class'ColorThemeMenu_Custom1'); ThemeManager.AddTheme(Class'ColorThemeMenu_BlueAndGold'); ThemeManager.AddTheme(Class'ColorThemeMenu_CoolGreen'); ThemeManager.AddTheme(Class'ColorThemeMenu_Cops'); ThemeManager.AddTheme(Class'ColorThemeMenu_Cyan'); ThemeManager.AddTheme(Class'ColorThemeMenu_DesertStorm'); ThemeManager.AddTheme(Class'ColorThemeMenu_DriedBlood'); ThemeManager.AddTheme(Class'ColorThemeMenu_Dusk'); ThemeManager.AddTheme(Class'ColorThemeMenu_Earth'); ThemeManager.AddTheme(Class'ColorThemeMenu_Green'); ThemeManager.AddTheme(Class'ColorThemeMenu_Grey'); ThemeManager.AddTheme(Class'ColorThemeMenu_IonStorm'); ThemeManager.AddTheme(Class'ColorThemeMenu_Lava'); ThemeManager.AddTheme(Class'ColorThemeMenu_NightVision'); ThemeManager.AddTheme(Class'ColorThemeMenu_Ninja'); ThemeManager.AddTheme(Class'ColorThemeMenu_Olive'); ThemeManager.AddTheme(Class'ColorThemeMenu_PaleGreen'); ThemeManager.AddTheme(Class'ColorThemeMenu_Pastel'); ThemeManager.AddTheme(Class'ColorThemeMenu_Plasma'); ThemeManager.AddTheme(Class'ColorThemeMenu_Primaries'); ThemeManager.AddTheme(Class'ColorThemeMenu_Purple'); ThemeManager.AddTheme(Class'ColorThemeMenu_Red'); ThemeManager.AddTheme(Class'ColorThemeMenu_Seawater'); ThemeManager.AddTheme(Class'ColorThemeMenu_SoylentGreen'); ThemeManager.AddTheme(Class'ColorThemeMenu_Starlight'); ThemeManager.AddTheme(Class'ColorThemeMenu_Steel'); ThemeManager.AddTheme(Class'ColorThemeMenu_SteelGreen'); ThemeManager.AddTheme(Class'ColorThemeMenu_Superhero'); ThemeManager.AddTheme(Class'ColorThemeMenu_Terminator'); ThemeManager.AddTheme(Class'ColorThemeMenu_Violet'); // HUD ThemeManager.AddTheme(Class'ColorThemeHUD_Default'); ThemeManager.AddTheme(Class'ColorThemeHUD_Custom2'); ThemeManager.AddTheme(Class'ColorThemeHUD_Amber'); ThemeManager.AddTheme(Class'ColorThemeHUD_Cops'); ThemeManager.AddTheme(Class'ColorThemeHUD_Cyan'); ThemeManager.AddTheme(Class'ColorThemeHUD_DarkBlue'); ThemeManager.AddTheme(Class'ColorThemeHUD_DesertStorm'); ThemeManager.AddTheme(Class'ColorThemeHUD_DriedBlood'); ThemeManager.AddTheme(Class'ColorThemeHUD_Dusk'); ThemeManager.AddTheme(Class'ColorThemeHUD_Grey'); ThemeManager.AddTheme(Class'ColorThemeHUD_IonStorm'); ThemeManager.AddTheme(Class'ColorThemeHUD_NightVision'); ThemeManager.AddTheme(Class'ColorThemeHUD_Ninja'); ThemeManager.AddTheme(Class'ColorThemeHUD_PaleGreen'); ThemeManager.AddTheme(Class'ColorThemeHUD_Pastel'); ThemeManager.AddTheme(Class'ColorThemeHUD_Plasma'); ThemeManager.AddTheme(Class'ColorThemeHUD_Primaries'); ThemeManager.AddTheme(Class'ColorThemeHUD_Purple'); ThemeManager.AddTheme(Class'ColorThemeHUD_Red'); ThemeManager.AddTheme(Class'ColorThemeHUD_SoylentGreen'); ThemeManager.AddTheme(Class'ColorThemeHUD_Starlight'); ThemeManager.AddTheme(Class'ColorThemeHUD_SteelGreen'); ThemeManager.AddTheme(Class'ColorThemeHUD_Superhero'); ThemeManager.AddTheme(Class'ColorThemeHUD_Terminator'); ThemeManager.AddTheme(Class'ColorThemeHUD_Violet'); } } // ---------------------------------------------------------------------- // NextHUDColorTheme() // // Cycles to the next available HUD color theme and squirts out // a "StylesChanged" event. // ---------------------------------------------------------------------- exec function NextHUDColorTheme() { if (ThemeManager != None) { ThemeManager.NextHUDColorTheme(); DeusExRootWindow(rootWindow).ChangeStyle(); } } // ---------------------------------------------------------------------- // Cycles to the next available Menu color theme and squirts out // a "StylesChanged" event. // ---------------------------------------------------------------------- exec function NextMenuColorTheme() { if (ThemeManager != None) { ThemeManager.NextMenuColorTheme(); DeusExRootWindow(rootWindow).ChangeStyle(); } } // ---------------------------------------------------------------------- // SetHUDBordersVisible() // ---------------------------------------------------------------------- exec function SetHUDBordersVisible(bool bVisible) { bHUDBordersVisible = bVisible; } // ---------------------------------------------------------------------- // GetHUDBordersVisible() // ---------------------------------------------------------------------- function bool GetHUDBordersVisible() { return bHUDBordersVisible; } // ---------------------------------------------------------------------- // SetHUDBorderTranslucency() // ---------------------------------------------------------------------- exec function SetHUDBorderTranslucency(bool bNewTranslucency) { bHUDBordersTranslucent = bNewTranslucency; } // ---------------------------------------------------------------------- // GetHUDBorderTranslucency() // ---------------------------------------------------------------------- function bool GetHUDBorderTranslucency() { return bHUDBordersTranslucent; } // ---------------------------------------------------------------------- // SetHUDBackgroundTranslucency() // ---------------------------------------------------------------------- exec function SetHUDBackgroundTranslucency(bool bNewTranslucency) { bHUDBackgroundTranslucent = bNewTranslucency; } // ---------------------------------------------------------------------- // GetHUDBackgroundTranslucency() // ---------------------------------------------------------------------- function bool GetHUDBackgroundTranslucency() { return bHUDBackgroundTranslucent; } // ---------------------------------------------------------------------- // SetMenuTranslucency() // ---------------------------------------------------------------------- exec function SetMenuTranslucency(bool bNewTranslucency) { bMenusTranslucent = bNewTranslucency; } // ---------------------------------------------------------------------- // GetMenuTranslucency() // ---------------------------------------------------------------------- function bool GetMenuTranslucency() { return bMenusTranslucent; } // ---------------------------------------------------------------------- // DebugInfo test functions // ---------------------------------------------------------------------- exec function DebugCommand(string teststr) { if (!bCheatsEnabled) return; if (GlobalDebugObj == None) GlobalDebugObj = new(Self) class'DebugInfo'; if (GlobalDebugObj != None) GlobalDebugObj.Command(teststr); } exec function SetDebug(name cmd, name val) { if (!bCheatsEnabled) return; if (GlobalDebugObj == None) GlobalDebugObj = new(Self) class'DebugInfo'; Log("Want to setting Debug String " $ cmd $ " to " $ val); if (GlobalDebugObj != None) GlobalDebugObj.SetString(String(cmd),String(val)); } exec function GetDebug(name cmd) { local string temp; if (!bCheatsEnabled) return; if (GlobalDebugObj == None) GlobalDebugObj = new(Self) class'DebugInfo'; if (GlobalDebugObj != None) { temp=GlobalDebugObj.GetString(String(cmd)); Log("Debug String " $ cmd $ " has value " $ temp); } } exec function LogMsg(string msg) { Log(msg); } simulated event Destroyed() { if (GlobalDebugObj != None) CriticalDelete(GlobalDebugObj); ClearAugmentationDisplay(); if (Role == ROLE_Authority) CloseThisComputer(ActiveComputer); ActiveComputer = None; Super.Destroyed(); } // ---------------------------------------------------------------------- // Actor Location and Movement commands // ---------------------------------------------------------------------- exec function MoveActor(int xPos, int yPos, int zPos) { local Actor hitActor; local Vector hitLocation, hitNormal; local Vector position, line, newPos; if (!bCheatsEnabled) return; position = Location; position.Z += BaseEyeHeight; line = Vector(ViewRotation) * 4000; hitActor = Trace(hitLocation, hitNormal, position+line, position, true); if (hitActor != None) { newPos.x=xPos; newPos.y=yPos; newPos.z=zPos; // hitPawn = ScriptedPawn(hitActor); Log( "Trying to move " $ hitActor.Name $ " from " $ hitActor.Location $ " to " $ newPos); hitActor.SetLocation(newPos); Log( "Ended up at " $ hitActor.Location ); } } exec function WhereActor(optional int Me) { local Actor hitActor; local Vector hitLocation, hitNormal; local Vector position, line, newPos; if (!bCheatsEnabled) return; if (Me==1) hitActor=self; else { position = Location; position.Z += BaseEyeHeight; line = Vector(ViewRotation) * 4000; hitActor = Trace(hitLocation, hitNormal, position+line, position, true); } if (hitActor != None) { Log( hitActor.Name $ " is at " $ hitActor.Location ); BroadcastMessage( hitActor.Name $ " is at " $ hitActor.Location ); } } // ---------------------------------------------------------------------- // Easter egg functions // ---------------------------------------------------------------------- function Matrix() { if (Sprite == None) { Sprite = Texture(DynamicLoadObject("Extras.Matrix_A00", class'Texture')); ConsoleCommand("RMODE 6"); } else { Sprite = None; ConsoleCommand("RMODE 5"); } } exec function IAmWarren() { if (!bCheatsEnabled) return; if (!bWarrenEMPField) { bWarrenEMPField = true; WarrenTimer = 0; WarrenSlot = 0; ClientMessage("Warren's EMP Field activated"); // worry about localization? } else { bWarrenEMPField = false; ClientMessage("Warren's EMP Field deactivated"); // worry about localization? } } // ---------------------------------------------------------------------- // UsingChargedPickup // ---------------------------------------------------------------------- function bool UsingChargedPickup(class<ChargedPickup> itemclass) { local inventory CurrentItem; local bool bFound; bFound = false; for (CurrentItem = Inventory; ((CurrentItem != None) && (!bFound)); CurrentItem = CurrentItem.inventory) { if ((CurrentItem.class == itemclass) && (CurrentItem.bActive)) bFound = true; } return bFound; } // ---------------------------------------------------------------------- // MultiplayerSpecificFunctions // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- // ReceiveFirstOptionSync() // DEUS_EX AMSD I have to enumerate every 2#%#@%Ing argument??? // ---------------------------------------------------------------------- function ReceiveFirstOptionSync ( Name PrefZero, Name PrefOne, Name PrefTwo, Name PrefThree, Name PrefFour) { local int i; local Name AugPriority[5]; if (bFirstOptionsSynced == true) { return; } AugPriority[0] = PrefZero; AugPriority[1] = PrefOne; AugPriority[2] = PrefTwo; AugPriority[3] = PrefThree; AugPriority[4] = PrefFour; for (i = 0; ((i < ArrayCount(AugPrefs)) && (i < ArrayCount(AugPriority))); i++) { AugPrefs[i] = AugPriority[i]; } bFirstOptionsSynced = true; if (Role == ROLE_Authority) { if ((DeusExMPGame(Level.Game) != None) && (bSecondOptionsSynced)) { DeusExMPGame(Level.Game).SetupAbilities(self); } } } // ---------------------------------------------------------------------- // ReceiveSecondOptionSync() // DEUS_EX AMSD I have to enumerate every 2#%#@%Ing argument??? // ---------------------------------------------------------------------- function ReceiveSecondOptionSync ( Name PrefFive, Name PrefSix, Name PrefSeven, Name PrefEight) { local int i; local Name AugPriority[9]; if (bSecondOptionsSynced == true) { return; } AugPriority[5] = PrefFive; AugPriority[6] = PrefSix; AugPriority[7] = PrefSeven; AugPriority[8] = PrefEight; for (i = 5; ((i < ArrayCount(AugPrefs)) && (i < ArrayCount(AugPriority))); i++) { AugPrefs[i] = AugPriority[i]; } bSecondOptionsSynced = true; if (Role == ROLE_Authority) { if ((DeusExMPGame(Level.Game) != None) && (bFirstOptionsSynced)) { DeusExMPGame(Level.Game).SetupAbilities(self); } } } // ---------------------------------------------------------------------- // ClientPlayAnimation // ---------------------------------------------------------------------- simulated function ClientPlayAnimation( Actor src, Name anim, float rate, bool bLoop ) { if ( src != None ) { // if ( bLoop ) // src.LoopAnim(anim, ,rate); // else src.PlayAnim(anim, ,rate); } } // ---------------------------------------------------------------------- // ClientSpawnProjectile // ---------------------------------------------------------------------- simulated function ClientSpawnProjectile( class<projectile> ProjClass, Actor owner, Vector Start, Rotator AdjustedAim ) { local DeusExProjectile proj; proj = DeusExProjectile(Spawn(ProjClass, Owner,, Start, AdjustedAim)); if ( proj != None ) { proj.RemoteRole = ROLE_None; proj.Damage = 0; } } // ---------------------------------------------------------------------- // ClientSpawnHits // ---------------------------------------------------------------------- simulated function ClientSpawnHits( bool bPenetrating, bool bHandToHand, Vector HitLocation, Vector HitNormal, Actor Other, float Damage) { local TraceHitSpawner hitspawner; log("DX"); if (inHand.isA('WeaponNanoSword')) { class'TraceHitSpawner'.default.bForceBulletHole=true; log("NANO FOUND"); } if (bPenetrating) { if (bHandToHand) { hitspawner = Spawn(class'TraceHitHandSpawner',Other,,HitLocation,Rotator(HitNormal)); } else { hitspawner = Spawn(class'TraceHitSpawner',Other,,HitLocation,Rotator(HitNormal)); hitspawner.HitDamage = Damage; } } else { if (bHandToHand) { hitspawner = Spawn(class'TraceHitHandNonPenSpawner',Other,,HitLocation,Rotator(HitNormal)); if (IsInState('Dying')) hitspawner = none; //CyberP: death overrides melee attacks } else { hitspawner = Spawn(class'TraceHitNonPenSpawner',Other,,HitLocation,Rotator(HitNormal)); } } if (hitSpawner != None) { hitspawner.HitDamage = Damage; if (inHand.isA('WeaponNanoSword')) { log("From DXplayer"); hitSpawner.damageType='NanoSword'; } } } // ---------------------------------------------------------------------- // NintendoImmunityEffect() // ---------------------------------------------------------------------- function NintendoImmunityEffect( bool on ) { bNintendoImmunity = on; if (bNintendoImmunity) { NintendoImmunityTime = Level.Timeseconds + NintendoDelay; NintendoImmunityTimeLeft = NintendoDelay; } else NintendoImmunityTimeLeft = 0.0; } // ---------------------------------------------------------------------- // GetAugPriority() // Returns -1 if the player has the aug. // Returns 0-8 (0 being higher priority) for the aug priority. // If the player doesn't list the aug as a priority, returns the first // unoccupied slot num (9 if all are filled). // ---------------------------------------------------------------------- function int GetAugPriority( Augmentation AugToCheck) { local Name AugName; local int PriorityIndex; AugName = AugToCheck.Class.Name; if (AugToCheck.bHasIt) return -1; for (PriorityIndex = 0; PriorityIndex < ArrayCount(AugPrefs); PriorityIndex++) { if (AugPrefs[PriorityIndex] == AugName) { return PriorityIndex; } if (AugPrefs[PriorityIndex] == '') { return PriorityIndex; } } return PriorityIndex; } // ---------------------------------------------------------------------- // GrantAugs() // Grants augs in order of priority. // Sadly, we do this on the client because propagation of requested augs // takes so long. // ---------------------------------------------------------------------- function GrantAugs(int NumAugs) { local Augmentation CurrentAug; local int PriorityIndex; local int AugsLeft; if (Role < ROLE_Authority) return; AugsLeft = NumAugs; for (PriorityIndex = 0; PriorityIndex < ArrayCount(AugPrefs); PriorityIndex++) { if (AugsLeft <= 0) { return; } if (AugPrefs[PriorityIndex] == '') { return; } for (CurrentAug = AugmentationSystem.FirstAug; CurrentAug != None; CurrentAug = CurrentAug.next) { if ((CurrentAug.Class.Name == AugPrefs[PriorityIndex]) && (CurrentAug.bHasIt == False)) { AugmentationSystem.GivePlayerAugmentation(CurrentAug.Class); // Max out aug if (CurrentAug.bHasIt) CurrentAug.CurrentLevel = CurrentAug.MaxLevel; AugsLeft = AugsLeft - 1; } } } } // ------------------------------------------------------------------------ // GiveInitialInventory() // ------------------------------------------------------------------------ function GiveInitialInventory() { local Inventory anItem; // Give the player a pistol. // spawn it. if ((!Level.Game.IsA('DeusExMPGame')) || (DeusExMPGame(Level.Game).bStartWithPistol)) { anItem = Spawn(class'WeaponPistol'); // "frob" it for pickup. This will spawn a copy and give copy to player. anItem.Frob(Self,None); // Set it to be in belt (it will be the first inventory item) inventory.bInObjectBelt = True; // destroy original. anItem.Destroy(); // Give some starting ammo. anItem = Spawn(class'Ammo10mm'); DeusExAmmo(anItem).AmmoAmount=50; anItem.Frob(Self,None); anItem.Destroy(); } // Give the player a medkit. anItem = Spawn(class'MedKit'); anItem.Frob(Self,None); inventory.bInObjectBelt = True; anItem.Destroy(); // Give them a lockpick and a multitool so they can make choices with skills // when they come across electronics and locks anItem = Spawn(class'Lockpick'); anItem.Frob(Self,None); inventory.bInObjectBelt = True; anItem.Destroy(); anItem = Spawn(class'Multitool'); anItem.Frob(Self,None); inventory.bInObjectBelt = True; anItem.Destroy(); } // ---------------------------------------------------------------------- // MultiplayerTick() // Not the greatest name, handles single player ticks as well. Basically // anything tick style stuff that should be propagated to the server gets // propagated as this one function call. // ---------------------------------------------------------------------- function MultiplayerTick(float DeltaTime) { local int burnTime; local float augLevel; Super.MultiplayerTick(DeltaTime); //If we've just put away items, reset this. if ((LastInHand != InHand) && (Level.Netmode == NM_Client) && (inHand == None)) { ClientInHandPending = None; } LastInHand = InHand; if ((PlayerIsClient()) || (Level.NetMode == NM_ListenServer)) { if ((ShieldStatus != SS_Off) && (DamageShield == None)) DrawShield(); if ( (NintendoImmunityTimeLeft > 0.0) && ( InvulnSph == None )) DrawInvulnShield(); if (Style != STY_Translucent) CreateShadow(); else KillShadow(); } if (Role < ROLE_Authority) return; UpdateInHand(); UpdatePoison(DeltaTime); if (lastRefreshTime < 0) lastRefreshTime = 0; lastRefreshTime = lastRefreshTime + DeltaTime; if (bOnFire) { if ( Level.NetMode != NM_Standalone ) burnTime = Class'WeaponFlamethrower'.Default.mpBurnTime; else burnTime = Class'WeaponFlamethrower'.Default.BurnTime; burnTimer += deltaTime; if (burnTimer >= burnTime) ExtinguishFire(); } if (lastRefreshTime < 0.25) return; if (ShieldTimer > 0) ShieldTimer = ShieldTimer - lastRefreshTime; if (ShieldStatus == SS_Fade) ShieldStatus = SS_Off; if (ShieldTimer <= 0) { if (ShieldStatus == SS_Strong) ShieldStatus = SS_Fade; } // If we have a drone active (post-death etc) and we're not using the aug, kill it off augLevel = AugmentationSystem.GetAugLevelValue(class'AugDrone'); if (( aDrone != None ) && (augLevel == -1.0)) aDrone.TakeDamage(100, None, aDrone.Location, vect(0,0,0), 'EMP'); if ( Level.Timeseconds > ServerTimeLastRefresh ) { SetServerTimeDiff( Level.Timeseconds ); ServerTimeLastRefresh = Level.Timeseconds + 10.0; } MaintainEnergy(lastRefreshTime); UpdateTranslucency(lastRefreshTime); if ( bNintendoImmunity ) { NintendoImmunityTimeLeft = NintendoImmunityTime - Level.Timeseconds; if ( Level.Timeseconds > NintendoImmunityTime ) NintendoImmunityEffect( False ); } RepairInventory(); lastRefreshTime = 0; } // ---------------------------------------------------------------------- function ForceDroneOff() { local AugDrone anAug; anAug = AugDrone(AugmentationSystem.FindAugmentation(class'AugDrone')); //foreach AllActors(class'AugDrone', anAug) if (anAug != None) anAug.Deactivate(); } // ---------------------------------------------------------------------- // PlayerIsListenClient() // Returns True if the current player is the "client" playing ON the // listen server. // ---------------------------------------------------------------------- function bool PlayerIsListenClient() { return ((GetPlayerPawn() == Self) && (Level.NetMode == NM_ListenServer)); } // ---------------------------------------------------------------------- // PlayerIsRemoteClient() // Returns true if this player is the main player of this remote client // ----------------------------------------------------------------------- function bool PlayerIsRemoteClient() { return ((Level.NetMode == NM_Client) && (Role == ROLE_AutonomousProxy)); } // ---------------------------------------------------------------------- // PlayerIsClient() // Returns true if the current player is the "client" playing ON the // listen server OR a remote client // ---------------------------------------------------------------------- function bool PlayerIsClient() { return (PlayerIsListenClient() || PlayerIsRemoteClient()); } // ---------------------------------------------------------------------- // DrawShield() // ---------------------------------------------------------------------- simulated function DrawShield() { local ShieldEffect shield; if (DamageShield != None) { return; } shield = Spawn(class'ShieldEffect', Self,, Location, Rotation); if (shield != None) { shield.SetBase(Self); shield.RemoteRole = ROLE_None; shield.AttachedPlayer = Self; } DamageShield = shield; } // ---------------------------------------------------------------------- // DrawInvulnShield() // ---------------------------------------------------------------------- simulated function DrawInvulnShield() { if (( InvulnSph != None ) || (Level.NetMode == NM_Standalone)) return; InvulnSph = Spawn(class'InvulnSphere', Self, , Location, Rotation ); if ( InvulnSph != None ) { InvulnSph.SetBase( Self ); InvulnSph.RemoteRole = ROLE_None; InvulnSph.AttachedPlayer = Self; InvulnSph.LifeSpan = NintendoImmunityTimeLeft; } } // ---------------------------------------------------------------------- // CreatePlayerTracker() // ---------------------------------------------------------------------- simulated function CreatePlayerTracker() { local MPPlayerTrack PlayerTracker; PlayerTracker = Spawn(class'MPPlayerTrack'); PlayerTracker.AttachedPlayer = Self; } // ---------------------------------------------------------------------- // DisconnectPlayer() // ---------------------------------------------------------------------- exec function DisconnectPlayer() { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ClearWindowStack(); if (PlayerIsRemoteClient()) ConsoleCommand("disconnect"); if (PlayerIsListenClient()) ConsoleCommand("start dx.dx"); } exec function ShowPlayerPawnList() { local pawn curpawn; for (curpawn = level.pawnlist; curpawn != none; curpawn = curpawn.nextpawn) log("======>Pawn is "$curpawn); } // ---------------------------------------------------------------------- // KillShadow // ---------------------------------------------------------------------- simulated function KillShadow() { if (Shadow != None) Shadow.Destroy(); Shadow = None; } // ---------------------------------------------------------------------- // CreateShadow // ---------------------------------------------------------------------- simulated function CreateShadow() { if (Shadow == None) { Shadow = Spawn(class'Shadow', Self,, Location-vect(0,0,1)*CollisionHeight, rot(16384,0,0)); if (Shadow != None) { Shadow.RemoteRole = ROLE_None; } } } // ---------------------------------------------------------------------- // LocalLog // ---------------------------------------------------------------------- function LocalLog(String S) { if (( Player != None ) && ( Player.Console != None )) Player.Console.AddString(S); } // ---------------------------------------------------------------------- // ShowDemoSplash() // ---------------------------------------------------------------------- function ShowDemoSplash() { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) root.PushWindow(Class'DemoSplashWindow'); } // ---------------------------------------------------------------------- // VerifyConsole() // Verifies that console is Engine.Console. If you want something different, // override this in a subclassed player class. // ---------------------------------------------------------------------- function VerifyConsole(Class<Console> ConsoleClass) { local bool bCheckPassed; bCheckPassed = True; if (Player.Console == None) bCheckPassed = False; else if (Player.Console.Class != ConsoleClass) bCheckPassed = False; if (bCheckPassed == False) FailConsoleCheck(); } // ---------------------------------------------------------------------- // VerifyRootWindow() // Verifies that the root window is the right kind of root window, since // it can be changed in the ini // ---------------------------------------------------------------------- function VerifyRootWindow(Class<DeusExRootWindow> WindowClass) { local bool bCheckPassed; bCheckPassed = True; if (RootWindow == None) bCheckPassed = False; else if (RootWindow.Class != WindowClass) bCheckPassed = False; if (bCheckPassed == False) FailRootWindowCheck(); } // ---------------------------------------------------------------------- // FailRootWindowCheck() // ---------------------------------------------------------------------- function FailRootWindowCheck() { if (Level.Game.IsA('DeusExGameInfo')) DeusExGameInfo(Level.Game).FailRootWindowCheck(Self); } // ---------------------------------------------------------------------- // FailConsoleCheck() // ---------------------------------------------------------------------- function FailConsoleCheck() { if (Level.Game.IsA('DeusExGameInfo')) DeusExGameInfo(Level.Game).FailConsoleCheck(Self); } // ---------------------------------------------------------------------- // Possess() // ---------------------------------------------------------------------- event Possess() { Super.Possess(); if (Level.Netmode == NM_Client) { ClientPossessed(); } } // ---------------------------------------------------------------------- // ClientPossessed() // ---------------------------------------------------------------------- function ClientPossessed() { if (Level.Game.IsA('DeusExGameInfo')) DeusExGameInfo(Level.Game).ClientPlayerPossessed(Self); } // ---------------------------------------------------------------------- // ForceDisconnect // ---------------------------------------------------------------------- function ForceDisconnect(string Message) { player.Console.AddString(Message); DisconnectPlayer(); } /* //---------------------------------------------------------------------------- // dasraiser keybind move offset and rotations // exec function MyFovPos() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyFovPos(); } exec function MyFovNeg() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyFovNeg(); } exec function MyOfsetYPos() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetYPos(); } exec function MyOfsetXPos() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetXPos(); } exec function MyOfsetZPos() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetZPos(); } exec function MyOfsetYNeg() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetYNeg(); } exec function MyOfsetXNeg() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetXNeg(); } exec function MyOfsetZNeg() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetZNeg(); } exec function MyOfsetRollPlus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetRollPlus(); } exec function MyOfsetPitchPlus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetPitchPlus(); } exec function MyOfsetYawPlus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetYawPlus(); } exec function MyOfsetRollMinus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetRollMinus(); } exec function MyOfsetPitchMinus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetPitchMinus(); } exec function MyOfsetYawMinus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetYawMinus(); } exec function MyLogInfos() { log("test"); if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyLogInfos(); } */ // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- defaultproperties { TruePlayerName="JC Denton" CombatDifficulty=1.000000 SkillPointsTotal=5000 SkillPointsAvail=5000 Credits=500 Energy=100.000000 EnergyMax=100.000000 MaxRegenPoint=25.000000 RegenRate=1.500000 MaxFrobDistance=112.000000 maxInvRows=6 maxInvCols=5 bBeltIsMPInventory=True RunSilentValue=1.000000 ClotPeriod=30.000000 strStartMap="01_NYC_UNATCOIsland" bObjectNames=True bNPCHighlighting=True bSubtitles=True bAlwaysRun=True logTimeout=3.000000 maxLogLines=4 bHelpMessages=True bObjectBeltVisible=True bHitDisplayVisible=True bAmmoDisplayVisible=True bAugDisplayVisible=True bDisplayAmmoByClip=True bCompassVisible=True bCrosshairVisible=True bAutoReload=True bDisplayAllGoals=True bHUDShowAllAugs=True bShowAmmoDescriptions=True bConfirmSaveDeletes=True bConfirmNoteDeletes=True bAskedToTrain=True AugPrefs(0)=AugVision AugPrefs(1)=AugHealing AugPrefs(2)=AugSpeed AugPrefs(3)=AugDefense AugPrefs(4)=AugBallistic AugPrefs(5)=AugShield AugPrefs(6)=AugEMP AugPrefs(7)=AugStealth AugPrefs(8)=AugAqualung MenuThemeName="Default" HUDThemeName="Default" bHUDBordersVisible=True bHUDBordersTranslucent=True bHUDBackgroundTranslucent=True bMenusTranslucent=True InventoryFull="You don't have enough room in your inventory to pick up the %s" TooMuchAmmo="You already have enough of that type of ammo" TooHeavyToLift="It's too heavy to lift" CannotLift="You can't lift that" NoRoomToLift="There's no room to lift that" CanCarryOnlyOne="You can only carry one %s" CannotDropHere="Can't drop that here" HandsFull="Your hands are full" NoteAdded="Note Received - Check DataVault For Details" GoalAdded="Goal Received - Check DataVault For Details" PrimaryGoalCompleted="Primary Goal Completed" SecondaryGoalCompleted="Secondary Goal Completed" EnergyDepleted="Bio-electric energy reserves depleted" AddedNanoKey="%s added to Nano Key Ring" HealedPointsLabel="Healed %d points" HealedPointLabel="Healed %d point" SkillPointsAward="%d skill points awarded" QuickSaveGameTitle="Quick Save" WeaponUnCloak="Weapon drawn... Uncloaking" TakenOverString="I've taken over the " HeadString="Head" TorsoString="Torso" LegsString="Legs" WithTheString=" with the " WithString=" with " PoisonString=" with deadly poison" BurnString=" with excessive burning" NoneString="None" MPDamageMult=1.000000 bHDTP_JC=True bHDTP_Walton=True bHDTP_Anna=True bHDTP_UNATCO=True bHDTP_MJ12=True bHDTP_NSF=True bHDTP_RiotCop=True bHDTP_Gunther=True bHDTP_Paul=True bHDTP_Nico=True QuickSaveTotal=5 bTogAutoSave=True bColorCodedAmmo=True bDecap=True bAnimBar1=True bAnimBar2=True bRemoveVanillaDeath=True bHitmarkerOn=True bMantleOption=True fatty="You are full and cannot consume any more at this time" noUsing="You cannot use it at this time" customColorsMenu(0)=(B=255) customColorsMenu(1)=(G=49,B=255) customColorsMenu(2)=(R=210,G=194,B=255) customColorsMenu(3)=(R=77,G=77,B=78) customColorsMenu(4)=(R=207,G=207,B=207) customColorsMenu(5)=(R=255,G=255,B=192) customColorsMenu(6)=(R=86,G=38,B=24) customColorsMenu(7)=(R=206,G=206,B=202) customColorsMenu(8)=(R=204,G=198,B=201) customColorsMenu(9)=(R=255) customColorsMenu(10)=(G=255) customColorsMenu(11)=(R=255,G=64) customColorsMenu(12)=(G=255) customColorsMenu(13)=(R=128,G=128,B=128) customColorsHUD(0)=(R=32,G=32,B=32) customColorsHUD(1)=(R=217) customColorsHUD(2)=(R=128) customColorsHUD(3)=(R=167) customColorsHUD(4)=(R=167,G=164,B=164) customColorsHUD(5)=(R=255) customColorsHUD(6)=(R=112) customColorsHUD(7)=(R=204,G=202,B=204) customColorsHUD(8)=(R=169,G=171,B=171) customColorsHUD(9)=(R=201) customColorsHUD(10)=(R=255,G=255,B=255) customColorsHUD(11)=(B=86) customColorsHUD(12)=(R=255) customColorsHUD(13)=(R=128,G=128,B=128) LightLevelDisplay=-1 advBelt=1 RocketTargetMaxDistance=40000.000000 RecoilSimLimit=(X=7.000000,Y=16.000000,Z=7.000000) RecoilDrain=0.950000 RecoilTime=0.140000 bCanStrafe=True MeleeRange=50.000000 GroundSpeed=380.000000 AccelRate=2048.000000 FovAngle=75.000000 Intelligence=BRAINS_HUMAN AngularResolution=0.500000 Alliance=Player DrawType=DT_Mesh SoundVolume=64 RotationRate=(Pitch=3072,Yaw=65000,Roll=2048) BindName="JCDenton" FamiliarName="JC Denton" UnfamiliarName="JC Denton" }
수정본
파일 열기
//============================================================================= // DeusExPlayer. //============================================================================= class DeusExPlayer extends PlayerPawnExt native; #exec OBJ LOAD FILE=Effects // Name and skin assigned to PC by player on the Character Generation screen var travel String TruePlayerName; var travel int PlayerSkin; // Combat Difficulty, set only at new game time var travel Float CombatDifficulty; // Augmentation system vars var travel AugmentationManager AugmentationSystem; // Skill system vars var travel SkillManager SkillSystem; var() travel int SkillPointsTotal; var() travel int SkillPointsAvail; // Credits (money) the player has var travel int Credits; // Energy the player has var travel float Energy; var travel float EnergyMax; var travel float EnergyDrain; // amount of energy left to drain var travel float EnergyDrainTotal; // total amount of energy to drain var float MaxRegenPoint; // in multiplayer, the highest that auto regen will take you var float RegenRate; // the number of points healed per second in mp // Keyring, used to store any keys the player picks up var travel NanoKeyRing KeyRing; // Inventory Item var travel NanoKeyInfo KeyList; // List of Keys // frob vars var() float MaxFrobDistance; var Actor FrobTarget; var float FrobTime; // HUD Refresh Timer var float LastRefreshTime; // Conversation System Vars var ConPlay conPlay; // Conversation var DataLinkPlay dataLinkPlay; // Used for DataLinks var travel ConHistory conHistory; // Conversation History // Inventory System Vars var travel byte invSlots[30]; // 5x6 grid of inventory slots var int maxInvRows; // Maximum number of inventory rows var int maxInvCols; // Maximum number of inventory columns var travel Inventory inHand; // The current object in hand var travel Inventory inHandPending; // The pending item waiting to be put in hand var travel Inventory ClientinHandPending; // Client temporary inhand pending, for mousewheel use. var travel Inventory LastinHand; // Last object inhand, so we can detect inhand changes on the client. var travel bool bInHandTransition; // The inHand is being swapped out // DEUS_EX AMSD Whether to ignore inv slots in multiplayer var bool bBeltIsMPInventory; // Goal Tracking var travel DeusExGoal FirstGoal; var travel DeusExGoal LastGoal; // Note Tracking var travel DeusExNote FirstNote; var travel DeusExNote LastNote; // Data Vault Images var travel DataVaultImage FirstImage; // Log Messages var DeusExLog FirstLog; var DeusExLog LastLog; // used by ViewModel var Actor ViewModelActor[8]; // DEUS_EX AMSD For multiplayer option propagation UGH! // In most cases options will sync on their own. But for // initial loadout based on options, we need to send them to the // server. Easiest thing to do is have a function at startup // that sends that info. var bool bFirstOptionsSynced; var bool bSecondOptionsSynced; // used while crouching var travel bool bForceDuck; var travel bool bCrouchOn; // used by toggle crouch var travel bool bWasCrouchOn; // used by toggle crouch var travel byte lastbDuck; // used by toggle crouch // leaning vars var bool bCanLean; var float curLeanDist; var float prevLeanDist; // toggle walk var bool bToggleWalk; // communicate run silent value in multiplayer var float RunSilentValue; // cheats var bool bWarrenEMPField; var float WarrenTimer; var int WarrenSlot; // used by lots of stuff var name FloorMaterial; var name WallMaterial; var Vector WallNormal; // drug effects on the player var travel float drugEffectTimer; // shake variables var float JoltMagnitude; // magnitude of bounce imposed by heavy footsteps // poison dart effects on the player var float poisonTimer; // time remaining before next poison TakeDamage var int poisonCounter; // number of poison TakeDamages remaining var int poisonDamage; // damage taken from poison effect // bleeding variables var float BleedRate; // how profusely the player is bleeding; 0-1 var float DropCounter; // internal; used in tick() var() float ClotPeriod; // seconds it takes bleedRate to go from 1 to 0 var float FlashTimer; // How long it should take the current flash to fade. // length of time player can stay underwater // modified by SkillSwimming, AugAqualung, and Rebreather var float swimDuration; var travel float swimTimer; var float swimBubbleTimer; // conversation info var Actor ConversationActor; var Actor lastThirdPersonConvoActor; var float lastThirdPersonConvoTime; var Actor lastFirstPersonConvoActor; var float lastFirstPersonConvoTime; var Bool bStartingNewGame; // Set to True when we're starting a new game. var Bool bSavingSkillsAugs; // Put spy drone here instead of HUD var bool bSpyDroneActive; var int spyDroneLevel; var float spyDroneLevelValue; var SpyDrone aDrone; // Buying skills for multiplayer var bool bBuySkills; // If player wants to see a profile of the killer in multiplayer var bool bKillerProfile; // Multiplayer notification messages const MPFLAG_FirstSpot = 0x01; const MPSERVERFLAG_FirstPoison = 0x01; const MPSERVERFLAG_FirstBurn = 0x02; const MPSERVERFLAG_TurretInv = 0x04; const MPSERVERFLAG_CameraInv = 0x08; const MPSERVERFLAG_LostLegs = 0x10; const MPSERVERFLAG_DropItem = 0x20; const MPSERVERFLAG_NoCloakWeapon = 0x40; const mpMsgDelay = 4.0; var int mpMsgFlags; var int mpMsgServerFlags; const MPMSG_TeamUnatco =0; const MPMSG_TeamNsf =1; const MPMSG_TeamHit =2; const MPMSG_TeamSpot =3; const MPMSG_FirstPoison =4; const MPMSG_FirstBurn =5; const MPMSG_TurretInv =6; const MPMSG_CameraInv =7; const MPMSG_CloseKills =8; const MPMSG_TimeNearEnd =9; const MPMSG_LostLegs =10; const MPMSG_DropItem =11; const MPMSG_KilledTeammate =12; const MPMSG_TeamLAM =13; const MPMSG_TeamComputer =14; const MPMSG_NoCloakWeapon =15; const MPMSG_TeamHackTurret =16; var int mpMsgCode; var float mpMsgTime; var int mpMsgOptionalParam; var String mpMsgOptionalString; // Variables used when starting new game to show the intro first. var String strStartMap; var travel Bool bStartNewGameAfterIntro; var travel Bool bIgnoreNextShowMenu; // map that we're about to travel to after we finish interpolating var String NextMap; // Configuration Variables var globalconfig bool bObjectNames; // Object names on/off var globalconfig bool bNPCHighlighting; // NPC highlighting when new convos var globalconfig bool bSubtitles; // True if Conversation Subtitles are on var globalconfig bool bAlwaysRun; // True to default to running var globalconfig bool bToggleCrouch; // True to let key toggle crouch var globalconfig float logTimeout; // Log Timeout Value var globalconfig byte maxLogLines; // Maximum number of log lines visible var globalconfig bool bHelpMessages; // Multiplayer help messages // Overlay Options (TODO: Move to DeusExHUD.uc when serializable) var globalconfig byte translucencyLevel; // 0 - 10? var globalconfig bool bObjectBeltVisible; var globalconfig bool bHitDisplayVisible; var globalconfig bool bAmmoDisplayVisible; var globalconfig bool bAugDisplayVisible; var globalconfig bool bDisplayAmmoByClip; var globalconfig bool bCompassVisible; var globalconfig bool bCrosshairVisible; var globalconfig bool bAutoReload; var globalconfig bool bDisplayAllGoals; var globalconfig bool bHUDShowAllAugs; // TRUE = Always show Augs on HUD var globalconfig int UIBackground; // 0 = Render 3D, 1 = Snapshot, 2 = Black var globalconfig bool bDisplayCompletedGoals; var globalconfig bool bShowAmmoDescriptions; var globalconfig bool bConfirmSaveDeletes; var globalconfig bool bConfirmNoteDeletes; var globalconfig bool bAskedToTrain; // Multiplayer Playerspecific options var() globalconfig Name AugPrefs[9]; //List of aug preferences. // Used to manage NPC Barks var travel BarkManager barkManager; // Color Theme Manager, used to manage all the pretty // colors the player gets to play with for the Menus // and HUD windows. var travel ColorThemeManager ThemeManager; var globalconfig String MenuThemeName; var globalconfig String HUDThemeName; // Translucency settings for various UI Elements var globalconfig Bool bHUDBordersVisible; var globalconfig Bool bHUDBordersTranslucent; var globalconfig Bool bHUDBackgroundTranslucent; var globalconfig Bool bMenusTranslucent; var localized String InventoryFull; var localized String TooMuchAmmo; var localized String TooHeavyToLift; var localized String CannotLift; var localized String NoRoomToLift; var localized String CanCarryOnlyOne; var localized String CannotDropHere; var localized String HandsFull; var localized String NoteAdded; var localized String GoalAdded; var localized String PrimaryGoalCompleted; var localized String SecondaryGoalCompleted; var localized String EnergyDepleted; var localized String AddedNanoKey; var localized String HealedPointsLabel; var localized String HealedPointLabel; var localized String SkillPointsAward; var localized String QuickSaveGameTitle; var localized String WeaponUnCloak; var localized String TakenOverString; var localized String HeadString; var localized String TorsoString; var localized String LegsString; var localized String WithTheString; var localized String WithString; var localized String PoisonString; var localized String BurnString; var localized String NoneString; var ShieldEffect DamageShield; //visual damage effect for multiplayer feedback var float ShieldTimer; //for turning shield to fade. enum EShieldStatus { SS_Off, SS_Fade, SS_Strong }; var EShieldStatus ShieldStatus; var Pawn myBurner; var Pawn myPoisoner; var Actor myProjKiller; var Actor myTurretKiller; var Actor myKiller; var KillerProfile killProfile; var InvulnSphere invulnSph; // Conversation Invocation Methods enum EInvokeMethod { IM_Bump, IM_Frob, IM_Sight, IM_Radius, IM_Named, IM_Other }; enum EMusicMode { MUS_Ambient, MUS_Combat, MUS_Conversation, MUS_Outro, MUS_Dying }; var EMusicMode musicMode; var byte savedSection; // last section playing before interrupt var float musicCheckTimer; var float musicChangeTimer; // Used to keep track of # of saves var travel int saveCount; var travel Float saveTime; // for getting at the debug system var DebugInfo GlobalDebugObj; // Set to TRUE if the player can see the quotes. :) var globalconfig bool bQuotesEnabled; // DEUS_EX AMSD For propagating gametype var GameInfo DXGame; var float ServerTimeDiff; var float ServerTimeLastRefresh; // DEUS_EX AMSD For trying higher damage games var float MPDamageMult; // Nintendo immunity var float NintendoImmunityTime; var float NintendoImmunityTimeLeft; var bool bNintendoImmunity; const NintendoDelay = 6.0; // For closing comptuers if the server quits var Computers ActiveComputer; var globalconfig bool bHDTP_JC; var globalconfig bool bHDTP_Walton, bHDTP_Anna, bHDTP_UNATCO, bHDTP_MJ12, bHDTP_NSF, bHDTP_RiotCop, bHDTP_Gunther, bHDTP_Paul, bHDTP_Nico; var globalconfig int bHDTP_ALL; //-1 = none, 0 = use other settings, 1 = all. var string HDTPMeshName; var string HDTPMeshTex[8]; //GMDX: CyberP & dasraiser //SAVEOUT var config int QuickSaveIndex; //out of some number var config int QuickSaveTotal;//this number var config bool bTogAutoSave; //CyberP: enable/disable autosave var config int iQuickSaveLast;//index to last saved file var travel int QuickSaveLast; var travel int QuickSaveCurrent; var string QuickSaveName; //hardcore mode var travel bool bHardCoreMode; //if set disable save game options. var bool bPendingHardCoreSave; //set this to active quicksave //misc var globalconfig bool bSkipNewGameIntro; //CyberP: for GMDX option menu var config bool bColorCodedAmmo; var config bool bExtraHardcore; var config bool bDecap; var config bool bNoTranslucency; var config bool bDblClickHolster; var config bool bHalveAmmo; var config bool bHardcoreUnlocked; //CyberP: unlock options once completed the game var config bool bAutoHolster; //CyberP:auto-down weapon if right click deco var config bool bRealUI; var config bool bNoConsole; var config bool bHardcoreAI1; var config bool bHardcoreAI2; var config bool bHardcoreAI3; var config bool bAlternateToolbelt; var config bool bAnimBar1; var config bool bAnimBar2; var config bool bExtraObjectDetails; var config bool bA51Camera; var config bool bCameraSensors; var config bool bHardcoreFilterOption; var config bool bRealisticCarc; var config bool bLaserRifle; var config bool bRemoveVanillaDeath; var config bool bHitmarkerOn; var config bool bMantleOption; var config bool bUSP; var bool bThisMission; //CyberP: getting hacky in here. var travel int fullUp; //CyberP: eat/drink limit. var string fatty; //CyberP: eat/drink limit. var string noUsing; //CyberP: left click interaction var bool bLeftClicked; //CyberP: left click interaction var bool bDrainAlert; //CyberP: alert if energy low var float bloodTime; //CyberP: var float hitmarkerTime; var float camInterpol; var travel bool bWasCrosshair; var bool bFromCrosshair; var transient bool bThrowDecoration; var int SlotMem; //CyberP: for belt/weapon switching, so the code remembers what weapon we had before holstering var int clickCountCyber; //CyberP: for double clicking to unequip var bool bStunted; //CyberP: for slowing player under various conditions var bool bRegenStamina; //CyberP: regen when in water but head above water var bool bCrouchRegen; //CyberP: regen when crouched and has skill var bool bDoubleClickCheck; //CyberP: to return from double clicking. var travel Inventory assignedWeapon; var Inventory primaryWeapon; var float augEffectTime; var vector vecta; var rotator rota; //var bool bBoosty; //CyberP: low-tech speed boost //Alias=LeanLeft,LeanRight //Aliases[18]=(Command="Button bLeanRightHook",Alias=LeanRH) //Aliases[19]=(Command="Button bLeanLeftHook",Alias=LeanLH) var transient bool bLeanKeysDefined; var travel int PerkNamesArray[34]; //CyberP: perk names var travel string BoughtPerks[34]; var config color customColorsMenu[14]; //CyberP: custom color theme var config color customColorsHUD[14]; var bool bTiptoes; //based on left+right lean var bool bCanTiptoes; //based on legs/crouch/can raise body var bool bIsTiptoes; var bool bPreTiptoes; var bool bLeftToe,bRightToe; var bool bRadarTran; //CyberP: radar trans effect var bool bCloakEnabled; //player is cloaked was class'DeusExWeapon'.default.this=T/F wow :) var transient bool bIsCloaked; //weapon is cloaked var int LightLevelDisplay; //CyberP: augIFF light value var travel Actor RocketTarget; //GEPDummyTarget (basic actor) var travel int advBelt; var travel float RocketTargetMaxDistance; var bool bGEPzoomActive; var bool bGEPprojectileInflight;//is projectile flighing var int GEPSkillLevel; var float GEPSkillLevelValue; var DeusExProjectile aGEPProjectile;//Fired projectile inflight var transient float GEPsteeringX,GEPsteeringY; //used for mouse input control var WeaponGEPGun GEPmounted; //Recoil shockwave var() vector RecoilSimLimit; //plus/minus var() float RecoilDrain; var vector RecoilShake; var vector RecoilDesired;//lerp to this var float RecoilTime; //amount of lerp shake before desired set to 0 var rotator SAVErotation; var vector SAVElocation; var bool bStaticFreeze; //////////END GMDX // native Functions native(1099) final function string GetDeusExVersion(); native(2100) final function ConBindEvents(); native(3001) final function name SetBoolFlagFromString(String flagNameString, bool bValue); native(3002) final function ConHistory CreateHistoryObject(); native(3003) final function ConHistoryEvent CreateHistoryEvent(); native(3010) final function DeusExLog CreateLogObject(); native(3011) final function SaveGame(int saveIndex, optional String saveDesc); native(3012) final function DeleteSaveGameFiles(optional String saveDirectory); native(3013) final function GameDirectory CreateGameDirectoryObject(); native(3014) final function DataVaultImageNote CreateDataVaultImageNoteObject(); native(3015) final function DumpLocation CreateDumpLocationObject(); native(3016) final function UnloadTexture(Texture texture); //native 3017 taken by particleiterator. // // network replication // replication { // server to client reliable if ((Role == ROLE_Authority) && (bNetOwner)) AugmentationSystem, SkillSystem, SkillPointsTotal, SkillPointsAvail, inHand, inHandPending, KeyRing, Energy, bSpyDroneActive, DXGame, bBuySkills, drugEffectTimer, killProfile; reliable if (Role == ROLE_Authority) ShieldStatus, RunSilentValue, aDrone, NintendoImmunityTimeLeft; // client to server reliable if (Role < ROLE_Authority) BarkManager, FrobTarget, AugPrefs, bCanLean, curLeanDist, prevLeanDist, bInHandTransition, bForceDuck, FloorMaterial, WallMaterial, WallNormal, swimTimer, swimDuration; // Functions the client can call reliable if (Role < ROLE_Authority) DoFrob, ParseLeftClick, ParseRightClick, ReloadWeapon, PlaceItemInSlot, RemoveItemFromSlot, ClearInventorySlots, SetInvSlots, FindInventorySlot, ActivateBelt, DropItem, SetInHand, AugAdd, ExtinguishFire, CatchFire, AllEnergy, ClearPosition, ClearBelt, AddObjectToBelt, RemoveObjectFromBelt, TeamSay, KeypadRunUntriggers, KeypadRunEvents, KeypadToggleLocks, ReceiveFirstOptionSync, ReceiveSecondOptionSync,CreateDrone, MoveDrone, CloseComputerScreen, SetComputerHackTime, UpdateCameraRotation, ToggleCameraState, SetTurretTrackMode, SetTurretState, NewMultiplayerMatch, PopHealth, ServerUpdateLean, BuySkills, PutInHand, MakeCameraAlly, PunishDetection, ServerSetAutoReload, FailRootWindowCheck, FailConsoleCheck, ClientPossessed; // Unreliable functions the client can call unreliable if (Role < ROLE_Authority) MaintainEnergy, UpdateTranslucency; // Functions the server calls in client reliable if ((Role == ROLE_Authority) && (bNetOwner)) UpdateAugmentationDisplayStatus, AddAugmentationDisplay, RemoveAugmentationDisplay, ClearAugmentationDisplay, ShowHud, ActivateKeyPadWindow, SetDamagePercent, SetServerTimeDiff, ClientTurnOffScores; reliable if (Role == ROLE_Authority) InvokeComputerScreen, ClientDeath, AddChargedDisplay, RemoveChargedDisplay, MultiplayerDeathMsg, MultiplayerNotifyMsg, BuySkillSound, ShowMultiplayerWin, ForceDroneOff ,AddDamageDisplay, ClientSpawnHits, CloseThisComputer, ClientPlayAnimation, ClientSpawnProjectile, LocalLog, VerifyRootWindow, VerifyConsole, ForceDisconnect; } exec function cheat() { if (bHardCoreMode) bCheatsEnabled = false; else bCheatsEnabled = !bCheatsEnabled; } function UpdateHDTPsettings() { local mesh tempmesh; local texture temptex; local int i; if(GetHDTPSettings(self)) //lol recursive { if(HDTPMeshname != "") { tempmesh = lodmesh(dynamicloadobject(HDTPMeshname,class'mesh',true)); if(tempmesh != none) { mesh = tempmesh; for(i=0;i<=7;i++) { if(HDTPMeshtex[i] != "") { temptex = texture(dynamicloadobject(HDTPMeshtex[i],class'texture',true)); if(temptex != none) multiskins[i] = temptex; } } } } } else { mesh = default.mesh; for(i=0; i<=7;i++) { multiskins[i]=default.multiskins[i]; } } } function bool GetHDTPSettings(actor Other) { if(bHDTP_ALL > 0) return true; else if(bHDTP_All < 0) return false; else { if((Other.IsA('JCDentonMaleCarcass') || Other.IsA('JCDouble') || Other.IsA('JCDentonMale')) && bHDTP_JC) //changed self to JCdentonmale for hopefully better mod compatibility return true; //if((Other.IsA('MJ12Troop') || Other.IsA('MJ12TroopCarcass')) && bHDTP_MJ12) // return true; else if((Other.IsA('UNATCOTroop') || Other.IsA('UNATCOTroopCarcass')) && bHDTP_UNATCO) return true; else if((Other.IsA('WaltonSimons') || Other.IsA('WaltonSimonsCarcass')) && bHDTP_WALTON) return true; else if((Other.IsA('AnnaNavarre') || Other.IsA('AnnaNavarreCarcass')) && bHDTP_Anna) return true; else if((Other.IsA('GuntherHermann') || Other.IsA('GuntherHermannCarcass')) && bHDTP_Gunther) return true; else if((Other.IsA('RiotCop') || Other.IsA('RiotCopCarcass')) && bHDTP_RiotCop) return true; else if((Other.IsA('Terrorist') || Other.IsA('TerroristCarcass')) && bHDTP_NSF) return true; else if((Other.IsA('PaulDenton') || Other.IsA('PaulDentonCarcass')) && bHDTP_Paul) return true; else if((Other.IsA('NicoletteDuClare') || Other.IsA('NicoletteDuClareCarcass')) && bHDTP_Nico) return true; else return false; } return false; } function setupDifficultyMod() //CyberP: Lazy scale based on difficulty. To find all things modified by difficulty level in { //CyberP: GMDX, search CombatDifficulty & bHardCoreMode. local ScriptedPawn P; //CyberP: WARNING: is called every login. TODO: call only once per map. local ThrownProjectile TP; local AutoTurret T; local SecurityCamera SC; local DeusExWeapon WP; local DeusExAmmo AM; local DeusExMover MV; local Keypad KP; log("bHardCoreMode =" @bHardCoreMode); log("CombatDifficulty =" @CombatDifficulty); if (bHDTP_All != -1) bHDTP_All=-1; bStunted = False; //CyberP: failsafe ForEach AllActors(class'ScriptedPawn', P) { if (P.bHardcoreOnly == True && bHardCoreMode == False && bHardcoreFilterOption == False) //CyberP: remove this pawn if we are not hardcore P.Destroy(); if (P.IsA('HumanMilitary') || P.IsA('HumanThug')) { if (!bHardCoreMode && CombatDifficulty > 1) { if (P.HearingThreshold < 0.135000) P.HearingThreshold = 0.135000; if (P.SurprisePeriod < 1.250000) P.SurprisePeriod = 1.250000; if (P.VisibilityThreshold < 0.005500) P.VisibilityThreshold = 0.005500; if (P.EnemyTimeout > 10.000000) P.EnemyTimeout = 10.000000; } else if (CombatDifficulty <= 1) { if (P.VisibilityThreshold < 0.010000) P.VisibilityThreshold = 0.010000; if (P.HearingThreshold < 0.150000) P.HearingThreshold = 0.150000; if (P.EnemyTimeout > 8.000000) P.EnemyTimeout = 8.000000; if (P.SurprisePeriod < 2.000000) P.SurprisePeriod = 2.0; } else if (bHardCoreMode) { if (P.BaseAccuracy != 0.000000 && P.BaseAccuracy > 0.050000) //CyberP: all Human Military are more accurate on hardcore mode. P.BaseAccuracy=0.050000; if (P.bDefendHome && P.HomeExtent < 64) P.EnemyTimeOut = 22.000000; //CyberP: camp for longer if (P.SurprisePeriod > 0.75) P.SurprisePeriod = 0.75; } } else if (P.IsA('Robot')) { if (bHardCoreMode) P.EnemyTimeout = 16.000000; else P.EnemyTimeout = 10.000000; } if ((P.IsA('MJ12Troop') || P.IsA('MJ12Elite')) && (P.bHasCloak || P.UnfamiliarName == "MJ12 Elite" )) { if (bHardCoreMode) { P.default.Health=350; P.default.HealthHead=350; P.default.HealthTorso=350; P.default.HealthLegLeft=350; P.default.HealthLegRight=350; P.default.HealthArmLeft=350; P.default.HealthArmRight=350; P.Health=350; P.HealthHead=350; P.HealthTorso=350; P.HealthLegLeft=350; P.HealthLegRight=350; P.HealthArmLeft=350; P.HealthArmRight=350; P.CloakThreshold=140; P.GroundSpeed=260.000000; } else { P.default.Health=200; P.default.HealthHead=200; P.default.HealthTorso=200; P.default.HealthLegLeft=200; P.default.HealthLegRight=200; P.default.HealthArmLeft=200; P.default.HealthArmRight=200; P.Health=200; P.HealthHead=200; P.HealthTorso=200; P.HealthLegLeft=200; P.HealthLegRight=200; P.HealthArmLeft=200; P.HealthArmRight=200; P.CloakThreshold=100; P.GroundSpeed=240.000000; P.SurprisePeriod=1.000000; } } else if (P.IsA('MJ12Commando')) { if (bHardCoreMode) { P.default.Health=450; P.default.HealthHead=450; P.default.HealthTorso=450; P.default.HealthLegLeft=450; P.default.HealthLegRight=450; P.default.HealthArmLeft=450; P.default.HealthArmRight=450; P.Health=450; P.HealthHead=450; P.HealthTorso=450; P.HealthLegLeft=450; P.HealthLegRight=450; P.HealthArmLeft=450; P.HealthArmRight=450; P.VisibilityThreshold=0.001000; } else { P.default.Health=300; P.default.HealthHead=300; P.default.HealthTorso=300; P.default.HealthLegLeft=300; P.default.HealthLegRight=300; P.default.HealthArmLeft=300; P.default.HealthArmRight=300; P.Health=300; P.HealthHead=300; P.HealthTorso=300; P.HealthLegLeft=300; P.HealthLegRight=300; P.HealthArmLeft=300; P.HealthArmRight=300; P.VisibilityThreshold=0.004000; } } else if (P.IsA('MIB')) { if (!bHardCoreMode && P.GroundSpeed>P.default.GroundSpeed) { P.GroundSpeed=360.000000; P.default.Health=450; P.default.HealthHead=450; P.default.HealthTorso=450; P.default.HealthLegLeft=450; P.default.HealthLegRight=450; P.default.HealthArmLeft=450; P.default.HealthArmRight=450; P.Health=450; P.HealthHead=450; P.HealthTorso=450; P.HealthLegLeft=450; P.HealthLegRight=450; P.HealthArmLeft=450; P.HealthArmRight=450; } } else if (P.IsA('WaltonSimons')) { if (!bHardCoreMode) { P.GroundSpeed=360.000000; P.default.Health=700; P.default.HealthHead=700; P.default.HealthTorso=700; P.default.HealthLegLeft=700; P.default.HealthLegRight=700; P.default.HealthArmLeft=700; P.default.HealthArmRight=700; P.Health=700; P.HealthHead=700; P.HealthTorso=700; P.HealthLegLeft=700; P.HealthLegRight=700; P.HealthArmLeft=700; P.HealthArmRight=700; } } else if (P.IsA('Gray')) { if (bHardCoreMode == False) { P.default.Health=250; P.default.HealthHead=250; P.default.HealthTorso=250; P.default.HealthLegLeft=250; P.default.HealthLegRight=250; P.default.HealthArmLeft=250; P.default.HealthArmRight=250; P.Health=250; P.HealthHead=250; P.HealthTorso=250; P.HealthLegLeft=200; P.HealthLegRight=250; P.HealthArmLeft=250; P.HealthArmRight=250; } } } if (bHardCoreMode == False) { ForEach AllActors(class'ThrownProjectile', TP) { if (TP.bNoHardcoreFilter == True) //CyberP: destroy this bomb if we are not hardcore { TP.Destroy(); } else TP.proxRadius=156.000000; //Also lower radius if not hardcore } } else { ForEach AllActors(class'DeusExAmmo', AM) { if (AM.Owner == None) { if (AM.IsA('AmmoDartTaser')) AM.AmmoAmount = 1; else if (AM.IsA('Ammo20mmEMP')) AM.AmmoAmount = 1; else if (AM.IsA('Ammo20mm')) AM.AmmoAmount = 2; } } /*ForEach AllActors(class'DeusExMover', MV) { if (MV.lockStrength < 0.8 && MV.bPickable) MV.lockStrength += 0.1; if (MV.bBreakable && MV.DamageThreshold < 90) MV.DamageThreshold += 10; } ForEach AllActors(class'Keypad', KP) { if (KP.bHackable && KP.hackStrength < 0.8) KP.hackStrength += 0.1; } */ } if (bLaserRifle == False) { ForEach AllActors(class'DeusExWeapon', WP) { if (WP.ItemName == "Laser Rifle") //CyberP: destroy it WP.Destroy(); } } if (bUSP == False) { ForEach AllActors(class'DeusExWeapon', WP) { if (WP.ItemName == "USP.10") WP.Destroy(); } } ForEach AllActors(class'AutoTurret', T) { if (CombatDifficulty <= 1.5) { T.maxRange=2000; T.default.maxRange=2000; } else { T.maxRange=4000; T.default.maxRange=4000; } } ForEach AllActors(class'SecurityCamera', SC) { if (CombatDifficulty < 3.0) { SC.hackStrength=0.100000; SC.cameraRange = 1024; SC.default.cameraRange = 1024; if (SC.swingPeriod < 9.0) SC.swingPeriod+=3.0; } if (bHardcoreMode) SC.hackStrength=0.250000; else SC.hackStrength=0.150000; if (bA51Camera) { SC.hackStrength=0.500000; SC.HitPoints=150; SC.minDamageThreshold=80; } } } // ---------------------------------------------------------------------- // PostBeginPlay() // // set up the augmentation and skill systems // ---------------------------------------------------------------------- function PostBeginPlay() { local DeusExLevelInfo info; local int levelInfoCount; local float mult; Super.PostBeginPlay(); class'DeusExPlayer'.default.DefaultFOV=DefaultFOV; class'DeusExPlayer'.default.DesiredFOV=DesiredFOV; // Check to make sure there's only *ONE* DeusExLevelInfo and // go fucking *BOOM* if we find more than one. levelInfoCount = 0; foreach AllActors(class'DeusExLevelInfo', info) levelInfoCount++; Assert(levelInfoCount <= 1); // give us a shadow if (Level.Netmode == NM_Standalone) CreateShadow(); InitializeSubSystems(); DXGame = Level.Game; ShieldStatus = SS_Off; ServerTimeLastRefresh = 0; if (bHDTP_All != -1) bHDTP_All=-1; //CyberP: no HDTP characters for a number of reasons. // Safeguard so no cheats in multiplayer if ( Level.NetMode != NM_Standalone ) bCheatsEnabled = False; HDTP(); // SAVEOUT //QuickSaveCurrent=int(ConsoleCommand("get DeusEx.JCDentonMale QuickSaveIndex")); //QuickSaveLast=int(ConsoleCommand("get DeusEx.JCDentonMale iQuickSaveLast")); QuickSaveCurrent=QuickSaveIndex; QuickSaveLast=iQuickSaveLast; log("MYCHK::"@QuickSaveCurrent@"::"@QuickSaveLast); bWasCrosshair=bCrosshairVisible; RefreshLeanKeys(); } function ServerSetAutoReload( bool bAuto ) { bAutoReload = bAuto; } // ---------------------------------------------------------------------- function SetServerTimeDiff( float sTime ) { ServerTimeDiff = (sTime - Level.Timeseconds); } // ---------------------------------------------------------------------- // PostNetBeginPlay() // // Take care of the theme manager // ---------------------------------------------------------------------- simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if (Role == ROLE_SimulatedProxy) { DrawShield(); CreatePlayerTracker(); if ( NintendoImmunityTimeLeft > 0.0 ) DrawInvulnShield(); return; } //DEUS_EX AMSD In multiplayer, we need to do this for our local theme manager, since //PostBeginPlay isn't called to set these up, and the Thememanager can be local, it //doesn't have to sync with the server. if (ThemeManager == NONE) { CreateColorThemeManager(); ThemeManager.SetOwner(self); ThemeManager.SetCurrentHUDColorTheme(ThemeManager.GetFirstTheme(1)); ThemeManager.SetCurrentMenuColorTheme(ThemeManager.GetFirstTheme(0)); ThemeManager.SetMenuThemeByName(MenuThemeName); ThemeManager.SetHUDThemeByName(HUDThemeName); if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ChangeStyle(); } ReceiveFirstOptionSync(AugPrefs[0], AugPrefs[1], AugPrefs[2], AugPrefs[3], AugPrefs[4]); ReceiveSecondOptionSync(AugPrefs[5], AugPrefs[6], AugPrefs[7], AugPrefs[8]); ShieldStatus = SS_Off; bCheatsEnabled = False; ServerSetAutoReload( bAutoReload ); } // ---------------------------------------------------------------------- // InitializeSubSystems() // ---------------------------------------------------------------------- function InitializeSubSystems() { // Spawn the BarkManager if (BarkManager == None) BarkManager = Spawn(class'BarkManager', Self); // Spawn the Color Manager CreateColorThemeManager(); ThemeManager.SetOwner(self); // install the augmentation system if not found if (AugmentationSystem == None) { AugmentationSystem = Spawn(class'AugmentationManager', Self); AugmentationSystem.CreateAugmentations(Self); AugmentationSystem.AddDefaultAugmentations(); AugmentationSystem.SetOwner(Self); } else { AugmentationSystem.SetPlayer(Self); AugmentationSystem.SetOwner(Self); } // install the skill system if not found if (SkillSystem == None) { SkillSystem = Spawn(class'SkillManager', Self); SkillSystem.CreateSkills(Self); } else { SkillSystem.SetPlayer(Self); } if ((Level.Netmode == NM_Standalone) || (!bBeltIsMPInventory)) { // Give the player a keyring CreateKeyRing(); } } // ---------------------------------------------------------------------- // PostPostBeginPlay() // ---------------------------------------------------------------------- function PostPostBeginPlay() { Super.PostPostBeginPlay(); // Bind any conversation events to this DeusExPlayer ConBindEvents(); // Restore colors that the user selected (as opposed to those // stored in the savegame) ThemeManager.SetMenuThemeByName(MenuThemeName); ThemeManager.SetHUDThemeByName(HUDThemeName); if ((Level.NetMode != NM_Standalone) && ( killProfile == None )) killProfile = Spawn(class'KillerProfile', Self); } // ---------------------------------------------------------------------- // PreTravel() - Called when a ClientTravel is about to happen // ---------------------------------------------------------------------- function PreTravel() { // Set a flag designating that we're traveling, // so MissionScript can check and not call FirstFrame() for this map. // log("MYCHK:PreTravel:"@self); flagBase.SetBool('PlayerTraveling', True, True, 0); SaveSkillPoints(); if (dataLinkPlay != None) dataLinkPlay.AbortAndSaveHistory(); // If the player is burning (Fire! Fire!), extinguish him // before the map transition. This is done to fix stuff // that's fucked up. ExtinguishFire(); } // ---------------------------------------------------------------------- // TravelPostAccept() // ---------------------------------------------------------------------- event TravelPostAccept() { local DeusExLevelInfo info; local MissionScript scr; local bool bScriptRunning; local InterpolationPoint I; local SavePoint SP; local rotator rofs; //local WeaponGEPGun gepTest; local vector ofst; Super.TravelPostAccept(); // reset the keyboard ResetKeyboard(); RefreshLeanKeys(); info = GetLevelInfo(); // log("MYCHK:PostTravel: ,"@info.Name); if (info != None) { // hack for the DX.dx logo/splash level if (info.MissionNumber == -2) { foreach AllActors(class 'InterpolationPoint', I, 'IntroCam') { if (I.Position == 1) { SetCollision(False, False, False); bCollideWorld = False; Target = I; SetPhysics(PHYS_Interpolating); PhysRate = 1.0; PhysAlpha = 0.0; bInterpolating = True; bStasis = False; ShowHud(False); PutInHand(None); GotoState('Interpolating'); break; } } return; } if (info.MapName == "14_OceanLab_silo" || info.MapName == "06_HongKong_Canal" || info.missionNumber == 15) bThisMission=true; else bThisMission=false; // hack for the DXOnly.dx splash level if (info.MissionNumber == -1) { ShowHud(False); GotoState('Paralyzed'); return; } } // Restore colors if (ThemeManager != None) { ThemeManager.SetMenuThemeByName(MenuThemeName); ThemeManager.SetHUDThemeByName(HUDThemeName); } // Make sure any charged pickups that were active // before travelling are still active. RefreshChargedPickups(); // Make sure the Skills and Augmentation systems // are properly initialized and reset. RestoreSkillPoints(); if (SkillSystem != None) { SkillSystem.SetPlayer(Self); } if (AugmentationSystem != None) { // set the player correctly AugmentationSystem.SetPlayer(Self); AugmentationSystem.RefreshAugDisplay(); } // Nuke any existing conversation if (conPlay != None) conPlay.TerminateConversation(); HDTP(); // Make sure any objects that care abou the PlayerSkin // are notified UpdatePlayerSkin(); // If the player was carrying a decoration, // call TravelPostAccept() so it can initialize itself if (CarriedDecoration != None) CarriedDecoration.TravelPostAccept(); // If the player was carrying a decoration, make sure // it's placed back in his hand (since the location // info won't properly travel) PutCarriedDecorationInHand(); // Reset FOV SetFOVAngle(Default.DesiredFOV); // If the player had a scope view up, make sure it's // properly restore RestoreScopeView(); // make sure the mission script has been spawned correctly if (info != None) { bScriptRunning = False; foreach AllActors(class'MissionScript', scr) bScriptRunning = True; if (!bScriptRunning) info.SpawnScript(); } // make sure the player's eye height is correct BaseEyeHeight = CollisionHeight - (GetDefaultCollisionHeight() - Default.BaseEyeHeight); //GMDX foreach AllActors(class'SavePoint',SP) { if ((!bHardCoreMode)||(SP.bUsedSavePoint)) SP.Destroy(); } //ConsoleCommand("set ini:Engine.Engine.ViewportManager Brightness 1"); if (bHardCoreMode) { bCheatsEnabled=false; bAutoReload=false; } setupDifficultyMod(); //CyberP: set difficulty modifiers //set gep tracking if (RocketTarget==none) RocketTarget=spawn(class'DeusEx.GEPDummyTarget'); SetRocketWireControl(); //end GMDX } //GMDX: set up mounted gep spawn, as no matter what i try it still draws it on spawn :/ function SpawnGEPmounted(bool mountIt) { if (mountIt) { if ((Weapon!=none)&&(Weapon.IsA('WeaponGEPGun'))) { GEPmounted=WeaponGEPGun(Weapon); GEPmounted.SetMount(self); } else log("ERROR: GEP gun in zoom but GEP not in hand"); } else { GEPmounted.SetMount(none); // GEPmounted=none; } /*if (GEPmounted!=none) return true; GEPmounted=spawn(class'WeaponGEPmounted',self,,Location,Rotation); if (GEPmounted!=none) { GEPmounted.bHidden=true;//use this to invoke renderoverlays GEPmounted.bHideWeapon=true; GEPmounted.SetPhysics(PHYS_None); GEPmounted.SetMount(self); return true; } else log("ERROR: could not spawn GEPmounted");//else //bNoGEPmounted=true; return false;*/ } //GMDX remove console from Hardcore mode >:] exec function Say(string Msg ) { if (bHardCoreMode || bNoConsole) return; else super.Say(Msg); } exec function Type() { if (bHardCoreMode) return; else super.Type(); } function Typing( bool bTyping ) { if (bHardCoreMode) Player.Console.GotoState(''); else super.Typing(bTyping); } ///// exec function HDTP(optional string s) { local scriptedpawn P; local deusexcarcass C; if(s != "") { s = Caps(s); if(s == "NICO") bHDTP_Nico = !bHDTP_Nico; else if(s == "WALTON") bHDTP_Walton = !bHDTP_Walton; else if(s == "ANNA") bHDTP_Anna = !bHDTP_Anna; else if(s == "MJ12") bHDTP_MJ12 = false;// was !bHDTP_MJ12; else if(s == "UNATCO") bHDTP_UNATCO = !bHDTP_UNATCO; else if(s == "NSF") bHDTP_NSF = !bHDTP_NSF; else if(s == "COP") bHDTP_RiotCop = !bHDTP_RiotCop; else if(s == "GUNTHER") bHDTP_Gunther = !bHDTP_Gunther; else if(s == "PAUL") bHDTP_Paul = !bHDTP_Paul; else if(s == "JC") bHDTP_JC = !bHDTP_JC; else if(s == "ALL") { bHDTP_All++; if(bHDTP_All > 1) bHDTP_All = -1; } } foreach Allactors(Class'Scriptedpawn',P) P.UpdateHDTPSettings(); foreach Allactors(Class'DeusexCarcass',C) C.UpdateHDTPsettings(); UpdateHDTPsettings(); } // ---------------------------------------------------------------------- // Update Time Played // ---------------------------------------------------------------------- final function UpdateTimePlayed(float deltaTime) { saveTime += deltaTime; } // ---------------------------------------------------------------------- // RestoreScopeView() // ---------------------------------------------------------------------- function RestoreScopeView() { if (inHand != None) { if (inHand.IsA('Binoculars') && (inHand.bActive)) Binoculars(inHand).RefreshScopeDisplay(Self, True); else if ((DeusExWeapon(inHand) != None) && (DeusExWeapon(inHand).bZoomed)) DeusExWeapon(inHand).RefreshScopeDisplay(Self, True, True); } } // ---------------------------------------------------------------------- // RefreshChargedPickups() // ---------------------------------------------------------------------- function RefreshChargedPickups() { local ChargedPickup anItem; // Loop through all the ChargedPicksups and look for charged pickups // that are active. If we find one, add to the user-interface. foreach AllActors(class'ChargedPickup', anItem) { if ((anItem.Owner == Self) && (anItem.IsActive())) { // Make sure tech goggles display is refreshed if (anItem.IsA('TechGoggles')) TechGoggles(anItem).UpdateHUDDisplay(Self); AddChargedDisplay(anItem); } } } // ---------------------------------------------------------------------- // UpdatePlayerSkin() // ---------------------------------------------------------------------- function UpdatePlayerSkin() { local PaulDenton paul; local PaulDentonCarcass paulCarcass; local JCDentonMaleCarcass jcCarcass; local JCDouble jc; // Paul Denton foreach AllActors(class'PaulDenton', paul) break; if (paul != None) paul.SetSkin(Self); // Paul Denton Carcass foreach AllActors(class'PaulDentonCarcass', paulCarcass) break; if (paulCarcass != None) paulCarcass.SetSkin(Self); // JC Denton Carcass foreach AllActors(class'JCDentonMaleCarcass', jcCarcass) break; if (jcCarcass != None) jcCarcass.SetSkin(Self); // JC's stunt double foreach AllActors(class'JCDouble', jc) break; if (jc != None) jc.SetSkin(Self); } // ---------------------------------------------------------------------- // GetLevelInfo() // ---------------------------------------------------------------------- function DeusExLevelInfo GetLevelInfo() { local DeusExLevelInfo info; foreach AllActors(class'DeusExLevelInfo', info) break; // log("MYCHK:LevelInfo: ,"@info.Name); return info; } // // If player chose to dual map the F keys // exec function DualmapF3() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(0); } exec function DualmapF4() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(1); } exec function DualmapF5() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(2); } exec function DualmapF6() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(3); } exec function DualmapF7() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(4); } exec function DualmapF8() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(5); } exec function DualmapF9() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(6); } exec function DualmapF10() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(7); } exec function DualmapF11() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(8); } exec function DualmapF12() { if ( AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(9); } // // Team Say // exec function TeamSay( string Msg ) { local Pawn P; local String str; if (bHardCoreMode) return; if ( TeamDMGame(DXGame) == None ) { Say(Msg); return; } str = PlayerReplicationInfo.PlayerName $ ": " $ Msg; if ( Role == ROLE_Authority ) log( "TeamSay>" $ str ); for( P=Level.PawnList; P!=None; P=P.nextPawn ) { if( P.bIsPlayer && (P.PlayerReplicationInfo.Team == PlayerReplicationInfo.Team) ) { if ( P.IsA('DeusExPlayer') ) DeusExPlayer(P).ClientMessage( str, 'TeamSay', true ); } } } // ---------------------------------------------------------------------- // RestartLevel() // ---------------------------------------------------------------------- exec function RestartLevel() { ResetPlayer(); Super.RestartLevel(); } // ---------------------------------------------------------------------- // LoadGame() // ---------------------------------------------------------------------- exec function LoadGame(int saveIndex) { // log("MYCHK:LoadGame: ,"@saveIndex); // Reset the FOV if (class'DeusExPlayer'.default.bCloakEnabled == True) class'DeusExPlayer'.default.bCloakEnabled = False; //CyberP: disable the cloak effect else if (class'DeusExPlayer'.default.bRadarTran == True) class'DeusExPlayer'.default.bRadarTran = False; //CyberP: disable the radar effect bCrosshairVisible=True; //CyberP: fuck it DesiredFOV = Default.DesiredFOV; DeusExRootWindow(rootWindow).ClearWindowStack(); ClientTravel("?loadgame=" $ saveIndex, TRAVEL_Absolute, False); } // ---------------------------------------------------------------------- // QuickSave() // ---------------------------------------------------------------------- exec function QuickSave() { local DeusExLevelInfo info; info = GetLevelInfo(); // Don't allow saving if: // // 1) The player is dead // 2) We're on the logo map // 4) We're interpolating (playing outtro) // 3) A datalink is playing // 4) We're in a multiplayer game if (((info != None) && (info.MissionNumber < 0)) || ((IsInState('Dying')) || (IsInState('Paralyzed')) || (IsInState('Interpolating'))) || (dataLinkPlay != None) || (Level.Netmode != NM_Standalone)) { return; } if (bHardCoreMode && !bPendingHardCoreSave) return; bPendingHardCoreSave=false; //SAVEOUT ConsoleCommand("set DeusEx.JCDentonMale QuickSaveIndex "$QuickSaveCurrent); // QuickSaveIndex=QuickSaveCurrent; if (QuickSaveCurrent>=QuickSaveTotal) QuickSaveCurrent=0; QuickSaveCurrent++; QuickSaveLast=-(10+QuickSaveCurrent); QuickSaveName=sprintf("AutoSave%d",QuickSaveCurrent); log("MYCHK:DX_QuickSave: ,"@QuickSaveName@" ,Last:"@QuickSaveLast@" ,Current:"@QuickSaveCurrent); SaveGame(QuickSaveLast, QuickSaveName); ConsoleCommand("set DeusEx.JCDentonMale iQuickSaveLast "$QuickSaveLast); // default.iQuickSaveLast=QuickSaveLast; //original SaveGame(-1, QuickSaveGameTitle); } // ---------------------------------------------------------------------- // QuickLoad() // ---------------------------------------------------------------------- exec function QuickLoad() { //Don't allow in multiplayer. if (Level.Netmode != NM_Standalone) return; if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ConfirmQuickLoad(); } // ---------------------------------------------------------------------- // QuickLoadConfirmed() // ---------------------------------------------------------------------- function QuickLoadConfirmed() { if (Level.Netmode != NM_Standalone) return; log("MYCHK:DX_QuickLoadConfirmed: "@QuickSaveLast); //SAVEOUT LoadGame(QuickSaveLast); //changed so now selects last saved game, even if from menu //original LoadGame(-1); } // ---------------------------------------------------------------------- // BuySkillSound() // ---------------------------------------------------------------------- function BuySkillSound( int code ) { local Sound snd; switch( code ) { case 0: snd = Sound'Menu_OK'; break; case 1: snd = Sound'Menu_Cancel'; break; case 2: snd = Sound'Menu_Focus'; break; case 3: snd = Sound'Menu_BuySkills'; break; } PlaySound( snd, SLOT_Interface, 0.75 ); } //GMDX meh my bloody saveconfig over(um)ride , changed all player.saveconfigs files to point here so i can handle DTS function SaveConfigOverride() { if (Weapon!=none&&DeusExWeapon(Weapon).bLasing) //CyberP: &&Weapon.IsA('WeaponNanoSword') bCrosshairVisible=bWasCrossHair; SaveConfig(); if (Weapon!=none&&DeusExWeapon(Weapon).bLasing) //CyberP: &&Weapon.IsA('WeaponNanoSword') bCrosshairVisible=false; } // ---------------------------------------------------------------------- // StartNewGame() // // Starts a new game given the map passed in // ---------------------------------------------------------------------- exec function StartNewGame(String startMap) { local Inventory item, nextItem; if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ClearWindowStack(); if(KeyRing != None) KeyRing.RemoveAllKeys(); for(item = Inventory; item != None; item = nextItem) { nextItem = item.Inventory; item.Destroy(); } // Set a flag designating that we're traveling, // so MissionScript can check and not call FirstFrame() for this map. flagBase.SetBool('PlayerTraveling', True, True, 0); SaveSkillPoints(); ResetPlayer(); DeleteSaveGameFiles(); bStartingNewGame = True; // Send the player to the specified map! if (startMap == "") Level.Game.SendPlayer(Self, "01_NYC_UNATCOIsland"); // TODO: Must be stored somewhere! else Level.Game.SendPlayer(Self, startMap); } // ---------------------------------------------------------------------- // StartTrainingMission() // ---------------------------------------------------------------------- function StartTrainingMission() { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ClearWindowStack(); // Make sure the player isn't asked to do this more than // once if prompted on the main menu. if (!bAskedToTrain) { bAskedToTrain = True; SaveConfig(); } SkillSystem.ResetSkills(); ResetPlayer(True); DeleteSaveGameFiles(); bStartingNewGame = True; Level.Game.SendPlayer(Self, "00_Training"); } // ---------------------------------------------------------------------- // ShowIntro() // ---------------------------------------------------------------------- function ShowIntro(optional bool bStartNewGame) { //GMDX: fix inventory bug when player dies and starts new game if (IsInState('Dying')) GotoState('PlayerWalking'); if (DeusExRootWindow(rootWindow) != None) { DeusExRootWindow(rootWindow).ClearWindowStack(); DeusExRootWindow(rootWindow).hud.belt.ClearBelt(); } bStartNewGameAfterIntro = bStartNewGame; // Make sure all augmentations are OFF before going into the intro AugmentationSystem.DeactivateAll(); if (bSkipNewGameIntro) PostIntro(); else// Reset the player Level.Game.SendPlayer(Self, "00_Intro"); } // ---------------------------------------------------------------------- // ShowCredits() // ---------------------------------------------------------------------- function ShowCredits(optional bool bLoadIntro) { local DeusExRootWindow root; local CreditsWindow winCredits; root = DeusExRootWindow(rootWindow); if (root != None) { // Show the credits screen and force the game not to pause // if we're showing the credits after the endgame winCredits = CreditsWindow(root.InvokeMenuScreen(Class'CreditsWindow', bLoadIntro)); winCredits.SetLoadIntro(bLoadIntro); } } // ---------------------------------------------------------------------- // StartListenGame() // ---------------------------------------------------------------------- function StartListenGame(string options) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) root.ClearWindowStack(); ConsoleCommand("start "$options$"?listen"); } // ---------------------------------------------------------------------- // StartMultiplayerGame() // ---------------------------------------------------------------------- function StartMultiplayerGame(string command) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) root.ClearWindowStack(); ConsoleCommand(command); } // ---------------------------------------------------------------------- // NewMultiplayerMatch() // ---------------------------------------------------------------------- function NewMultiplayerMatch() { DeusExMPGame( DXGame ).RestartPlayer( Self ); PlayerReplicationInfo.Score = 0; PlayerReplicationInfo.Deaths = 0; PlayerReplicationInfo.Streak = 0; } // ---------------------------------------------------------------------- // ShowMultiplayerWin() // ---------------------------------------------------------------------- function ShowMultiplayerWin( String winnerName, int winningTeam, String Killer, String Killee, String Method ) { local HUDMultiplayer mpScr; local DeusExRootWindow root; if (( Player != None ) && ( Player.Console != None )) Player.Console.ClearMessages(); root = DeusExRootWindow(rootWindow); if ( root != None ) { mpScr = HUDMultiplayer(root.InvokeUIScreen(Class'HUDMultiplayer', True)); root.MaskBackground(True); if ( mpScr != None ) { mpScr.winnerName = winnerName; mpScr.winningTeam = winningTeam; mpScr.winKiller = Killer; mpScr.winKillee = Killee; mpScr.winMethod = Method; } } //Do cleanup if (PlayerIsClient()) { if (AugmentationSystem != None) AugmentationSystem.DeactivateAll(); } } // ---------------------------------------------------------------------- // ResetPlayer() // // Called when a new game is started. // // 1) Erase all flags except those beginning with "SKTemp_" // 2) Dumps inventory // 3) Restore any other defaults // ---------------------------------------------------------------------- function ResetPlayer(optional bool bTraining) { local inventory anItem; local inventory nextItem; ResetPlayerToDefaults(); // Reset Augmentations if (AugmentationSystem != None) { AugmentationSystem.ResetAugmentations(); AugmentationSystem.Destroy(); AugmentationSystem = None; } // Give the player a pistol and a prod if (!bTraining) { anItem = Spawn(class'WeaponPistol'); anItem.Frob(Self, None); anItem.bInObjectBelt = True; anItem = Spawn(class'WeaponProd'); anItem.Frob(Self, None); anItem.bInObjectBelt = True; anItem = Spawn(class'MedKit'); anItem.Frob(Self, None); anItem.bInObjectBelt = True; swimTimer = 100; //CyberP: start with full stamina. } } // ---------------------------------------------------------------------- // ResetPlayerToDefaults() // // Resets all travel variables to their defaults // ---------------------------------------------------------------------- function ResetPlayerToDefaults() { local inventory anItem; local inventory nextItem; local int i; // reset the image linked list FirstImage = None; if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ResetFlags(); // Remove all the keys from the keyring before // it gets destroyed if (KeyRing != None) { KeyRing.RemoveAllKeys(); if ((Role == ROLE_Authority) && (Level.NetMode != NM_Standalone)) { KeyRing.ClientRemoveAllKeys(); } KeyRing = None; } while(Inventory != None) { anItem = Inventory; DeleteInventory(anItem); anItem.Destroy(); } /* anItem = Inventory; while(anItem!= None) { log("DELETE "@anItem); nextItem=anItem.Inventory; DeleteInventory(anItem); anItem.Destroy(); anItem=nextItem; } */ // Clear object belt if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.ClearBelt(); // clear the notes and the goals DeleteAllNotes(); DeleteAllGoals(); // Nuke the history ResetConversationHistory(); // Other defaults Credits = Default.Credits; Energy = Default.Energy; SkillPointsTotal = Default.SkillPointsTotal; SkillPointsAvail = Default.SkillPointsAvail; SetInHandPending(None); SetInHand(None); bInHandTransition = False; RestoreAllHealth(); ClearLog(); // Reset save count/time saveCount = 0; saveTime = 0.0; // Reinitialize all subsystems we've just nuked InitializeSubSystems(); for(i=0;i<ArrayCount(PerkNamesArray);i++) //CyberP: reset perks PerkNamesArray[i] = 0; for(i=0;i<ArrayCount(BoughtPerks);i++) //CyberP: reset perks BoughtPerks[i] = ""; // Give starting inventory. if (Level.Netmode != NM_Standalone) { NintendoImmunityEffect( True ); GiveInitialInventory(); } } // ---------------------------------------------------------------------- // CreateKeyRing() // ---------------------------------------------------------------------- function CreateKeyRing() { if (KeyRing == None) { KeyRing = Spawn(class'NanoKeyRing', Self); KeyRing.InitialState='Idle2'; KeyRing.GiveTo(Self); KeyRing.SetBase(Self); } } singular function RecoilShaker(vector shakeAmount) { local float shakeTime, shakeRoll, shakeVert; RecoilDesired.X=RecoilShake.X+((1.0*shakeAmount.X*2.2)-shakeAmount.X);//2.0)-shakeAmount.X); RecoilDesired.Y=RecoilShake.Y+((1.0*shakeAmount.Y*2.2)-shakeAmount.Y); //CyberP: 2 RecoilDesired.Z=RecoilShake.Z+((1.0*shakeAmount.Z*2.2)-shakeAmount.Z); if (Weapon != none && DeusExWeapon(Weapon).bHandToHand && DeusExWeapon(Weapon).bFiring) { RecoilTime=default.RecoilTime/3; //CyberP: attack effect for melee weapons FovAngle += 1; } else if (Weapon != none && DeusExWeapon(Weapon).bFiring) { if (DeusExWeapon(Weapon).bAutomatic && DeusExWeapon(inHand).bFiring) { RecoilTime=default.RecoilTime/2.5; FovAngle -= 1.5; } else { RecoilTime=default.RecoilTime*0.65; //CyberP: faster shake for guns //if (DeusExWeapon(Weapon).bExtraShaker && !IsLeaning() && PerkNamesArray[12] != 1) //Velocity -= Vector(ViewRotation) * 150; //CyberP: big guns make us step back a bit } } else { RecoilTime=default.RecoilTime; //CyberP: else for flinching and other effects } //SetFOVAngle(FOVAngle); if (RecoilShake.X>RecoilSimLimit.X) RecoilShake.X=RecoilSimLimit.X; if (RecoilShake.Y>RecoilSimLimit.Y) RecoilShake.Y=RecoilSimLimit.Y; if (RecoilShake.Z>RecoilSimLimit.Z) RecoilShake.Z=RecoilSimLimit.Z; if (RecoilShake.X<-RecoilSimLimit.X) RecoilShake.X=-RecoilSimLimit.X; if (RecoilShake.Y<-RecoilSimLimit.Y) RecoilShake.Y=-RecoilSimLimit.Y; if (RecoilShake.Z<-RecoilSimLimit.Z) RecoilShake.Z=-RecoilSimLimit.Z; } function RecoilEffectTick(float deltaTime) { local float invTime; local float shakeTime, ShakeRoll, ShakeVert; if ((RecoilTime>0)||(VSize(RecoilShake)>0.0)) { if (inHand !=none && inHand.IsA('DeusExWeapon') && DeusExWeapon(inHand).bFiring) {invTime=3/default.RecoilTime; if ((!DeusExWeapon(inHand).bSuperheated) && (DeusExWeapon(inHand).bExtraShaker)) //CyberP: hmm, tick... {shakeTime=0.01; shakeRoll=80+80; shakeVert-=2+2; ShakeView(shakeTime, shakeRoll, shakeVert);} } else invTime=1.0/0.140000; RecoilShake.X=Lerp(deltaTime*invTime,RecoilShake.X,RecoilDesired.X); RecoilShake.Y=Lerp(deltaTime*invTime,RecoilShake.Y,RecoilDesired.Y); RecoilShake.Z=Lerp(deltaTime*invTime,RecoilShake.Z,RecoilDesired.Z); RecoilTime-=deltaTime; if (RecoilTime<=0.0) { RecoilTime=0; if ((DeusExWeapon(inHand) != None) && (DeusExWeapon(inHand).bZoomed)) FovAngle = DeusExWeapon(inHand).ScopeFOV; else FovAngle = Default.DesiredFOV; RecoilDesired=vect(0,0,0); if (VSize(RecoilShake)<0.1) RecoilShake=vect(0,0,0); } } /*else if { RecoilShake.X*=(RecoilDrain*deltaTime*(FRand()*0.1+0.9)); RecoilShake.Y*=(RecoilDrain*deltaTime*(FRand()*0.1+0.9)); RecoilShake.Z*=(RecoilDrain*deltaTime*(FRand()*0.1+0.9)); RecoilShake.X +=(FRand()*0.06-0.03); //push to var? RecoilShake.Y +=(FRand()*0.06-0.03); //push to var? RecoilShake.Z +=(FRand()*0.06-0.03); //push to var? }*/ } // ---------------------------------------------------------------------- // DrugEffects() // ---------------------------------------------------------------------- simulated function DrugEffects(float deltaTime) { local float mult, fov, augLevel; local Rotator rot; local DeusExRootWindow root; local Crosshair cross; root = DeusExRootWindow(rootWindow); if (hitmarkerTime > 0) { if ((root != None) && (root.hud != None)) { cross = root.hud.cross; if (bCrosshairVisible==False) bCrosshairVisible=True; cross.SetBackground(Texture'GMDXSFX.Icons.Hitmarker'); //root.hud.SetBackground(Texture'GMDXSFX.Icons.Hitmarker'); hitmarkerTime -= deltaTime; if (hitmarkerTime < 0.05 || IsInState('Dying')) { hitmarkerTime = 0; if (Weapon != None && Weapon.IsA('DeusExWeapon') && DeusExWeapon(Weapon).bLasing && bCrosshairVisible==True) bCrosshairVisible=False; cross.SetBackground(Texture'CrossSquare'); } } } if (drugEffectTimer > 0) { if ((root != None) && (root.hud != None)) { if (root.hud.background == None) { root.hud.SetBackground(Texture'DrunkFX'); root.hud.SetBackgroundSmoothing(True); root.hud.SetBackgroundStretching(True); root.hud.SetBackgroundStyle(DSTY_Modulated);//(DSTY_Modulated); } } mult = FClamp(drugEffectTimer / 10.0, 0.0, 3.0); rot.Pitch = 1024.0 * Cos(Level.TimeSeconds * mult) * deltaTime * mult; rot.Yaw = 1024.0 * Sin(Level.TimeSeconds * mult) * deltaTime * mult; rot.Roll = 0; rot.Pitch = FClamp(rot.Pitch, -4096, 4096); rot.Yaw = FClamp(rot.Yaw, -4096, 4096); ViewRotation += rot; if ((ViewRotation.Pitch > 16384) && (ViewRotation.Pitch < 32768)) ViewRotation.Pitch = 16384; //CyberP: stop view rot /*if ( Level.NetMode == NM_Standalone ) { fov = Default.DesiredFOV - drugEffectTimer + Rand(2); fov = FClamp(fov, 60, Default.DesiredFOV); DesiredFOV = fov; } else */ //DesiredFOV = Default.DesiredFOV; //Aug Environment will help with drug effects augLevel = AugmentationSystem.GetAugLevelValue(class'AugEnviro'); if(augLevel > 0.0) drugEffectTimer -= deltaTime / augLevel; else drugEffectTimer -= deltaTime; if (drugEffectTimer < 0) drugEffectTimer = 0; } else if (bloodTime > 0) { if ((root != None) && (root.hud != None)) { if (root.hud.background == None) { if (FRand() < 0.25) root.hud.SetBackground(Texture'HDTPFlatFXtex2'); else if (FRand() < 0.5) root.hud.SetBackground(Texture'HDTPFlatFXtex3'); else if (FRand() < 0.75) root.hud.SetBackground(Texture'HDTPFlatFXtex5'); else root.hud.SetBackground(Texture'HDTPFlatFXtex6'); root.hud.SetBackgroundSmoothing(True); root.hud.SetBackgroundStretching(True); root.hud.SetBackgroundStyle(DSTY_Modulated);//(DSTY_Modulated); } bloodTime -= deltaTime; if (bloodTime > 0 && bloodTime < 0.2) root.hud.SetBackground(Texture'FadeTop'); else if (bloodTime < 0) bloodTime = 0; } } else if (augEffectTime > 0) //Hmm, may be a problem: if we activate augBallistic to wipe drug effect { if ((root != None) && (root.hud != None)) { if (root.hud.background == None) { root.hud.SetBackground(Texture'Xplsn_EMPG'); root.hud.SetBackgroundSmoothing(True); root.hud.SetBackgroundStretching(True); root.hud.SetBackgroundStyle(DSTY_Modulated);//(DSTY_Modulated); } augEffectTime -= deltaTime; if (augEffectTime < 0) augEffectTime = 0; } } else { if ((root != None) && (root.hud != None)) { if (root.hud.background != None) { root.hud.SetBackground(None); root.hud.SetBackgroundStyle(DSTY_Normal); if (inHand.IsA('DeusExWeapon') && DeusExWeapon(inHand).bZoomed) { } else DesiredFOV = Default.DesiredFOV; } } } } function ZymeEffects(float deltaTime) { //Zyme effect // This function just manages the time and resets it when applicable. The fact // that the value is negative is what other functions look for. if(drugEffectTimer < 0.0) { drugEffectTimer += deltaTime; if(drugEffectTimer >= 0.0) { if(Level.NetMode == NM_Standalone) { flagBase.DeleteFlag('Travel_GameSpeed', FLAG_Float); //Just in case it hasn't been set yet Level.Game.SetGameSpeed(Level.Game.GameSpeed * 2.000); } else log("DeusExPlayer: Somehow the zyme effect was activated in a non-singleplayer map. WTF?"); drugEffectTimer = 60.0; ClientMessage("Zyme effect wears off"); } } } // ---------------------------------------------------------------------- // PlayMusic() // ---------------------------------------------------------------------- function PlayMusic(String musicToPlay, optional int sectionToPlay) { local Music LoadedMusic; local EMusicMode newMusicMode; if (musicToPlay != "") { LoadedMusic = Music(DynamicLoadObject(musicToPlay $ "." $ musicToPlay, class'Music')); if (LoadedMusic != None) { switch(sectionToPlay) { case 0: newMusicMode = MUS_Ambient; break; case 1: newMusicMode = MUS_Combat; break; case 2: newMusicMode = MUS_Conversation; break; case 3: newMusicMode = MUS_Outro; break; case 4: newMusicMode = MUS_Dying; break; default: newMusicMode = MUS_Ambient; break; } ClientSetMusic(LoadedMusic, newMusicMode, 255, MTRAN_FastFade); } } } // ---------------------------------------------------------------------- // PlayMusicWindow() // // Displays the Load Map dialog // ---------------------------------------------------------------------- exec function PlayMusicWindow() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'PlayMusicWindow'); } // ---------------------------------------------------------------------- // UpdateDynamicMusic() // // Pattern definitions: // 0 - Ambient 1 // 1 - Dying // 2 - Ambient 2 (optional) // 3 - Combat // 4 - Conversation // 5 - Outro // ---------------------------------------------------------------------- function UpdateDynamicMusic(float deltaTime) { local bool bCombat; local ScriptedPawn npc; local Pawn CurPawn; local DeusExLevelInfo info; if (Level.Song == None) return; info = GetLevelInfo(); if (info != none) if (info.MapName == "02_NYC_Bar" || info.MapName == "04_NYC_Bar" || info.MapName == "08_NYC_Bar" || info.MapName == "06_HongKong_WanChai_Underworld" || info.MapName == "10_Paris_Club") return; //CyberP: no dynamic music in clubs and bars. // DEUS_EX AMSD In singleplayer, do the old thing. // In multiplayer, we can come out of dying. if (!PlayerIsClient()) { if ((musicMode == MUS_Dying) || (musicMode == MUS_Outro)) return; } else { if (musicMode == MUS_Outro) return; } musicCheckTimer += deltaTime; musicChangeTimer += deltaTime; if (IsInState('Interpolating')) { // don't mess with the music on any of the intro maps info = GetLevelInfo(); if ((info != None) && (info.MissionNumber < 0)) { musicMode = MUS_Outro; return; } if (musicMode != MUS_Outro) { ClientSetMusic(Level.Song, 5, 255, MTRAN_FastFade); musicMode = MUS_Outro; } } else if (IsInState('Conversation')) { if (musicMode != MUS_Conversation) { // save our place in the ambient track if (musicMode == MUS_Ambient) savedSection = SongSection; else savedSection = 255; ClientSetMusic(Level.Song, 4, 255, MTRAN_Fade); musicMode = MUS_Conversation; } } else if (IsInState('Dying')) { if (musicMode != MUS_Dying) { ClientSetMusic(Level.Song, 1, 255, MTRAN_Fade); musicMode = MUS_Dying; } } else { // only check for combat music every second //CyberP: 2 secs if (musicCheckTimer >= 2.0) { musicCheckTimer = 0.0; bCombat = False; // check a 100 foot radius around me for combat // XXXDEUS_EX AMSD Slow Pawn Iterator //foreach RadiusActors(class'ScriptedPawn', npc, 1600) for (CurPawn = Level.PawnList; CurPawn != None; CurPawn = CurPawn.NextPawn) { npc = ScriptedPawn(CurPawn); if ((npc != None) && (VSize(npc.Location - Location) < (1600 + npc.CollisionRadius))) { if ((npc.GetStateName() == 'Attacking') && (npc.Enemy == Self)) { bCombat = True; break; } } } if (bCombat) { musicChangeTimer = 0.0; if (musicMode != MUS_Combat) { // save our place in the ambient track if (musicMode == MUS_Ambient) savedSection = SongSection; else savedSection = 255; ClientSetMusic(Level.Song, 3, 255, MTRAN_FastFade); musicMode = MUS_Combat; } } else if (musicMode != MUS_Ambient) { // wait until we've been out of combat for 5 seconds before switching music if (musicChangeTimer >= 5.0) { // use the default ambient section for this map if (savedSection == 255) savedSection = Level.SongSection; // fade slower for combat transitions if (musicMode == MUS_Combat) ClientSetMusic(Level.Song, savedSection, 255, MTRAN_SlowFade); else ClientSetMusic(Level.Song, savedSection, 255, MTRAN_Fade); savedSection = 255; musicMode = MUS_Ambient; musicChangeTimer = 0.0; } } } } } // ---------------------------------------------------------------------- // MaintainEnergy() // ---------------------------------------------------------------------- function MaintainEnergy(float deltaTime) { local Float energyUse; local Float energyRegen; // make sure we can't continue to go negative if we take damage // after we're already out of energy if (Energy <= 0) { Energy = 0; EnergyDrain = 0; EnergyDrainTotal = 0; } energyUse = 0; // Don't waste time doing this if the player is dead or paralyzed if ((!IsInState('Dying')) && (!IsInState('Paralyzed'))) { if (Energy > 0) { // Decrement energy used for augmentations energyUse = AugmentationSystem.CalcEnergyUse(deltaTime); Energy -= EnergyUse; if (Energy < 6) { if (EnergyUse != 0 && bDrainAlert==False) { PlaySound(sound'GMDXSFX.Generic.biolow',SLOT_None); bDrainAlert=True; //CyberP: alert when energy is low } } if (Energy > 10) bDrainAlert=False; // Calculate the energy drain due to EMP attacks if (EnergyDrain > 0) { energyUse = EnergyDrainTotal * deltaTime; Energy -= EnergyUse; EnergyDrain -= EnergyUse; if (EnergyDrain <= 0) { EnergyDrain = 0; EnergyDrainTotal = 0; } } } //Do check if energy is 0. // If the player's energy drops to zero, deactivate // all augmentations if (Energy <= 0) { //If we were using energy, then tell the client we're out. //Otherwise just make sure things are off. If energy was //already 0, then energy use will still be 0, so we won't //spam. DEUS_EX AMSD if (energyUse > 0) ClientMessage(EnergyDepleted); Energy = 0; EnergyDrain = 0; EnergyDrainTotal = 0; AugmentationSystem.DeactivateAll(); } // If all augs are off, then start regenerating in multiplayer, // up to 25%. if ((energyUse == 0) && (Energy <= MaxRegenPoint) && (Level.NetMode != NM_Standalone)) { energyRegen = RegenRate * deltaTime; Energy += energyRegen; } } } // ---------------------------------------------------------------------- // RefreshSystems() // DEUS_EX AMSD For keeping multiplayer working in better shape // ---------------------------------------------------------------------- simulated function RefreshSystems(float DeltaTime) { local DeusExRootWindow root; if (Level.NetMode == NM_Standalone) return; if (Role == ROLE_Authority) return; if (LastRefreshTime < 0) LastRefreshTime = 0; LastRefreshTime = LastRefreshTime + DeltaTime; if (LastRefreshTime < 0.25) return; if (AugmentationSystem != None) AugmentationSystem.RefreshAugDisplay(); root = DeusExRootWindow(rootWindow); if (root != None) root.RefreshDisplay(LastRefreshTime); RepairInventory(); LastRefreshTime = 0; } function RepairInventory() { local byte LocalInvSlots[30]; // 5x6 grid of inventory slots local int i; local int slotsCol; local int slotsRow; local Inventory curInv; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) return; //clean out our temp inventory. for (i = 0; i < 30; i++) LocalInvSlots[i] = 0; // go through our inventory and fill localinvslots if (Inventory != None) { for (curInv = Inventory; curInv != None; curInv = curInv.Inventory) { // Make sure this item is located in a valid position if (( curInv.invPosX != -1 ) && ( curInv.invPosY != -1 )) { // fill inventory slots for( slotsRow=0; slotsRow < curInv.invSlotsY; slotsRow++ ) for ( slotsCol=0; slotsCol < curInv.invSlotsX; slotsCol++ ) LocalInvSlots[((slotsRow + curInv.invPosY) * maxInvCols) + (slotscol + curInv.invPosX)] = 1; } } } // verify that the 2 inventory grids match for (i = 0; i < 30; i++) if (LocalInvSlots[i] < invSlots[i]) //don't stuff slots, that can get handled elsewhere, just clear ones that need it { log("ERROR!!! Slot "$i$" should be "$LocalInvSlots[i]$", but isn't!!!!, repairing"); invSlots[i] = LocalInvSlots[i]; } } // ---------------------------------------------------------------------- // Bleed() // // Let the blood flow // ---------------------------------------------------------------------- function Bleed(float deltaTime) { local float dropPeriod; local float adjustedRate; local vector bloodVector; if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) { bleedrate = 0; dropCounter = 0; return; } // Copied from ScriptedPawn::Tick() bleedRate = FClamp(bleedRate, 0.0, 1.0); if (bleedRate > 0) { adjustedRate = (1.0-bleedRate)*1.0+0.1; // max 10 drops per second dropPeriod = adjustedRate / FClamp(VSize(Velocity)/512.0, 0.05, 1.0); dropCounter += deltaTime; while (dropCounter >= dropPeriod) { bloodVector = vect(0,0,1)*CollisionHeight*0.5; // so folks don't bleed from the crotch spawn(Class'BloodDrop',,,bloodVector+Location); dropCounter -= dropPeriod; } bleedRate -= deltaTime/clotPeriod; } if (bleedRate <= 0) { dropCounter = 0; bleedRate = 0; } } // ---------------------------------------------------------------------- // UpdatePoison() // // Get all woozy 'n' stuff // ---------------------------------------------------------------------- function UpdatePoison(float deltaTime) { if (Health <= 0) // no more pain -- you're already dead! return; if (InConversation()) // kinda hacky... return; if (poisonCounter > 0) { poisonTimer += deltaTime; if (poisonTimer >= 3.0) // pain every two seconds //CyberP: three seconds { poisonTimer = 0; poisonCounter--; TakeDamage(poisonDamage * 0.5, myPoisoner, Location, vect(0,0,0), 'PoisonEffect'); //CyberP: since we have thrice as effective tranq darts, reduce poison damage to player by half. 15 dam per interval on hardcore } if ((poisonCounter <= 0) || (Health <= 0)) StopPoison(); } } // ---------------------------------------------------------------------- // StartPoison() // // Gakk! We've been poisoned! // ---------------------------------------------------------------------- function StartPoison( Pawn poisoner, int Damage ) { myPoisoner = poisoner; if (myPoisoner.weapon.IsA('WeaponGreaselSpit') && FRand() < 0.3) PlaySound(sound'MaleCough',SLOT_Pain); //CyberP: cough to greasel spit if (Health <= 0) // no more pain -- you're already dead! return; if (InConversation()) // kinda hacky... return; // CyberP: less poison if if (PerkNamesArray[20]==1) poisonCounter = 3; else poisonCounter = 4; // take damage no more than four times (over 8 seconds) poisonTimer = 0; // reset pain timer if (poisonDamage < Damage) // set damage amount poisonDamage = Damage; // CyberP: Don't do drug effects if if (PerkNamesArray[20]==1 && poisonCounter > 0) drugEffectTimer = 0; else drugEffectTimer += 3; // make the player vomit for the next four seconds // In multiplayer, don't let the effect last longer than 30 seconds if ( Level.NetMode != NM_Standalone ) { if ( drugEffectTimer > 30 ) drugEffectTimer = 30; } } // ---------------------------------------------------------------------- // StopPoison() // // Stop the pain // ---------------------------------------------------------------------- function StopPoison() { myPoisoner = None; poisonCounter = 0; poisonTimer = 0; poisonDamage = 0; } // ---------------------------------------------------------------------- // SpawnEMPSparks() // // Spawn sparks for items affected by Warren's EMP Field // ---------------------------------------------------------------------- function SpawnEMPSparks(Actor empActor, Rotator rot) { local ParticleGenerator sparkGen; if ((empActor == None) || empActor.bDeleteMe) return; sparkGen = Spawn(class'ParticleGenerator', empActor,, empActor.Location, rot); if (sparkGen != None) { sparkGen.SetBase(empActor); sparkGen.LifeSpan = 3; sparkGen.particleTexture = Texture'Effects.Fire.SparkFX1'; sparkGen.particleDrawScale = 0.1; sparkGen.bRandomEject = True; sparkGen.ejectSpeed = 100.0; sparkGen.bGravity = True; sparkGen.bParticlesUnlit = True; sparkGen.frequency = 1.0; sparkGen.riseRate = 10; sparkGen.spawnSound = Sound'Spark2'; } } // ---------------------------------------------------------------------- // UpdateWarrenEMPField() // // Update Warren's EMP field // ---------------------------------------------------------------------- function UpdateWarrenEMPField(float deltaTime) { local float empRadius; local Robot curRobot; local AlarmUnit curAlarm; local AutoTurret curTurret; local LaserTrigger curLaser; local BeamTrigger curBeam; local SecurityCamera curCamera; local int option; if (bWarrenEMPField) { WarrenTimer -= deltaTime; if (WarrenTimer <= 0) { WarrenTimer = 0.15; empRadius = 600; if (WarrenSlot == 0) { foreach RadiusActors(Class'Robot', curRobot, empRadius) { if ((curRobot.LastRendered() < 2.0) && (curRobot.CrazedTimer <= 0) && (curRobot.EMPHitPoints > 0)) { if (curRobot.GetPawnAllianceType(self) == ALLIANCE_Hostile) option = Rand(2); else option = 0; if (option == 0) curRobot.TakeDamage(curRobot.EMPHitPoints*2, self, curRobot.Location, vect(0,0,0), 'EMP'); else curRobot.TakeDamage(100, self, curRobot.Location, vect(0,0,0), 'NanoVirus'); SpawnEMPSparks(curRobot, Rotator(Location-curRobot.Location)); } } } else if (WarrenSlot == 1) { foreach RadiusActors(Class'AlarmUnit', curAlarm, empRadius) { if ((curAlarm.LastRendered() < 2.0) && !curAlarm.bConfused) { curAlarm.TakeDamage(100, self, curAlarm.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curAlarm, curAlarm.Rotation); } } } else if (WarrenSlot == 2) { foreach RadiusActors(Class'AutoTurret', curTurret, empRadius) { if ((curTurret.LastRendered() < 2.0) && !curTurret.bConfused) { curTurret.TakeDamage(100, self, curTurret.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curTurret, Rotator(Location-curTurret.Location)); } } } else if (WarrenSlot == 3) { foreach RadiusActors(Class'LaserTrigger', curLaser, empRadius) { if ((curLaser.LastRendered() < 2.0) && !curLaser.bConfused) { curLaser.TakeDamage(100, self, curLaser.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curLaser, curLaser.Rotation); } } } else if (WarrenSlot == 4) { foreach RadiusActors(Class'BeamTrigger', curBeam, empRadius) { if ((curBeam.LastRendered() < 2.0) && !curBeam.bConfused) { curBeam.TakeDamage(100, self, curBeam.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curBeam, curBeam.Rotation); } } } else if (WarrenSlot == 5) { foreach RadiusActors(Class'SecurityCamera', curCamera, empRadius) { if ((curCamera.LastRendered() < 2.0) && !curCamera.bConfused) { curCamera.TakeDamage(100, self, curCamera.Location, vect(0,0,0), 'EMP'); SpawnEMPSparks(curCamera, Rotator(Location-curCamera.Location)); } } } WarrenSlot++; if (WarrenSlot >= 6) WarrenSlot = 0; } } } // ---------------------------------------------------------------------- // UpdateTranslucency() // DEUS_EX AMSD Try to make the player harder to see if he is in darkness. // ---------------------------------------------------------------------- function UpdateTranslucency(float DeltaTime) { local float DarkVis; local float CamoVis; local AdaptiveArmor armor; local bool bMakeTranslucent; local DeusExMPGame Game; // Don't do it in multiplayer. if (Level.NetMode == NM_Standalone) return; Game = DeusExMPGame(Level.Game); if (Game == None) { return; } bMakeTranslucent = false; //DarkVis = AIVisibility(TRUE); DarkVis = 1.0; CamoVis = 1.0; //Check cloaking. if (AugmentationSystem.GetAugLevelValue(class'AugCloak') != -1.0) { bMakeTranslucent = TRUE; CamoVis = Game.CloakEffect; } // If you have a weapon out, scale up the camo and turn off the cloak. // Adaptive armor leaves you completely invisible, but drains quickly. if ((inHand != None) && (inHand.IsA('DeusExWeapon')) && (CamoVis < 1.0)) { CamoVis = 1.0; bMakeTranslucent=FALSE; ClientMessage(WeaponUnCloak); AugmentationSystem.FindAugmentation(class'AugCloak').Deactivate(); } // go through the actor list looking for owned AdaptiveArmor // since they aren't in the inventory anymore after they are used if (UsingChargedPickup(class'AdaptiveArmor')) { CamoVis = CamoVis * Game.CloakEffect; bMakeTranslucent = TRUE; } ScaleGlow = Default.ScaleGlow * CamoVis * DarkVis; //Translucent is < 0.1, untranslucent if > 0.2, not same edge to prevent sharp breaks. if (bMakeTranslucent) { Style = STY_Translucent; if (Self.IsA('JCDentonMale')) { MultiSkins[6] = Texture'BlackMaskTex'; MultiSkins[7] = Texture'BlackMaskTex'; } } else if (Game.bDarkHiding) { if (CamoVis * DarkVis < Game.StartHiding) Style = STY_Translucent; if (CamoVis * DarkVis > Game.EndHiding) Style = Default.Style; } else if (!bMakeTranslucent) { if (Self.IsA('JCDentonMale')) { MultiSkins[6] = Default.MultiSkins[6]; MultiSkins[7] = Default.MultiSkins[7]; } Style = Default.Style; } } // ---------------------------------------------------------------------- // RestoreSkillPoints() // // Restore skill point variables // ---------------------------------------------------------------------- function RestoreSkillPoints() { local name flagName; bSavingSkillsAugs = False; // Get the skill points available flagName = rootWindow.StringToName("SKTemp_SkillPointsAvail"); if (flagBase.CheckFlag(flagName, FLAG_Int)) { SkillPointsAvail = flagBase.GetInt(flagName); flagBase.DeleteFlag(flagName, FLAG_Int); } // Get the skill points total flagName = rootWindow.StringToName("SKTemp_SkillPointsTotal"); if (flagBase.CheckFlag(flagName, FLAG_Int)) { SkillPointsTotal = flagBase.GetInt(flagName); flagBase.DeleteFlag(flagName, FLAG_Int); } } // ---------------------------------------------------------------------- // SaveSkillPoints() // // Saves out skill points, used when starting a new game // ---------------------------------------------------------------------- function SaveSkillPoints() { local name flagName; // Save/Restore must be done as atomic unit if (bSavingSkillsAugs) return; bSavingSkillsAugs = True; // Save the skill points available flagName = rootWindow.StringToName("SKTemp_SkillPointsAvail"); flagBase.SetInt(flagName, SkillPointsAvail); // Save the skill points available flagName = rootWindow.StringToName("SKTemp_SkillPointsTotal"); flagBase.SetInt(flagName, SkillPointsTotal); } // ---------------------------------------------------------------------- // AugAdd() // // Augmentation system functions // exec functions for command line for demo // ---------------------------------------------------------------------- exec function AugAdd(class<Augmentation> aWantedAug) { local Augmentation anAug; if (!bCheatsEnabled) return; if (AugmentationSystem != None) { anAug = AugmentationSystem.GivePlayerAugmentation(aWantedAug); if (anAug == None) ClientMessage(GetItemName(String(aWantedAug)) $ " is not a valid augmentation!"); } } // ---------------------------------------------------------------------- // ActivateAugmentation() // ---------------------------------------------------------------------- exec function ActivateAugmentation(int num) { local Augmentation anAug; local int count, wantedSlot, slotIndex; local bool bFound; if (RestrictInput()) return; if (Energy == 0) { ClientMessage(EnergyDepleted); PlaySound(AugmentationSystem.FirstAug.DeactivateSound, SLOT_None); return; } if (AugmentationSystem != None) AugmentationSystem.ActivateAugByKey(num); } // ---------------------------------------------------------------------- // ActivateAllAugs() // ---------------------------------------------------------------------- exec function ActivateAllAugs() { if (AugmentationSystem != None) AugmentationSystem.ActivateAll(); } // ---------------------------------------------------------------------- // DeactivateAllAugs() // ---------------------------------------------------------------------- exec function DeactivateAllAugs() { if (AugmentationSystem != None) AugmentationSystem.DeactivateAll(); } // ---------------------------------------------------------------------- // SwitchAmmo() // ---------------------------------------------------------------------- exec function SwitchAmmo() { if (inHand.IsA('DeusExWeapon')) DeusExWeapon(inHand).CycleAmmo(); } // ---------------------------------------------------------------------- // RemoveInventoryType() // ---------------------------------------------------------------------- function RemoveInventoryType(Class<Inventory> removeType) { local Inventory item; item = FindInventoryType(removeType); if (item != None) DeleteInventory(item); } // ---------------------------------------------------------------------- // AddAugmentationDisplay() // ---------------------------------------------------------------------- function AddAugmentationDisplay(Augmentation aug) { //DEUS_EX AMSD Added none check here. if ((rootWindow != None) && (aug != None)) DeusExRootWindow(rootWindow).hud.activeItems.AddIcon(aug.SmallIcon, aug); } // ---------------------------------------------------------------------- // RemoveAugmentationDisplay() // ---------------------------------------------------------------------- function RemoveAugmentationDisplay(Augmentation aug) { DeusExRootWindow(rootWindow).hud.activeItems.RemoveIcon(aug); } // ---------------------------------------------------------------------- // ClearAugmentationDisplay() // ---------------------------------------------------------------------- function ClearAugmentationDisplay() { DeusExRootWindow(rootWindow).hud.activeItems.ClearAugmentationDisplay(); } // ---------------------------------------------------------------------- // UpdateAugmentationDisplayStatus() // ---------------------------------------------------------------------- function UpdateAugmentationDisplayStatus(Augmentation aug) { DeusExRootWindow(rootWindow).hud.activeItems.UpdateAugIconStatus(aug); } // ---------------------------------------------------------------------- // AddChargedDisplay() // ---------------------------------------------------------------------- function AddChargedDisplay(ChargedPickup item) { if ( (PlayerIsClient()) || (Level.NetMode == NM_Standalone) ) DeusExRootWindow(rootWindow).hud.activeItems.AddIcon(item.ChargedIcon, item); } // ---------------------------------------------------------------------- // RemoveChargedDisplay() // ---------------------------------------------------------------------- function RemoveChargedDisplay(ChargedPickup item) { if ( (PlayerIsClient()) || (Level.NetMode == NM_Standalone) ) DeusExRootWindow(rootWindow).hud.activeItems.RemoveIcon(item); } // ---------------------------------------------------------------------- // ActivateKeypadWindow() // DEUS_EX AMSD Has to be here because player doesn't own keypad, so // func rep doesn't work right. // ---------------------------------------------------------------------- function ActivateKeypadWindow(Keypad KPad, bool bHacked) { KPad.ActivateKeypadWindow(Self, bHacked); } function KeypadRunUntriggers(Keypad KPad) { KPad.RunUntriggers(Self); } function KeypadRunEvents(Keypad KPad, bool bSuccess) { KPad.RunEvents(Self, bSuccess); } function KeypadToggleLocks(Keypad KPad) { KPad.ToggleLocks(Self); } // ---------------------------------------------------------------------- // Multiplayer computer functions // ---------------------------------------------------------------------- //server->client (computer to frobber) function InvokeComputerScreen(Computers computerToActivate, float CompHackTime, float ServerLevelTime) { local NetworkTerminal termwindow; local DeusExRootWindow root; computerToActivate.LastHackTime = CompHackTime + (Level.TimeSeconds - ServerLevelTime); ActiveComputer = ComputerToActivate; //only allow for clients or standalone if ((Level.NetMode != NM_Standalone) && (!PlayerIsClient())) { ActiveComputer = None; CloseComputerScreen(computerToActivate); return; } root = DeusExRootWindow(rootWindow); if (root != None) { termwindow = NetworkTerminal(root.InvokeUIScreen(computerToActivate.terminalType, True)); if (termwindow != None) { computerToActivate.termwindow = termwindow; termWindow.SetCompOwner(computerToActivate); // If multiplayer, start hacking if there are no users if ((Level.NetMode != NM_Standalone) && (!termWindow.bHacked) && (computerToActivate.NumUsers() == 0) && (termWindow.winHack != None) && (termWindow.winHack.btnHack != None)) { termWindow.winHack.StartHack(); termWindow.winHack.btnHack.SetSensitivity(False); termWindow.FirstScreen=None; } termWindow.ShowFirstScreen(); } } if ((termWindow == None) || (root == None)) { CloseComputerScreen(computerToActivate); ActiveComputer = None; } } // CloseThisComputer is for the client (used at the end of a mp match) function CloseThisComputer( Computers comp ) { if ((comp != None) && ( comp.termwindow != None )) comp.termwindow.CloseScreen("EXIT"); } //client->server (window to player) function CloseComputerScreen(Computers computerToClose) { computerToClose.CloseOut(); } //client->server (window to player) function SetComputerHackTime(Computers computerToSet, float HackTime, float ClientLevelTime) { computerToSet.lastHackTime = HackTime + (Level.TimeSeconds - ClientLevelTime); } //client->server (window to player) function UpdateCameraRotation(SecurityCamera camera, Rotator rot) { camera.DesiredRotation = rot; } //client->server (window to player) function ToggleCameraState(SecurityCamera cam, ElectronicDevices compOwner) { if (cam.bActive) { cam.UnTrigger(compOwner, self); cam.team = -1; } else { MakeCameraAlly(cam); cam.Trigger(compOwner, self); } // Make sure the camera isn't in bStasis=True // so it responds to our every whim. cam.bStasis = False; } //client->server (window to player) function SetTurretState(AutoTurret turret, bool bActive, bool bDisabled) { turret.bActive = bActive; turret.bDisabled = bDisabled; turret.bComputerReset = False; } //client->server (window to player) function SetTurretTrackMode(ComputerSecurity computer, AutoTurret turret, bool bTrackPlayers, bool bTrackPawns) { local String str; turret.bTrackPlayersOnly = bTrackPlayers; turret.bTrackPawnsOnly = bTrackPawns; turret.bComputerReset = False; //in multiplayer, behave differently //set the safe target to ourself. if (Level.NetMode != NM_Standalone) { //we abuse the names of the booleans here. turret.SetSafeTarget( Self ); if (Role == ROLE_Authority) { if ( TeamDMGame(DXGame) != None ) { computer.team = PlayerReplicationInfo.team; turret.team = PlayerReplicationInfo.Team; if ( !turret.bDisabled ) { str = TakenOverString $ turret.titleString $ "."; TeamSay( str ); } } else { computer.team = PlayerReplicationInfo.PlayerID; turret.team = PlayerReplicationInfo.PlayerID; } } } } //client->server (window to player) function MakeCameraAlly(SecurityCamera camera) { Camera.SafeTarget = Self; if (Level.Game.IsA('TeamDMGame')) Camera.Team = PlayerReplicationInfo.Team; else Camera.Team = PlayerReplicationInfo.PlayerID; } //client->server (window to player) function PunishDetection(int DamageAmount) { if (DamageAmount > 0) TakeDamage(DamageAmount, None, vect(0,0,0), vect(0,0,0), 'EMP'); } // ---------------------------------------------------------------------- // AddDamageDisplay() // // Turn on the correct damage type icon on the HUD // Note that these icons naturally fade out after a few seconds, // so there is no need to turn them off // ---------------------------------------------------------------------- function AddDamageDisplay(name damageType, vector hitOffset) { DeusExRootWindow(rootWindow).hud.damageDisplay.AddIcon(damageType, hitOffset); } // ---------------------------------------------------------------------- // SetDamagePercent() // // Set the percentage amount of damage that's being absorbed // ---------------------------------------------------------------------- function SetDamagePercent(float percent) { DeusExRootWindow(rootWindow).hud.damageDisplay.SetPercent(percent); } // ---------------------------------------------------------------------- // default sound functions // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- // PlayBodyThud() // // this is called by MESH NOTIFY // ---------------------------------------------------------------------- function PlayBodyThud() { PlaySound(sound'BodyThud', SLOT_Interact); } // ---------------------------------------------------------------------- // GetWallMaterial() // // gets the name of the texture group that we are facing // ---------------------------------------------------------------------- function name GetWallMaterial(out vector wallNormal) { local vector EndTrace, HitLocation, HitNormal; local actor target; local int texFlags, grabDist; local name texName, texGroup; // if we are falling, then increase our grabbing distance if (Physics == PHYS_Falling) grabDist = 3.0; else grabDist = 1.5; // trace out in front of us EndTrace = Location + (Vector(Rotation) * CollisionRadius * grabDist); foreach TraceTexture(class'Actor', target, texName, texGroup, texFlags, HitLocation, HitNormal, EndTrace) { if ((target == Level) || target.IsA('Mover')) break; } wallNormal = HitNormal; return texGroup; } // ---------------------------------------------------------------------- // GetFloorMaterial() // // gets the name of the texture group that we are standing on // ---------------------------------------------------------------------- function name GetFloorMaterial() { local vector EndTrace, HitLocation, HitNormal; local actor target; local int texFlags; local name texName, texGroup; // trace down to our feet EndTrace = Location - CollisionHeight * 2 * vect(0,0,1); foreach TraceTexture(class'Actor', target, texName, texGroup, texFlags, HitLocation, HitNormal, EndTrace) { if ((target == Level) || target.IsA('Mover')) break; } if (target != None && target.IsA('DeusExMover')) //CyberP: special case for movers. { if (target.IsA('BreakableGlass')) texGroup = 'Glass'; else if (DeusExMover(target).FragmentClass == Class'DeusEx.WoodFragment') texGroup = 'Wood'; else if (DeusExMover(target).FragmentClass == Class'DeusEx.MetalFragment') texGroup = 'Metal'; else texGroup = 'Stucco'; } return texGroup; } // ---------------------------------------------------------------------- // PlayFootStep() // // plays footstep sounds based on the texture group // yes, I know this looks nasty -- I'll have to figure out a cleaner // way to do this // ---------------------------------------------------------------------- simulated function PlayFootStep() { local Sound stepSound; local float rnd; local float speedFactor, massFactor; local float volume, pitch, range; local float radius, mult; local float volumeMultiplier,volumeMod; local DeusExPlayer pp; local bool bOtherPlayer; local float shakeTime, shakeRoll, shakeVert; // Only do this on ourself, since this takes into account aug stealth and such if ( Level.NetMode != NM_StandAlone ) pp = DeusExPlayer( GetPlayerPawn() ); if ( pp != Self ) bOtherPlayer = True; else bOtherPlayer = False; rnd = FRand(); volumeMultiplier = 1.0; if (IsInState('PlayerSwimming') || (Physics == PHYS_Swimming)) { volumeMultiplier = 0.5; if (rnd < 0.5) stepSound = Sound'Swimming'; else stepSound = Sound'Treading'; } else if (FootRegion.Zone.bWaterZone) { volumeMultiplier = 1.0; if (rnd < 0.33) stepSound = Sound'WaterStep1'; else if (rnd < 0.66) stepSound = Sound'WaterStep2'; else stepSound = Sound'WaterStep3'; } else { switch(FloorMaterial) { case 'Textile': case 'Paper': volumeMultiplier = 0.6; if (rnd < 0.25) stepSound = Sound'CarpetStep1'; else if (rnd < 0.5) stepSound = Sound'CarpetStep2'; else if (rnd < 0.75) stepSound = Sound'CarpetStep3'; else stepSound = Sound'CarpetStep4'; break; case 'Earth': volumeMultiplier = 0.8; if (rnd < 0.25) stepSound = Sound'DIRT1'; else if (rnd < 0.5) stepSound = Sound'DIRT2'; else if (rnd < 0.75) stepSound = Sound'DIRT3'; else stepSound = Sound'DIRT4'; break; case 'Foliage': volumeMultiplier = 0.7; if (rnd < 0.25) stepSound = Sound'GrassStep1'; else if (rnd < 0.5) stepSound = Sound'GrassStep2'; else if (rnd < 0.75) stepSound = Sound'GrassStep3'; else stepSound = Sound'GrassStep4'; break; case 'Metal': volumeMultiplier = 0.9; if (bThisMission) { if (rnd < 0.25) stepSound = Sound'GRATE1'; else if (rnd < 0.5) stepSound = Sound'GRATE2'; else if (rnd < 0.75) stepSound = Sound'GRATE3'; else stepSound = Sound'GRATE4'; } else { if (rnd < 0.25) stepSound = Sound'MetalStep1'; else if (rnd < 0.5) stepSound = Sound'MetalStep2'; else if (rnd < 0.75) stepSound = Sound'MetalStep3'; else stepSound = Sound'MetalStep4'; } break; case 'Ladder': volumeMultiplier = 1.0; if (rnd < 0.25) stepSound = Sound'GRATE1'; else if (rnd < 0.5) stepSound = Sound'GRATE2'; else if (rnd < 0.75) stepSound = Sound'GRATE3'; else stepSound = Sound'GRATE4'; break; case 'Glass': volumeMultiplier = 0.7; if (rnd < 0.25) stepSound = Sound'GLASS1'; else if (rnd < 0.5) stepSound = Sound'GLASS2'; else if (rnd < 0.75) stepSound = Sound'GLASS3'; else stepSound = Sound'GLASS4'; break; case 'Ceramic': case 'Tiles': volumeMultiplier = 0.75; if (rnd < 0.25) stepSound = Sound'TileStep1'; else if (rnd < 0.5) stepSound = Sound'TileStep2'; else if (rnd < 0.75) stepSound = Sound'TileStep3'; else stepSound = Sound'TileStep4'; break; case 'Wood': volumeMultiplier = 0.8; if (rnd < 0.25) stepSound = Sound'WoodStep1'; else if (rnd < 0.5) stepSound = Sound'WoodStep2'; else if (rnd < 0.75) stepSound = Sound'WoodStep3'; else stepSound = Sound'WoodStep4'; break; case 'Stucco': volumeMultiplier = 0.7; if (rnd < 0.25) stepSound = Sound'CARDB1'; else if (rnd < 0.5) stepSound = Sound'CARDB2'; else if (rnd < 0.75) stepSound = Sound'CARDB3'; else stepSound = Sound'CARDB4'; break; case 'Brick': case 'Concrete': volumeMultiplier = 0.95; if (rnd < 0.25) stepSound = Sound'STEP1'; else if (rnd < 0.5) stepSound = Sound'STEP2'; else if (rnd < 0.75) stepSound = Sound'STEP3'; else stepSound = Sound'STEP4'; break; case 'Stone': default: volumeMultiplier = 0.8; if (rnd < 0.25) stepSound = Sound'StoneStep1'; else if (rnd < 0.5) stepSound = Sound'StoneStep2'; else if (rnd < 0.75) stepSound = Sound'StoneStep3'; else stepSound = Sound'StoneStep4'; break; } } // compute sound volume, range and pitch, based on mass and speed if (IsInState('PlayerSwimming') || (Physics == PHYS_Swimming)) speedFactor = WaterSpeed/180.0; else speedFactor = VSize(Velocity)/200.0; //CyberP: was 180 massFactor = Mass/150.0; radius = 375.0; volume = (speedFactor+0.2) * massFactor; //CyberP: SpeedF bonus Was +0.2 range = radius * volume; pitch = (volume+0.5); volume = FClamp(volume, 0, 1.0) * 0.5; // Hack to compensate for increased footstep volume. range = FClamp(range, 0.01, radius*4); pitch = FClamp(pitch, 1.0, 1.5); // AugStealth decreases our footstep volume volume *= RunSilentValue; //CyberP: new sounds for landing from height. if (Velocity.Z < -350) { if (FloorMaterial=='Wood' && Velocity.Z > -500) stepSound=sound'WoodLand'; else if (FloorMaterial=='Concrete' || FloorMaterial=='Stone' || FloorMaterial=='Tile') stepSound=sound'pcconcfall1'; else if (FloorMaterial=='Wood') stepSound=sound'DSOOF2'; else if (FloorMaterial=='Textile' || FloorMaterial=='Paper') stepSound=sound'CarpetLand'; else if (FloorMaterial=='Earth' || FloorMaterial=='Foliage') stepSound=sound'pl_jumpland1'; volume*=1.5; } if (Velocity.Z < -500) { if (((bThisMission) && (FloorMaterial=='Metal'))|| FloorMaterial=='Ladder') PlaySound(sound'bouncemetal',SLOT_None,volume*1.25,,,0.6); else if (FloorMaterial=='Metal') PlaySound(sound'MetalDoorClose',SLOT_None,volume*1.25,,,1.5); } //GMDX: modded for skill system stealth volumeMod=0.9; if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')>=1) { if (abs(Velocity.z)>20) volumeMod*=0.1; //no point really having landed caclucate when footstep overrides it, so a nasty hack is afoot. //if (SkillSystem.GetSkillLevel(class'SkillStealth')>1) volume *= 0.6; } //if (bJustLanded) log("PlayFootStep bJustLanded vol="@volume@": mod="@volumeMod@": Z="@Velocity.Z); if (bIsWalking) volume *= 0.3; //CyberP: can walk up behind enemies. PlaySound(stepSound, SLOT_Interact, volume, , range, pitch); AISendEvent('LoudNoise', EAITYPE_Audio, volume*volumeMultiplier*volumeMod, range*volumeMultiplier); } // ---------------------------------------------------------------------- // IsHighlighted() // // checks to see if we should highlight this actor // ---------------------------------------------------------------------- function bool IsHighlighted(actor A) { if (bBehindView) return False; if (A != None) { if (A.bDeleteMe || A.bHidden) return False; if (A.IsA('Pawn')) { if (!bNPCHighlighting) return False; } if (A.IsA('DeusExMover') && !DeusExMover(A).bHighlight) return False; else if (A.IsA('Mover') && !A.IsA('DeusExMover')) return False; else if (A.IsA('DeusExDecoration') && !DeusExDecoration(A).bHighlight) return False; else if (A.IsA('DeusExCarcass') && !DeusExCarcass(A).bHighlight) return False; else if (A.IsA('ThrownProjectile') && !ThrownProjectile(A).bHighlight) return False; else if (A.IsA('DeusExProjectile') && !DeusExProjectile(A).bStuck) return False; else if (A.IsA('ScriptedPawn') && !ScriptedPawn(A).bHighlight) return False; } return True; } // ---------------------------------------------------------------------- // IsFrobbable() // // is this actor frobbable? // ---------------------------------------------------------------------- function bool IsFrobbable(actor A) { if ((!A.bHidden)) //GMDX: so you it doesnt hightlight spoof &&(!A.IsA('WeaponGEPmounted')) if (A.IsA('Mover') || A.IsA('DeusExDecoration') || A.IsA('Inventory') || A.IsA('ScriptedPawn') || A.IsA('DeusExCarcass') || A.IsA('DeusExProjectile')) return True; return False; } // ---------------------------------------------------------------------- // HighlightCenterObject() // // checks to see if an object can be frobbed, if so, then highlight it // ---------------------------------------------------------------------- function HighlightCenterObject() { local Actor target, smallestTarget; local Vector HitLoc, HitNormal, StartTrace, EndTrace; local DeusExRootWindow root; local float minSize; local bool bFirstTarget; local int skillz; local float shakeTime, shakeRoll, shakeVert; local float rnd; if (IsInState('Dying')) return; root = DeusExRootWindow(rootWindow); // only do the trace every tenth of a second if (FrobTime >= 0.1) { /*if (WallMaterial == 'Ladder' || FloorMaterial == 'Ladder') //CyberP: hack for ladder climbing sfx. Meh, inconsistent { if (Velocity.Z != 0 && FRand() < 0.25) { rnd = FRand(); if (rnd < 0.25) PlaySound(Sound'GMDXSFX.Player.pl_ladder1',SLOT_None); else if (rnd < 0.5) PlaySound(Sound'GMDXSFX.Player.pl_ladder2',SLOT_None); else if (rnd < 0.75) PlaySound(Sound'GMDXSFX.Player.pl_ladder3',SLOT_None); else PlaySound(Sound'GMDXSFX.Player.pl_ladder4',SLOT_None); } } */ if (inHand != None && inHand.IsA('Multitool')) { if (self.IsA('DeusExPlayer') && PerkNamesArray[16]==1) MaxFrobDistance = 768; } else { MaxFrobDistance = 112; } // figure out how far ahead we should trace StartTrace = Location; EndTrace = Location + (Vector(ViewRotation) * MaxFrobDistance); // adjust for the eye height StartTrace.Z += BaseEyeHeight; EndTrace.Z += BaseEyeHeight; smallestTarget = None; minSize = 99999; bFirstTarget = True; if (bIsCrouching) { if (PerkNamesArray[29]==1) bCrouchRegen=True; if (Velocity.X != 0 || Velocity.Y != 0) { shakeTime = 0.1; shakeRoll = 24+24; shakeVert = 3; ShakeView(shakeTime, shakeRoll, shakeVert); } } else { bCrouchRegen=false; } if (inHand != none && inHand.IsA('Multitool')) { foreach TraceActors(class'Actor', target, HitLoc, HitNormal, EndTrace, StartTrace) { if (IsFrobbable(target) && (target != CarriedDecoration)) { if (target.IsA('HackableDevices')) { } else { MaxFrobDistance=112; StartTrace = Location; EndTrace = Location + (Vector(ViewRotation) * MaxFrobDistance); StartTrace.Z += BaseEyeHeight; EndTrace.Z += BaseEyeHeight; } } } } // find the object that we are looking at // make sure we don't select the object that we're carrying // use the last traced object as the target...this will handle // smaller items under larger items for example // ScriptedPawns always have precedence, though foreach TraceActors(class'Actor', target, HitLoc, HitNormal, EndTrace, StartTrace) { if (IsFrobbable(target) && (target != CarriedDecoration)) { if (target.IsA('ScriptedPawn')) { smallestTarget = target; break; } else if (target.IsA('Mover') && bFirstTarget) { smallestTarget = target; break; } else if (target.CollisionRadius < minSize) { minSize = target.CollisionRadius; smallestTarget = target; bFirstTarget = False; } } } FrobTarget = smallestTarget; // reset our frob timer FrobTime = 0; } } // ---------------------------------------------------------------------- // Landed() // // copied from Engine.PlayerPawn new landing code for Deus Ex // zero damage if falling from 15 feet or less // scaled damage from 15 to 60 feet // death over 60 feet // ---------------------------------------------------------------------- function Landed(vector HitNormal) { local vector legLocation; local int augLevel; local float augReduce, dmg, skillStealthMod; local float shakeTime, shakeRoll, shakeVert; //Note - physics changes type to PHYS_Walking by default for landed pawns PlayLanded(Velocity.Z); // PlaySound(Land, SLOT_Interact, 1); //this is aweful sound, leaving it to footstep if (Velocity.Z < -1.4 * JumpZ) { //MakeNoise(-0.5 * Velocity.Z/(FMax(JumpZ, 150.0))); if ((Velocity.Z < -800) && (ReducedDamageType != 'All')) if ( Role == ROLE_Authority ) { // check our jump augmentation and reduce falling damage if we have it // jump augmentation doesn't exist anymore - use Speed instaed // reduce an absolute amount of damage instead of a relative amount augReduce = 0; if (AugmentationSystem != None) { if (AugmentationSystem.GetAugLevelValue(class'AugStealth') != -1.0) //CyberP: silent running also reduces falling dam too augLevel = AugmentationSystem.GetClassLevel(class'AugStealth'); else augLevel = AugmentationSystem.GetClassLevel(class'AugSpeed'); if (augLevel >= 0) augReduce = 15 * (augLevel+1); } //Calculate the zyme effect if(drugEffectTimer < 0) //(FindInventoryType(Class'DeusEx.ZymeCharged') != None) augReduce += 10; dmg = Max((-0.16 * (Velocity.Z + 700)) - augReduce, 0); legLocation = Location + vect(-1,0,-1); // damage left leg TakeDamage(dmg, None, legLocation, vect(0,0,0), 'fell'); legLocation = Location + vect(1,0,-1); // damage right leg TakeDamage(dmg, None, legLocation, vect(0,0,0), 'fell'); dmg = Max((-0.06 * (Velocity.Z + 700)) - augReduce, 0); legLocation = Location + vect(0,0,1); // damage torso TakeDamage(dmg, None, legLocation, vect(0,0,0), 'fell'); if (dmg > 20) PlaySound(sound'pl_fallpain3',SLOT_None,2.0); } } if (Velocity.Z < -460)//(Abs(Velocity.Z) >= 1.5 * JumpZ)//GMDX add compression to jump/fall (cosmetic) //CyberP: edited { camInterpol = 0.4; if (inHand != none && (inHand.IsA('NanoKeyRing') || inHand.IsA('DeusExPickup'))) { } else { RecoilTime=default.RecoilTime; RecoilShake.Z-=lerp(min(Abs(Velocity.Z),4.0*310)/(4.0*310),0,14.0); //CyberP: 7 RecoilShake.Y-=lerp(min(Abs(Velocity.Z),4.0*310)/(4.0*310),0,6.0); RecoilShaker(vect(3,4,14)); shakeTime= 0.15; shakeRoll = 0; shakeVert = -8; shakeView(shakeTime,shakeRoll,shakeVert); } } //if ( (Level.Game != None) && (Level.Game.Difficulty > 0) && (Abs(Velocity.Z) > 0.75 * 400) ) //{//GMDX: skill system stealth mod //if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')==0 && //AugmentationSystem != None && AugmentationSystem.GetAugLevelValue('AugStealth') == -1.0) // AISendEvent('LoudNoise', EAITYPE_Audio,, 512); //skillStealthMod=0.075; //else skillStealthMod=0.8;//0.15; //skillStealthMod*= Level.Game.Difficulty * (0.01+fMin(abs(Velocity.Z/100.0),3)); //MakeNoise(skillStealthMod ); //log("LANDED VOL: "@skillStealthMod@" "@fMin(abs(Velocity.Z),640)); //if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')==0) //CyberP: fuck it, we'll just have it not send at all //AISendEvent('LoudNoise', EAITYPE_Audio, skillStealthMod, fMin(Abs(Velocity.Z*1.5),536)); //} bJustLanded = true; } // ---------------------------------------------------------------------- // SupportActor() // // Copied directly from ScriptedPawn.uc // Called when something lands on us // ---------------------------------------------------------------------- function SupportActor(Actor standingActor) { local vector newVelocity; local float angle; local float zVelocity; local float baseMass; local float standingMass; local vector damagePoint; local float damage; zVelocity = standingActor.Velocity.Z; standingMass = FMax(1, standingActor.Mass); baseMass = FMax(1, Mass); damagePoint = Location + vect(0,0,1)*(CollisionHeight-1); damage = (1 - (standingMass/baseMass) * (zVelocity/100)); // Have we been stomped? if ((zVelocity*standingMass < -7500) && (damage > 0)) TakeDamage(damage, standingActor.Instigator, damagePoint, 0.2*standingActor.Velocity, 'stomped'); // Bounce the actor off the player angle = FRand()*Pi*2; newVelocity.X = cos(angle); newVelocity.Y = sin(angle); newVelocity.Z = 0; newVelocity *= FRand()*25 + 25; newVelocity += standingActor.Velocity; newVelocity.Z = 90; standingActor.Velocity = newVelocity; standingActor.SetPhysics(PHYS_Falling); } // ---------------------------------------------------------------------- // SpawnCarcass() // // copied from Engine.PlayerPawn // modified to let carcasses have inventories // ---------------------------------------------------------------------- function Carcass SpawnCarcass() { local DeusExCarcass carc; local Inventory item; local Vector loc; // don't spawn a carcass if we've been gibbed if (Health < -40) //CyberP: gib return None; carc = DeusExCarcass(Spawn(CarcassType)); if (carc != None) { carc.Initfor(self); // move it down to the ground loc = Location; loc.z -= CollisionHeight; loc.z += carc.CollisionHeight; carc.SetLocation(loc); if (Player != None) carc.bPlayerCarcass = true; MoveTarget = carc; //for Player 3rd person views // give the carcass the player's inventory for (item=Inventory; item!=None; item=Inventory) { DeleteInventory(item); // carc.AddInventory(item); //CyberP: commented out to prevent suicide inventory exploit. } } return carc; } // ---------------------------------------------------------------------- // Reloading() // // Called when one of the player's weapons is reloading // ---------------------------------------------------------------------- function Reloading(DeusExWeapon weapon, float reloadTime) { if (!IsLeaning() && !bIsCrouching && (Physics != PHYS_Swimming) && !IsInState('Dying')) PlayAnim('Reload', 1.0 / reloadTime, 0.1); } function DoneReloading(DeusExWeapon weapon); // ---------------------------------------------------------------------- // HealPlayer() // ---------------------------------------------------------------------- function int HealPlayer(int baseHealPoints, optional Bool bUseMedicineSkill) { local float mult; local int adjustedHealAmount, aha2, tempaha; local int origHealAmount; local float dividedHealAmount; if (bUseMedicineSkill) adjustedHealAmount = CalculateSkillHealAmount(baseHealPoints); else adjustedHealAmount = baseHealPoints; origHealAmount = adjustedHealAmount; if (adjustedHealAmount > 0) { if (bUseMedicineSkill) { PlaySound(sound'MedicalHiss', SLOT_None,,, 256); ClientFlash(4,vect(0,0,200)); //CyberP: flash when using medkits. } // Heal by 3 regions via multiplayer game if (( Level.NetMode == NM_DedicatedServer ) || ( Level.NetMode == NM_ListenServer )) { // DEUS_EX AMSD If legs broken, heal them a little bit first if (HealthLegLeft == 0) { aha2 = adjustedHealAmount; if (aha2 >= 5) aha2 = 5; tempaha = aha2; adjustedHealAmount = adjustedHealAmount - aha2; HealPart(HealthLegLeft, aha2); HealPart(HealthLegRight,tempaha); mpMsgServerFlags = mpMsgServerFlags & (~MPSERVERFLAG_LostLegs); } HealPart(HealthHead, adjustedHealAmount); if ( adjustedHealAmount > 0 ) { aha2 = adjustedHealAmount; HealPart(HealthTorso, aha2); aha2 = adjustedHealAmount; HealPart(HealthArmRight,aha2); HealPart(HealthArmLeft, adjustedHealAmount); } if ( adjustedHealAmount > 0 ) { aha2 = adjustedHealAmount; HealPart(HealthLegRight, aha2); HealPart(HealthLegLeft, adjustedHealAmount); } } else { HealPartMedicalSkill(HealthHead, adjustedHealAmount); //GMDX upgraded out HealPartMedicalSkill(HealthTorso, adjustedHealAmount); //GMDX upgraded out HealPart(HealthLegRight, adjustedHealAmount); HealPart(HealthLegLeft, adjustedHealAmount); HealPart(HealthArmRight, adjustedHealAmount); HealPart(HealthArmLeft, adjustedHealAmount); } GenerateTotalHealth(); adjustedHealAmount = origHealAmount - adjustedHealAmount; if (origHealAmount == baseHealPoints) { if (adjustedHealAmount == 1) ClientMessage(Sprintf(HealedPointLabel, adjustedHealAmount)); else ClientMessage(Sprintf(HealedPointsLabel, adjustedHealAmount)); } else { ClientMessage(Sprintf(HealedPointsLabel, adjustedHealAmount)); } } return adjustedHealAmount; } // ---------------------------------------------------------------------- // ChargePlayer() // ---------------------------------------------------------------------- function int ChargePlayer(int baseChargePoints) { local int chargedPoints; chargedPoints = Min(EnergyMax - Int(Energy), baseChargePoints); Energy += chargedPoints; return chargedPoints; } // ---------------------------------------------------------------------- // CalculateSkillHealAmount() // ---------------------------------------------------------------------- function int CalculateSkillHealAmount(int baseHealPoints) { local float mult; local int adjustedHealAmount; // check skill use if (SkillSystem != None) { mult = SkillSystem.GetSkillLevelValue(class'SkillMedicine'); // apply the skill adjustedHealAmount = baseHealPoints * mult; } return adjustedHealAmount; } // ---------------------------------------------------------------------- // HealPart() // ---------------------------------------------------------------------- function HealPart(out int points, out int amt) { local int spill; points += amt; spill = points - 100; if (spill > 0) points = 100; else spill = 0; amt = spill; } // ---------------------------------------------------------------------- // by dasraiser for GMDX // HealPart()Extended // Medical Upgrade for Head Torso Base on Medical Skill Upgrade // ---------------------------------------------------------------------- function HealPartMedicalSkill(out int points, out int amt) { local int spill; local Skill sk; if (SkillSystem!=None) { sk = SkillSystem.GetSkillFromClass(Class'DeusEx.SkillMedicine'); if (sk==None) HealPart(points,amt); //deal with default if no medical skill!! else { points += amt; spill = points - (100+sk.CurrentLevel*10); if (spill > 0) points = (100+sk.CurrentLevel*10); else spill = 0; amt = spill; } } else HealPart(points,amt); //deal with default if no skill system!! } // ---------------------------------------------------------------------- // HandleWalking() // // subclassed from PlayerPawn so we can control run/walk defaults // ---------------------------------------------------------------------- function HandleWalking() { Super.HandleWalking(); if (bAlwaysRun && !(bExtraHardcore && bHardCoreMode)) //&& !bHardCoreMode bIsWalking = (bRun != 0) || (bDuck != 0); else bIsWalking = (bRun == 0) || (bDuck != 0); // handle the toggle walk key if (bToggleWalk && !bExtraHardcore) //&& !bHardCoreMode bIsWalking = !bIsWalking; if (bToggleCrouch) { if (!bCrouchOn && !bWasCrouchOn && (bDuck != 0)) { bCrouchOn = True; if ((InHand != None && InHand.IsA('DeusExPickup')) || CarriedDecoration != None) { } else { RecoilTime*=3.0; RecoilShake.Z-=lerp(min(Abs(4),4.0*4)/(4.0*4),3,5); RecoilShaker(vect(0,0,-1.5)); } } else if (bCrouchOn && !bWasCrouchOn && (bDuck == 0)) { bWasCrouchOn = True; } else if (bCrouchOn && bWasCrouchOn && (bDuck == 0) && (lastbDuck != 0)) { bCrouchOn = False; bWasCrouchOn = False; } if (bCrouchOn) { bIsCrouching = True; bDuck = 1; } lastbDuck = bDuck; } } // ---------------------------------------------------------------------- // DoJump() // // copied from Engine.PlayerPawn // Modified to let you jump if you are carrying something rather light // You can also jump if you are crouching, just at a much lower height // ---------------------------------------------------------------------- function DoJump( optional float F ) { local DeusExWeapon w; local float scaleFactor, augLevel; local int MusLevel; MusLevel = AugmentationSystem.GetClassLevel(class'AugMuscle'); if (MusLevel==-1) MusLevel=30; else MusLevel=(MusLevel+3)*50; if ((CarriedDecoration != None) && (CarriedDecoration.Mass > MusLevel)) return; else if (bForceDuck || IsLeaning()) return; //CyberP: effect when jumping if (!bIsCrouching && Physics == PHYS_Walking) { RecoilTime=default.RecoilTime + 0.9; if (Weapon != none && inHand != none) { if (Weapon.IsA('WeaponPlasmaRifle') || Weapon.IsA('WeaponGEPGun') || Weapon.IsA('WeaponFlamethrower') || inHand.IsA('DeusExPickup')) { RecoilShake.Z-=lerp(min(Abs(4),4.0*4)/(4.0*4),2,4.0); RecoilShaker(vect(0,0,1)); } else { RecoilShake.Z-=lerp(min(Abs(30),4.0*30)/(4.0*30),12,14.0); RecoilShaker(vect(0,0,4)); } } } if (Physics == PHYS_Walking) { camInterpol = 0.4; if ((Role == ROLE_Authority )&&(FRand()<0.33)) PlaySound(JumpSound, SLOT_None, 1.5, true, 1200, 1.0 - 0.2*FRand() ); if ( (Level.Game != None) && (Level.Game.Difficulty > 0) ) MakeNoise(0.1 * Level.Game.Difficulty); PlayInAir(); if (bStunted) Velocity.Z = JumpZ*0.75; else Velocity.Z = JumpZ; //Zyme effect if(drugEffectTimer < 0) //(FindInventoryType(Class'DeusEx.ZymeCharged') != None) Velocity.Z += Default.JumpZ * 0.2; swimTimer -= 0.8; if (swimTimer < 0) swimTimer = 0; if ( Level.NetMode != NM_Standalone ) { if (AugmentationSystem == None) augLevel = -1.0; else augLevel = AugmentationSystem.GetAugLevelValue(class'AugSpeed'); w = DeusExWeapon(InHand); if ((augLevel != -1.0) && ( w != None ) && ( w.Mass > 30.0)) { scaleFactor = 1.0 - FClamp( ((w.Mass - 30.0)/55.0), 0.0, 0.5 ); Velocity.Z *= scaleFactor; } } // reduce the jump velocity if you are crouching // if (bIsCrouching) // Velocity.Z *= 0.9; if ( Base != Level ) Velocity.Z += Base.Velocity.Z; SetPhysics(PHYS_Falling); if ( bCountJumps && (Role == ROLE_Authority) ) Inventory.OwnerJumped(); } } function bool IsLeaning() { return (curLeanDist != 0); } // ---------------------------------------------------------------------- // SetBasedPawnSize() // ---------------------------------------------------------------------- function bool SetBasedPawnSize(float newRadius, float newHeight) { local float oldRadius, oldHeight; local bool bSuccess; local vector centerDelta, lookDir, upDir; local float deltaEyeHeight; local Decoration savedDeco; if (newRadius < 0) newRadius = 0; if (newHeight < 0) newHeight = 0; oldRadius = CollisionRadius; oldHeight = CollisionHeight; if ( Level.NetMode == NM_Standalone ) { if ((oldRadius == newRadius) && (oldHeight == newHeight)) return true; } centerDelta = vect(0, 0, 1)*(newHeight-oldHeight); deltaEyeHeight = GetDefaultCollisionHeight() - Default.BaseEyeHeight; if ( Level.NetMode != NM_Standalone ) { if ((oldRadius == newRadius) && (oldHeight == newHeight) && (BaseEyeHeight == newHeight - deltaEyeHeight)) return true; } if (CarriedDecoration != None) savedDeco = CarriedDecoration; bSuccess = false; if ((newHeight <= CollisionHeight) && (newRadius <= CollisionRadius)) // shrink { SetCollisionSize(newRadius, newHeight); if (Move(centerDelta)) bSuccess = true; else SetCollisionSize(oldRadius, oldHeight); } else { if (Move(centerDelta)) { SetCollisionSize(newRadius, newHeight); bSuccess = true; } } if (bSuccess) { // make sure we don't lose our carried decoration if (savedDeco != None) { savedDeco.SetPhysics(PHYS_None); savedDeco.SetBase(Self); savedDeco.SetCollision(False, False, False); // reset the decoration's location lookDir = Vector(Rotation); lookDir.Z = 0; upDir = vect(0,0,0); upDir.Z = CollisionHeight / 2; // put it up near eye level savedDeco.SetLocation(Location + upDir + (0.5 * CollisionRadius + CarriedDecoration.CollisionRadius) * lookDir); } // PrePivotOffset = vect(0, 0, 1)*(GetDefaultCollisionHeight()-newHeight); PrePivot -= centerDelta; // DesiredPrePivot -= centerDelta; BaseEyeHeight = newHeight - deltaEyeHeight; // Complaints that eye height doesn't seem like your crouching in multiplayer if (( Level.NetMode != NM_Standalone ) && (bIsCrouching || bForceDuck) ) EyeHeight -= (centerDelta.Z * 2.5); else EyeHeight -= centerDelta.Z; } return (bSuccess); } // ---------------------------------------------------------------------- // ResetBasedPawnSize() // ---------------------------------------------------------------------- function bool ResetBasedPawnSize() { return SetBasedPawnSize(Default.CollisionRadius, GetDefaultCollisionHeight()); } // ---------------------------------------------------------------------- // GetDefaultCollisionHeight() // ---------------------------------------------------------------------- function float GetDefaultCollisionHeight() { return (Default.CollisionHeight-4.5); } // ---------------------------------------------------------------------- // GetCurrentGroundSpeed() // ---------------------------------------------------------------------- function float GetCurrentGroundSpeed() { local float augValue, speed; // Remove this later and find who's causing this to Access None MB if ( AugmentationSystem == None ) return 0; augValue = AugmentationSystem.GetAugLevelValue(class'AugSpeed'); if (augValue == -1.0) augValue = 1.0; if (( Level.NetMode != NM_Standalone ) && Self.IsA('Human') ) speed = Human(Self).mpGroundSpeed * augValue; else speed = Default.GroundSpeed * augValue; if(drugEffectTimer < 0) //(FindInventoryType(Class'DeusEx.ZymeCharged') != None) speed += Default.GroundSpeed * 0.2; return speed; } // ---------------------------------------------------------------------- // CreateDrone // ---------------------------------------------------------------------- function CreateDrone() { local Vector loc; loc = (2.0 + class'SpyDrone'.Default.CollisionRadius + CollisionRadius) * Vector(ViewRotation); loc.Z = BaseEyeHeight; loc += Location; aDrone = Spawn(class'SpyDrone', Self,, loc, ViewRotation); if (aDrone != None) { aDrone.Speed = 3 * spyDroneLevelValue; aDrone.MaxSpeed = 3 * spyDroneLevelValue; aDrone.Damage = 5 * spyDroneLevelValue; aDrone.blastRadius = 8 * spyDroneLevelValue; // window construction now happens in Tick() } } // ---------------------------------------------------------------------- // MoveDrone // ---------------------------------------------------------------------- simulated function MoveDrone( float DeltaTime, Vector loc ) { // if the wanted velocity is zero, apply drag so we slow down gradually if (VSize(loc) == 0) { aDrone.Velocity *= 0.9; } else { aDrone.Velocity += deltaTime * aDrone.MaxSpeed * loc; } // add slight bobbing // DEUS_EX AMSD Only do the bobbing in singleplayer, we want stationary drones stationary. if (Level.Netmode == NM_Standalone) aDrone.Velocity += deltaTime * Sin(Level.TimeSeconds * 2.0) * vect(0,0,1); } function ServerUpdateLean( Vector desiredLoc ) { local Vector gndCheck, traceSize, HitNormal, HitLocation; local Actor HitActor, HitActorGnd; // First check to see if anything is in the way traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = CollisionHeight; HitActor = Trace( HitLocation, HitNormal, desiredLoc, Location, True, traceSize ); // Make we don't lean off the edge of something if ( HitActor == None ) // Don't bother if we're going to fail to set anyway { gndCheck = desiredLoc - vect(0,0,1) * CollisionHeight; HitActorGnd = Trace( HitLocation, HitNormal, gndCheck, desiredLoc, True, traceSize ); } if ( (HitActor == None) && (HitActorGnd != None) ) SetLocation( desiredLoc ); // SetRotation( rot ); } // ---------------------------------------------------------------------- // GMDX:dasraiser insert lean to Tiptoes // RefreshKey copied from HUDMultiSkill.uc for Tiptoes Lean // ---------------------------------------------------------------------- function RefreshLeanKeys() { local String KeyName, Alias,KeyLeanLeft,AliasLeanLeft,KeyLeanRight,AliasLeanRight; // local int EI_KL,EI_KR; local int i; local int Nfound; //GMDX as EInputKey enum not same as Actor! //^^var int LeanLeftKey, LeanRightKey; bLeanKeysDefined=false; for ( i=0; i<255; i++ ) { KeyName = ConsoleCommand ( "KEYNAME "$i ); if ( KeyName != "" ) { Alias = ConsoleCommand( "KEYBINDING "$KeyName ); if ( InStr(Alias,"LeanRight" )!=-1) { //EI_KR=i; KeyLeanRight=KeyName; AliasLeanRight=Alias; Nfound++; } else if ( InStr(Alias,"LeanLeft" )!=-1) { //EI_KL=i; KeyLeanLeft=KeyName; AliasLeanLeft=Alias; Nfound++; } if (Nfound==2) break; } } if (Nfound==2) { bLeanKeysDefined=true; // log("Set InputExt "$KeyLeanRight$" "$AliasLeanRight$" | bLeanRightHook 1 | OnRelease bLeanRightHook 0"); // log("Set InputExt "$KeyLeanLeft$" "$AliasLeanLeft$" | bLeanLeftHook 1 | OnRelease bLeanLeftHook 0"); ConsoleCommand("SET InputExt "$KeyLeanRight$" LeanRight | SetTiptoesRight 1 | OnRelease SetTiptoesRight 0"); ConsoleCommand("SET InputExt "$KeyLeanLeft$" LeanLeft | SetTiptoesLeft 1 | OnRelease SetTiptoesLeft 0"); } else log("Lean Keys UNDEFINED, disabling tiptoes"); } exec function SetTiptoesLeft(bool B) { if (bLeanKeysDefined) bLeftToe=B; else bLeftToe=false; if (bLeftToe&&bRightToe) bPreTiptoes=true; else bPreTiptoes=false; //log("Exec LeftTip"@bLeftToe@bPreTiptoes@bLeanKeysDefined); } exec function SetTiptoesRight(bool B) { if (bLeanKeysDefined) bRightToe=B; else bLeftToe=false; if (bLeftToe&&bRightToe) bPreTiptoes=true; else bPreTiptoes=false; //log("Exec RightTip"@bRightToe@bPreTiptoes); } // ---------------------------------------------------------------------- // state PlayerWalking // ---------------------------------------------------------------------- state PlayerWalking { // lets us affect the player's movement function ProcessMove ( float DeltaTime, vector newAccel, eDodgeDir DodgeMove, rotator DeltaRot) { local int newSpeed, defSpeed; local name mat; local vector HitLocation, HitNormal, checkpoint, downcheck; local Actor HitActor, HitActorDown; local bool bCantStandUp; local Vector loc, traceSize; local float alpha, maxLeanDist; local float legTotal, weapSkill; local int augValue; local int ResetSize; local float mult, mult2, mult3; if (bStaticFreeze) { SetRotation(SAVErotation); return; } // if the spy drone augmentation is active if (bSpyDroneActive) { if ( aDrone != None ) { // put away whatever is in our hand if (inHand != None) PutInHand(None); // make the drone's rotation match the player's view aDrone.SetRotation(ViewRotation); // move the drone loc = Normal((aUp * vect(0,0,1) + aForward * vect(1,0,0) + aStrafe * vect(0,1,0)) >> ViewRotation); // opportunity for client to translate movement to server MoveDrone( DeltaTime, loc ); // freeze the player Velocity = vect(0,0,0); } return; } defSpeed = GetCurrentGroundSpeed(); ResetSize=0; // log("TIPTOES "@bLeanLeftHook@bLeanRightHook@IsLeaning()@bIsCrouching@bForceDuck); //GMDX:tiptoes if (!bPreTiptoes) bIsTiptoes=false; bTiptoes=bPreTiptoes&&(!IsLeaning()||bIsTiptoes); // crouching makes you two feet tall if (bIsCrouching || bForceDuck) { if ( Level.NetMode != NM_Standalone ) SetBasedPawnSize(Default.CollisionRadius, 30.0); else SetBasedPawnSize(Default.CollisionRadius, 16); // check to see if we could stand up if we wanted to checkpoint = Location; // check normal standing height checkpoint.Z = checkpoint.Z - CollisionHeight + 2 * GetDefaultCollisionHeight(); traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = 1; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, True, traceSize); if (HitActor == None) bCantStandUp = False; else bCantStandUp = True; } else ResetSize++; if (bTiptoes) { //check we can go on tiptoes checkpoint = Location; if (bForceDuck||bIsCrouching) checkpoint.Z = checkpoint.Z + 14 +18; else checkpoint.Z = checkpoint.Z + 5.3 + GetDefaultCollisionHeight(); traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = 1; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, True, traceSize); if (HitActor == None) bCanTiptoes = True; else bCanTiptoes = False; //log("bCanTiptoes "@bCanTiptoes); } else ResetSize++; if (ResetSize==2) { // DEUS_EX AMSD Changed this to grab defspeed, because GetCurrentGroundSpeed takes 31k cycles to run. GroundSpeed = defSpeed; // make sure the collision height is fudged for the floor problem - CNN if (!IsLeaning()) { ResetBasedPawnSize(); //log("Size Reset"); } } if (bCantStandUp) bForceDuck = True; else bForceDuck = False; // if the player's legs are damaged, then reduce our speed accordingly newSpeed = defSpeed; if ( Level.NetMode == NM_Standalone ) { if (HealthLegLeft < 1) newSpeed -= (defSpeed/2) * 0.25; else if (HealthLegLeft < 34) newSpeed -= (defSpeed/2) * 0.15; else if (HealthLegLeft < 67) newSpeed -= (defSpeed/2) * 0.10; if (HealthLegRight < 1) newSpeed -= (defSpeed/2) * 0.25; else if (HealthLegRight < 34) newSpeed -= (defSpeed/2) * 0.15; else if (HealthLegRight < 67) newSpeed -= (defSpeed/2) * 0.10; if (HealthTorso < 67) newSpeed -= (defSpeed/2) * 0.05; } // let the player pull themselves along with their hands even if both of // their legs are blown off if ((HealthLegLeft < 1) && (HealthLegRight < 1)) { newSpeed = defSpeed * 0.8; bIsWalking = True; bForceDuck = True; bCanTiptoes=false; } // make crouch speed faster than normal else if (bIsCrouching || bForceDuck) { mult3=1; //CyberP: faster crouch speed. Comment out all except bIsWalking = True to remove if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')>=1) mult3= 1 + (SkillSystem.GetSkillLevel(class'SkillStealth')* 0.15); newSpeed = defSpeed * mult3; bIsWalking = True; } // CNN - Took this out because it sucks ASS! // if the legs are seriously damaged, increase the head bob // (unless the player has turned it off) // if (Bob > 0.0) // { // legTotal = (HealthLegLeft + HealthLegRight) / 2.0; // if (legTotal < 20) // Bob = Default.Bob * FClamp(0.05*(70 - legTotal), 1.0, 3.0); // else // Bob = Default.Bob; // } if ( AugmentationSystem != None ) augValue = AugmentationSystem.GetClassLevel(class'AugMuscle'); if (augValue==3) augValue = 0; else augValue=1; //CyberP: slow the player under certain conditions if (bStunted && Physics == PHYS_Walking) { bIsWalking = True; newSpeed = defSpeed; } // slow the player down if he's carrying something heavy // Like a DEAD BODY! AHHHHHH!!! if (CarriedDecoration != None) { newSpeed -= CarriedDecoration.Mass * 2*augValue; } // don't slow the player down if he's skilled at the corresponding weapon skill else if ((DeusExWeapon(Weapon) != None) && (Weapon.Mass > 30) && (AugmentationSystem != None)) { if (DeusExWeapon(Weapon).GetWeaponSkill() > -0.25 && AugmentationSystem.GetAugLevelValue(class'AugMuscle') == -1) { bIsWalking = True; newSpeed = defSpeed; } } else if ((inHand != None) && inHand.IsA('POVCorpse')) { newSpeed -= inHand.Mass * 3*augValue; } /*// Multiplayer movement adjusters //CyberP: no multiplayer if ( Level.NetMode != NM_Standalone ) { if ( Weapon != None ) { weapSkill = DeusExWeapon(Weapon).GetWeaponSkill(); // Slow down heavy weapons in multiplayer if ((DeusExWeapon(Weapon) != None) && (Weapon.Mass > 30) ) { newSpeed = defSpeed; newSpeed -= ((( Weapon.Mass - 30.0 ) / (class'WeaponGEPGun'.Default.Mass - 30.0 )) * (0.70 + weapSkill) * defSpeed ); } // Slow turn rate of GEP gun in multiplayer to discourage using it as the most effective close quarters weapon if ((WeaponGEPGun(Weapon) != None) && (!WeaponGEPGun(Weapon).bZoomed)) TurnRateAdjuster = FClamp( 0.20 + -(weapSkill*0.5), 0.25, 1.0 ); else TurnRateAdjuster = 1.0; } else TurnRateAdjuster = 1.0; } */ // if we are moving really slow, force us to walking if ((newSpeed <= defSpeed / 3) && !bForceDuck) { bIsWalking = True; newSpeed = defSpeed; } // if we are moving backwards, we should move slower // DEUS_EX AMSD Turns out this wasn't working right in multiplayer, I have a fix // for it, but it would change all our balance. //if ((aForward < 0) && (Level.NetMode == NM_Standalone)) // newSpeed *= 0.65; //CyberP: //Zyme effect if(drugEffectTimer < 0) //(FindInventoryType(Class'DeusEx.ZymeCharged') != None) newSpeed *= 1.2; if (bTiptoes&&bCanTiptoes) //!bIsTiptoes fuuk why so much spamming size { bIsTiptoes=true; if (bIsCrouching || bForceDuck) SetBasedPawnSize(Default.CollisionRadius, 16+18); else SetBasedPawnSize(Default.CollisionRadius, GetDefaultCollisionHeight()+5.3); newSpeed*=0.6; } mult = SkillSystem.GetSkillLevelValue(class'SkillSwimming'); swimDuration = UnderWaterTime * mult; if (bIsWalking && !bIsCrouching && !bForceDuck) //CyberP: faster walking { mult3=1; //CyberP: faster walk speed. Comment out all except newSpeed *= 1.7 to remove if (SkillSystem!=None && SkillSystem.GetSkillLevel(class'SkillStealth')>=1) mult3= 1 + (SkillSystem.GetSkillLevel(class'SkillStealth')* 0.15); //newSpeed = defSpeed * mult3; newSpeed *= 1.7; //1.5 newSpeed *= mult3; } if (Physics == PHYS_Walking && !bCrouchOn) //CyberP: stamina system { if (bIsWalking == false && !bIsCrouching && (Velocity.X != 0 || Velocity.Y != 0 )) { if (bHardCoreMode) swimTimer -= deltaTime; else swimTimer -= deltaTime*0.3; if (swimTimer < 0) {swimTimer = 0; bIsWalking = true; } if (swimTimer < 0.0001 && FRand() < 0.7) PlaySound(sound'MaleBreathe', SLOT_None); } } if (Physics == PHYS_Walking) //CyberP: stamina system { if (bIsWalking == true || (Velocity.X == 0 && Velocity.Y == 0)) { if (bIsCrouching) { if (bCrouchRegen) { mult2 = AugmentationSystem.GetAugLevelValue(class'AugAqualung'); if (mult2 == -1.0 && PerkNamesArray[27] == 1) swimTimer += deltaTime*3.3; else if (mult2 == -1.0) swimTimer += deltaTime*2.2; else if (mult2 == 30) swimTimer += deltaTime*5; else if (mult2 == 60) swimTimer += deltaTime*10; else if (mult2 == 120) swimTimer += deltaTime*20; else if (mult2 == 240) swimTimer += deltaTime*40; if (swimTimer < 1) {bStunted = true; SetTimer(3,false);} if (swimTimer < 0) swimTimer = 0; if (swimTimer > swimDuration) swimTimer = swimDuration; } } else { mult2 = AugmentationSystem.GetAugLevelValue(class'AugAqualung'); if (mult2 == -1.0 && PerkNamesArray[27] == 1) swimTimer += deltaTime*3.3; else if (mult2 == -1.0) swimTimer += deltaTime*2.2; else if (mult2 == 30) swimTimer += deltaTime*5; else if (mult2 == 60) swimTimer += deltaTime*10; else if (mult2 == 120) swimTimer += deltaTime*20; else if (mult2 == 240) swimTimer += deltaTime*40; if (swimTimer < 1) {bStunted = true; SetTimer(3,false);} if (swimTimer < 0) swimTimer = 0; if (swimTimer > swimDuration) swimTimer = swimDuration; } } } //if (bBoosty) // { // newSpeed *= 30; // } GroundSpeed = FMax(newSpeed, 100); // if we are moving or crouching, we can't lean // uncomment below line to disallow leaning during crouch if ((VSize(Velocity) < 10) && (aForward == 0) && !(bPreTiptoes||bIsTiptoes||CarriedDecoration != None)) // && !bIsCrouching && !bForceDuck) bCanLean = True; else bCanLean = False; // check leaning buttons (axis aExtra0 is used for leaning) maxLeanDist = 40; if (IsLeaning()&&!bIsTiptoes) { if ( PlayerIsClient() || (Level.NetMode == NM_Standalone) ) ViewRotation.Roll = curLeanDist * 20; if (!bIsCrouching && !bForceDuck) { SetBasedPawnSize(CollisionRadius, GetDefaultCollisionHeight() - Abs(curLeanDist) / 3.0); //log("Size REset"); } } if (bCanLean && (aExtra0 != 0)) { // lean DropDecoration(); // drop the decoration that we are carrying if (AnimSequence != 'CrouchWalk') PlayCrawling(); if (SkillSystem.GetSkillLevel(class'SkillStealth') >=3) alpha = maxLeanDist * aExtra0 * 2.0 * (DeltaTime*2); else alpha = maxLeanDist * aExtra0 * 2.0 * DeltaTime; loc = vect(0,0,0); loc.Y = alpha; if (Abs(curLeanDist + alpha) < maxLeanDist) { // check to make sure the destination not blocked checkpoint = (loc >> Rotation) + Location; traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = CollisionHeight; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, True, traceSize); // check down as well to make sure there's a floor there downcheck = checkpoint - vect(0,0,1) * CollisionHeight; HitActorDown = Trace(HitLocation, HitNormal, downcheck, checkpoint, True, traceSize); if ((HitActor == None) && (HitActorDown != None)) { if ( PlayerIsClient() || (Level.NetMode == NM_Standalone)) { SetLocation(checkpoint); ServerUpdateLean( checkpoint ); curLeanDist += alpha; } } } else { if ( PlayerIsClient() || (Level.NetMode == NM_Standalone) ) curLeanDist = aExtra0 * maxLeanDist; } } else if (IsLeaning()) //if (!bCanLean && IsLeaning()) // uncomment this to not hold down lean { // un-lean if (AnimSequence == 'CrouchWalk') PlayRising(); if ( PlayerIsClient() || (Level.NetMode == NM_Standalone)) { prevLeanDist = curLeanDist; alpha = FClamp(7.0 * DeltaTime, 0.001, 0.9); curLeanDist *= 1.0 - alpha; if (Abs(curLeanDist) < 1.0) curLeanDist = 0; } loc = vect(0,0,0); loc.Y = -(prevLeanDist - curLeanDist); // check to make sure the destination not blocked checkpoint = (loc >> Rotation) + Location; traceSize.X = CollisionRadius; traceSize.Y = CollisionRadius; traceSize.Z = CollisionHeight; HitActor = Trace(HitLocation, HitNormal, checkpoint, Location, True, traceSize); // check down as well to make sure there's a floor there downcheck = checkpoint - vect(0,0,1) * CollisionHeight; HitActorDown = Trace(HitLocation, HitNormal, downcheck, checkpoint, True, traceSize); if ((HitActor == None) && (HitActorDown != None)) { if ( PlayerIsClient() || (Level.NetMode == NM_Standalone)) { SetLocation( checkpoint ); ServerUpdateLean( checkpoint ); } } } Super.ProcessMove(DeltaTime, newAccel, DodgeMove, DeltaRot); } function ZoneChange(ZoneInfo NewZone) { local vector loc; local int i; // if we jump into water, empty our hands if (NewZone.bWaterZone) { DropDecoration(); //loc = Location + VRand() * 4; //loc.Z += CollisionHeight * 0.9; if (Velocity.Z < -440) //CyberP: effects for jumping in water from height. { PlaySound(sound'SplashLarge', SLOT_Pain); ClientFlash(12,vect(160,200,255)); for (i=0;i<38;i++) { loc = Location + VRand() * 35; loc.Z = Location.Z + FRand(); loc += Vector(ViewRotation) * CollisionRadius * 1.02; loc.Z -= CollisionHeight + FRand(); Spawn(class'AirBubble', Self,, loc); } if (inHand != none && (inHand.IsA('NanoKeyRing') || inHand.IsA('DeusExPickup'))) { } else { RecoilTime=default.RecoilTime; RecoilShake.Z-=lerp(min(Abs(Velocity.Z),4.0*JumpZ)/(4.0*JumpZ),0,14.0); //CyberP: 7 RecoilShake.Y-=lerp(min(Abs(Velocity.Z),4.0*JumpZ)/(4.0*JumpZ),0,6.0); RecoilShaker(vect(6,8,18)); } } Super.ZoneChange(NewZone); } } event PlayerTick(float deltaTime) { //DEUS_EX AMSD Additional updates //Because of replication delay, aug icons end up being a step behind generally. So refresh them //every freaking tick. RefreshSystems(deltaTime); DrugEffects(deltaTime); RecoilEffectTick(deltaTime); Bleed(deltaTime); HighlightCenterObject(); ZymeEffects(deltaTime); // CyberP: scare NPCs if holding TNT if (CarriedDecoration != None) { if (CarriedDecoration.IsA('CrateExplosiveSmall')) { AISendEvent('WeaponFire', EAITYPE_Visual); } } UpdateDynamicMusic(deltaTime); UpdateWarrenEMPField(deltaTime); // DEUS_EX AMSD Move these funcions to a multiplayer tick // so that only that call gets propagated to the server. MultiplayerTick(deltaTime); // DEUS_EX AMSD For multiplayer... FrobTime += deltaTime; if (camInterpol > 0) { if (camInterpol > 0.2) ViewRotation.Pitch -= deltaTime * 2000; else ViewRotation.Pitch += deltaTime * 2000; if ((ViewRotation.Pitch > 16384) && (ViewRotation.Pitch < 32768)) ViewRotation.Pitch = 16384; camInterpol -= deltaTime; } // save some texture info FloorMaterial = GetFloorMaterial(); WallMaterial = GetWallMaterial(WallNormal); // Check if player has walked outside a first-person convo. CheckActiveConversationRadius(); // Check if all the people involved in a conversation are // still within a reasonable radius. CheckActorDistances(); // handle poison //DEUS_EX AMSD Now handled in multiplayertick //UpdatePoison(deltaTime); // Update Time Played UpdateTimePlayed(deltaTime); Super.PlayerTick(deltaTime); } } // ---------------------------------------------------------------------- // state PlayerFlying // ---------------------------------------------------------------------- state PlayerFlying { function ZoneChange(ZoneInfo NewZone) { // if we jump into water, empty our hands if (NewZone.bWaterZone) DropDecoration(); Super.ZoneChange(NewZone); } event PlayerTick(float deltaTime) { //DEUS_EX AMSD Additional updates //Because of replication delay, aug icons end up being a step behind generally. So refresh them //every freaking tick. RefreshSystems(deltaTime); DrugEffects(deltaTime); RecoilEffectTick(deltaTime); HighlightCenterObject(); UpdateDynamicMusic(deltaTime); ZymeEffects(deltaTime); // DEUS_EX AMSD For multiplayer... MultiplayerTick(deltaTime); FrobTime += deltaTime; // Check if player has walked outside a first-person convo. CheckActiveConversationRadius(); // Check if all the people involved in a conversation are // still within a reasonable radius. CheckActorDistances(); // Update Time Played UpdateTimePlayed(deltaTime); Super.PlayerTick(deltaTime); } } // ---------------------------------------------------------------------- // event HeadZoneChange // ---------------------------------------------------------------------- event HeadZoneChange(ZoneInfo newHeadZone) { local float mult, augLevel; // hack to get the zone's ambientsound working until Tim fixes it if (newHeadZone.AmbientSound != None) newHeadZone.SoundRadius = 255; if (HeadRegion.Zone.AmbientSound != None) HeadRegion.Zone.SoundRadius = 0; if (newHeadZone.bWaterZone && !HeadRegion.Zone.bWaterZone) { // make sure we're not crouching when we start swimming bIsCrouching = False; bCrouchOn = False; bWasCrouchOn = False; bDuck = 0; lastbDuck = 0; Velocity = vect(0,0,0); Acceleration = vect(0,0,0); mult = SkillSystem.GetSkillLevelValue(class'SkillSwimming'); swimDuration = UnderWaterTime * mult; bRegenStamina = false; AmbientSound = Sound'swimmingloop'; SoundPitch = 46; SwimTimer = swimDuration; //swimTimer = swimDuration; if (( Level.NetMode != NM_Standalone ) && Self.IsA('Human') ) { if ( AugmentationSystem != None ) augLevel = AugmentationSystem.GetAugLevelValue(class'AugAqualung'); if ( augLevel == -1.0 ) WaterSpeed = Human(Self).Default.mpWaterSpeed * mult; else WaterSpeed = Human(Self).Default.mpWaterSpeed * 2.0 * mult; } else WaterSpeed = Default.WaterSpeed * mult; } else { bRegenStamina = true; SwimTimer += 0.5; AmbientSound = none; SoundPitch = 64; } Super.HeadZoneChange(newHeadZone); } // ---------------------------------------------------------------------- // state PlayerSwimming // ---------------------------------------------------------------------- state PlayerSwimming { function GrabDecoration() { // we can't grab decorations underwater } function ZoneChange(ZoneInfo NewZone) { // if we jump into water, empty our hands if (NewZone.bWaterZone) { DropDecoration(); if (bOnFire) ExtinguishFire(); } Super.ZoneChange(NewZone); } event PlayerTick(float deltaTime) { local vector loc; local float mult2; //DEUS_EX AMSD Additional updates //Because of replication delay, aug icons end up being a step behind generally. So refresh them //every freaking tick. RefreshSystems(deltaTime); RecoilEffectTick(deltaTime); DrugEffects(deltaTime); HighlightCenterObject(); UpdateDynamicMusic(deltaTime); ZymeEffects(deltaTime); // DEUS_EX AMSD For multiplayer... MultiplayerTick(deltaTime); FrobTime += deltaTime; if (bOnFire) ExtinguishFire(); if (bRegenStamina) { mult2 = AugmentationSystem.GetAugLevelValue(class'AugAqualung'); if (mult2 == -1.0 && PerkNamesArray[27] == 1) swimTimer += deltaTime*3.3; else if (mult2 == -1.0) swimTimer += deltaTime*2.2; else if (mult2 == 30) swimTimer += deltaTime*5; else if (mult2 == 60) swimTimer += deltaTime*10; else if (mult2 == 120) swimTimer += deltaTime*20; else if (mult2 == 240) swimTimer += deltaTime*40; if (swimTimer > SwimDuration) swimTimer = SwimDuration; if (swimTimer < 0) swimTimer = 0; } // save some texture info FloorMaterial = GetFloorMaterial(); WallMaterial = GetWallMaterial(WallNormal); // don't let the player run if swimming bIsWalking = True; // update our swimming info swimTimer -= deltaTime; swimTimer = FMax(0, swimTimer); if ( Role == ROLE_Authority ) { if (swimTimer > 0) PainTime = swimTimer; } // Check if player has walked outside a first-person convo. CheckActiveConversationRadius(); // Check if all the people involved in a conversation are // still within a reasonable radius. CheckActorDistances(); // Randomly spawn an air bubble every 0.2 seconds // Place them in front of the player's eyes swimBubbleTimer += deltaTime; if (swimBubbleTimer >= 0.2) { swimBubbleTimer = 0; if (FRand() < 0.2) { loc = Location + VRand() * 4; loc += Vector(ViewRotation) * CollisionRadius * 2; loc.Z += CollisionHeight * 0.9; Spawn(class'AirBubble', Self,, loc); } } // handle poison //DEUS_EX AMSD Now handled in multiplayertick //UpdatePoison(deltaTime); // Update Time Played UpdateTimePlayed(deltaTime); Super.PlayerTick(deltaTime); } function BeginState() { local float mult, augLevel; // set us to be two feet high SetBasedPawnSize(Default.CollisionRadius, 16); // get our skill info mult = SkillSystem.GetSkillLevelValue(class'SkillSwimming'); swimDuration = UnderWaterTime * mult; //swimTimer = swimDuration; swimBubbleTimer = 0; WaterSpeed = Default.WaterSpeed * mult; Super.BeginState(); } } // ---------------------------------------------------------------------- // state Dying // // make sure the death animation finishes // ---------------------------------------------------------------------- state Dying { ignores all; event PlayerTick(float deltaTime) { local float time; if (PlayerIsClient()) ClientDeath(); UpdateDynamicMusic(deltaTime); time = Level.TimeSeconds - FrobTime; HeadRegion.Zone.ViewFog.X = time*0.01; if (bRemoveVanillaDeath && time > 64.0 && HeadRegion.Zone.ViewFog.X != 0) { if ((MenuUIWindow(DeusExRootWindow(rootWindow).GetTopWindow()) == None) && (ToolWindow(DeusExRootWindow(rootWindow).GetTopWindow()) == None)) ConsoleCommand("OPEN DXONLY"); } Super.PlayerTick(deltaTime); } exec function Fire(optional float F) { if ( Level.NetMode != NM_Standalone ) Super.Fire(); } exec function ShowMainMenu() { // reduce the white glow when the menu is up if (InstantFog != vect(0,0,0)) { InstantFog = vect(0.1,0.1,0.1); InstantFlash = 0.01; // force an update ViewFlash(1.0); } HeadRegion.Zone.ViewFog.X = 0; Global.ShowMainMenu(); } function BeginState() { local DeusExRootWindow root; local BloodPool pool; local Vector HitLocation, HitNormal, EndTrace; local Actor hit; root = DeusExRootWindow(rootWindow); ClientFlash(900000,vect(255,0,0)); if (bCrouchOn || bWasCrouchOn || bIsCrouching || bForceDuck) MeleeRange=51.000000; //CyberP: change this unused var to avoid adding yet more global vars if (root != None) root.ClearWindowStack(); FrobTime = Level.TimeSeconds; if (!bRemoveVanillaDeath || Health < -40) ShowHud(False); else if (bRemoveVanillaDeath) { KillShadow(); EndTrace = Location - vect(0,0,320); if (!HeadRegion.Zone.bWaterZone) { hit = Trace(HitLocation, HitNormal, EndTrace, Location, False); pool = spawn(class'BloodPool',,, HitLocation, Rotator(HitNormal)); if (pool != none) { pool.maxDrawScale = CollisionRadius / 520.0; pool.ReattachDecal(); } } } ClientDeath(); } function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { } function Landed(vector HitNormal) { if (Velocity.Z < -800) { PlaySound(sound'pl_fallpain3',SLOT_None,1.5); HeadRegion.Zone.ViewFog.X = 255; } } function PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation) { local vector ViewVect, HitLocation, HitNormal, whiteVec; local float ViewDist; local actor HitActor; local float time; ViewActor = Self; if (bHidden && (!bRemoveVanillaDeath || Health < -40)) { // spiral up and around carcass and fade to white in five seconds time = Level.TimeSeconds - FrobTime; if ( ((myKiller != None) && (killProfile != None) && (!killProfile.bKilledSelf)) || ((killProfile != None) && killProfile.bValid && (!killProfile.bKilledSelf))) { if ( killProfile.bValid && killProfile.bTurretKilled ) ViewVect = killProfile.killerLoc - Location; else if ( killProfile.bValid && killProfile.bProximityKilled ) ViewVect = killProfile.killerLoc - Location; else if (( !killProfile.bKilledSelf ) && ( myKiller != None )) ViewVect = myKiller.Location - Location; CameraLocation = Location; CameraRotation = Rotator(ViewVect); } else if (time < 8.0) { whiteVec.X = time / 16.0; whiteVec.Y = time / 16.0; whiteVec.Z = time / 16.0; CameraRotation.Pitch = -16384; CameraRotation.Yaw = (time * 2000.0); // 8192.0) % 65536; CyberP: slow down the spinning ViewDist = 32 + time * 32; InstantFog = whiteVec; InstantFlash = 0.5; ViewFlash(1.0); // make sure we don't go through the ceiling ViewVect = vect(0,0,1); HitActor = Trace(HitLocation, HitNormal, Location + ViewDist * ViewVect, Location); if ( HitActor != None ) CameraLocation = HitLocation; else CameraLocation = Location + ViewDist * ViewVect; } else { if ( Level.NetMode != NM_Standalone ) { // Don't fade to black in multiplayer } else { // then, fade out to black in four seconds and bring up // the main menu automatically whiteVec.X = FMax(0.5 - (time-8.0) / 8.0, -1.0); whiteVec.Y = FMax(0.5 - (time-8.0) / 8.0, -1.0); whiteVec.Z = FMax(0.5 - (time-8.0) / 8.0, -1.0); CameraRotation.Pitch = -16384; CameraRotation.Yaw = (time * 2000.0); //% 65536; cyberP: same changes as above. ViewDist = 32 + 8.0 * 32; InstantFog = whiteVec; InstantFlash = whiteVec.X; ViewFlash(1.0); // start the splash screen after a bit // only if we don't have a menu open // DEUS_EX AMSD Don't do this in multiplayer!!!! if (Level.NetMode == NM_Standalone) { if (whiteVec == vect(-1.0,-1.0,-1.0)) if ((MenuUIWindow(DeusExRootWindow(rootWindow).GetTopWindow()) == None) && (ToolWindow(DeusExRootWindow(rootWindow).GetTopWindow()) == None)) ConsoleCommand("OPEN DXONLY"); } } // make sure we don't go through the ceiling ViewVect = vect(0,0,1); HitActor = Trace(HitLocation, HitNormal, Location + ViewDist * ViewVect, Location); if ( HitActor != None ) CameraLocation = HitLocation; else CameraLocation = Location + ViewDist * ViewVect; } } else if (bRemoveVanillaDeath) { time = Level.TimeSeconds - FrobTime; CameraLocation = Location; CameraRotation = ViewRotation; ViewFlash(1.0); bHidden = True; if (time < 0.35 && !HeadRegion.Zone.bWaterZone && ((AnimSequence == 'DeathFront' && Physics != PHYS_Falling) || bJustLanded)) { //CameraRotation.Pitch = (time * -17000); //CameraRotation.Yaw = (time * 1000.0); //CameraLocation += Vector(ViewRotation) * (time * 60); //CameraLocation.Z -= (time * 5); CameraRotation.Pitch = (time * 7000); CameraRotation.Roll = (time * 34000.0); if (MeleeRange != 51.000000) CameraLocation.Z -= (time * 127); else CameraLocation.Z -= (time * 48); rota = CameraRotation; vecta = CameraLocation; } else if (time < 1.1 && !HeadRegion.Zone.bWaterZone && (AnimSequence == 'DeathBack' || (AnimSequence == 'DeathFront' && Physics == PHYS_Falling))) { if (time < 0.5) CameraRotation.Pitch = (time * 16000); else if (time < 0.6) CameraRotation.Pitch = (time * 16500); else if (time < 0.7) CameraRotation.Pitch = (time * 17000); else if (time < 0.8) CameraRotation.Pitch = (time * 17500); else CameraRotation.Pitch = (time * 18000); CameraRotation.Yaw += (time * 6000.0); if (MeleeRange != 51.000000) CameraLocation.Z -= (time * 30); else CameraLocation.Z -= (time * 13); rota = CameraRotation; vecta = CameraLocation; } else if (time < 8.0 && HeadRegion.Zone.bWaterZone) { CameraRotation.Pitch -= (time * 2000); CameraRotation.Yaw -= (time * 1000); rota = CameraRotation; vecta = CameraLocation; } else { CameraRotation = rota; CameraLocation = vecta; } } else { // use FrobTime as the cool DeathCam timer FrobTime = Level.TimeSeconds; // make sure we don't go through the wall ViewDist = 190; ViewVect = vect(1,0,0) >> Rotation; HitActor = Trace( HitLocation, HitNormal, Location - ViewDist * vector(CameraRotation), Location, false, vect(12,12,2)); if ( HitActor != None ) CameraLocation = HitLocation; else CameraLocation = Location - ViewDist * ViewVect; } // don't fog view if we are "paused" if (DeusExRootWindow(rootWindow).bUIPaused) { InstantFog = vect(0,0,0); InstantFlash = 0; ViewFlash(1.0); } } Begin: // Dead players comes back to life with scope view, so this is here to prevent that if ( DeusExWeapon(inHand) != None ) { DeusExWeapon(inHand).bZoomed = False; DeusExWeapon(inHand).RefreshScopeDisplay(Self, True, False); } if ( DeusExRootWindow(rootWindow).hud.augDisplay != None ) { DeusExRootWindow(rootWindow).hud.augDisplay.bVisionActive = False; DeusExRootWindow(rootWindow).hud.augDisplay.activeCount = 0; } // Don't come back to life drugged or posioned poisonCounter = 0; poisonTimer = 0; drugEffectTimer = 0; if (AugmentationSystem != None) AugmentationSystem.DeactivateAll(); //CyberP: deactivate augs // Don't come back to life crouched bCrouchOn = False; bWasCrouchOn = False; bIsCrouching = False; bForceDuck = False; lastbDuck = 0; bDuck = 0; ClientFlash(900000,vect(160,0,0)); IncreaseClientFlashLength(4); FrobTime = Level.TimeSeconds; bBehindView = True; //CyberP: was true Velocity = vect(0,0,0); Acceleration = vect(0,0,0); DesiredFOV = Default.DesiredFOV; FinishAnim(); KillShadow(); FlashTimer = 0; // hide us and spawn the carcass bHidden = True; if (!bRemoveVanillaDeath) SpawnCarcass(); //DEUS_EX AMSD Players should not leave physical versions of themselves around :) if (Level.NetMode != NM_Standalone) HidePlayer(); } // ---------------------------------------------------------------------- // state Interpolating // ---------------------------------------------------------------------- state Interpolating { ignores all; function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { } // check to see if we are done interpolating, if so, then travel to the next map event InterpolateEnd(Actor Other) { if (InterpolationPoint(Other).bEndOfPath) if (NextMap != "") { // DEUS_EX_DEMO // // If this is the demo, show the demo splash screen, which // will exit the game after the player presses a key/mouseclick // if (NextMap == "02_NYC_BatteryPark") // ShowDemoSplash(); // else Level.Game.SendPlayer(Self, NextMap); } } exec function Fire(optional float F) { local DeusExLevelInfo info; // only bring up the menu if we're not in a mission outro info = GetLevelInfo(); if ((info != None) && (info.MissionNumber < 0)) ShowMainMenu(); } event PlayerTick(float deltaTime) { UpdateInHand(); UpdateDynamicMusic(deltaTime); ShowHud(False); } Begin: if (bOnFire) ExtinguishFire(); bDetectable = False; // put away your weapon if (Weapon != None) { Weapon.bHideWeapon = True; Weapon = None; PutInHand(None); } // can't carry decorations across levels if (CarriedDecoration != None) { CarriedDecoration.Destroy(); CarriedDecoration = None; } PlayAnim('Still'); } state StaticFreeze { ignores all; event PlayerTick(float deltaTime) { UpdateInHand(); // ViewFlash(deltaTime); if (aGEPProjectile==none) { bStaticFreeze=false; GotoState('PlayerWalking'); } } Begin: } // ---------------------------------------------------------------------- // state Paralyzed // ---------------------------------------------------------------------- state Paralyzed { ignores all; function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { } exec function Fire(optional float F) { ShowMainMenu(); } event PlayerTick(float deltaTime) { UpdateInHand(); ShowHud(False); ViewFlash(deltaTime); } Begin: if (bOnFire) ExtinguishFire(); bDetectable = False; // put away your weapon if (Weapon != None) { Weapon.bHideWeapon = True; Weapon = None; PutInHand(None); } // can't carry decorations across levels if (CarriedDecoration != None) { CarriedDecoration.Destroy(); CarriedDecoration = None; } SetPhysics(PHYS_None); PlayAnim('Still'); Stop; Letterbox: if (bOnFire) ExtinguishFire(); bDetectable = False; // put away your weapon if (Weapon != None) { Weapon.bHideWeapon = True; Weapon = None; PutInHand(None); } // can't carry decorations across levels if (CarriedDecoration != None) { CarriedDecoration.Destroy(); CarriedDecoration = None; } SetPhysics(PHYS_None); PlayAnim('Still'); if (rootWindow != None) rootWindow.NewChild(class'CinematicWindow'); } // ---------------------------------------------------------------------- // RenderOverlays() // render our in-hand object // ---------------------------------------------------------------------- simulated event RenderOverlays( canvas Canvas ) { // if ((aGEPProjectile!=none)&&(aGEPProjectile.IsA('Rocket'))&&(Rocket(aGEPProjectile).bFlipFlopCanvas)) return; if ((GEPmounted!=none)&&(GEPmounted.bFlipFlopCanvas)) return; Super.RenderOverlays(Canvas); if (!IsInState('Interpolating') && !IsInState('Paralyzed')) if ((inHand != None) && (!inHand.IsA('Weapon'))) inHand.RenderOverlays(Canvas); if ((aGEPProjectile!=none)&&(aGEPProjectile.IsA('Rocket'))&&(bGEPprojectileInflight)) { if (!bStaticFreeze) { SAVErotation=Rotation; SAVElocation=Location; bStaticFreeze=true; } // Rocket(aGEPProjectile).RenderPortal(Canvas); } else bStaticFreeze=false; } // ---------------------------------------------------------------------- // RestrictInput() // // Are we in a state which doesn't allow certain exec functions? // ---------------------------------------------------------------------- function bool RestrictInput() { if (IsInState('Interpolating') || IsInState('Dying') || IsInState('Paralyzed') || (FlagBase.GetBool('PlayerTraveling') )) return True; return False; } // ---------------------------------------------------------------------- // DroneExplode // ---------------------------------------------------------------------- function DroneExplode() { local AugDrone anAug; if (aDrone != None) { aDrone.Explode(aDrone.Location, vect(0,0,1)); //DEUS_EX AMSD Don't blow up OTHER player drones... anAug = AugDrone(AugmentationSystem.FindAugmentation(class'AugDrone')); //foreach AllActors(class'AugDrone', anAug) if (anAug != None) anAug.Deactivate(); } } // ---------------------------------------------------------------------- // BuySkills() // ---------------------------------------------------------------------- exec function BuySkills() { if ( Level.NetMode != NM_Standalone ) { // First turn off scores if we're heading into skill menu if ( !bBuySkills ) ClientTurnOffScores(); bBuySkills = !bBuySkills; BuySkillSound( 2 ); } } // ---------------------------------------------------------------------- // KillerProfile() // ---------------------------------------------------------------------- exec function KillerProfile() { bKillerProfile = !bKillerProfile; } // ---------------------------------------------------------------------- // ClientTurnOffScores() // ---------------------------------------------------------------------- function ClientTurnOffScores() { if ( bShowScores ) bShowScores = False; } // ---------------------------------------------------------------------- /// ShowScores() //CyberP: this function is now used in singleplayer for secondary weapon use // ---------------------------------------------------------------------- exec function ShowScores() { if ( bBuySkills && !bShowScores ) BuySkills(); if (Level.NetMode == NM_Standalone) { if (RestrictInput()) return; if (Weapon != None && inHand != none && assignedWeapon != None && assignedWeapon != inHand) { if (inHand.IsA('DeusExWeapon')) primaryWeapon = DeusExWeapon(inHand); inHandPending = assignedWeapon; if (inHandPending.IsA('DeusExWeapon')) DeusExWeapon(inHandPending).bBeginQuickMelee=true; } else if (inHand != none && assignedWeapon != None && assignedWeapon == inHand) { if (inHand.IsA('DeusExWeapon') && DeusExWeapon(inHand).bBeginQuickMelee) { if (DeusExWeapon(inHand).AccurateRange > 200 && DeusExWeapon(inHand).AmmoLeftInClip() == 0 ) //CyberP/|Totalitarian|: hack fix bug return; else DeusExWeapon(inHand).quickMeleeCombo = 0.4; } } else if (inHand == none && inHandPending == None && CarriedDecoration == None) { if (assignedWeapon != None) inHandPending = assignedWeapon; } } bShowScores = !bShowScores; } // ---------------------------------------------------------------------- // ParseLeftClick() // ---------------------------------------------------------------------- exec function ParseLeftClick() { local int AugMuscleOn; local DeusExPickup pickup; local int MedSkillLevel; local string bioboost; local DeusExRootWindow root; local bool bThrownDecor; //local Decoration Decor; //CyberP: see commented out block further down. // // ParseLeftClick deals with things in your HAND // // Precedence: // - Detonate spy drone // - Fire (handled automatically by user.ini bindings) // - Use inHand // //log("ParseLeftClick"); if (RestrictInput()) return; //log("ParseLeftClick1"); // if the spy drone augmentation is active, blow it up if (bSpyDroneActive) { DroneExplode(); return; } if (inHand != None) if (inHand.IsA('DeusExWeapon')) //CyberP: cancel reloading - shotguns only if (DeusExWeapon(inHand).IsInState('Reload')) DeusExWeapon(inHand).bCancelLoading = True; //log("ParseLeftClick2"); if ((inHand != None) && !bInHandTransition &&(!inHand.IsA('POVcorpse'))) { // log("ParseLeftClick3"); if (inHand.bActivatable) inHand.Activate(); else if (FrobTarget != None) { // log("ParseLeftClick4"); // special case for using keys or lockpicks on doors if (FrobTarget.IsA('DeusExMover')) if (inHand.IsA('NanoKeyRing') || inHand.IsA('Lockpick')) DoFrob(Self, inHand); // special case for using multitools on hackable things if (FrobTarget.IsA('HackableDevices')) { if (inHand.IsA('Multitool')) { if (( Level.Netmode != NM_Standalone ) && (TeamDMGame(DXGame) != None) && FrobTarget.IsA('AutoTurretGun') && (AutoTurretGun(FrobTarget).team==PlayerReplicationInfo.team) ) { MultiplayerNotifyMsg( MPMSG_TeamHackTurret ); return; } else DoFrob(Self, inHand); } } } } else { if (AugmentationSystem != None) AugMuscleOn = AugmentationSystem.GetAugLevelValue(class'AugMuscle'); if (AugMuscleOn> -1.0) { if ((inHand != None) && !bInHandTransition &&(InHand.IsA('POVcorpse'))) { bThrownDecor=true; if (bRealisticCarc || bHardCoreMode) bThrowDecoration=False; else bThrowDecoration=True; DropItem(); } else { if (CarriedDecoration != None) bThrownDecor=true; bThrowDecoration=true; DropDecoration(); // play a throw anim PlayAnim('Attack',,0.1); } } } /*if (inHand == None && FrobTarget != none && FrobTarget.IsA('DeusExDecoration') && Decoration(FrobTarget).bPushable == False) { Decoration(FrobTarget).bPushable = True; GrabDecoration(); } */ //CyberP: this allowed us to pick up objects like datacubes, lamps. vending machines and such, but it is not worth the effort. if (inHand == None && FrobTarget != none && FrobTarget.IsA('DeusExPickup')) { if (FrobTarget.IsA('Sodacan')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(2, False); PlaySound(sound'MaleBurp'); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('SoyFood')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(5, False); PlaySound(sound'EatingChips',SLOT_None,3.0); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Candybar')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(3, False); PlaySound(sound'CandyEat',SLOT_None,2); bioboost="Recharged 3 Bioelectrical Energy Units"; ClientMessage(bioboost); Energy += 3; if (Energy > EnergyMax) Energy = EnergyMax; fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Flare')) { Flare(FrobTarget).LightFlare(); } else if (FrobTarget.IsA('FireExtinguisher')) { if (FireExtinguisher(FrobTarget).bAltActivate==False) { FireExtinguisher(FrobTarget).bAltActivate=True; FireExtinguisher(FrobTarget).Activate(); } } else if (FrobTarget.IsA('WineBottle')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(2, False); drugEffectTimer += 5.0; PlaySound(sound'drinkwine',SLOT_None); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Liquor40oz')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(2, False); drugEffectTimer += 7.0; PlaySound(sound'drinkwine',SLOT_None); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('LiquorBottle')) { if (fullUp >= 15) {ClientMessage(fatty); return;} HealPlayer(2, False); drugEffectTimer += 4.0; PlaySound(sound'drinkwine',SLOT_None); fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('VialCrack')) { if (fullUp >= 10) {ClientMessage(fatty); return;} HealPlayer(-10, False); drugEffectTimer += 60.0; fullUp++; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Medkit')) { if (SkillSystem != none) MedSkillLevel = SkillSystem.GetSkillLevel(class'SkillMedicine'); if (MedSkillLevel < 1.0) MedSkillLevel = 0; HealPlayer((MedSkillLevel+1)*30, False); PlaySound(sound'MedicalHiss', SLOT_None,,, 256); ClientFlash(4,vect(0,0,200)); DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('BioelectricCell')) { PlaySound(sound'BioElectricHiss', SLOT_None,,, 256); if (PerkNamesArray[8]==1) BioelectricCell(FrobTarget).rechargeAmount=25; ClientMessage(Sprintf(BioelectricCell(FrobTarget).msgRecharged, BioelectricCell(FrobTarget).rechargeAmount)); Energy += BioelectricCell(FrobTarget).rechargeAmount; //25; if (Energy > EnergyMax) Energy = EnergyMax; DeusExPickup(FrobTarget).Destroy(); } else if (FrobTarget.IsA('Cigarettes')) { Cigarettes(FrobTarget).bDontUse = True; Cigarettes(FrobTarget).GoToState('Activated'); } else if (FrobTarget.IsA('SkilledTool') || FrobTarget.IsA('ChargedPickup') || FrobTarget.IsA('WeaponMod') || FrobTarget.IsA('AugmentationUpgradeCannister') || FrobTarget.IsA('AugmentationCannister') || FrobTarget.IsA('Binoculars')) { bLeftClicked = True; ParseRightClick(); } else ClientMessage(noUsing); } else if (inHand == None && FrobTarget != none && FrobTarget.IsA('DeusExWeapon')) { bLeftClicked = True; ParseRightClick(); } else if (inHand == None && FrobTarget != none && FrobTarget.IsA('DeusExAmmo')) { ClientMessage(noUsing); } // log("ParseLeftClick5"); } // ---------------------------------------------------------------------- // ParseRightClick() // ---------------------------------------------------------------------- exec function ParseRightClick() { // // ParseRightClick deals with things in the WORLD // // Precedence: // - Pickup highlighted Inventory // - Frob highlighted object // - Grab highlighted Decoration // - Put away (or drop if it's a deco) inHand // local AutoTurret turret; local int ViewIndex; local bool bPlayerOwnsIt; local Inventory oldFirstItem; local Inventory oldInHand; local Decoration oldCarriedDecoration; local Vector loc; local DeusExWeapon ExWep; local DeusExRootWindow root; if (RestrictInput()) return; if (bSpyDroneActive) { if (aDrone != none) aDrone.AISendEvent('LoudNoise', EAITYPE_Audio, TransientSoundVolume, 768); if (FRand() < 0.25) PlaySound(sound'CatDie'); else if (FRand() < 0.5) PlaySound(sound'DogLargeBark1'); else if (FRand() < 0.75) PlaySound(sound'SeagullCry'); else PlaySound(sound'RatSqueak1'); return; } oldFirstItem = Inventory; oldInHand = inHand; oldCarriedDecoration = CarriedDecoration; if (FrobTarget != None) loc = FrobTarget.Location; if (FrobTarget != None) { // First check if this is a NanoKey, in which case we just // want to add it to the NanoKeyRing without disrupting // what the player is holding if ((FrobTarget.IsA('ScriptedPawn') || FrobTarget.IsA('DeusExMover')) && bAlternateToolbelt) //CyberP: no, first we do this for the invisible war toolbelt. { if ((ScriptedPawn(FrobTarget) != None && ScriptedPawn(FrobTarget).GetPawnAllianceType(self) == ALLIANCE_Hostile) || (DeusExMover(FrobTarget) != None && DeusExMover(FrobTarget).bFrobbable == False)) { if (CarriedDecoration == None) //CyberP: DX:IW toolbelt { if (inHand != None && inHand.IsA('POVCorpse')) { } else { if (inHand == None) { root = DeusExRootWindow(rootWindow); if (root != None && root.hud.belt.GetObjectFromBelt(advBelt) != inHand) { root.ActivateObjectInBelt(advBelt); return; } } else PutInHand(None); } } } else DoFrob(Self, None); } else if (FrobTarget.IsA('NanoKey')) { PickupNanoKey(NanoKey(FrobTarget)); FrobTarget.Destroy(); FrobTarget = None; return; } else if (FrobTarget.IsA('Inventory')) { // If this is an item that can be stacked, check to see if // we already have one, in which case we don't need to // allocate more space in the inventory grid. // // TODO: This logic may have to get more involved if/when // we start allowing other types of objects to get stacked. if (SkillSystem != none) { if ((FrobTarget.IsA('WeaponGEPGun') || FrobTarget.IsA('WeaponFlamethrower') || FrobTarget.IsA('WeaponPlasmaRifle')) && PerkNamesArray[24]==1) { DeusExWeapon(FrobTarget).invSlotsX=3; DeusExWeapon(FrobTarget).invSlotsY=1; } } if (PerkNamesArray[30]==1) { if (FrobTarget.IsA('BioelectricCell')) BioelectricCell(FrobTarget).MaxCopies=25; else if (FrobTarget.IsA('Medkit')) Medkit(FrobTarget).MaxCopies=20; } if (HandleItemPickup(FrobTarget, True) == False) return; // if the frob succeeded, put it in the player's inventory //DEUS_EX AMSD ARGH! Because of the way respawning works, the item I pick up //is NOT the same as the frobtarget if I do a pickup. So how do I tell that //I've successfully picked it up? Well, if the first item in my inventory //changed, I picked up a new item. if ( ((Level.NetMode == NM_Standalone) && (Inventory(FrobTarget).Owner == Self)) || ((Level.NetMode != NM_Standalone) && (oldFirstItem != Inventory)) ) { if (Level.NetMode == NM_Standalone) FindInventorySlot(Inventory(FrobTarget)); else FindInventorySlot(Inventory); FrobTarget = None; } } else if (FrobTarget.IsA('Decoration') && Decoration(FrobTarget).bPushable) { if (swimTimer <= 1) { } else { GrabDecoration(); } } else { if (( Level.NetMode != NM_Standalone ) && ( TeamDMGame(DXGame) != None )) { if ( FrobTarget.IsA('LAM') || FrobTarget.IsA('GasGrenade') || FrobTarget.IsA('EMPGrenade')) { if ((ThrownProjectile(FrobTarget).team == PlayerReplicationInfo.team) && ( ThrownProjectile(FrobTarget).Owner != Self )) { if ( ThrownProjectile(FrobTarget).bDisabled ) // You can re-enable a grenade for a teammate { ThrownProjectile(FrobTarget).ReEnable(); return; } MultiplayerNotifyMsg( MPMSG_TeamLAM ); return; } } if ( FrobTarget.IsA('ComputerSecurity') && (PlayerReplicationInfo.team == ComputerSecurity(FrobTarget).team) ) { // Let controlling player re-hack his/her own computer bPlayerOwnsIt = False; foreach AllActors(class'AutoTurret',turret) { for (ViewIndex = 0; ViewIndex < ArrayCount(ComputerSecurity(FrobTarget).Views); ViewIndex++) { if (ComputerSecurity(FrobTarget).Views[ViewIndex].turretTag == turret.Tag) { if (( turret.safeTarget == Self ) || ( turret.savedTarget == Self )) { bPlayerOwnsIt = True; break; } } } } if ( !bPlayerOwnsIt ) { MultiplayerNotifyMsg( MPMSG_TeamComputer ); return; } } } // otherwise, just frob it DoFrob(Self, None); } } else { // if there's no FrobTarget, put away an inventory item or drop a decoration // or drop the corpse if (bAlternateToolbelt && CarriedDecoration == None) //CyberP: DX:IW toolbelt { if (inHand != None && inHand.IsA('POVCorpse')) { } else { root = DeusExRootWindow(rootWindow); if (root != None && root.hud.belt.GetObjectFromBelt(advBelt) != inHand) { root.ActivateObjectInBelt(advBelt); return; } } } if ((inHand != None) && inHand.IsA('POVCorpse')) { DropItem(); } else if (CarriedDecoration != None) { PutInHand(None); } else if (clickCountCyber >= 1) { PutInHand(None); } else if (!bDblClickHolster) { PutInHand(None); } else { SetTimer(0.3,false); bDoubleClickCheck=True; clickCountCyber++; } } if ((oldInHand == None) && (inHand != None)) PlayPickupAnim(loc); else if ((oldCarriedDecoration == None) && (CarriedDecoration != None)) PlayPickupAnim(loc); } // ---------------------------------------------------------------------- // PlayPickupAnim() // ---------------------------------------------------------------------- function PlayPickupAnim(Vector locPickup) { if (Location.Z - locPickup.Z < 16) PlayAnim('PushButton',,0.1); else PlayAnim('Pickup',,0.1); } // ---------------------------------------------------------------------- // HandleItemPickup() // ---------------------------------------------------------------------- function bool HandleItemPickup(Actor FrobTarget, optional bool bSearchOnly) { local bool bCanPickup; local bool bSlotSearchNeeded; local Inventory foundItem; bSlotSearchNeeded = True; bCanPickup = True; // Special checks for objects that do not require phsyical inventory // in order to be picked up: // // - NanoKeys // - DataVaultImages // - Credits if ((FrobTarget.IsA('DataVaultImage')) || (FrobTarget.IsA('NanoKey')) || (FrobTarget.IsA('Credits'))) { bSlotSearchNeeded = False; } else if (FrobTarget.IsA('DeusExPickup')) { // If an object of this type already exists in the player's inventory *AND* // the object is stackable, then we don't need to search. if ((FindInventoryType(FrobTarget.Class) != None) && (DeusExPickup(FrobTarget).bCanHaveMultipleCopies)) bSlotSearchNeeded = False; } else { // If this isn't ammo or a weapon that we already have, // check if there's enough room in the player's inventory // to hold this item. foundItem = GetWeaponOrAmmo(Inventory(FrobTarget)); if (foundItem != None) { bSlotSearchNeeded = False; // if this is an ammo, and we're full of it, abort the pickup if (foundItem.IsA('Ammo')) { if (Ammo(foundItem).AmmoAmount >= Ammo(foundItem).MaxAmmo) { ClientMessage(TooMuchAmmo); bCanPickup = False; } } //GMDX: hmm // If this is a grenade or LAM (what a pain in the ass) then also check // to make sure we don't have too many grenades already else if ((foundItem.IsA('WeaponEMPGrenade')) || (foundItem.IsA('WeaponGasGrenade')) || (foundItem.IsA('WeaponNanoVirusGrenade')) || (foundItem.IsA('WeaponLAM'))) { if (DeusExWeapon(foundItem).AmmoType.AmmoAmount >= DeusExWeapon(foundItem).AmmoType.MaxAmmo) { ClientMessage(TooMuchAmmo); bCanPickup = False; } } // Otherwise, if this is a single-use weapon, prevent the player // from picking up //CyberP: also check if ammo is full when picking up weapons else if (foundItem.IsA('Weapon')) { // If these fields are set as checked, then this is a // single use weapon, and if we already have one in our // inventory another cannot be picked up (puke). bCanPickup = ! ( (Weapon(foundItem).ReloadCount == 0) && (Weapon(foundItem).PickupAmmoCount == 0) && (Weapon(foundItem).AmmoName != None) ); /*if (Weapon(foundItem).IsA('WeaponHideAGun')) {bCanPickup = True; bSearchSlotNeeded = True; }*/ if (!bCanPickup) ClientMessage(Sprintf(CanCarryOnlyOne, foundItem.itemName)); DeusExWeapon(foundItem).SetMaxAmmo(); if (DeusExWeapon(foundItem).AmmoType.AmmoAmount >= DeusExWeapon(foundItem).MaxiAmmo) { ClientMessage(TooMuchAmmo); bCanPickup = False; } } } } if (bSlotSearchNeeded && bCanPickup) { // log("MYCHK::DXPlayer::HIP::ADD TO::"@FrobTarget); if (FindInventorySlot(Inventory(FrobTarget), bSearchOnly) == False) { // log("MYCHK::DXPlayer::HIP::ADD TO FAILED::"@foundItem); ClientMessage(Sprintf(InventoryFull, Inventory(FrobTarget).itemName)); bCanPickup = False; ServerConditionalNotifyMsg( MPMSG_DropItem ); } } if (bCanPickup) { //if (FrobTarget.IsA('WeaponLAW')) // PlaySound(sound'WeaponPickup', SLOT_Interact, 0.5+FRand()*0.25, , 256, 0.95+FRand()*0.1); DoFrob(Self, inHand); if ( FrobTarget.IsA('DeusExWeapon') && bLeftClicked) //CyberP: for left click interaction { PutInHand(FoundItem); //bLeftClicked = False; } // This is bad. We need to reset the number so restocking works if ( Level.NetMode != NM_Standalone ) { if ( FrobTarget.IsA('DeusExWeapon') && (DeusExWeapon(FrobTarget).PickupAmmoCount == 0) ) { DeusExWeapon(FrobTarget).PickupAmmoCount = DeusExWeapon(FrobTarget).Default.mpPickupAmmoCount * 3; } } } return bCanPickup; } // ---------------------------------------------------------------------- // CreateNanoKeyInfo() // ---------------------------------------------------------------------- function NanoKeyInfo CreateNanoKeyInfo() { local NanoKeyInfo newKey; newKey = new(Self) Class'NanoKeyInfo'; return newKey; } // ---------------------------------------------------------------------- // PickupNanoKey() // // Picks up a NanoKey // // 1. Add KeyID to list of keys // 2. Destroy NanoKey (since the user can't have it in his/her inventory) // ---------------------------------------------------------------------- function PickupNanoKey(NanoKey newKey) { KeyRing.GiveKey(newKey.KeyID, newKey.Description); //DEUS_EX AMSD In multiplayer, propagate the key to the client if the server if ((Role == ROLE_Authority) && (Level.NetMode != NM_Standalone)) { KeyRing.GiveClientKey(newKey.KeyID, newKey.Description); } ClientMessage(Sprintf(AddedNanoKey, newKey.Description)); } // ---------------------------------------------------------------------- // RemoveNanoKey() // ---------------------------------------------------------------------- exec function RemoveNanoKey(Name KeyToRemove) { if (!bCheatsEnabled) return; KeyRing.RemoveKey(KeyToRemove); if ((Role == ROLE_Authority) && (Level.NetMode != NM_Standalone)) { KeyRing.RemoveClientKey(KeyToRemove); } } // ---------------------------------------------------------------------- // GiveNanoKey() // ---------------------------------------------------------------------- exec function GiveNanoKey(Name newKeyID, String newDescription) { if (!bCheatsEnabled) return; KeyRing.GiveKey(newKeyID, newDescription); //DEUS_EX AMSD In multiplayer, propagate the key to the client if the server if ((Role == ROLE_Authority) && (Level.NetMode != NM_Standalone)) { KeyRing.GiveClientKey(newKeyID, newDescription); } } // ---------------------------------------------------------------------- // DoFrob() // // Frob the target // ---------------------------------------------------------------------- function DoFrob(Actor Frobber, Inventory frobWith) { local DeusExRootWindow root; local Ammo ammo; local Inventory item; local Actor A; // if the object destroyed itself, get out //CyberP: copy-pasted this from below if (FrobTarget == None) return; // make sure nothing is based on us if we're an inventory if (FrobTarget.IsA('Inventory')) foreach FrobTarget.BasedActors(class'Actor', A) A.SetBase(None); // log("MYCHK::DXPlayer::DoFrob:Frobber:"@Frobber@": frobWith:"@frobWith@": FrobTarget:"@FrobTarget); FrobTarget.Frob(Frobber, frobWith); // if the object destroyed itself, get out if (FrobTarget == None) return; // if the inventory item aborted it's own pickup, get out if (FrobTarget.IsA('Inventory') && (FrobTarget.Owner != Self)) return; // alert NPCs that I'm messing with stuff if (FrobTarget.bOwned) AISendEvent('Futz', EAITYPE_Visual); // play an animation PlayPickupAnim(FrobTarget.Location); // set the base so the inventory follows us around correctly if (FrobTarget.IsA('Inventory')) FrobTarget.SetBase(Frobber); } // ---------------------------------------------------------------------- // PutInHand() // // put the object in the player's hand and draw it in front of the player // ---------------------------------------------------------------------- exec function PutInHand(optional Inventory inv) { if (RestrictInput()) return; if (bGEPprojectileInflight) return; // can't put anything in hand if you're using a spy drone if ((inHand == None) && bSpyDroneActive) return; // can't do anything if you're carrying a corpse if ((inHand != None) && inHand.IsA('POVCorpse')) return; if (inv != None) { // can't put ammo in hand if (inv.IsA('Ammo')) return; // Can't put an active charged item in hand //cyberP: overruled for armor system //if ((inv.IsA('ChargedPickup')) && (ChargedPickup(inv).IsActive())) // return; } if (CarriedDecoration != None) DropDecoration(); bLeftClicked = False; //CyberP: fail safe SetInHandPending(inv); } // ---------------------------------------------------------------------- // UpdateBeltText() // ---------------------------------------------------------------------- function UpdateBeltText(Inventory item) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); // Update object belt text if ((item.bInObjectBelt) && (root != None)) root.hud.belt.UpdateObjectText(item.beltPos); } // ---------------------------------------------------------------------- // UpdateAmmoBeltText() // // Loops through all the weapons in the player's inventory and updates // the ammo for any that matches the ammo type passed in. // ---------------------------------------------------------------------- function UpdateAmmoBeltText(Ammo ammo) { local Inventory inv; inv = Inventory; while(inv != None) { if ((inv.IsA('DeusExWeapon')) && (DeusExWeapon(inv).AmmoType == ammo)) UpdateBeltText(inv); inv = inv.Inventory; } } // ---------------------------------------------------------------------- // SetInHand() // ---------------------------------------------------------------------- function SetInHand(Inventory newInHand) { local DeusExRootWindow root; inHand = newInHand; // Notify the hud root = DeusExRootWindow(rootWindow); if (root != None) root.hud.belt.UpdateInHand(); } // ---------------------------------------------------------------------- // SetInHandPending() // ---------------------------------------------------------------------- function SetInHandPending(Inventory newInHandPending) { local DeusExRootWindow root; if ( newInHandPending == None ) ClientInHandPending = None; inHandPending = newInHandPending; root = DeusExRootWindow(rootWindow); if (root != None) root.hud.belt.UpdateInHand(); } // ---------------------------------------------------------------------- // UpdateInHand() // // Called every frame // Checks the state of inHandPending and deals with animation and crap // 1. Check for pending item // 2. Play down anim (and deactivate) for inHand and wait for it to finish // 3. Assign inHandPending to inHand (and SelectedItem) // 4. Play up anim for inHand // ---------------------------------------------------------------------- function UpdateInHand() { local bool bSwitch; local rotator rot; //sync up clientinhandpending. if (inHandPending != inHand) ClientInHandPending = inHandPending; //DEUS_EX AMSD Don't let clients do this. if (Role < ROLE_Authority) return; if (inHand != inHandPending) { bInHandTransition = True; bSwitch = False; if (inHand != None) { // turn it off if it is on if (inHand.bActive && !inHand.IsA('ChargedPickup')) //CyberP: armor system inHand.Activate(); if (inHand.IsA('SkilledTool')) { if (inHand.IsInState('Idle')) { SkilledTool(inHand).PutDown(); } else if (inHand.IsInState('Idle2')) { bSwitch = True; } } else if (inHand.IsA('DeusExWeapon')) { if (inHand.IsInState('Idle') || inHand.IsInState('Reload')) DeusExWeapon(inHand).PutDown(); else if (inHand.IsInState('DownWeapon') && (Weapon == None)) bSwitch = True; } else { bSwitch = True; } } else { bSwitch = True; } // OK to actually switch? if (bSwitch) { SetInHand(inHandPending); SelectedItem = inHandPending; if (inHand != None) { if (inHand.IsA('SkilledTool')) SkilledTool(inHand).BringUp(); else if (inHand.IsA('DeusExWeapon')) SwitchWeapon(DeusExWeapon(inHand).InventoryGroup); } } } else { bInHandTransition = False; // Added this code because it's now possible to reselect an in-hand // item while we're putting it down, so we need to bring it back up... if (inHand != None) { // if we put the item away, bring it back up if (inHand.IsA('SkilledTool')) { if (inHand.IsInState('Idle2')) SkilledTool(inHand).BringUp(); } else if (inHand.IsA('DeusExWeapon')) { if (inHand.IsInState('DownWeapon') && (Weapon == None)) SwitchWeapon(DeusExWeapon(inHand).InventoryGroup); } } } UpdateCarcassEvent(); } // ---------------------------------------------------------------------- // UpdateCarcassEvent() // // Small hack for sending carcass events // ---------------------------------------------------------------------- function UpdateCarcassEvent() { if ((inHand != None) && (inHand.IsA('POVCorpse'))) { AIStartEvent('WeaponDrawn', EAITYPE_Visual);//AIStartEvent('Carcass', EAITYPE_Visual); } else { AIEndEvent('WeaponDrawn', EAITYPE_Visual); AIEndEvent('Carcass', EAITYPE_Visual); } } // ---------------------------------------------------------------------- // IsEmptyItemSlot() // // Returns True if the item will fit in this slot // ---------------------------------------------------------------------- function Bool IsEmptyItemSlot( Inventory anItem, int col, int row ) { local int slotsCol; local int slotsRow; local Bool bEmpty; local Inventory inv; local DeusExRootWindow root; local PersonaScreenInventory winInv; if ( anItem == None ) return False; //=== If cheats are off, then don't let us do the "overlap" trick root = DeusExRootWindow(rootWindow); winInv = PersonaScreenInventory(root.GetTopWindow()); if(winInv == None || !winInv.bDragging) { inv = Inventory; while(inv != None) { SetInvSlots(inv, 1); inv = inv.Inventory; } } // First make sure the item can fit horizontally // and vertically if (( col + anItem.invSlotsX > maxInvCols ) || ( row + anItem.invSlotsY > maxInvRows )) return False; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) return True; // Now check this and the needed surrounding slots // to see if all the slots are empty bEmpty = True; for( slotsRow=0; slotsRow < anItem.invSlotsY; slotsRow++ ) { for ( slotsCol=0; slotsCol < anItem.invSlotsX; slotsCol++ ) { if ( invSlots[((slotsRow + row) * maxInvCols) + (slotsCol + col)] == 1 ) { bEmpty = False; break; } } if ( !bEmpty ) break; } return bEmpty; } // ---------------------------------------------------------------------- // IsEmptyItemSlotXY() // // Returns True if the item will fit in this slot // ---------------------------------------------------------------------- function Bool IsEmptyItemSlotXY( int invSlotsX, int invSlotsY, int col, int row ) { local int slotsCol; local int slotsRow; local Bool bEmpty; // First make sure the item can fit horizontally // and vertically if (( col + invSlotsX > maxInvCols ) || ( row + invSlotsY > maxInvRows )) return False; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) return True; // Now check this and the needed surrounding slots // to see if all the slots are empty bEmpty = True; for( slotsRow=0; slotsRow < invSlotsY; slotsRow++ ) { for ( slotsCol=0; slotsCol < invSlotsX; slotsCol++ ) { if ( invSlots[((slotsRow + row) * maxInvCols) + (slotsCol + col)] == 1 ) { bEmpty = False; break; } } if ( !bEmpty ) break; } return bEmpty; } // ---------------------------------------------------------------------- // SetInvSlots() // ---------------------------------------------------------------------- function SetInvSlots( Inventory anItem, int newValue ) { local int slotsCol; local int slotsRow; if ( anItem == None ) return; // Make sure this item is located in a valid position if (( anItem.invPosX != -1 ) && ( anItem.invPosY != -1 )) { // fill inventory slots for( slotsRow=0; slotsRow < anItem.invSlotsY; slotsRow++ ) for ( slotsCol=0; slotsCol < anItem.invSlotsX; slotsCol++ ) invSlots[((slotsRow + anItem.invPosY) * maxInvCols) + (slotsCol + anItem.invPosX)] = newValue; } } // ---------------------------------------------------------------------- // PlaceItemInSlot() // ---------------------------------------------------------------------- function PlaceItemInSlot( Inventory anItem, int col, int row ) { // Save in the original Inventory item also anItem.invPosX = col; anItem.invPosY = row; SetInvSlots(anItem, 1); } // ---------------------------------------------------------------------- // RemoveItemFromSlot() // // Removes an inventory item from the inventory grid // ---------------------------------------------------------------------- function RemoveItemFromSlot(Inventory anItem) { if (anItem != None) { SetInvSlots(anItem, 0); anItem.invPosX = -1; anItem.invPosY = -1; } } // ---------------------------------------------------------------------- // ClearInventorySlots() // // Not for the foolhardy // ---------------------------------------------------------------------- function ClearInventorySlots() { local int slotIndex; for(slotIndex=0; slotIndex<arrayCount(invSlots); slotIndex++) invSlots[slotIndex] = 0; } // ---------------------------------------------------------------------- // FindInventorySlot() // // Searches through the inventory slot grid and attempts to find a // valid location for the item passed in. Returns True if the item // is placed, otherwise returns False. // ---------------------------------------------------------------------- function Bool FindInventorySlot(Inventory anItem, optional Bool bSearchOnly) { local bool bPositionFound; local int row; local int col; local int newSlotX; local int newSlotY; local int beltpos; local ammo foundAmmo; if (anItem == None) return False; // Special checks for objects that do not require phsyical inventory // in order to be picked up: // // - NanoKeys // - DataVaultImages // - Credits // - Ammo if ((anItem.IsA('DataVaultImage')) || (anItem.IsA('NanoKey')) || (anItem.IsA('Credits')) || (anItem.IsA('Ammo'))) return True; bPositionFound = False; // DEUS_EX AMSD In multiplayer, due to propagation delays, the inventory refreshers in the // personascreeninventory can keep bouncing items back and forth. So just return true and // place the item where it already was. if ((anItem.invPosX != -1) && (anItem.invPosY != -1) && (Level.NetMode != NM_Standalone) && (!bSearchOnly)) { SetInvSlots(anItem,1); log("Trying to place item "$anItem$" when already placed at "$anItem.invPosX$", "$anItem.invPosY$"."); return True; } // Loop through all slots, looking for a fit for (row=0; row<maxInvRows; row++) { if (row + anItem.invSlotsY > maxInvRows) break; // Make sure the item can fit vertically for(col=0; col<maxInvCols; col++) { if (IsEmptyItemSlot(anItem, col, row )) { bPositionFound = True; break; } } if (bPositionFound) break; } if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { bPositionFound = False; beltpos = 0; if (DeusExRootWindow(rootWindow) != None) { for (beltpos = 0; beltpos < ArrayCount(DeusExRootWindow(rootWindow).hud.belt.objects); beltpos++) { if ( (DeusExRootWindow(rootWindow).hud.belt.objects[beltpos].item == None) && (anItem.TestMPBeltSpot(beltpos)) ) { bPositionFound = True; } } } else { log("no belt to check"); } } if ((bPositionFound) && (!bSearchOnly)) { PlaceItemInSlot(anItem, col, row); if (bLeftClicked) { PutInHand(anItem); //CyberP: left click interaction bLeftClicked = False; } } return bPositionFound; } // ---------------------------------------------------------------------- // FindInventorySlotXY() // // Searches for an available slot given the number of horizontal and // vertical slots this item takes up. // ---------------------------------------------------------------------- function Bool FindInventorySlotXY(int invSlotsX, int invSlotsY, out int newSlotX, out int newSlotY) { local bool bPositionFound; local int row; local int col; bPositionFound = False; // Loop through all slots, looking for a fit for (row=0; row<maxInvRows; row++) { if (row + invSlotsY > maxInvRows) break; // Make sure the item can fit vertically for(col=0; col<maxInvCols; col++) { if (IsEmptyItemSlotXY(invSlotsX, invSlotsY, col, row)) { newSlotX = col; newSlotY = row; bPositionFound = True; break; } } if (bPositionFound) break; } return bPositionFound; } // ---------------------------------------------------------------------- // DumpInventoryGrid() // // Dumps the inventory grid to the log file. Useful for debugging only. // ---------------------------------------------------------------------- exec function DumpInventoryGrid() { local int slotsCol; local int slotsRow; local String gridRow; log("DumpInventoryGrid()"); log("============================================================="); log(" 1 2 3 4 5"); log("-----------------"); for( slotsRow=0; slotsRow < maxInvRows; slotsRow++ ) { gridRow = "Row #" $ slotsRow $ ": "; for ( slotsCol=0; slotsCol < maxInvCols; slotsCol++ ) { if ( invSlots[(slotsRow * maxInvCols) + slotsCol] == 1) gridRow = gridRow $ "X "; else gridRow = gridRow $ " "; } log(gridRow); } log("============================================================="); } // ---------------------------------------------------------------------- // Belt functions following are just callbacks to handle multiplayer // belt updating. First arg is true if it's the invbelt, false if it's // the hudbelt. // ---------------------------------------------------------------------- function ClearPosition(int pos) { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.ClearPosition(pos); } function ClearBelt() { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.ClearBelt(); } function RemoveObjectFromBelt(Inventory item) { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.RemoveObjectFromBelt(item); } function AddObjectToBelt(Inventory item, int pos, bool bOverride) { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).hud.belt.AddObjectToBelt(item,pos,bOverride); } // ---------------------------------------------------------------------- // GetWeaponOrAmmo() // // Checks to see if the player already has this weapon or ammo // in his inventory. Returns the item if found, or None if not. // ---------------------------------------------------------------------- function Inventory GetWeaponOrAmmo(Inventory queryItem) { // First check to see if this item is actually a weapon or ammo if ((Weapon(queryItem) != None) || (Ammo(queryItem) != None)) return FindInventoryType(queryItem.Class); else return None; } /// ///////////////////////////////////////////////////////// //CheckBob() //CyberP: overrides code in playerPawn. Uncomment and modify headbob. ///////////////////////////////////////////////////////// /// /*function CheckBob(float DeltaTime, float Speed2D, vector Y) { local float OldBobTime; if (!bModdedHeadBob) { Super.CheckBob(DeltaTime, Speed2D, Y); return; } OldBobTime = BobTime; if ( Speed2D < 10 ) BobTime += 0.2 * DeltaTime; else BobTime += DeltaTime * (0.5 + 0.8 * Speed2D/GroundSpeed); //0.5 + 0.8 WalkBob = Y * 0.65 * Bob * Speed2D * sin(6 * BobTime); AppliedBob = AppliedBob * (1 - FMin(1, 2 * deltatime -70)); if ( LandBob > 0.01 ) { AppliedBob += FMin(1, 2 * deltatime) * LandBob; LandBob *= (1 - 8*Deltatime); } if ( Speed2D < 160 ) WalkBob.Z = 0; // AppliedBob + Bob * 30 * sin(12 * BobTime); // take out the "breathe" effect - DEUS_EX CNN else WalkBob.Z = AppliedBob/9 + Bob * (Speed2D/4) * cos(12 * BobTime); } */ // ---------------------------------------------------------------------- // Summon() // // automatically prepend DeusEx. to the summoned class // ---------------------------------------------------------------------- exec function Summon(string ClassName) { if (!bCheatsEnabled) return; if(!bAdmin && (Level.Netmode != NM_Standalone)) return; if(instr(ClassName, ".") == -1) ClassName = "DeusEx." $ ClassName; Super.Summon(ClassName); } // ---------------------------------------------------------------------- // SpawnMass() // // Spawns a bunch of actors around the player // ---------------------------------------------------------------------- exec function SpawnMass(Name ClassName, optional int TotalCount) { local actor spawnee; local vector spawnPos; local vector center; local rotator direction; local int maxTries; local int count; local int numTries; local float maxRange; local float range; local float angle; local class<Actor> spawnClass; local string holdName; if (!bCheatsEnabled) return; if (!bAdmin && (Level.Netmode != NM_Standalone)) return; if (instr(ClassName, ".") == -1) holdName = "DeusEx." $ ClassName; else holdName = "" $ ClassName; // barf spawnClass = class<actor>(DynamicLoadObject(holdName, class'Class')); if (spawnClass == None) { ClientMessage("Illegal actor name "$GetItemName(String(ClassName))); return; } if (totalCount <= 0) totalCount = 10; if (totalCount > 250) totalCount = 250; maxTries = totalCount*2; count = 0; numTries = 0; maxRange = sqrt(totalCount/3.1416)*4*SpawnClass.Default.CollisionRadius; direction = ViewRotation; direction.pitch = 0; direction.roll = 0; center = Location + Vector(direction)*(maxRange+SpawnClass.Default.CollisionRadius+CollisionRadius+20); while ((count < totalCount) && (numTries < maxTries)) { angle = FRand()*3.14159265359*2; range = sqrt(FRand())*maxRange; spawnPos.X = sin(angle)*range; spawnPos.Y = cos(angle)*range; spawnPos.Z = 0; spawnee = spawn(SpawnClass,,,center+spawnPos, Rotation); if (spawnee != None) count++; numTries++; } ClientMessage(count$" actor(s) spawned"); } // ---------------------------------------------------------------------- // ToggleWalk() // ---------------------------------------------------------------------- exec function ToggleWalk() { if (RestrictInput()) return; bToggleWalk = !bToggleWalk; } // ---------------------------------------------------------------------- // ReloadWeapon() // // reloads the currently selected weapon // ---------------------------------------------------------------------- exec function ReloadWeapon() { local DeusExWeapon W; if (RestrictInput()) return; //GMDX: bumped to restricted // if (bGEPprojectileInflight) return;// cant reload during projectil flight W = DeusExWeapon(Weapon); //CyberP: cannot reload when ammo in mag but none in reserves. if (W != None && (W.AmmoLeftInClip() != W.AmmoType.AmmoAmount || W.IsA('WeaponHideAGun') || W.GoverningSkill == class'DeusEx.SkillDemolition')) W.ReloadAmmo(); } // ---------------------------------------------------------------------- // ToggleScope() // // turns the scope on or off for the current weapon // ---------------------------------------------------------------------- exec function ToggleScope() { local DeusExWeapon W; //log("ToggleScope "@IsInState('Interpolating')@" "@IsInState('Dying')@" "@IsInState('Paralyzed')); if (RestrictInput()) return; W = DeusExWeapon(Weapon); if (W != None) { if (W.IsInState('Idle') || (W.bZoomed == False && W.AnimSequence == 'Shoot') || (W.bZoomed == True && RecoilTime==0)) //CyberP: far less restrictive { if (W.AnimSequence == 'Idle1' || W.AnimSequence == 'Idle2' || W.AnimSequence == 'Idle3') W.PlayAnim('Still'); if (W.bZoomed==False&&W.IsA('WeaponRifle')) WeaponRifle(W).activateAn = True; else if (W.bZoomed==False&&W.IsA('WeaponPistol') && W.bHasScope) WeaponPistol(W).activateAn = True; else if (W.bZoomed==False&&W.IsA('WeaponMiniCrossbow') && W.bHasScope) WeaponMiniCrossbow(W).activateAn = True; else if (W.bZoomed==False&&W.IsA('WeaponStealthPistol') && W.bHasScope) WeaponStealthPistol(W).activateAn = True; else if (W.bZoomed==False&&W.IsA('WeaponAssaultGun') && W.bHasScope) WeaponAssaultGun(W).activateAn = True; else W.ScopeToggle(); if (W.bZoomed&&W.IsA('WeaponGEPGun')) { bFromCrosshair=true; if (W.bLasing) W.LaserOff(); } } } } //GMDX: tester for rocket tracking //copied part from PutCarriedDecorationInHand() //major cheat :P //copied inpart from laseremitter function bool CalcGEPLaserTrace(rotator newCamera,float newDistance,out vector HitLocOut) { local vector StartTrace, EndTrace, HitLoc, HitNormal, Reflection; local actor target; local int i, texFlags; local name texName, texGroup; local bool HitObject; StartTrace = Location; StartTrace.Z += BaseEyeHeight; EndTrace = StartTrace + Vector(newCamera)*newDistance; HitObject = false; // trace the path of the reflected beam and draw points at each hit foreach TraceTexture(class'Actor', target, texName, texGroup, texFlags, HitLoc, HitNormal, EndTrace, StartTrace) { if ((target.DrawType == DT_None) || target.bHidden) { // do nothing - keep on tracing } else if ((target == Level) || target.IsA('Mover')) { HitObject=true; HitLocOut=HitLoc; break; } else { HitObject=true; HitLocOut=HitLoc; break; } } return HitObject; } function bool UpdateRocketTarget(rotator newCamera,float newDistance,optional bool bForcedUpdate) { local vector lookDir, upDir,accVec; local Vector Start, X, Y, Z; if (RocketTarget==none) return false; if (bForcedUpdate||((InHand!=none)&&(InHand.IsA('WeaponGEPGun'))&&(WeaponGEPGun(InHand).bLasing)))// ||(WeaponGEPGun(InHand).bZoomed)))) { if (CalcGEPLaserTrace(newCamera,newDistance,lookDir)) return RocketTarget.SetLocation(lookDir); upDir = Location; upDir.Z += BaseEyeHeight; lookDir = Vector(newCamera)*newDistance; return RocketTarget.SetLocation(upDir + lookDir); } return false; } function SetRocketWireControl() { if (RocketTarget!=none) { RocketTarget.SetPhysics(PHYS_None); RocketTarget.SetBase(self); if (!UpdateRocketTarget(Rotation,RocketTargetMaxDistance,true)) log("Error: Could not base initialize Rocket Target!"); } else log("Error: Could not spawn Rocket Target!"); } /* function SetRocketPOVControl() { if ((RocketTarget!=none)&&(InHand.IsA('WeaponGEPGun'))) { RocketTarget.SetPhysics(PHYS_None); if (!bGEPprojectileInflight) RocketTarget.SetBase(InHand); // else // RocketTarget.SetBase(aGEPProjectile); if (UpdateRocketTarget(InHand.Rotation,0,true)) { log("GEP Loc="@Location@" : Its="@RocketTarget.Location); } else log("Error: Could not base initialize Rocket Target to GEP!"); } else log("Error: Could not spawn Rocket Target!"); } */ /* function SetRocketPOV(bool bSetToGEP) { if (bSetToGEP) { SetRocketPOVControl(); } else { SetRocketWireControl(); } } */ function UpdateTrackingSteering(float deltaT) { local float smx,smy; local float vlen; //Handle mouse inputs smX=SmoothMouseX*0.01; smY=SmoothMouseY*0.01; if ((smX<0)&&(GEPSteeringX>smX)) GEPsteeringX=smX; else if ((smX>0)&&(GEPSteeringX<smX)) GEPsteeringX=smX; //if (Abs(GEPsteeringX)<0.1) GEPsteeringX=0.0; if ((smY<0)&&(GEPSteeringY>smY)) GEPsteeringY=smY; else if ((smY>0)&&(GEPSteeringY<smY)) GEPsteeringY=smY; GEPsteeringX *=(0.7+(0.3-Fmax(0.3*deltaT*3.0,0.3))); GEPsteeringY *=(0.7+(0.3-Fmax(0.3*deltaT*3.0,0.3))); /*scaleGEP.X=GEPsteeringX; scaleGEP.Y=GEPsteeringY; vlen=Vsize(scaleGEP)*(0.8+(0.2-0.2*deltaT)); GEPsteeringX = GEPsteeringX*3.0*deltaT; //drain to zero GEPsteeringY = GEPsteeringY*3.0*deltaT; //drain to zero */ // if (Abs(GEPsteeringY)<0.1) GEPsteeringY=0.0; } //GMDX: end Rocket Target system // check to see if the player can lift a certain decoration taking // into account his muscle augs function bool CanBeLifted(Decoration deco) { local int augLevel, augMult; local float maxLift; //gmdx modded so aug has effect maxLift = 50; if (AugmentationSystem != None) { augLevel = AugmentationSystem.GetClassLevel(class'AugMuscle'); augMult = 1; if (augLevel >= 0) augMult = augLevel+3; maxLift *= augMult; } if (!deco.bPushable || (deco.Mass > maxLift) || (deco.StandingCount > 0)) { if (deco.bPushable) ClientMessage(TooHeavyToLift); else ClientMessage(CannotLift); return False; } return True; } // ---------------------------------------------------------------------- // GrabDecoration() // // This overrides GrabDecoration() in Pawn.uc // lets the strength augmentation affect how much the player can lift // ---------------------------------------------------------------------- function GrabDecoration() { // can't grab decorations while leaning if (IsLeaning()) return; // log("GrabDecoration::"@FrobTarget@FrobTarget.Owner@FrobTarget.Base); if ((FrobTarget!=none)&&(FrobTarget.Base!=none)&&(FrobTarget.Base.IsA('GMDXProjectileWrap'))) { FrobTarget.Base.Destroy(); return;//GMDX stop catching of mythical deco that has no collide settings! will expand to allow catch maybe! } // can't grab decorations while holding something else if (inHand != None) { if (carriedDecoration != None || inHand.IsA('POVcorpse')) {ClientMessage(HandsFull); return;} else if (!bAutoHolster) {ClientMessage(HandsFull); return;} else if (bAutoHolster) {PutInHand(None);} } if (carriedDecoration == None) if ((FrobTarget != None) && FrobTarget.IsA('Decoration') && (Weapon == None || inHandPending == None)) //CyberP: added || inHandPending == None if (CanBeLifted(Decoration(FrobTarget))) { CarriedDecoration = Decoration(FrobTarget); PutCarriedDecorationInHand(); } } // ---------------------------------------------------------------------- // PutCarriedDecorationInHand() // ---------------------------------------------------------------------- function PutCarriedDecorationInHand() { local vector lookDir, upDir; local float shakeTime, shakeVert, shakeRoll; if (CarriedDecoration != None) { lookDir = Vector(Rotation); lookDir.Z = 0; upDir = vect(0,0,0); if (CarriedDecoration.CollisionHeight < 8.000000) upDir.Z = CollisionHeight / 1.75; //CyberP: a bit higher for small objects. else upDir.Z = CollisionHeight / 2.5; // put it up near eye level //CyberP: chest level. was 2 CarriedDecoration.SetPhysics(PHYS_Falling); if ( CarriedDecoration.SetLocation(Location + upDir + (0.5 * CollisionRadius + CarriedDecoration.CollisionRadius) * lookDir) ) { if (CarriedDecoration.Mass > 40) //CyberP: pickup sounds { if (FRand() < 0.5) PlaySound(Sound'objpickup3',SLOT_None); else PlaySound(Sound'genericlargeequip',SLOT_None); } else if (FRand() < 0.33) PlaySound(Sound'genericlargeequip',SLOT_None); else if (FRand() < 0.66) PlaySound(Sound'genericsmallequip',SLOT_None); else PlaySound(Sound'genericsmallunequip',SLOT_None); CarriedDecoration.SetPhysics(PHYS_None); CarriedDecoration.SetBase(self); CarriedDecoration.SetCollision(False, False, False); CarriedDecoration.bCollideWorld = False; // make it translucent if (!bNoTranslucency || AugmentationSystem.GetAugLevelValue(class'AugCloak') != -1.0) { CarriedDecoration.Style = STY_Translucent; CarriedDecoration.ScaleGlow = 0.2; //GMDX was 1.0 CarriedDecoration.bUnlit = True; } FrobTarget = None; } else { ClientMessage(NoRoomToLift); CarriedDecoration = None; } } } function ThrowDecoration(Decoration WrapDeco) { local GMDXProjectileWrap PW; if (WrapDeco==none) return; //log("CARRIED DECO "@WrapDeco); // PW.default.Mesh=CarriedDecoration.Mesh; // PW.default.Mass=CarriedDecoration.Mass; // PW.default.CollisionHeight=CarriedDecoration.CollisionHeight; // PW.default.CollisionRadius=CarriedDecoration.CollisionRadius; // PW.default.ImpactSound=CarriedDecoration.PushSound; // PW.default.Buoyancy=CarriedDecoration.Buoyancy; PW=Spawn(class'GMDXProjectileWrap'); if(PW!=none) { //log("CARRIED DECO, spawn prj"); // if (WrapDeco.IsA('Carcass')) PW.InitWrapDecoration(WrapDeco,self);//,false); swimTimer -= 1; RecoilShaker(vect(3,0,1)); if (swimTimer < 0) swimTimer = 0; // else // PW.InitWrapDecoration(WrapDeco,self);//,true); } } // ---------------------------------------------------------------------- // DropDecoration() // // This overrides DropDecoration() in Pawn.uc // lets the player throw a decoration instead of just dropping it // ---------------------------------------------------------------------- function DropDecoration() { local Vector X, Y, Z, dropVect, origLoc, HitLocation, HitNormal, extent; local float velscale, size, mult; local bool bSuccess; local Actor hitActor; bSuccess = False; if (CarriedDecoration != None) { origLoc = CarriedDecoration.Location; GetAxes(Rotation, X, Y, Z); // if we are highlighting something, try to place the object on the target if ((FrobTarget != None) && !FrobTarget.IsA('Pawn') && !FrobTarget.IsA('DeusExWeapon') && !FrobTarget.IsA('Pickup') && !FrobTarget.IsA('Decoration')) { CarriedDecoration.Velocity = vect(0,0,0); // try to drop the object about one foot above the target size = FrobTarget.CollisionRadius - CarriedDecoration.CollisionRadius * 2; dropVect.X = size/2 - FRand() * size; dropVect.Y = size/2 - FRand() * size; dropVect.Z = FrobTarget.CollisionHeight + CarriedDecoration.CollisionHeight + 16; dropVect += FrobTarget.Location; } else { // throw velocity is based on augmentation if (AugmentationSystem != None) { mult = 1.3;//AugmentationSystem.GetAugLevelValue(class'AugMuscle'); //CyberP: we don't need this anymore if (mult == -1.0) mult = 1.0; } //if (IsLeaning()) // CarriedDecoration.Velocity = vect(0,0,0); //else CarriedDecoration.Velocity = Vector(ViewRotation) * mult * 500 + vect(0,0,180) + 40 * VRand(); // scale it based on the mass velscale = FClamp(CarriedDecoration.Mass / 20.0, 1.0, 40.0); CarriedDecoration.Velocity /= velscale; dropVect = Location + (CarriedDecoration.CollisionRadius + CollisionRadius + 2) * X; //was 4, now 2 dropVect.Z += BaseEyeHeight; //if (FRand() < 0.3) // PlaySound(Sound'MaleLand',SLOT_None); if (CarriedDecoration.Mass <= 40 && CarriedDecoration.CollisionHeight < 23.000000 && CarriedDecoration.CollisionRadius <= 22.500000) { CarriedDecoration.bFixedRotationDir = True; CarriedDecoration.RotationRate.Pitch = (32768 - Rand(65536)) * 1.5; if (FRand() < 0.2) CarriedDecoration.RotationRate.Yaw = (32768 - Rand(65536)) * 1.0; else if (FRand() < 0.7) { } else CarriedDecoration.RotationRate.Yaw -= (32768 - Rand(65536)) * 1.0; } } // is anything blocking the drop point? (like thin doors) if (FastTrace(dropVect)) { CarriedDecoration.SetCollision(True, True, True); CarriedDecoration.bCollideWorld = True; // check to see if there's space there extent.X = CarriedDecoration.CollisionRadius; extent.Y = CarriedDecoration.CollisionRadius; extent.Z = 1; hitActor = Trace(HitLocation, HitNormal, dropVect, CarriedDecoration.Location, True, extent); if ((hitActor == None) && CarriedDecoration.SetLocation(dropVect)) bSuccess = True; else { CarriedDecoration.SetCollision(False, False, False); CarriedDecoration.bCollideWorld = False; } } // if we can drop it here, then drop it if (bSuccess) { CarriedDecoration.bWasCarried = True; CarriedDecoration.SetBase(None); CarriedDecoration.SetPhysics(PHYS_Falling); CarriedDecoration.Instigator = Self; AIEndEvent('WeaponDrawn', EAITYPE_Visual); // turn off translucency CarriedDecoration.Style = CarriedDecoration.Default.Style; CarriedDecoration.bUnlit = CarriedDecoration.Default.bUnlit; if (CarriedDecoration.IsA('DeusExDecoration')) DeusExDecoration(CarriedDecoration).ResetScaleGlow(); if (bThrowDecoration) ThrowDecoration(CarriedDecoration); CarriedDecoration = None; } else { // otherwise, don't drop it and display a message CarriedDecoration.SetLocation(origLoc); ClientMessage(CannotDropHere); } } bThrowDecoration=false; } // ---------------------------------------------------------------------- // DropItem() // // throws an item where you are currently looking // or places it on your currently highlighted object // if None is passed in, it drops what's inHand // ---------------------------------------------------------------------- exec function bool DropItem(optional Inventory inv, optional bool bDrop) { local Inventory item, previtem; local Inventory previousItemInHand; local Vector X, Y, Z, dropVect; local float size, mult; local DeusExCarcass carc; local class<DeusExCarcass> carcClass; local bool bDropped; local bool bRemovedFromSlots; local int itemPosX, itemPosY, tex; bDropped = True; if (RestrictInput()) return False; if (inv == None) { previousItemInHand = inHand; item = inHand; } else { item = inv; } if ((item!=none)&&(!item.IsA('POVcorpse'))) bThrowDecoration=false; if (item != None) { GetAxes(Rotation, X, Y, Z); dropVect = Location + (CollisionRadius + 2*item.CollisionRadius) * X; dropVect.Z += BaseEyeHeight; // check to see if we're blocked by terrain if (!FastTrace(dropVect)) { ClientMessage(CannotDropHere); return False; } // don't drop it if it's in a strange state if (item.IsA('DeusExWeapon')) { if (!DeusExWeapon(item).IsInState('Idle') && !DeusExWeapon(item).IsInState('Idle2') && !DeusExWeapon(item).IsInState('DownWeapon') && !DeusExWeapon(item).IsInState('Reload')) { return False; } else // make sure the scope/laser are turned off { DeusExWeapon(item).ScopeOff(); DeusExWeapon(item).LaserOff(); if (DeusExWeapon(item) == assignedWeapon) assignedWeapon = None; } } // Don't allow active ChargedPickups to be dropped if ((item.IsA('ChargedPickup')) && (ChargedPickup(item).IsActive())) { return False; } // don't let us throw away the nanokeyring if (item.IsA('NanoKeyRing')) { return False; } // take it out of our hand if (item == inHand) PutInHand(None); // handle throwing pickups that stack if (item.IsA('DeusExPickup')) { // turn it off if it is on if (DeusExPickup(item).bActive) DeusExPickup(item).Activate(); tex = deusExPickUp(item).textureset; //our current tex DeusExPickup(item).NumCopies--; UpdateBeltText(item); if (DeusExPickup(item).NumCopies > 0) { // put it back in our hand, but only if it was in our // hand originally!!! if (previousItemInHand == item) PutInHand(previousItemInHand); previtem = item; item = Spawn(item.Class, Owner); if(item != none) { if(deusExPickUp(item).bhasMultipleSkins) { deusExPickUp(item).textureSet = tex; deusExPickUp(item).SetSkin(); deusExPickUp(previtem).UpdateCurrentSkin(); } } } else { if(deusExPickUp(item).bhasMultipleSkins) { deusExPickUp(item).textureSet = tex; deusExPickUp(item).SetSkin(); } // Keep track of this so we can undo it // if necessary bRemovedFromSlots = True; itemPosX = item.invPosX; itemPosY = item.invPosY; // Remove it from the inventory slot grid RemoveItemFromSlot(item); // make sure we have one copy to throw! DeusExPickup(item).NumCopies = 1; } } else { // Keep track of this so we can undo it // if necessary bRemovedFromSlots = True; itemPosX = item.invPosX; itemPosY = item.invPosY; // Remove it from the inventory slot grid RemoveItemFromSlot(item); } // if we are highlighting something, try to place the object on the target //CyberP: more lenience when dropping if ((FrobTarget != None) && !item.IsA('POVCorpse') && !FrobTarget.IsA('Pawn') && !FrobTarget.IsA('Pickup') && !FrobTarget.IsA('DeusExWeapon') && !FrobTarget.IsA('Decoration')) { item.Velocity = vect(0,0,0); // play the correct anim PlayPickupAnim(FrobTarget.Location); // try to drop the object about one foot above the target size = FrobTarget.CollisionRadius - item.CollisionRadius * 2; dropVect.X = size/2 - FRand() * size; dropVect.Y = size/2 - FRand() * size; dropVect.Z = FrobTarget.CollisionHeight + item.CollisionHeight + 16; if (FastTrace(dropVect)) { item.DropFrom(FrobTarget.Location + dropVect); } else { ClientMessage(CannotDropHere); bDropped = False; } } else { // throw velocity is based on augmentation if (AugmentationSystem != None) { mult = AugmentationSystem.GetAugLevelValue(class'AugMuscle'); if (mult == -1.0) mult = 0.7; } if (bDrop) { item.Velocity = VRand() * 30; // play the correct anim PlayPickupAnim(item.Location); } else { if (item.Mass > 20) mult -= 0.15; item.Velocity = Vector(ViewRotation) * (mult*1.5) * 600 + vect(0,0,150); //CyberP: z vect was 240 // play a throw anim PlayAnim('Attack',,0.1); } GetAxes(ViewRotation, X, Y, Z); dropVect = Location + 0.8 * CollisionRadius * X; dropVect.Z += BaseEyeHeight; // if we are a corpse, spawn the actual carcass if (item.IsA('POVCorpse')) { if (POVCorpse(item).carcClassString != "") { carcClass = class<DeusExCarcass>(DynamicLoadObject(POVCorpse(item).carcClassString, class'Class')); if (carcClass != None) { carc = Spawn(carcClass); if (carc != None) { carc.Mesh = carc.Mesh2; carc.KillerAlliance = POVCorpse(item).KillerAlliance; carc.KillerBindName = POVCorpse(item).KillerBindName; carc.Alliance = POVCorpse(item).Alliance; carc.bNotDead = POVCorpse(item).bNotDead; carc.Tag = POVCorpse(item).CarcassTag; //CyberP: tag carc.bEmitCarcass = POVCorpse(item).bEmitCarcass; carc.CumulativeDamage = POVCorpse(item).CumulativeDamage; carc.MaxDamage = POVCorpse(item).MaxDamage; carc.itemName = POVCorpse(item).CorpseItemName; carc.CarcassName = POVCorpse(item).CarcassName; carc.Velocity = item.Velocity * 0.5; item.Velocity = vect(0,0,0); carc.bHidden = False; carc.bNotFirstFall = True; carc.bEmitCarcass = true; //CyberP: emitcarc carc.SetPhysics(PHYS_Falling); carc.SetScaleGlow(); Carc.UpdateHDTPSettings(); Carc.Inventory = PovCorpse(item).Inv; //GMDX //if (FRand() < 0.3) //PlaySound(Sound'DeusExSounds.Player.MaleLand', SLOT_None, 0.9, false, 800, 0.85); if (carc.SetLocation(dropVect)) { // must circumvent PutInHand() since it won't allow // things in hand when you're carrying a corpse SetInHandPending(None); item.Destroy(); item = None; if (bThrowDecoration) { bThrowDecoration=false; ThrowDecoration(carc); // play a throw anim PlayAnim('Attack',,0.1); } } else carc.bHidden = True; } } } } else { if (FastTrace(dropVect)) { item.DropFrom(dropVect); item.bFixedRotationDir = True; item.RotationRate.Pitch = (32768 - Rand(65536)) * 4.0 * (mult); item.RotationRate.Yaw = (32768 - Rand(65536)) * 4.0 * (mult); } } } // if we failed to drop it, put it back inHand if (item != None) { if (((inHand == None) || (inHandPending == None)) && (item.Physics != PHYS_Falling)) { PutInHand(item); ClientMessage(CannotDropHere); bDropped = False; } else { item.Instigator = Self; } } } else if (CarriedDecoration != None) { bThrowDecoration=false; DropDecoration(); // play a throw anim PlayAnim('Attack',,0.1); } // If the drop failed and we removed the item from the inventory // grid, then we need to stick it back where it came from so // the inventory doesn't get fucked up. if ((bRemovedFromSlots) && (item != None) && (!bDropped)) { //DEUS_EX AMSD Use the function call for this, helps multiplayer PlaceItemInSlot(item, itemPosX, itemPosY); } return bDropped; } // ---------------------------------------------------------------------- // RemoveItemDuringConversation() // ---------------------------------------------------------------------- function RemoveItemDuringConversation(Inventory item) { if (item != None) { // take it out of our hand if (item == inHand) PutInHand(None); // Make sure it's removed from the inventory grid RemoveItemFromSlot(item); // Make sure the item is deactivated! if (item.IsA('DeusExWeapon')) { DeusExWeapon(item).ScopeOff(); DeusExWeapon(item).LaserOff(); } else if (item.IsA('DeusExPickup')) { // turn it off if it is on if (DeusExPickup(item).bActive) DeusExPickup(item).Activate(); } if (conPlay != None) conPlay.SetInHand(None); } } // ---------------------------------------------------------------------- // WinStats() // ---------------------------------------------------------------------- exec function WinStats(bool bStatsOn) { if (rootWindow != None) rootWindow.ShowStats(bStatsOn); } // ---------------------------------------------------------------------- // ToggleWinStats() // ---------------------------------------------------------------------- exec function ToggleWinStats() { if (!bCheatsEnabled) return; if (rootWindow != None) rootWindow.ShowStats(!rootWindow.bShowStats); } // ---------------------------------------------------------------------- // WinFrames() // ---------------------------------------------------------------------- exec function WinFrames(bool bFramesOn) { if (!bCheatsEnabled) return; if (rootWindow != None) rootWindow.ShowFrames(bFramesOn); } // ---------------------------------------------------------------------- // ToggleWinFrames() // ---------------------------------------------------------------------- exec function ToggleWinFrames() { if (!bCheatsEnabled) return; if (rootWindow != None) rootWindow.ShowFrames(!rootWindow.bShowFrames); } // ---------------------------------------------------------------------- // ShowClass() // ---------------------------------------------------------------------- exec function ShowClass(Class<Actor> newClass) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.SetViewClass(newClass); } // ---------------------------------------------------------------------- // ShowEyes() // ---------------------------------------------------------------------- exec function ShowEyes(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowEyes(bShow); } // ---------------------------------------------------------------------- // ShowArea() // ---------------------------------------------------------------------- exec function ShowArea(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowArea(bShow); } // ---------------------------------------------------------------------- // ShowCylinder() // ---------------------------------------------------------------------- exec function ShowCylinder(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowCylinder(bShow); } // ---------------------------------------------------------------------- // ShowMesh() // ---------------------------------------------------------------------- exec function ShowMesh(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowMesh(bShow); } // ---------------------------------------------------------------------- // ShowZone() // ---------------------------------------------------------------------- exec function ShowZone(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowZone(bShow); } // ---------------------------------------------------------------------- // ShowLOS() // ---------------------------------------------------------------------- exec function ShowLOS(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowLOS(bShow); } // ---------------------------------------------------------------------- // ShowVisibility() // ---------------------------------------------------------------------- exec function ShowVisibility(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowVisibility(bShow); } // ---------------------------------------------------------------------- // ShowData() // ---------------------------------------------------------------------- exec function ShowData(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowData(bShow); } // ---------------------------------------------------------------------- // ShowEnemyResponse() // ---------------------------------------------------------------------- exec function ShowEnemyResponse(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowEnemyResponse(bShow); } // ---------------------------------------------------------------------- // ShowER() // ---------------------------------------------------------------------- exec function ShowER(bool bShow) { // Convenience form of ShowEnemyResponse() ShowEnemyResponse(bShow); } // ---------------------------------------------------------------------- // ShowState() // ---------------------------------------------------------------------- exec function ShowState(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowState(bShow); } // ---------------------------------------------------------------------- // ShowEnemy() // ---------------------------------------------------------------------- exec function ShowEnemy(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowEnemy(bShow); } // ---------------------------------------------------------------------- // ShowInstigator() // ---------------------------------------------------------------------- exec function ShowInstigator(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowInstigator(bShow); } // ---------------------------------------------------------------------- // ShowBase() // ---------------------------------------------------------------------- exec function ShowBase(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowBase(bShow); } // ---------------------------------------------------------------------- // ShowLight() // ---------------------------------------------------------------------- exec function ShowLight(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowLight(bShow); } // ---------------------------------------------------------------------- // ShowDist() // ---------------------------------------------------------------------- exec function ShowDist(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowDist(bShow); } // ---------------------------------------------------------------------- // ShowBindName() // ---------------------------------------------------------------------- exec function ShowBindName(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowBindName(bShow); } // ---------------------------------------------------------------------- // ShowPos() // ---------------------------------------------------------------------- exec function ShowPos(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowPos(bShow); } // ---------------------------------------------------------------------- // ShowHealth() // ---------------------------------------------------------------------- exec function ShowHealth(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowHealth(bShow); } // ---------------------------------------------------------------------- // ShowPhysics() // ---------------------------------------------------------------------- exec function ShowPhysics(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowPhysics(bShow); } // ---------------------------------------------------------------------- // ShowMass() // ---------------------------------------------------------------------- exec function ShowMass(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowMass(bShow); } // ---------------------------------------------------------------------- // ShowVelocity() // ---------------------------------------------------------------------- exec function ShowVelocity(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowVelocity(bShow); } // ---------------------------------------------------------------------- // ShowAcceleration() // ---------------------------------------------------------------------- exec function ShowAcceleration(bool bShow) { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) if (root.actorDisplay != None) root.actorDisplay.ShowAcceleration(bShow); } // ---------------------------------------------------------------------- // ShowHud() // ---------------------------------------------------------------------- exec function ShowHud(bool bShow) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) root.ShowHud(bShow); } // ---------------------------------------------------------------------- // ToggleObjectBelt() // ---------------------------------------------------------------------- exec function ToggleObjectBelt() { local DeusExRootWindow root; bObjectBeltVisible = !bObjectBeltVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleHitDisplay() // ---------------------------------------------------------------------- exec function ToggleHitDisplay() { local DeusExRootWindow root; bHitDisplayVisible = !bHitDisplayVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleAmmoDisplay() // ---------------------------------------------------------------------- exec function ToggleAmmoDisplay() { local DeusExRootWindow root; bAmmoDisplayVisible = !bAmmoDisplayVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleAugDisplay() // ---------------------------------------------------------------------- exec function ToggleAugDisplay() { local DeusExRootWindow root; bAugDisplayVisible = !bAugDisplayVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleCompass() // ---------------------------------------------------------------------- exec function ToggleCompass() { local DeusExRootWindow root; bCompassVisible = !bCompassVisible; root = DeusExRootWindow(rootWindow); if (root != None) root.UpdateHud(); } // ---------------------------------------------------------------------- // ToggleLaser() // // turns the laser sight on or off for the current weapon // ---------------------------------------------------------------------- exec function ToggleLaser() { local DeusExWeapon W; if (RestrictInput()||bGEPzoomActive) return; W = DeusExWeapon(Weapon); if (W==none) return; if (!W.bHasLaser||W.IsA('WeaponNanoSword')||!W.IsInState('idle')) return; SetLaser(!W.bLasing,true); } function SetLaser(bool bNewOn,optional bool bCheckXhair) { local DeusExWeapon W; W = DeusExWeapon(Weapon); if (W==none||(W!=none&&!W.bHasLaser)) return; bFromCrosshair=true; if (bNewOn) { W.LaserOn(); if (bCheckXhair) SetCrosshair(false,false); } else { W.LaserOff(); if (bCheckXhair) SetCrosshair(bWasCrosshair,false); } } function SetCrosshair(bool bNewOn,optional bool bCheckLasing) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root == None) return; bCrosshairVisible=bNewOn; root.UpdateHud(); if (bNewOn&&bCheckLasing) SetLaser(false,false); } // ---------------------------------------------------------------------- // ToggleCrosshair() // ---------------------------------------------------------------------- exec function ToggleCrosshair() { local DeusExWeapon W; if (RestrictInput()) return; W = DeusExWeapon(Weapon); if (W!=none&&(W.IsA('WeaponNanoSword')||!W.IsInState('idle'))) return; bCrosshairVisible = !bCrosshairVisible; bWasCrosshair=bCrosshairVisible; SetCrosshair(bCrosshairVisible,true); } // ---------------------------------------------------------------------- // ShowInventoryWindow() // ---------------------------------------------------------------------- exec function ShowInventoryWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Inventory screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenInventory'); } // ---------------------------------------------------------------------- // ShowSkillsWindow() // ---------------------------------------------------------------------- exec function ShowSkillsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Skills screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenSkills'); } // ---------------------------------------------------------------------- // ShowHealthWindow() // ---------------------------------------------------------------------- exec function ShowHealthWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Health screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenHealth'); } // ---------------------------------------------------------------------- // ShowImagesWindow() // ---------------------------------------------------------------------- exec function ShowImagesWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Images screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenImages'); } // ---------------------------------------------------------------------- // ShowConversationsWindow() // ---------------------------------------------------------------------- exec function ShowConversationsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Conversations screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenConversations'); } // ---------------------------------------------------------------------- // ShowAugmentationsWindow() // ---------------------------------------------------------------------- exec function ShowAugmentationsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Augmentations screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenAugmentations'); } // ---------------------------------------------------------------------- // ShowGoalsWindow() // ---------------------------------------------------------------------- exec function ShowGoalsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Goals screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenGoals'); } // ---------------------------------------------------------------------- // ShowLogsWindow() // ---------------------------------------------------------------------- exec function ShowLogsWindow() { if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && (bBeltIsMPInventory)) { ClientMessage("Logs screen disabled in multiplayer"); return; } InvokeUIScreen(Class'PersonaScreenLogs'); } // ---------------------------------------------------------------------- // ShowAugmentationAddWindow() // ---------------------------------------------------------------------- exec function ShowAugmentationAddWindow() { if (RestrictInput()) return; InvokeUIScreen(Class'HUDMedBotAddAugsScreen'); } // ---------------------------------------------------------------------- // ShowQuotesWindow() // ---------------------------------------------------------------------- exec function ShowQuotesWindow() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'QuotesWindow'); } // ---------------------------------------------------------------------- // ShowRGBDialog() // ---------------------------------------------------------------------- exec function ShowRGBDialog() { local DeusExRootWindow root; if (!bCheatsEnabled) return; root = DeusExRootWindow(rootWindow); if (root != None) root.PushWindow(Class'MenuScreenRGB'); } // ---------------------------------------------------------------------- // ActivateBelt() // ---------------------------------------------------------------------- exec function ActivateBelt(int objectNum) { local DeusExRootWindow root; if (RestrictInput()) return; if ((Level.NetMode != NM_Standalone) && bBuySkills) { root = DeusExRootWindow(rootWindow); if ( root != None ) { if ( root.hud.hms.OverrideBelt( Self, objectNum )) return; } } if (CarriedDecoration == None) { root = DeusExRootWindow(rootWindow); if (root != None) root.ActivateObjectInBelt(objectNum); } } // ---------------------------------------------------------------------- // NextBeltItem() // ---------------------------------------------------------------------- exec function NextBeltItem() { local DeusExRootWindow root; local int slot, startSlot; if (RestrictInput()) return; if (inHand != None && inHand.IsA('DeusExWeapon')) { if (DeusExWeapon(inHand).bZoomed) { if (FovAngle < 60) { DeusExWeapon(inHand).ScopeFOV += 2; DeusExWeapon(inHand).RefreshScopeDisplay(Self,False,True); } return; } } if (!bAlternateToolbelt) { if (CarriedDecoration == None) { slot = 0; root = DeusExRootWindow(rootWindow); if (root != None) { if (inHand == None) slot = SlotMem-1; else if (ClientInHandPending != None) slot = ClientInHandPending.beltPos; else if (inHandPending != None) slot = inHandPending.beltPos; else if (inHand != None) slot = inHand.beltPos; startSlot = slot; do { if (++slot >= 10) slot = 0; } until (root.ActivateObjectInBelt(slot) || (startSlot == slot)); clientInHandPending = root.hud.belt.GetObjectFromBelt(slot); switch( inHandPending.beltPos ) { case 1:SlotMem = 1;break; case 2:SlotMem = 2;break; case 3:SlotMem = 3;break; case 4:SlotMem = 4;break; case 5:SlotMem = 5;break; case 6:SlotMem = 6;break; case 7:SlotMem = 7;break; case 8:SlotMem = 8;break; case 9:SlotMem = 9;break; default:SlotMem = 1;break; } } } } else { if (CarriedDecoration == None) { //slot = advBelt; root = DeusExRootWindow(rootWindow); if (root != None) { if (++advBelt >= 10) advBelt = 0; root.hud.belt.UpdateInHand2(advBelt); clientInHandPending = root.hud.belt.GetObjectFromBelt(advBelt); } } } } // ---------------------------------------------------------------------- // PrevBeltItem() // ---------------------------------------------------------------------- exec function PrevBeltItem() { local DeusExRootWindow root; local int slot, startSlot; if (RestrictInput()) return; if (inHand != None && inHand.IsA('DeusExWeapon')) { if (DeusExWeapon(inHand).bZoomed) { if (FovAngle > 20) { DeusExWeapon(inHand).ScopeFOV -= 2; DeusExWeapon(inHand).RefreshScopeDisplay(Self,False,True); } return; } } if (!bAlternateToolbelt) { if (CarriedDecoration == None) { slot = 1; root = DeusExRootWindow(rootWindow); if (root != None) { if (inHand == none) slot = SlotMem+1; else if (ClientInHandPending != None) slot = ClientInHandPending.beltPos; else if (inHandPending != None) slot = inHandPending.beltPos; else if (inHand != None) slot = inHand.beltPos; startSlot = slot; do { if (--slot <= -1) slot = 9; } until (root.ActivateObjectInBelt(slot) || (startSlot == slot)); clientInHandPending = root.hud.belt.GetObjectFromBelt(slot); switch( inHandPending.beltPos ) { case 1:SlotMem = 1;break; case 2:SlotMem = 2;break; case 3:SlotMem = 3;break; case 4:SlotMem = 4;break; case 5:SlotMem = 5;break; case 6:SlotMem = 6;break; case 7:SlotMem = 7;break; case 8:SlotMem = 8;break; case 9:SlotMem = 9;break; default:SlotMem = 0;break; } } } } else { if (CarriedDecoration == None) { //slot = advBelt; root = DeusExRootWindow(rootWindow); if (root != None) { if (--advBelt <= -1) advBelt = 9; root.hud.belt.UpdateInHand2(advBelt); clientInHandPending = root.hud.belt.GetObjectFromBelt(advBelt); } } } } // ---------------------------------------------------------------------- // ShowMainMenu() // ---------------------------------------------------------------------- exec function ShowMainMenu() { local DeusExRootWindow root; local DeusExLevelInfo info; local MissionEndgame Script; if (bIgnoreNextShowMenu) { bIgnoreNextShowMenu = False; return; } info = GetLevelInfo(); // Special case baby! // // If the Intro map is loaded and we get here, that means the player // pressed Escape and we want to either A) start a new game // or B) return to the dx.dx screen. Either way we're going to // abort the Intro by doing this. // // If this is one of the Endgames (which have a mission # of 99) // then we also want to call the Endgame's "FinishCinematic" // function // force the texture caches to flush ConsoleCommand("FLUSH"); if ((info != None) && (info.MissionNumber == 98)) { bIgnoreNextShowMenu = True; PostIntro(); } else if ((info != None) && (info.MissionNumber == 99)) { foreach AllActors(class'MissionEndgame', Script) break; if (Script != None) Script.FinishCinematic(); } else { root = DeusExRootWindow(rootWindow); if (root != None) { //GMDX: stop lockpick and multitool cheat if (!IsInState('Dying')&&InHand!=None&&InHand.IsA('SkilledTool')&&(InHand.IsA('Lockpick')||InHand.IsA('MultiTool'))) { if (SkilledTool(InHand).IsInState('UseIt')) return; //just can InvokeMenu :P } root.InvokeMenu(Class'MenuMain'); } } } // ---------------------------------------------------------------------- // PostIntro() // ---------------------------------------------------------------------- function PostIntro() { if (bStartNewGameAfterIntro) { bStartNewGameAfterIntro = False; StartNewGame(strStartMap); } else { Level.Game.SendPlayer(Self, "dxonly"); } } // ---------------------------------------------------------------------- // EditFlags() // // Displays the Flag Edit dialog // ---------------------------------------------------------------------- exec function EditFlags() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'FlagEditWindow'); } // ---------------------------------------------------------------------- // InvokeConWindow() // // Displays the Invoke Conversation Window // ---------------------------------------------------------------------- exec function InvokeConWindow() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'InvokeConWindow'); } // ---------------------------------------------------------------------- // LoadMap() // // Displays the Load Map dialog // ---------------------------------------------------------------------- exec function LoadMap() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'LoadMapWindow'); } // ---------------------------------------------------------------------- // Overrides from PlayerPawn // ---------------------------------------------------------------------- exec function Walk() { if (RestrictInput()) return; if (!bCheatsEnabled) return; Super.Walk(); } exec function Fly() { if (RestrictInput()) return; if (!bCheatsEnabled) return; Super.Fly(); } exec function Ghost() { if (RestrictInput()) return; if (!bCheatsEnabled) return; Super.Ghost(); } exec function Fire(optional float F) { if (RestrictInput()) { if (bHidden) ShowMainMenu(); return; } Super.Fire(F); } // ---------------------------------------------------------------------- // Tantalus() // // Instantly kills/destroys the object directly in front of the player // (just like the Tantalus Field in Star Trek) // ---------------------------------------------------------------------- exec function Tantalus() { local Actor hitActor; local Vector hitLocation, hitNormal; local Vector position, line; local ScriptedPawn hitPawn; local DeusExMover hitMover; local DeusExDecoration hitDecoration; local bool bTakeDamage; local int damage; if (!bCheatsEnabled) return; bTakeDamage = false; damage = 1; position = Location; position.Z += BaseEyeHeight; line = Vector(ViewRotation) * 4000; hitActor = Trace(hitLocation, hitNormal, position+line, position, true); if (hitActor != None) { hitMover = DeusExMover(hitActor); hitPawn = ScriptedPawn(hitActor); hitDecoration = DeusExDecoration(hitActor); if (hitMover != None) { if (hitMover.bBreakable) { hitMover.doorStrength = 0; bTakeDamage = true; } } else if (hitPawn != None) { if (!hitPawn.bInvincible) { hitPawn.HealthHead = 0; hitPawn.HealthTorso = 0; hitPawn.HealthLegLeft = 0; hitPawn.HealthLegRight = 0; hitPawn.HealthArmLeft = 0; hitPawn.HealthArmRight = 0; hitPawn.Health = 0; bTakeDamage = true; } } else if (hitDecoration != None) { if (!hitDecoration.bInvincible) { hitDecoration.HitPoints = 0; bTakeDamage = true; } } else if (hitActor != Level) { damage = 5000; bTakeDamage = true; } } if (bTakeDamage) hitActor.TakeDamage(damage, self, hitLocation, line, 'Tantalus'); } // ---------------------------------------------------------------------- // OpenSesame() // // Opens any door immediately in front of you, locked or not // ---------------------------------------------------------------------- exec function OpenSesame() { local Actor hitActor; local Vector hitLocation, hitNormal; local Vector position, line; local DeusExMover hitMover; local DeusExMover triggerMover; local HackableDevices device; if (!bCheatsEnabled) return; position = Location; position.Z += BaseEyeHeight; line = Vector(ViewRotation) * 4000; hitActor = Trace(hitLocation, hitNormal, position+line, position, true); hitMover = DeusExMover(hitActor); device = HackableDevices(hitActor); if (hitMover != None) { if ((hitMover.Tag != '') && (hitMover.Tag != 'DeusExMover')) { foreach AllActors(class'DeusExMover', triggerMover, hitMover.Tag) { triggerMover.bLocked = false; triggerMover.Trigger(self, self); } } else { hitMover.bLocked = false; hitMover.Trigger(self, self); } } else if (device != None) { if (device.bHackable) { if (device.hackStrength > 0) { device.hackStrength = 0; device.HackAction(self, true); } } } } // ---------------------------------------------------------------------- // Legend() // // Displays the "Behind The Curtain" menu // ---------------------------------------------------------------------- exec function Legend() { if (!bCheatsEnabled) return; InvokeUIScreen(Class'BehindTheCurtain'); } // ---------------------------------------------------------------------- // AddInventory() // ---------------------------------------------------------------------- function bool AddInventory(inventory item) { local bool retval; local DeusExRootWindow root; if (item == none) //CyberP: Patches up a really terrible bug. Origin: Unknown return(false); retval = super.AddInventory(item); // Force the object be added to the object belt // unless it's ammo // // Don't add Ammo and don't add Images! if ((item != None) && !item.IsA('Ammo') && (!item.IsA('DataVaultImage')) && (!item.IsA('Credits'))) { root = DeusExRootWindow(rootWindow); if ( item.bInObjectBelt ) { if (root != None) { root.hud.belt.AddObjectToBelt(item, item.beltPos, True); } } if (retval) { if (root != None) { root.AddInventory(item); } } } return (retval); } // ---------------------------------------------------------------------- // DeleteInventory() // ---------------------------------------------------------------------- function bool DeleteInventory(inventory item) { local bool retval; local DeusExRootWindow root; local PersonaScreenInventory winInv; // If the item was inHand, clear the inHand if (inHand == item) { SetInHand(None); SetInHandPending(None); } // Make sure the item is removed from the inventory grid RemoveItemFromSlot(item); root = DeusExRootWindow(rootWindow); if (root != None) { // If the inventory screen is active, we need to send notification // that the item is being removed winInv = PersonaScreenInventory(root.GetTopWindow()); if (winInv != None) winInv.InventoryDeleted(item); // Remove the item from the object belt if (root != None) root.DeleteInventory(item); else //In multiplayer, we often don't have a root window when creating corpse, so hand delete { item.bInObjectBelt = false; item.beltPos = -1; } } return Super.DeleteInventory(item); } // ---------------------------------------------------------------------- // JoltView() // ---------------------------------------------------------------------- event JoltView(float newJoltMagnitude) { if (Abs(JoltMagnitude) < Abs(newJoltMagnitude)) JoltMagnitude = newJoltMagnitude; } // ---------------------------------------------------------------------- // UpdateEyeHeight() // ---------------------------------------------------------------------- event UpdateEyeHeight(float DeltaTime) { Super.UpdateEyeHeight(DeltaTime); if (JoltMagnitude != 0) { if ((Physics == PHYS_Walking) && (Bob != 0)) EyeHeight += (JoltMagnitude * 5); JoltMagnitude = 0; } } // ---------------------------------------------------------------------- // PlayerCalcView() // ---------------------------------------------------------------------- event PlayerCalcView( out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { local vector unX,unY,unZ; if (bStaticFreeze) { CameraLocation = SAVElocation; CameraLocation.Z += EyeHeight; CameraLocation += WalkBob; CameraRotation=SAVErotation; SetLocation(SAVElocation); SetRotation(SAVErotation); GotoState('StaticFreeze'); return; } // check for spy drone and freeze player's view if (bSpyDroneActive) { if (aDrone != None) { // First-person view. CameraLocation = Location; CameraLocation.Z += EyeHeight; CameraLocation += WalkBob; return; } } // Check if we're in first-person view or third-person. If we're in first-person then // we'll just render the normal camera view. Otherwise we want to place the camera // as directed by the conPlay.cameraInfo object. if ( bBehindView && (!InConversation()) ) { Super.PlayerCalcView(ViewActor, CameraLocation, CameraRotation); return; } if ( (!InConversation()) || ( conPlay.GetDisplayMode() == DM_FirstPerson ) ) { // First-person view. ViewActor = Self; CameraRotation = ViewRotation; CameraLocation = Location; CameraLocation.Z += EyeHeight; CameraLocation += WalkBob; //GMDX if (!bGEPzoomActive) UpdateRocketTarget(CameraRotation,RocketTargetMaxDistance);//wire guided (laser) GetAxes(Normalize(Rotation),unX,unY,unZ); unX*=RecoilShake.X; unY*=RecoilShake.Y; unZ*=RecoilShake.Z; CameraLocation += (unX+unY+unZ); return; } // Allow the ConCamera object to calculate the camera position and // rotation for us (in other words, take this sloppy routine and // hide it elsewhere). if (conPlay.cameraInfo.CalculateCameraPosition(ViewActor, CameraLocation, CameraRotation) == False) Super.PlayerCalcView(ViewActor, CameraLocation, CameraRotation); } // ---------------------------------------------------------------------- // PlayerInput() // ---------------------------------------------------------------------- event PlayerInput( float DeltaTime ) { if (!InConversation()) Super.PlayerInput(DeltaTime); } // ---------------------------------------------------------------------- // state Conversation // ---------------------------------------------------------------------- state Conversation { ignores SeePlayer, HearNoise, Bump; event PlayerTick(float deltaTime) { local rotator tempRot; local float yawDelta; UpdateInHand(); UpdateDynamicMusic(deltaTime); DrugEffects(deltaTime); RecoilEffectTick(deltaTime); Bleed(deltaTime); MaintainEnergy(deltaTime); // must update viewflash manually incase a flash happens during a convo ViewFlash(deltaTime); // Check if player has walked outside a first-person convo. CheckActiveConversationRadius(); // Check if all the people involved in a conversation are // still within a reasonable radius. CheckActorDistances(); Super.PlayerTick(deltaTime); LipSynch(deltaTime); // Keep turning towards the person we're speaking to if (ConversationActor != None) { LookAtActor(ConversationActor, true, true, true, 0, 0.5); // Hacky way to force the player to turn... tempRot = rot(0,0,0); tempRot.Yaw = (DesiredRotation.Yaw - Rotation.Yaw) & 65535; if (tempRot.Yaw > 32767) tempRot.Yaw -= 65536; yawDelta = RotationRate.Yaw * deltaTime; if (tempRot.Yaw > yawDelta) tempRot.Yaw = yawDelta; else if (tempRot.Yaw < -yawDelta) tempRot.Yaw = -yawDelta; SetRotation(Rotation + tempRot); } // Update Time Played UpdateTimePlayed(deltaTime); } function LoopHeadConvoAnim() { } function EndState() { conPlay = None; // Re-enable the PC's detectability MakePlayerIgnored(false); MoveTarget = None; bBehindView = false; StopBlendAnims(); ConversationActor = None; } Begin: // Make sure we're stopped Velocity.X = 0; Velocity.Y = 0; Velocity.Z = 0; Acceleration = Velocity; PlayRising(); // Make sure the player isn't on fire! if (bOnFire) ExtinguishFire(); // Make sure the PC can't be attacked while in conversation MakePlayerIgnored(true); LookAtActor(conPlay.startActor, true, false, true, 0, 0.5); SetRotation(DesiredRotation); PlayTurning(); // TurnToward(conPlay.startActor); // TweenToWaiting(0.1); // FinishAnim(); if (!conPlay.StartConversation(Self)) { AbortConversation(True); } else { // Put away whatever the PC may be holding conPlay.SetInHand(InHand); PutInHand(None); UpdateInHand(); if ( conPlay.GetDisplayMode() == DM_ThirdPerson ) bBehindView = true; } } // ---------------------------------------------------------------------- // InConversation() // // Returns True if the player is currently engaged in conversation // ---------------------------------------------------------------------- function bool InConversation() { if ( conPlay == None ) { return False; } else { if (conPlay.con != None) return ((conPlay.con.bFirstPerson == False) && (!conPlay.GetForcePlay())); else return False; } } // ---------------------------------------------------------------------- // CanStartConversation() // // Returns true if we can start a conversation. Basically this means // that // // 1) If in conversation, bCannotBeInterrutped set to False // 2) If in conversation, if we're not in a third-person convo // 3) The player isn't in 'bForceDuck' mode // 4) The player isn't DEAD! // 5) The player isn't swimming // 6) The player isn't CheatFlying (ghost) // 7) The player isn't in PHYS_Falling // 8) The game is in 'bPlayersOnly' mode // 9) UI screen of some sort isn't presently active. // ---------------------------------------------------------------------- function bool CanStartConversation() { if (((conPlay != None) && (conPlay.CanInterrupt() == False)) || ((conPlay != None) && (conPlay.con.bFirstPerson != True)) || (( bForceDuck == True ) && ((HealthLegLeft > 0) || (HealthLegRight > 0))) || ( IsInState('Dying') ) || ( IsInState('PlayerSwimming') ) || ( IsInState('CheatFlying') ) || ( Physics == PHYS_Falling ) || ( Level.bPlayersOnly ) || (!DeusExRootWindow(rootWindow).CanStartConversation())) return False; else return True; } // ---------------------------------------------------------------------- // GetDisplayName() // // Returns a name that can be displayed in the conversation. // // The first time we speak to someone we'll use the Unfamiliar name. // For subsequent conversations, use the Familiar name. As a fallback, // the BindName will be used if both of the other two fields // are blank. // // If this is a DeusExDecoration and the Familiar/Unfamiliar names // are blank, then use the decoration's ItemName instead. This is // for use in the FrobDisplayWindow. // ---------------------------------------------------------------------- function String GetDisplayName(Actor actor, optional Bool bUseFamiliar) { local String displayName; // Sanity check if ((actor == None) || (player == None) || (rootWindow == None)) return ""; // If we've spoken to this person already, use the // Familiar Name if ((actor.FamiliarName != "") && ((actor.LastConEndTime > 0) || (bUseFamiliar))) displayName = actor.FamiliarName; if ((displayName == "") && (actor.UnfamiliarName != "")) displayName = actor.UnfamiliarName; if (displayName == "") { if (actor.IsA('DeusExDecoration')) displayName = DeusExDecoration(actor).itemName; else displayName = actor.BindName; } return displayName; } // ---------------------------------------------------------------------- // EndConversation() // // Called by ConPlay when a conversation has finished. // ---------------------------------------------------------------------- function EndConversation() { local DeusExLevelInfo info; Super.EndConversation(); // If we're in a bForcePlay (cinematic) conversation, // force the CinematicWindow to be displayd if ((conPlay != None) && (conPlay.GetForcePlay())) { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).NewChild(class'CinematicWindow'); } conPlay = None; // Check to see if we need to resume any DataLinks that may have // been aborted when we started this conversation ResumeDataLinks(); StopBlendAnims(); // We might already be dead at this point (someone drop a LAM before // entering the conversation?) so we want to make sure the player // doesn't suddenly jump into a non-DEATH state. // // Also make sure the player is actually in the Conversation state // before attempting to kick him out of it. if ((Health > 0) && ((IsInState('Conversation')) || (IsInState('FirstPersonConversation')) || (NextState == 'Interpolating'))) { if (NextState == '') GotoState('PlayerWalking'); else GotoState(NextState); } } // ---------------------------------------------------------------------- // ResumeDataLinks() // ---------------------------------------------------------------------- function ResumeDataLinks() { if ( dataLinkPlay != None ) dataLinkPlay.ResumeDataLinks(); } // ---------------------------------------------------------------------- // AbortConversation() // ---------------------------------------------------------------------- function AbortConversation(optional bool bNoPlayedFlag) { if (conPlay != None) conPlay.TerminateConversation(False, bNoPlayedFlag); } // ---------------------------------------------------------------------- // StartConversationByName() // // Starts a conversation by looking for the name passed in. // // Calls StartConversation() if a match is found. // ---------------------------------------------------------------------- function bool StartConversationByName( Name conName, Actor conOwner, optional bool bAvoidState, optional bool bForcePlay ) { local ConListItem conListItem; local Conversation con; local Int dist; local Bool bConversationStarted; bConversationStarted = False; if (conOwner == None) return False; conListItem = ConListItem(conOwner.conListItems); while( conListItem != None ) { if ( conListItem.con.conName == conName ) { con = conListItem.con; break; } conListItem = conListItem.next; } // Now check to see that we're in a respectable radius. if (con != None) { dist = VSize(Location - conOwner.Location); // 800 = default sound radius, from unscript.cpp // // If "bForcePlay" is set, then force the conversation // to play! if ((dist <= 800) || (bForcePlay)) bConversationStarted = StartConversation(conOwner, IM_Named, con, bAvoidState, bForcePlay); } return bConversationStarted; } // ---------------------------------------------------------------------- // StartAIBarkConversation() // // Starts an AI Bark conversation, which really isn't a conversation // as much as a simple bark. // ---------------------------------------------------------------------- function bool StartAIBarkConversation( Actor conOwner, EBarkModes barkMode ) { if ((conOwner == None) || (conOwner.conListItems == None) || (barkManager == None) || ((conPlay != None) && (conPlay.con.bFirstPerson != True))) return False; else return (barkManager.StartBark(DeusExRootWindow(rootWindow), ScriptedPawn(conOwner), barkMode)); } // ---------------------------------------------------------------------- // StartConversation() // // Checks to see if a valid conversation exists for this moment in time // between the ScriptedPawn and the PC. If so, then it triggers the // conversation system and returns TRUE when finished. // ---------------------------------------------------------------------- function bool StartConversation( Actor invokeActor, EInvokeMethod invokeMethod, optional Conversation con, optional bool bAvoidState, optional bool bForcePlay ) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); // First check to see the actor has any conversations or if for some // other reason we're unable to start a conversation (typically if // we're alread in a conversation or there's a UI screen visible) if ((!bForcePlay) && ((invokeActor.conListItems == None) || (!CanStartConversation()))) return False; // Make sure the other actor can converse if ((!bForcePlay) && ((ScriptedPawn(invokeActor) != None) && (!ScriptedPawn(invokeActor).CanConverse()))) return False; // If we have a conversation passed in, use it. Otherwise check to see // if the passed in actor actually has a valid conversation that can be // started. if ( con == None ) con = GetActiveConversation(invokeActor, invokeMethod); // If we have a conversation, put the actor into "Conversation Mode". // Otherwise just return false. // // TODO: Scan through the conversation and put *ALL* actors involved // in the conversation into the "Conversation" state?? if ( con != None ) { // Check to see if this conversation is already playing. If so, // then don't start it again. This prevents a multi-bark conversation // from being abused. if ((conPlay != None) && (conPlay.con == con)) return False; // Now check to see if there's a conversation playing that is owned // by the InvokeActor *and* the player has a speaking part *and* // it's a first-person convo, in which case we want to abort here. if (((conPlay != None) && (conPlay.invokeActor == invokeActor)) && (conPlay.con.bFirstPerson) && (conPlay.con.IsSpeakingActor(Self))) return False; // Check if the person we're trying to start the conversation // with is a Foe and this is a Third-Person conversation. // If so, ABORT! if ((!bForcePlay) && ((!con.bFirstPerson) && (ScriptedPawn(invokeActor) != None) && (ScriptedPawn(invokeActor).GetPawnAllianceType(Self) == ALLIANCE_Hostile))) return False; // If the player is involved in this conversation, make sure the // scriptedpawn even WANTS to converse with the player. // // I have put a hack in here, if "con.bCanBeInterrupted" // (which is no longer used as intended) is set, then don't // call the ScriptedPawn::CanConverseWithPlayer() function if ((!bForcePlay) && ((con.IsSpeakingActor(Self)) && (!con.bCanBeInterrupted) && (ScriptedPawn(invokeActor) != None) && (!ScriptedPawn(invokeActor).CanConverseWithPlayer(Self)))) return False; // Hack alert! If this is a Bark conversation (as denoted by the // conversation name, since we don't have a field in ConEdit), // then force this conversation to be first-person if (Left(con.conName, Len(con.conOwnerName) + 5) == (con.conOwnerName $ "_Bark")) //CyberP: we can make all conversations first person this way con.bFirstPerson = True; // Make sure the player isn't ducking. If the player can't rise // to start a third-person conversation (blocked by geometry) then // immediately abort the conversation, as this can create all // sorts of complications (such as the player standing through // geometry!!) if ((!con.bFirstPerson) && (ResetBasedPawnSize() == False)) return False; // If ConPlay exists, end the current conversation playing if (conPlay != None) { // If we're already playing a third-person conversation, don't interrupt with // another *radius* induced conversation (frobbing is okay, though). if ((conPlay.con != None) && (conPlay.con.bFirstPerson) && (invokeMethod == IM_Radius)) return False; conPlay.InterruptConversation(); conPlay.TerminateConversation(); } // If this is a first-person conversation _and_ a DataLink is already // playing, then abort. We don't want to give the user any more // distractions while a DL is playing, since they're pretty important. if ( dataLinkPlay != None ) { if (con.bFirstPerson) return False; else dataLinkPlay.AbortAndSaveHistory(); } // Found an active conversation, so start it conPlay = Spawn(class'ConPlay'); conPlay.SetStartActor(invokeActor); conPlay.SetConversation(con); conPlay.SetForcePlay(bForcePlay); conPlay.SetInitialRadius(VSize(Location - invokeActor.Location)); // If this conversation was invoked with IM_Named, then save away // the current radius so we don't abort until we get outside // of this radius + 100. if ((invokeMethod == IM_Named) || (invokeMethod == IM_Frob)) { conPlay.SetOriginalRadius(con.radiusDistance); con.radiusDistance = VSize(invokeActor.Location - Location); } // If the invoking actor is a ScriptedPawn, then force this person // into the conversation state if ((!bForcePlay) && (ScriptedPawn(invokeActor) != None )) ScriptedPawn(invokeActor).EnterConversationState(con.bFirstPerson, bAvoidState); // Do the same if this is a DeusExDecoration if ((!bForcePlay) && (DeusExDecoration(invokeActor) != None )) DeusExDecoration(invokeActor).EnterConversationState(con.bFirstPerson, bAvoidState); // If this is a third-person convo, we're pretty much going to // pause the game. If this is a first-person convo, then just // keep on going.. // // If this is a third-person convo *AND* 'bForcePlay' == True, // then use first-person mode, as we're playing an intro/endgame // sequence and we can't have the player in the convo state (bad bad bad!) if ((!con.bFirstPerson) && (!bForcePlay)) { GotoState('Conversation'); } else { if (!conPlay.StartConversation(Self, invokeActor, bForcePlay)) { AbortConversation(True); } } return True; } else { return False; } } // ---------------------------------------------------------------------- // GetActiveConversation() // // This routine searches all the conversations in this chain until it // finds one that is valid for this situation. It returns the // conversation or None if none are found. // ---------------------------------------------------------------------- function Conversation GetActiveConversation( Actor invokeActor, EInvokeMethod invokeMethod ) { local ConListItem conListItem; local Conversation con; local Name flagName; local bool bAbortConversation; // If we don't have a valid invokeActor or the flagbase // hasn't yet been initialized, immediately abort. if ((invokeActor == None) || (flagBase == None)) return None; bAbortConversation = True; // Force there to be a one second minimum between conversations // with the same NPC if ((invokeActor.LastConEndTime != 0) && ((Level.TimeSeconds - invokeActor.LastConEndTime) < 1.0)) return None; // In a loop, go through the conversations, checking each. conListItem = ConListItem(invokeActor.ConListItems); while ( conListItem != None ) { con = conListItem.con; bAbortConversation = False; // Ignore Bark conversations, as these are started manually // by the AI system. Do this by checking to see if the first // part of the conversation name is in the form, // // ConversationOwner_Bark if (Left(con.conName, Len(con.conOwnerName) + 5) == (con.conOwnerName $ "_Bark")) bAbortConversation = True; if (!bAbortConversation) { // Now check the invocation method to make sure // it matches what was passed in switch( invokeMethod ) { // Removed Bump conversation starting functionality, all convos // must now be "Frobbed" to start (excepting Radius, of course). case IM_Bump: case IM_Frob: bAbortConversation = !(con.bInvokeFrob || con.bInvokeBump); break; case IM_Sight: bAbortConversation = !con.bInvokeSight; break; case IM_Radius: if ( con.bInvokeRadius ) { // Calculate the distance between the player and the owner // and if the player is inside that radius, we've passed // this check. bAbortConversation = !CheckConversationInvokeRadius(invokeActor, con); // First check to make sure that at least 10 seconds have passed // before playing a radius-induced conversation after a letterbox // conversation with the player // // Check: // // 1. Player finished letterbox convo in last 10 seconds // 2. Conversation was with this NPC // 3. This new radius conversation is with same NPC. if ((!bAbortConversation) && ((Level.TimeSeconds - lastThirdPersonConvoTime) < 10) && (lastThirdPersonConvoActor == invokeActor)) bAbortConversation = True; // Now check if this conversation ended in the last ten seconds or so // We want to prevent the user from getting trapped inside the same // radius conversation if ((!bAbortConversation) && (con.lastPlayedTime > 0)) bAbortConversation = ((Level.TimeSeconds - con.lastPlayedTime) < 10); // Now check to see if the player just ended a radius, third-person // conversation with this NPC in the last 5 seconds. If so, punt, // because we don't want these to chain together too quickly. if ((!bAbortConversation) && ((Level.TimeSeconds - lastFirstPersonConvoTime) < 5) && (lastFirstPersonConvoActor == invokeActor)) bAbortConversation = True; } else { bAbortConversation = True; } break; case IM_Other: default: break; } } // Now check to see if these two actors are too far apart on their Z // axis so we don't get conversations triggered when someone jumps on // someone else, or when actors are on two different levels. if (!bAbortConversation) { bAbortConversation = !CheckConversationHeightDifference(invokeActor, 20); // If the height check failed, look to see if the actor has a LOS view // to the player in which case we'll allow the conversation to continue if (bAbortConversation) bAbortConversation = !CanActorSeePlayer(invokeActor); } // Check if this conversation is only to be played once if (( !bAbortConversation ) && ( con.bDisplayOnce )) { flagName = rootWindow.StringToName(con.conName $ "_Played"); bAbortConversation = (flagBase.GetBool(flagName) == True); } if ( !bAbortConversation ) { // Then check to make sure all the flags that need to be // set are. bAbortConversation = !CheckFlagRefs(con.flagRefList); } if ( !bAbortConversation ) break; conListItem = conListItem.next; } if (bAbortConversation) return None; else return con; } // ---------------------------------------------------------------------- // CheckConversationInvokeRadius() // // Returns True if this conversation can be invoked given the // invoking actor and the conversation passed in. // ---------------------------------------------------------------------- function bool CheckConversationInvokeRadius(Actor invokeActor, Conversation con) { local Int invokeRadius; local Int dist; dist = VSize(Location - invokeActor.Location); invokeRadius = Max(16, con.radiusDistance); return (dist <= invokeRadius); } // ---------------------------------------------------------------------- // CheckConversationHeightDifference() // // Checks to make sure the player and the invokeActor are fairly close // to each other on the Z Plane. Returns True if they are an // acceptable distance, otherwise returns False. // ---------------------------------------------------------------------- function bool CheckConversationHeightDifference(Actor invokeActor, int heightOffset) { local Int dist; dist = Abs(Location.Z - invokeActor.Location.Z) - Abs(Default.CollisionHeight - CollisionHeight); if (dist > (Abs(CollisionHeight - invokeActor.CollisionHeight) + heightOffset)) return False; else return True; } // ---------------------------------------------------------------------- // CanActorSeePlayer() // ---------------------------------------------------------------------- function bool CanActorSeePlayer(Actor invokeActor) { return FastTrace(invokeActor.Location); } // ---------------------------------------------------------------------- // CheckActiveConversationRadius() // // If there's a first-person conversation active, checks to make sure // that the player has not walked far away from the conversation owner. // If so, the conversation is aborted. // ---------------------------------------------------------------------- function CheckActiveConversationRadius() { local int checkRadius; // Ignore if conPlay.GetForcePlay() returns True if ((conPlay != None) && (!conPlay.GetForcePlay()) && (conPlay.ConversationStarted()) && (conPlay.displayMode == DM_FirstPerson) && (conPlay.StartActor != None)) { // If this was invoked via a radius, then check to make sure the player doesn't // exceed that radius plus if (conPlay.con.bInvokeRadius) checkRadius = conPlay.con.radiusDistance + 100; else checkRadius = 300; // Add the collisioncylinder since some objects are wider than others checkRadius += conPlay.StartActor.CollisionRadius; if (VSize(conPlay.startActor.Location - Location) > checkRadius) { // Abort the conversation conPlay.TerminateConversation(True); } } } // ---------------------------------------------------------------------- // CheckActorDistances() // // Checks to see how far all the actors are away from each other // to make sure the conversation should continue. // ---------------------------------------------------------------------- function bool CheckActorDistances() { if ((conPlay != None) && (!conPlay.GetForcePlay()) && (conPlay.ConversationStarted()) && (conPlay.displayMode == DM_ThirdPerson)) { if (!conPlay.con.CheckActorDistances(Self)) conPlay.TerminateConversation(True); } } // ---------------------------------------------------------------------- // CheckFlagRefs() // // Loops through the flagrefs passed in and sees if the current flag // settings in the game match this set of flags. Returns True if so, // otherwise False. // ---------------------------------------------------------------------- function bool CheckFlagRefs( ConFlagRef flagRef ) { local ConFlagRef currentRef; // Loop through our list of FlagRef's, checking the value of each. // If we hit a bad match, then we'll stop right away since there's // no point of continuing. currentRef = flagRef; while( currentRef != None ) { if ( flagBase.GetBool(currentRef.flagName) != currentRef.value ) return False; currentRef = currentRef.nextFlagRef; } // If we made it this far, then the flags check out. return True; } // ---------------------------------------------------------------------- // StartDataLinkTransmission() // // Locates and starts the DataLink passed in // ---------------------------------------------------------------------- function Bool StartDataLinkTransmission( String datalinkName, Optional DataLinkTrigger datalinkTrigger) { local Conversation activeDataLink; local bool bDataLinkPlaySpawned; // Don't allow DataLinks to start if we're in PlayersOnly mode if ( Level.bPlayersOnly ) return False; activeDataLink = GetActiveDataLink(datalinkName); if ( activeDataLink != None ) { // Search to see if there's an active DataLinkPlay object // before creating one if ( dataLinkPlay == None ) { datalinkPlay = Spawn(class'DataLinkPlay'); bDataLinkPlaySpawned = True; } // Call SetConversation(), which returns if (datalinkPlay.SetConversation(activeDataLink)) { datalinkPlay.SetTrigger(datalinkTrigger); if (datalinkPlay.StartConversation(Self)) { return True; } else { // Datalink must already be playing, or in queue if (bDataLinkPlaySpawned) { datalinkPlay.Destroy(); datalinkPlay = None; } return False; } } else { // Datalink must already be playing, or in queue if (bDataLinkPlaySpawned) { datalinkPlay.Destroy(); datalinkPlay = None; } return False; } } else { return False; } } // ---------------------------------------------------------------------- // GetActiveDataLink() // // Loops through the conversations belonging to the player and checks // to see if the datalink conversation passed in can be found. Also // checks to the "PlayedOnce" flag to prevent datalink transmissions // from playing more than one (unless intended). // ---------------------------------------------------------------------- function Conversation GetActiveDataLink(String datalinkName) { local Name flagName; local ConListItem conListItem; local Conversation con; local bool bAbortDataLink; local bool bDatalinkFound; local bool bDataLinkNameFound; // Abort immediately if the flagbase isn't yet initialized if ((flagBase == None) || (rootWindow == None)) return None; conListItem = ConListItem(conListItems); // In a loop, go through the conversations, checking each. while ( conListItem != None ) { con = conListItem.con; if ( Caps(datalinkName) == Caps(con.conName) ) { // Now check if this DataLink is only to be played // once bDataLinkNameFound = True; bAbortDataLink = False; if ( con.bDisplayOnce ) { flagName = rootWindow.StringToName(con.conName $ "_Played"); bAbortDataLink = (flagBase.GetBool(flagName) == True); } // Check the flags for this DataLink if (( !bAbortDataLink ) && ( CheckFlagRefs( con.flagRefList ) == True )) { bDatalinkFound = True; break; } } conListItem = conListItem.next; } if (bDatalinkFound) { return con; } else { // Print a warning if this DL couldn't be found based on its name if (bDataLinkNameFound == False) { log("WARNING! INFOLINK NOT FOUND!! Name = " $ datalinkName); ClientMessage("WARNING! INFOLINK NOT FOUND!! Name = " $ datalinkName); } return None; } } // ---------------------------------------------------------------------- // AddNote() // // Adds a new note to the list of notes the player is carrying around. // ---------------------------------------------------------------------- function DeusExNote AddNote( optional String strNote, optional Bool bUserNote, optional bool bShowInLog ) { local DeusExNote newNote; newNote = new(Self) Class'DeusExNote'; newNote.text = strNote; newNote.SetUserNote( bUserNote ); // Insert this new note at the top of the notes list if (FirstNote == None) LastNote = newNote; else newNote.next = FirstNote; FirstNote = newNote; // Optionally show the note in the log if ( bShowInLog ) { ClientMessage(NoteAdded); DeusExRootWindow(rootWindow).hud.msgLog.PlayLogSound(Sound'LogNoteAdded'); } return newNote; } // ---------------------------------------------------------------------- // GetNote() // // Loops through the notes and searches for the TextTag passed in // ---------------------------------------------------------------------- function DeusExNote GetNote(Name textTag) { local DeusExNote note; note = FirstNote; while( note != None ) { if (note.textTag == textTag) break; note = note.next; } return note; } // ---------------------------------------------------------------------- // DeleteNote() // // Deletes the specified note // Returns True if the note successfully deleted // ---------------------------------------------------------------------- function Bool DeleteNote( DeusExNote noteToDelete ) { local DeusExNote note; local DeusExNote previousNote; local Bool bNoteDeleted; bNoteDeleted = False; note = FirstNote; previousNote = None; while( note != None ) { if ( note == noteToDelete ) { if ( note == FirstNote ) FirstNote = note.next; if ( note == LastNote ) LastNote = previousNote; if ( previousNote != None ) previousNote.next = note.next; note = None; bNoteDeleted = True; break; } previousNote = note; note = note.next; } return bNoteDeleted; } // ---------------------------------------------------------------------- // DeleteAllNotes() // // Deletes *ALL* Notes // ---------------------------------------------------------------------- function DeleteAllNotes() { local DeusExNote note; local DeusExNote noteNext; note = FirstNote; while( note != None ) { noteNext = note.next; DeleteNote(note); note = noteNext; } FirstNote = None; LastNote = None; } // ---------------------------------------------------------------------- // NoteAdd() // ---------------------------------------------------------------------- exec function NoteAdd( String noteText, optional bool bUserNote ) { local DeusExNote newNote; newNote = AddNote( noteText ); newNote.SetUserNote( bUserNote ); } // ---------------------------------------------------------------------- // AddGoal() // // Adds a new goal to the list of goals the player is carrying around. // ---------------------------------------------------------------------- function DeusExGoal AddGoal( Name goalName, bool bPrimaryGoal ) { local DeusExGoal newGoal; // First check to see if this goal already exists. If so, we'll just // return it. Otherwise create a new goal newGoal = FindGoal( goalName ); if ( newGoal == None ) { newGoal = new(Self) Class'DeusExGoal'; newGoal.SetName( goalName ); // Insert goal at the Top so goals are displayed in // Newest order first. if (FirstGoal == None) LastGoal = newGoal; else newGoal.next = FirstGoal; FirstGoal = newGoal; newGoal.SetPrimaryGoal( bPrimaryGoal ); ClientMessage(GoalAdded); DeusExRootWindow(rootWindow).hud.msgLog.PlayLogSound(Sound'LogGoalAdded'); } return newGoal; } // ---------------------------------------------------------------------- // FindGoal() // ---------------------------------------------------------------------- function DeusExGoal FindGoal( Name goalName ) { local DeusExGoal goal; goal = FirstGoal; while( goal != None ) { if ( goalName == goal.goalName ) break; goal = goal.next; } return goal; } // ---------------------------------------------------------------------- // GoalAdd() // // Adds a new goal to the list of goals the player is carrying around. // ---------------------------------------------------------------------- exec function GoalAdd( Name goalName, String goalText, optional bool bPrimaryGoal ) { local DeusExGoal newGoal; if (!bCheatsEnabled) return; newGoal = AddGoal( goalName, bPrimaryGoal ); newGoal.SetText( goalText ); } // ---------------------------------------------------------------------- // GoalSetPrimary() // // Sets a goal as a Primary Goal // ---------------------------------------------------------------------- exec function GoalSetPrimary( Name goalName, bool bPrimaryGoal ) { local DeusExGoal goal; if (!bCheatsEnabled) return; goal = FindGoal( goalName ); if ( goal != None ) goal.SetPrimaryGoal( bPrimaryGoal ); } // ---------------------------------------------------------------------- // GoalCompleted() // // Looks up the goal and marks it as completed. // ---------------------------------------------------------------------- function GoalCompleted( Name goalName ) { local DeusExGoal goal; // Loop through all the goals until we hit the one we're // looking for. goal = FindGoal( goalName ); if ( goal != None ) { // Only mark a goal as completed once! if (!goal.IsCompleted()) { goal.SetCompleted(); DeusExRootWindow(rootWindow).hud.msgLog.PlayLogSound(Sound'LogGoalCompleted'); // Let the player know if ( goal.bPrimaryGoal ) ClientMessage(PrimaryGoalCompleted); else ClientMessage(SecondaryGoalCompleted); } } } // ---------------------------------------------------------------------- // DeleteGoal() // // Deletes the specified note // Returns True if the note successfully deleted // ---------------------------------------------------------------------- function Bool DeleteGoal( DeusExGoal goalToDelete ) { local DeusExGoal goal; local DeusExGoal previousGoal; local Bool bGoalDeleted; bGoalDeleted = False; goal = FirstGoal; previousGoal = None; while( goal != None ) { if ( goal == goalToDelete ) { if ( goal == FirstGoal ) FirstGoal = goal.next; if ( goal == LastGoal ) LastGoal = previousGoal; if ( previousGoal != None ) previousGoal.next = goal.next; goal = None; bGoalDeleted = True; break; } previousGoal = goal; goal = goal.next; } return bGoalDeleted; } // ---------------------------------------------------------------------- // DeleteAllGoals() // // Deletes *ALL* Goals // ---------------------------------------------------------------------- function DeleteAllGoals() { local DeusExGoal goal; local DeusExGoal goalNext; goal = FirstGoal; while( goal != None ) { goalNext = goal.next; DeleteGoal(goal); goal = goalNext; } FirstGoal = None; LastGoal = None; } // ---------------------------------------------------------------------- // ResetGoals() // // Called when progressing to the next mission. Deletes all // completed Primary Goals as well as *ALL* Secondary Goals // (regardless of status) // ---------------------------------------------------------------------- function ResetGoals() { local DeusExGoal goal; local DeusExGoal goalNext; goal = FirstGoal; while( goal != None ) { goalNext = goal.next; // Delete: // 1) Completed Primary Goals // 2) ALL Secondary Goals if ((!goal.IsPrimaryGoal()) || (goal.IsPrimaryGoal() && goal.IsCompleted())) DeleteGoal(goal); goal = goalNext; } } // ---------------------------------------------------------------------- // AddImage() // // Inserts a new image in the user's list of images. First checks to // make sure the player doesn't already have the image. If not, // sticks the image at the top of the list. // ---------------------------------------------------------------------- function bool AddImage(DataVaultImage newImage) { local DataVaultImage image; if (newImage == None) return False; // First make sure the player doesn't already have this image!! image = FirstImage; while(image != None) { if (newImage.imageDescription == image.imageDescription) return False; image = image.NextImage; } // If the player doesn't yet have an image, make this his // first image. newImage.nextImage = FirstImage; newImage.prevImage = None; if (FirstImage != None) FirstImage.prevImage = newImage; FirstImage = newImage; return True; } // ---------------------------------------------------------------------- // AddLog() // // Adds a log message to our FirstLog linked list // ---------------------------------------------------------------------- function DeusExLog AddLog(String logText) { local DeusExLog newLog; newLog = CreateLogObject(); newLog.SetLogText(logText); // Add this Note to the list of player Notes if ( FirstLog != None ) LastLog.next = newLog; else FirstLog = newLog; LastLog = newLog; return newLog; } // ---------------------------------------------------------------------- // ClearLog() // // Removes log objects // ---------------------------------------------------------------------- function ClearLog() { local DeusExLog log; local DeusExLog nextLog; log = FirstLog; while( log != None ) { nextLog = log.next; CriticalDelete(log); log = nextLog; } FirstLog = None; LastLog = None; } // ---------------------------------------------------------------------- // SetLogTimeout() // ---------------------------------------------------------------------- function SetLogTimeout(Float newLogTimeout) { logTimeout = newLogTimeout; // Update the HUD Log Display if (DeusExRootWindow(rootWindow).hud != None) DeusExRootWindow(rootWindow).hud.msgLog.SetLogTimeout(newLogTimeout); } // ---------------------------------------------------------------------- // GetLogTimeout() // ---------------------------------------------------------------------- function Float GetLogTimeout() { if (Level.NetMode == NM_Standalone) return logTimeout; else return (FMax(5.0,logTimeout)); } // ---------------------------------------------------------------------- // SetMaxLogLines() // ---------------------------------------------------------------------- function SetMaxLogLines(Byte newLogLines) { maxLogLines = newLogLines; // Update the HUD Log Display if (DeusExRootWindow(rootWindow).hud != None) DeusExRootWindow(rootWindow).hud.msgLog.SetMaxLogLines(newLogLines); } // ---------------------------------------------------------------------- // GetMaxLogLines() // ---------------------------------------------------------------------- function Byte GetMaxLogLines() { return maxLogLines; } // ---------------------------------------------------------------------- // PopHealth() - This is used from the health screen (Medkits applied to body parts were not in sync with server) // ---------------------------------------------------------------------- function PopHealth( float health0, float health1, float health2, float health3, float health4, float health5 ) { HealthHead = health0; HealthTorso = health1; HealthArmRight = health2; HealthArmLeft = health3; HealthLegRight = health4; HealthLegLeft = health5; } // ---------------------------------------------------------------------- // GenerateTotalHealth() // // this will calculate a weighted average of all of the body parts // and put that value in the generic Health // NOTE: head and torso are both critical // ---------------------------------------------------------------------- function GenerateTotalHealth() { local float ave, avecrit; ave = (HealthLegLeft + HealthLegRight + HealthArmLeft + HealthArmRight) / 4.0; if ((HealthHead <= 0) || (HealthTorso <= 0)) avecrit = 0; else avecrit = (HealthHead + HealthTorso) / 2.0; if (avecrit == 0) Health = 0; else Health = (ave + avecrit) / 2.0; //GMDX: TODO: check mini display for colouring etc, max value=115 } // ---------------------------------------------------------------------- // MultiplayerDeathMsg() // ---------------------------------------------------------------------- function MultiplayerDeathMsg( Pawn killer, bool killedSelf, bool valid, String killerName, String killerMethod ) { local MultiplayerMessageWin mmw; local DeusExRootWindow root; myKiller = killer; if ( killProfile != None ) { killProfile.bKilledSelf = killedSelf; killProfile.bValid = valid; } root = DeusExRootWindow(rootWindow); if ( root != None ) { mmw = MultiplayerMessageWin(root.InvokeUIScreen(Class'MultiplayerMessageWin', True)); if ( mmw != None ) { mmw.bKilled = true; mmw.killerName = killerName; mmw.killerMethod = killerMethod; mmw.bKilledSelf = killedSelf; mmw.bValidMethod = valid; } } } function ShowProgress() { local MultiplayerMessageWin mmw; local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) { if (root.GetTopWindow() != None) mmw = MultiplayerMessageWin(root.GetTopWindow()); if ((mmw != None) && (mmw.bDisplayProgress == false)) { mmw.Destroy(); mmw = None; } if ( mmw == None ) { mmw = MultiplayerMessageWin(root.InvokeUIScreen(Class'MultiplayerMessageWin', True)); if ( mmw != None ) { mmw.bKilled = false; mmw.bDisplayProgress = true; mmw.lockoutTime = Level.TimeSeconds + 0.2; } } } } // ---------------------------------------------------------------------- // ServerConditionalNoitfyMsg // ---------------------------------------------------------------------- function ServerConditionalNotifyMsg( int code, optional int param, optional string str ) { switch( code ) { case MPMSG_FirstPoison: if ( (mpMsgServerFlags & MPSERVERFLAG_FirstPoison) == MPSERVERFLAG_FirstPoison ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_FirstPoison; break; case MPMSG_FirstBurn: if ( (mpMsgServerFlags & MPSERVERFLAG_FirstBurn) == MPSERVERFLAG_FirstBurn ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_FirstBurn; break; case MPMSG_TurretInv: if ( ( mpMsgServerFlags & MPSERVERFLAG_TurretInv ) == MPSERVERFLAG_TurretInv ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_TurretInv; break; case MPMSG_CameraInv: if ( ( mpMsgServerFlags & MPSERVERFLAG_CameraInv ) == MPSERVERFLAG_CameraInv ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_CameraInv; break; case MPMSG_LostLegs: if ( ( mpMsgServerFlags & MPSERVERFLAG_LostLegs) == MPSERVERFLAG_LostLegs ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_LostLegs; break; case MPMSG_DropItem: if ( ( mpMsgServerFlags & MPSERVERFLAG_DropItem) == MPSERVERFLAG_DropItem ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_DropItem; break; case MPMSG_NoCloakWeapon: if ( ( mpMsgServerFlags & MPSERVERFLAG_NoCloakWeapon) == MPSERVERFLAG_NoCloakWeapon ) return; else mpMsgServerFlags = mpMsgServerFlags | MPSERVERFLAG_NoCloakWeapon; break; } // If we made it here we need to notify MultiplayerNotifyMsg( code, param, str ); } // ---------------------------------------------------------------------- // MultiplayerNotifyMsg() // ---------------------------------------------------------------------- function MultiplayerNotifyMsg( int code, optional int param, optional string str ) { if ( !bHelpMessages ) { switch( code ) { case MPMSG_TeamUnatco: case MPMSG_TeamNsf: case MPMSG_TeamHit: case MPMSG_TeamSpot: case MPMSG_FirstPoison: case MPMSG_FirstBurn: case MPMSG_TurretInv: case MPMSG_CameraInv: case MPMSG_LostLegs: case MPMSG_DropItem: case MPMSG_KilledTeammate: case MPMSG_TeamLAM: case MPMSG_TeamComputer: case MPMSG_NoCloakWeapon: case MPMSG_TeamHackTurret: return; // Pass on these case MPMSG_CloseKills: case MPMSG_TimeNearEnd: break; // Go ahead with these } } switch( code ) { case MPMSG_TeamSpot: if ( (mpMsgFlags & MPFLAG_FirstSpot) == MPFLAG_FirstSpot ) return; else mpMsgFlags = mpMsgFlags | MPFLAG_FirstSpot; break; case MPMSG_CloseKills: if ((param == 0) || (str ~= "")) { log("Warning: Passed bad params to multiplayer notify msg." ); return; } mpMsgOptionalParam = param; mpMsgOptionalString = str; break; case MPMSG_TimeNearEnd: if ((param == 0) || (str ~= "")) { log("Warning: Passed bad params to multiplayer notify msg." ); return; } mpMsgOptionalParam = param; mpMsgOptionalString = str; break; case MPMSG_DropItem: case MPMSG_TeamUnatco: case MPMSG_TeamNsf: if (( DeusExRootWindow(rootWindow) != None ) && ( DeusExRootWindow(rootWindow).hud != None ) && (DeusExRootWindow(rootWindow).hud.augDisplay != None )) DeusExRootWindow(rootWindow).hud.augDisplay.RefreshMultiplayerKeys(); break; } mpMsgCode = code; mpMsgTime = Level.Timeseconds + mpMsgDelay; if (( code == MPMSG_TeamUnatco ) || ( code == MPMSG_TeamNsf )) mpMsgTime += 2.0; } // // GetSkillInfoFromProjKiller // function GetSkillInfoFromProj( DeusExPlayer killer, Actor proj ) { local class<Skill> skillClass; if ( proj.IsA('GasGrenade') || proj.IsA('LAM') || proj.IsA('EMPGrenade') || proj.IsA('TearGas')) skillClass = class'SkillDemolition'; else if ( proj.IsA('Rocket') || proj.IsA('RocketLAW') || proj.IsA('RocketWP') || proj.IsA('Fireball') || proj.IsA('PlasmaBolt') || proj.IsA('PlasmaGamma')) skillClass = class'SkillWeaponHeavy'; else if ( proj.IsA('Dart') || proj.IsA('DartFlare') || proj.IsA('DartPoison') || proj.IsA('Shuriken')) skillClass = class'SkillWeaponLowTech'; else if ( proj.IsA('HECannister20mm') || proj.IsA('SpiderConstructorLaunched2') || proj.IsA('RubberBullet')) skillClass = class'SkillWeaponRifle'; else if ( proj.IsA('DeusExDecoration') ) { killProfile.activeSkill = NoneString; killProfile.activeSkillLevel = 0; return; } if ( killer.SkillSystem != None ) { killProfile.activeSkill = skillClass.Default.skillName; killProfile.activeSkillLevel = killer.SkillSystem.GetSkillLevel(skillClass); } } function GetWeaponName( DeusExWeapon w, out String name ) { if ( w != None ) { if ( WeaponGEPGun(w) != None ) name = WeaponGEPGun(w).shortName; else if ( WeaponLAM(w) != None ) name = WeaponLAM(w).shortName; else name = w.itemName; } else name = NoneString; } // // CreateKillerProfile // 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 Skill askill; local String wShortString; if ( killProfile == None ) { log("Warning:"$Self$" has a killProfile that is None!" ); return; } else 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; anAug = pkiller.AugmentationSystem.FirstAug; while ( anAug != None ) { if ( anAug.bHasIt && anAug.bIsActive && !anAug.bAlwaysActive && (augCnt < ArrayCount(killProfile.activeAugs))) { killProfile.activeAugs[augCnt] = anAug.augmentationName; augCnt += 1; } anAug = anAug.next; } } else killProfile.numActiveAugs = 0; // My weapon and skill GetWeaponName( DeusExWeapon(inHand), killProfile.myActiveWeapon ); if ( DeusExWeapon(inHand) != None ) { if ( SkillSystem != None ) { askill = SkillSystem.GetSkillFromClass(DeusExWeapon(inHand).GoverningSkill); killProfile.myActiveSkill = askill.skillName; killProfile.myActiveSkillLevel = askill.CurrentLevel; } } 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; anAug = AugmentationSystem.FirstAug; while ( anAug != None ) { if ( anAug.bHasIt && anAug.bIsActive && !anAug.bAlwaysActive && (augCnt < ArrayCount(killProfile.myActiveAugs))) { killProfile.myActiveAugs[augCnt] = anAug.augmentationName; augCnt += 1; } anAug = anAug.next; } } 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 $ "!"; askill = pkiller.SkillSystem.GetSkillFromClass(w.GoverningSkill); killProfile.activeSkill = askill.skillName; killProfile.activeSkillLevel = askill.CurrentLevel; } 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; } } // ---------------------------------------------------------------------- // TakeDamage() // ---------------------------------------------------------------------- function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { local int actualDamage; local bool bAlreadyDead, bPlayAnim, bDamageGotReduced; local Vector offset, dst; local float headOffsetZ, headOffsetY, armOffset; local float origHealth, fdst; local DeusExLevelInfo info; local DeusExWeapon dxw; local String bodyString; local int MPHitLoc; local GMDXFlickerLight lightFlicker; local float augLVL; local DeusExRootWindow root; local GMDXImpactSpark AST; if ( bNintendoImmunity ) return; bodyString = ""; origHealth = Health; if (Level.NetMode != NM_Standalone) Damage *= MPDamageMult; else if (damageType=='Drowned') { if (PerkNamesArray[5]!=1) drugEffectTimer += 3.5; //freak player :) Damage=12; //GMDX mod drowning damage, taked that hard coded 5hpts } //log("MYCHK DXP_TD:"@self@"take damage in state"@GetStateName()@" : "@Damage@" : "@damageType@" : "@instigatedBy); // use the hitlocation to determine where the pawn is hit // transform the worldspace hitlocation into objectspace // in objectspace, remember X is front to back // Y is side to side, and Z is top to bottom offset = (hitLocation - Location) << Rotation; // add a HUD icon for this damage type if ((damageType == 'Poison') || (damageType == 'PoisonEffect')) // hack AddDamageDisplay('PoisonGas', offset); else AddDamageDisplay(damageType, offset); // nanovirus damage doesn't affect us if (damageType == 'NanoVirus') return; // handle poison if ((damageType == 'Poison') || ((Level.NetMode != NM_Standalone) && (damageType=='TearGas')) ) { // Notify player if they're getting burned for the first time if ( Level.NetMode != NM_Standalone ) ServerConditionalNotifyMsg( MPMSG_FirstPoison ); StartPoison( instigatedBy, Damage ); } // reduce our damage correctly if (ReducedDamageType == damageType) actualDamage = float(actualDamage) * (1.0 - ReducedDamagePct); // check for augs or inventory items bDamageGotReduced = DXReduceDamage(Damage, damageType, hitLocation, actualDamage, False); /// DEUS_EX AMSD Multiplayer shield if (Level.NetMode != NM_Standalone) if (bDamageGotReduced) { ShieldStatus = SS_Strong; ShieldTimer = 1.0; } if (ReducedDamageType == 'All') //God mode actualDamage = 0; //CyberP: add flinch effects if ((DamageType == 'Shot' || DamageType == 'AutoShot' || DamageType == 'Shocked')) { if (inHand != None && inHand.IsA('DeusExWeapon') && !DeusExWeapon(inHand).bFiring && FRand() < 0.18) { if (AugmentationSystem != None) augLVL = AugmentationSystem.GetAugLevelValue(class'AugBallistic'); if (AugmentationSystem != None && augLVL >= 0.0) { } else { RecoilTime=default.RecoilTime; RecoilShake.Z-=lerp(min(Abs(ActualDamage),2.0*ActualDamage)/(1.0*ActualDamage),0,4.0); //CyberP: 7 RecoilShake.Y-=lerp(min(Abs(ActualDamage),2.0*ActualDamage)/(1.0*ActualDamage),0,3.0); RecoilShaker(vect(1,2,-2)); } } if (inHand != None && inHand.IsA('WeaponSword')) { if ((DamageType == 'Shot' || DamageType == 'AutoShot') && FRand() < 0.03) { PlaySound(sound'bouncemetal',SLOT_None); actualDamage = 0; return; } } } // Multiplayer only code if ( Level.NetMode != NM_Standalone ) { if ( ( instigatedBy != None ) && (instigatedBy.IsA('DeusExPlayer')) ) { // Special case the sniper rifle if ((DeusExPlayer(instigatedBy).Weapon != None) && ( DeusExPlayer(instigatedBy).Weapon.class == class'WeaponRifle' )) { dxw = DeusExWeapon(DeusExPlayer(instigatedBy).Weapon); if ( (dxw != None ) && ( !dxw.bZoomed )) actualDamage *= WeaponRifle(dxw).mpNoScopeMult; // Reduce damage if we're not using the scope } if ( (TeamDMGame(DXGame) != None) && (TeamDMGame(DXGame).ArePlayersAllied(DeusExPlayer(instigatedBy),Self)) ) { // Don't notify if the player hurts themselves if ( DeusExPlayer(instigatedBy) != Self ) { actualDamage *= TeamDMGame(DXGame).fFriendlyFireMult; if (( damageType != 'TearGas' ) && ( damageType != 'PoisonEffect' )) DeusExPlayer(instigatedBy).MultiplayerNotifyMsg( MPMSG_TeamHit ); } } } } // EMP attacks drain BE energy if (damageType == 'EMP') { EnergyDrain += actualDamage; EnergyDrainTotal += actualDamage; PlayTakeHitSound(actualDamage, damageType, 1); if ((damageType == 'EMP') && (damage > 25)) { PlaySound(sound'CloakDown', SLOT_None,,,,2.0); PlaySound(sound'tinnitus', SLOT_None); ClientFlash(800000,vect(255,255,255)); IncreaseClientFlashLength(4); ShowHud(false); return; } } if (damageType == 'Exploded' || damageType == 'Shocked') { if (AugmentationSystem != None) { if (AugmentationSystem.GetAugLevelValue(class'AugShield') == -1.0 && PerkNamesArray[6] != 1) { bStunted = True; SetTimer(0.4,false); } } } bPlayAnim = True; // if we're burning, don't play a hit anim when taking burning damage if (damageType == 'Burned') bPlayAnim = False; if (Physics == PHYS_None) SetMovementPhysics(); if (Physics == PHYS_Walking) momentum.Z = 0.4 * VSize(momentum); if ( instigatedBy == self ) momentum *= 0.6; momentum = momentum/Mass; // AddVelocity( momentum ); // doesn't do anything anyway // calculate our hit extents headOffsetZ = CollisionHeight * 0.78; headOffsetY = CollisionRadius * 0.35; armOffset = CollisionRadius * 0.35; // We decided to just have 3 hit locations in multiplayer MBCODE if (( Level.NetMode == NM_DedicatedServer ) || ( Level.NetMode == NM_ListenServer )) { MPHitLoc = GetMPHitLocation(HitLocation); if (MPHitLoc == 0) return; else if (MPHitLoc == 1 ) { // MP Headshot is 2x damage // narrow the head region actualDamage *= 2; HealthHead -= actualDamage; bodyString = HeadString; if (bPlayAnim) PlayAnim('HitHead', , 0.1); } else if ((MPHitLoc == 3) || (MPHitLoc == 4)) // Leg region { HealthLegRight -= actualDamage; HealthLegLeft -= actualDamage; if (MPHitLoc == 4) { if (bPlayAnim) PlayAnim('HitLegRight', , 0.1); } else if (MPHitLoc == 3) { if (bPlayAnim) PlayAnim('HitLegLeft', , 0.1); } // Since the legs are in sync only bleed up damage from one leg (otherwise it's double damage) if (HealthLegLeft < 0) { HealthArmRight += HealthLegLeft; HealthTorso += HealthLegLeft; HealthArmLeft += HealthLegLeft; bodyString = TorsoString; HealthLegLeft = 0; HealthLegRight = 0; } } else // arms and torso now one region { HealthArmLeft -= actualDamage; HealthTorso -= actualDamage; HealthArmRight -= actualDamage; bodyString = TorsoString; if (MPHitLoc == 6) { if (bPlayAnim) PlayAnim('HitArmRight', , 0.1); } else if (MPHitLoc == 5) { if (bPlayAnim) PlayAnim('HitArmLeft', , 0.1); } else { if (bPlayAnim) PlayAnim('HitTorso', , 0.1); } } } else // Normal damage code path for single player { if (offset.z > headOffsetZ) // head { // narrow the head region if ((Abs(offset.x) < headOffsetY) || (Abs(offset.y) < headOffsetY)) { HealthHead -= actualDamage * 2; if (bPlayAnim) PlayAnim('HitHead', , 0.1); // elec effect if (damageType == 'Shocked' && AST == None) { root = DeusExRootWindow(rootWindow); if ((root != None) && (root.hud != None)) { if (root.hud.background == None) { root.hud.SetBackground(Texture'Wepn_Prod_FX'); //root.hud.SetBackgroundSmoothing(True); root.hud.SetBackgroundStretching(True); root.hud.SetBackgroundStyle(DSTY_Translucent); AST=Spawn(class'GMDXImpactSpark'); if (AST != None) { AST.LifeSpan=4.000000; AST.DrawScale=0.000001; AST.Velocity=vect(0,0,0); AST.AmbientSound=Sound'Ambient.Ambient.Electricity3'; AST.SoundVolume=224; AST.SoundRadius=64; AST.SoundPitch=80; } } } } } } else if (offset.z < 0.0) // legs { if (offset.y > 0.0) { HealthLegRight -= actualDamage; if (bPlayAnim) PlayAnim('HitLegRight', , 0.1); } else { HealthLegLeft -= actualDamage; if (bPlayAnim) PlayAnim('HitLegLeft', , 0.1); } // if this part is already dead, damage the adjacent part 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 // arms and torso { if (offset.y > armOffset) { HealthArmRight -= actualDamage; if (bPlayAnim) PlayAnim('HitArmRight', , 0.1); } else if (offset.y < -armOffset) { HealthArmLeft -= actualDamage; if (bPlayAnim) PlayAnim('HitArmLeft', , 0.1); } else { HealthTorso -= actualDamage * 2; if (bPlayAnim) { PlayAnim('HitTorso', , 0.1); } } // if this part is already dead, damage the adjacent part if (HealthArmLeft < 0) { HealthTorso += HealthArmLeft; HealthArmLeft = 0; } if (HealthArmRight < 0) { HealthTorso += HealthArmRight; HealthArmRight = 0; } } } // check for a back hit and play the correct anim if ((offset.x < 0.0) && bPlayAnim) { if (offset.z > headOffsetZ) // head from the back { // narrow the head region if ((Abs(offset.x) < headOffsetY) || (Abs(offset.y) < headOffsetY)) PlayAnim('HitHeadBack', , 0.1); } else PlayAnim('HitTorsoBack', , 0.1); } // check for a water hit if (Region.Zone.bWaterZone) { if ((offset.x < 0.0) && bPlayAnim) PlayAnim('WaterHitTorsoBack',,0.1); else PlayAnim('WaterHitTorso',,0.1); } GenerateTotalHealth(); if ((damageType != 'Stunned') && (damageType != 'TearGas') && (damageType != 'HalonGas') && (damageType != 'PoisonGas') && (damageType != 'Radiation') && (damageType != 'EMP') && (damageType != 'NanoVirus') && (damageType != 'Drowned') && (damageType != 'KnockedOut')) bleedRate += (origHealth-Health)/30.0; // 30 points of damage = bleed profusely if (CarriedDecoration != None && FRand() < 0.3 && AugmentationSystem.GetAugLevelValue(class'AugMuscle') != 2) DropDecoration(); // don't let the player die in the training mission info = GetLevelInfo(); if ((info != None) && (info.MissionNumber == 0)) { if (Health <= 0) { HealthTorso = FMax(HealthTorso, 10); HealthHead = FMax(HealthHead, 10); GenerateTotalHealth(); } } if (Health > 0) { if ((Level.NetMode != NM_Standalone) && (HealthLegLeft==0) && (HealthLegRight==0)) ServerConditionalNotifyMsg( MPMSG_LostLegs ); if (instigatedBy != None) damageAttitudeTo(instigatedBy); PlayDXTakeDamageHit(actualDamage, hitLocation, damageType, momentum, bDamageGotReduced); AISendEvent('Distress', EAITYPE_Visual); } else { NextState = ''; if (inHand != None && FRand() < 0.3) DropItem(); PlayDeathHit(actualDamage, hitLocation, damageType, momentum); if ( Level.NetMode != NM_Standalone ) CreateKillerProfile( instigatedBy, actualDamage, damageType, bodyString ); if (DamageType == 'Exploded') //CyberP: always gib to explosives { Health = -1000; Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentSmoking'); } else if (DamageType == 'Burned' && instigatedBy.Weapon != None && (instigatedBy.Weapon.IsA('WeaponHideAGun') || instigatedBy.Weapon.IsA('WeaponPlasmaRifle') || instigatedBy.Weapon.IsA('WeaponRobotPlasmaGun'))) { Health = -1000; Spawn(class'FleshFragmentSmoking'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); Spawn(class'FleshFragmentBurned'); } else if ( actualDamage > mass ) Health = -1 * actualDamage; Enemy = instigatedBy; Died(instigatedBy, damageType, HitLocation); return; } MakeNoise(1.0); if ((DamageType == 'Flamed') && !bOnFire) { // Notify player if they're getting burned for the first time if ( Level.NetMode != NM_Standalone ) ServerConditionalNotifyMsg( MPMSG_FirstBurn ); CatchFire( instigatedBy ); } myProjKiller = None; } // ---------------------------------------------------------------------- // GetMPHitLocation() // Returns 1 for head, 2 for torso, 3 for left leg, 4 for right leg, 5 for // left arm, 6 for right arm, 0 for nothing. // ---------------------------------------------------------------------- simulated function int GetMPHitLocation(Vector HitLocation) { local float HeadOffsetZ; local float HeadOffsetY; local float ArmOffset; local vector Offset; offset = (hitLocation - Location) << Rotation; // calculate our hit extents headOffsetZ = CollisionHeight * 0.78; headOffsetY = CollisionRadius * 0.35; armOffset = CollisionRadius * 0.35; if (offset.z > headOffsetZ ) { // narrow the head region if ((Abs(offset.x) < headOffsetY) || (Abs(offset.y) < headOffsetY)) { // Headshot, return 1; return 1; } else { return 0; } } else if (offset.z < 0.0) // Leg region { if (offset.y > 0.0) { //right leg return 4; } else { //left leg return 3; } } else // arms and torso now one region { if (offset.y > armOffset) { return 6; } else if (offset.y < -armOffset) { return 5; } else { return 2; } } return 0; } // ---------------------------------------------------------------------- // DXReduceDamage() // // Calculates reduced damage from augmentations and from inventory items // Also calculates a scalar damage reduction based on the mission number // ---------------------------------------------------------------------- function bool DXReduceDamage(int Damage, name damageType, vector hitLocation, out int adjustedDamage, bool bCheckOnly) { local float newDamage; local float augLevel, skillLevel; local float pct; local HazMatSuit suit; local BallisticArmor armor; local bool bReduced; bReduced = False; newDamage = Float(Damage); if ((damageType == 'TearGas') || (damageType == 'PoisonGas') || (damageType == 'Radiation') || (damageType == 'HalonGas') || (damageType == 'PoisonEffect') || (damageType == 'Poison') || (damageType == 'Burned') || (damageType == 'Shocked')) { if (AugmentationSystem != None) augLevel = AugmentationSystem.GetAugLevelValue(class'AugEnviro'); if (augLevel >= 0.0) newDamage *= augLevel; // get rid of poison if we're maxed out if (newDamage ~= 0.0) { StopPoison(); drugEffectTimer -= 4; // stop the drunk effect if (drugEffectTimer < 0) drugEffectTimer = 0; } // go through the actor list looking for owned HazMatSuits // since they aren't in the inventory anymore after they are used if (UsingChargedPickup(class'HazMatSuit')) { skillLevel = SkillSystem.GetSkillLevelValue(class'SkillEnviro'); newDamage *= 0.4;//0.75 * skillLevel; foreach AllActors(class'HazMatSuit', suit) if ((suit.Owner == Self) && suit.bActive) suit.Charge -= (Damage * 20 * skillLevel); } } if ((damageType == 'Shot') || (damageType == 'Sabot') || (damageType == 'AutoShot')) { // go through the actor list looking for owned BallisticArmor // since they aren't in the inventory anymore after they are used if (UsingChargedPickup(class'BallisticArmor')) { skillLevel = SkillSystem.GetSkillLevelValue(class'SkillEnviro'); newDamage *= 0.65; //GMDX: removed too easy * skillLevel; //CyberP: foreach durable armor foreach AllActors(class'BallisticArmor', armor) if ((armor.Owner == Self) && armor.bActive) armor.Charge -= (Damage * 18 * skillLevel); } } if (damageType == 'HalonGas') { if (bOnFire && !bCheckOnly) ExtinguishFire(); } if ((damageType == 'Shot') || (damageType == 'AutoShot') || (damageType == 'KnockedOut')) { if (AugmentationSystem != None) //CyberP: now includes ballistic passive aug { augLevel = AugmentationSystem.GetAugLevelValue(class'AugBallistic'); if (augLevel < 0.0 && Energy > 0) augLevel = AugmentationSystem.GetAugLevelValue(class'AugBallisticPassive'); } if (augLevel >= 0.0) newDamage *= augLevel; } //if (damageType == 'EMP') //{ // if (AugmentationSystem != None) // augLevel = AugmentationSystem.GetAugLevelValue(class'AugEMP'); // // if (augLevel >= 0.0) // newDamage *= augLevel; // } if ((damageType == 'Burned') || (damageType == 'Flamed') || (damageType == 'Exploded') || (damageType == 'Shocked') || (damageType == 'EMP')) { if (AugmentationSystem != None) augLevel = AugmentationSystem.GetAugLevelValue(class'AugShield'); if (augLevel >= 0.0) newDamage *= augLevel; if (augLevel == 0.3) Spawn(class'SphereEffectShield2'); } if (newDamage < Damage) { if (!bCheckOnly) { pct = 1.0 - (newDamage / Float(Damage)); SetDamagePercent(pct); ClientFlash(0.01, vect(80, 0, 0)); } bReduced = True; } else { if (!bCheckOnly) SetDamagePercent(0.0); } // // Reduce or increase the damage based on the combat difficulty setting // if ((damageType == 'Shot') || (damageType == 'AutoShot') || (damageType == 'KnockedOut')) { newDamage *= CombatDifficulty; // always take at least one point of damage if ((newDamage <= 1) && (Damage > 0)) newDamage = 1; if (AugmentationSystem.GetAugLevelValue(class'AugBallisticPassive') >= 0.0) { Energy -= newDamage * 0.125; if (Energy < 0) Energy = 0; } } if (!bHardCoreMode) //CyberP: now we also reduce all other damage types based on difficulty. { //CyberP: easy = reduced by half. Medium = 1/4. Hardcore & realistic = No reduction if ((damageType == 'Shocked') || (damageType == 'Burned') || (damageType == 'Exploded') || (damageType == 'Poison') || (damageType == 'Radiation') || (damageType == 'TearGas') || (damageType == 'PoisonEffect')) { if (CombatDifficulty < 1) newDamage *= 0.5; else if (CombatDifficulty < 3) newDamage *= 0.75; } } adjustedDamage = Int(newDamage); return bReduced; } // ---------------------------------------------------------------------- // Died() // // Checks to see if a conversation is playing when the PC dies. // If so, nukes it. // ---------------------------------------------------------------------- function Died(pawn Killer, name damageType, vector HitLocation) { if (conPlay != None) conPlay.TerminateConversation(); if (bOnFire) ExtinguishFire(); if (AugmentationSystem != None) AugmentationSystem.DeactivateAll(); if ((Level.NetMode == NM_DedicatedServer) || (Level.NetMode == NM_ListenServer)) ClientDeath(); Super.Died(Killer, damageType, HitLocation); } // ---------------------------------------------------------------------- // ClientDeath() // // Does client side cleanup on death. // ---------------------------------------------------------------------- function ClientDeath() { if (!PlayerIsClient()) return; //FlashTimer = 0; // Reset skill notification DeusExRootWindow(rootWindow).hud.hms.bNotifySkills = False; DeusExRootWindow(rootWindow).hud.activeItems.winItemsContainer.RemoveAllIcons(); DeusExRootWindow(rootWindow).hud.belt.ClearBelt(); // This should get rid of the scope death problem in multiplayer if (( DeusExRootWindow(rootWindow).scopeView != None ) && DeusExRootWindow(rootWindow).scopeView.bViewVisible ) DeusExRootWindow(rootWindow).scopeView.DeactivateView(); if ( DeusExRootWindow(rootWindow).hud.augDisplay != None ) { DeusExRootWindow(rootWindow).hud.augDisplay.bVisionActive = False; DeusExRootWindow(rootWindow).hud.augDisplay.activeCount = 0; } if ( bOnFire ) ExtinguishFire(); // Don't come back to life drugged or posioned poisonCounter = 0; poisonTimer = 0; drugEffectTimer = 0; // Don't come back to life crouched bCrouchOn = False; bWasCrouchOn = False; bIsCrouching = False; bForceDuck = False; lastbDuck = 0; bDuck = 0; // No messages carry over mpMsgCode = 0; mpMsgTime = 0; bleedrate = 0; dropCounter = 0; } // ---------------------------------------------------------------------- // Timer() // // continually burn and do damage // ---------------------------------------------------------------------- function Timer() { local int damage; if (bDoubleClickCheck) { clickCountCyber = 0; bDoubleClickCheck=False; bStunted = False; if (!bOnFire) return; } bStunted = False; //CyberP: called from takedamage. if (!InConversation() && bOnFire) { if ( Level.NetMode != NM_Standalone ) damage = Class'WeaponFlamethrower'.Default.mpBurnDamage; else damage = Class'WeaponFlamethrower'.Default.BurnDamage; TakeDamage(damage, myBurner, Location, vect(0,0,0), 'Burned'); if (HealthTorso <= 0) { TakeDamage(10, myBurner, Location, vect(0,0,0), 'Burned'); ExtinguishFire(); } } } // ---------------------------------------------------------------------- // CatchFire() // ---------------------------------------------------------------------- function CatchFire( Pawn burner ) { local Fire f; local int i; local vector loc; myBurner = burner; burnTimer = 0; if (bOnFire || Region.Zone.bWaterZone) return; bOnFire = True; burnTimer = 0; for (i=0; i<8; i++) { loc.X = 0.5*CollisionRadius * (1.0-2.0*FRand()); loc.Y = 0.5*CollisionRadius * (1.0-2.0*FRand()); loc.Z = 0.6*CollisionHeight * (1.0-2.0*FRand()); loc += Location; // DEUS_EX AMSD reduce the number of smoke particles in multiplayer // by creating smokeless fire (better for server propagation). if ((Level.NetMode == NM_Standalone) || (i <= 0)) f = Spawn(class'Fire', Self,, loc); else f = Spawn(class'SmokelessFire', Self,, loc); if (f != None) { f.DrawScale = 0.5*FRand() + 1.0; //DEUS_EX AMSD Reduce the penalty in multiplayer if (Level.NetMode != NM_Standalone) f.DrawScale = f.DrawScale * 0.5; // turn off the sound and lights for all but the first one if (i > 0) { f.AmbientSound = None; f.LightType = LT_None; } // turn on/off extra fire and smoke // MP already only generates a little. if ((FRand() < 0.5) && (Level.NetMode == NM_Standalone)) f.smokeGen.Destroy(); if ((FRand() < 0.5) && (Level.NetMode == NM_Standalone)) f.AddFire(); } } // set the burn timer SetTimer(1.0, True); } // ---------------------------------------------------------------------- // ExtinguishFire() // ---------------------------------------------------------------------- function ExtinguishFire() { local Fire f; bOnFire = False; burnTimer = 0; SetTimer(0, False); foreach BasedActors(class'Fire', f) f.Destroy(); } // ---------------------------------------------------------------------- // SpawnBlood() // ---------------------------------------------------------------------- function SpawnBlood(Vector HitLocation, float Damage) { local int i; if ((DeusExMPGame(Level.Game) != None) && (!DeusExMPGame(Level.Game).bSpawnEffects)) { return; } //spawn(class'BloodSpurt',,,HitLocation); //spawn(class'BloodDrop',,,HitLocation); for (i=0; i<int(Damage); i+=10) spawn(class'BloodDrop',,,HitLocation); } // ---------------------------------------------------------------------- // PlayDXTakeDamageHit() // DEUS_EX AMSD Created as a separate function to avoid extra calls to // DXReduceDamage, which is slow in multiplayer // ---------------------------------------------------------------------- function PlayDXTakeDamageHit(float Damage, vector HitLocation, name damageType, vector Momentum, bool DamageReduced) { local float rnd; //log("MYCHK PDXTDH:"@self@"take damage in state"@GetStateName()@" : "@Damage@" : "@damageType); PlayHit(Damage,HitLocation,damageType,Momentum); // if we actually took the full damage, flash the screen and play the sound // DEUS_EX AMSD DXReduceDamage is slow. Pass in the result from earlier. if (!DamageReduced) { if ( (damage > 0) || (ReducedDamageType == 'All') ) { // No client flash on plasma bolts in multiplayer if (( Level.NetMode != NM_Standalone ) && ( myProjKiller != None ) && (PlasmaBolt(myProjKiller)!=None) ) { } else {//gmdx changed 0.002 on burned rnd = FClamp(Damage, 20, 100); if (damageType == 'Burned') ClientFlash(0.0001, vect(75,37,37)); //vect(100,50,50) else if (damageType == 'Flamed') ClientFlash(rnd * 0.002, vect(200,100,100)); else if (damageType == 'Radiation') ClientFlash(rnd * 0.002, vect(100,100,0)); else if (damageType == 'PoisonGas') ClientFlash(rnd * 0.002, vect(50,150,0)); else if (damageType == 'TearGas') ClientFlash(rnd * 0.002, vect(150,150,0)); else if (damageType == 'Drowned') ClientFlash(rnd * 0.002, vect(0,100,200)); else if (damageType == 'EMP') ClientFlash(rnd * 0.002, vect(0,200,200)); else ClientFlash(rnd * 0.002, vect(50,0,0)); } ShakeView(0.15 + 0.002 * Damage, Damage * 30, 0.3 * Damage); } } } // ---------------------------------------------------------------------- // PlayHit() // ---------------------------------------------------------------------- function PlayHit(float Damage, vector HitLocation, name damageType, vector Momentum) { if ((Damage > 0) && (damageType == 'Shot') || (damageType == 'Exploded') || (damageType == 'AutoShot')) SpawnBlood(HitLocation, Damage); if (Damage >=1) //CyberP: Don't scream (and subsequently send AIEvents) if the damage is really weak. PlayTakeHitSound(Damage, damageType, 1); } // ---------------------------------------------------------------------- // PlayDeathHit() // ---------------------------------------------------------------------- function PlayDeathHit(float Damage, vector HitLocation, name damageType, vector Momentum) { PlayDying(damageType, HitLocation); } // ---------------------------------------------------------------------- // SkillPointsAdd() // ---------------------------------------------------------------------- function SkillPointsAdd(int numPoints) { if (numPoints > 0) { SkillPointsAvail += numPoints; SkillPointsTotal += numPoints; if ((DeusExRootWindow(rootWindow) != None) && (DeusExRootWindow(rootWindow).hud != None) && (DeusExRootWindow(rootWindow).hud.msgLog != None)) { ClientMessage(Sprintf(SkillPointsAward, numPoints)); DeusExRootWindow(rootWindow).hud.msgLog.PlayLogSound(Sound'LogSkillPoints'); } } } // ---------------------------------------------------------------------- // perksManager() //CyberP: // ---------------------------------------------------------------------- function perksManager(string Perky, int perkLevel) { local Medkit med; local BioelectricCell cell; local Robot robo; if (perkLevel == 1) { switch(Perky) { case "SONIC-TRANSDUCER SENSOR": PerkNamesArray[0]= 1; break; case "FOCUSED: PISTOLS": PerkNamesArray[1]= 1; break; case "FOCUSED: RIFLES": PerkNamesArray[2]= 1; break; case "PERFECT STANCE: HEAVY WEAPONS": PerkNamesArray[3]= 1; break; case "SHARP-EYED": PerkNamesArray[4]= 1; break; case "CLARITY": PerkNamesArray[5]= 1; break; case "STEADY-FOOTED": PerkNamesArray[6]= 1; break; case "MODDER": PerkNamesArray[7]= 1; break; case "BIOGENIC": PerkNamesArray[8]= 1; break; case "NIMBLE": PerkNamesArray[9]= 1; break; case "SABOTAGE": PerkNamesArray[10]= 1; break; default: break; } } else if (perkLevel == 2) { switch(Perky) { case "HUMAN COMBUSTION": PerkNamesArray[11]= 1; break; case "QUICKDRAW": PerkNamesArray[12]= 1; break; case "H.E ROCKET": PerkNamesArray[13]= 1; break; case "PIERCING": PerkNamesArray[14]= 1; break; case "SHORT FUSE": PerkNamesArray[15]= 1; break; case "WIRELESS STRENGTH": PerkNamesArray[16]= 1; break; case "ATHLETE'S APPETITE": PerkNamesArray[17]= 1; fullUp=-9999; break; case "NERVES OF STEEL": PerkNamesArray[18]= 1; break; case "TOXICOLOGIST": PerkNamesArray[19]= 1; break; case "HARDENED": PerkNamesArray[20]= 1; break; case "MISFEATURE EXPLOIT": PerkNamesArray[21]= 1; break; default: break; } } else if (perkLevel == 3) { switch(Perky) { case "PERFECT STANCE: PISTOLS": PerkNamesArray[22]= 1; break; case "PERFECT STANCE: RIFLES": PerkNamesArray[23]= 1; break; case "IN BULK": PerkNamesArray[24]= 1; break; case "INVENTIVE": PerkNamesArray[25]= 1; break; case "KNOCKOUT GAS": PerkNamesArray[26]= 1; break; case "ENDURANCE": PerkNamesArray[27]= 1; break; case "TECH SPECIALIST": PerkNamesArray[28]= 1; break; case "CREEPER": PerkNamesArray[29]= 1; break; case "COMBAT MEDIC'S BAG": PerkNamesArray[30]= 1; foreach AllActors(class'Medkit',med) med.MaxCopies = 20; foreach AllActors(class'BioelectricCell',cell) cell.MaxCopies = 25; break; case "CRACKED": PerkNamesArray[31]= 1; break; case "LOCKSPORT": PerkNamesArray[32]= 1; break; case "NEAT HACK": PerkNamesArray[33]= 1; break; default: break; } } } // ---------------------------------------------------------------------- // MakePlayerIgnored() // ---------------------------------------------------------------------- function MakePlayerIgnored(bool bNewIgnore) { bIgnore = bNewIgnore; // to restore original behavior, uncomment the next line //bDetectable = !bNewIgnore; } // ---------------------------------------------------------------------- // CalculatePlayerVisibility() // ---------------------------------------------------------------------- function float CalculatePlayerVisibility(ScriptedPawn P) { local float vis; local AdaptiveArmor armor; local DeusExWeapon wep; wep = DeusExWeapon(Weapon); vis = 1.0; if ((P != None) && (AugmentationSystem != None)) { if (P.IsA('Robot')) { // if the aug is on, give the player full invisibility if (AugmentationSystem.GetAugLevelValue(class'AugRadarTrans') != -1.0) vis = 0.0; } else { // if the aug is on, give the player full invisibility if (AugmentationSystem.GetAugLevelValue(class'AugCloak') != -1.0) vis = 0.0; } // go through the actor list looking for owned AdaptiveArmor // since they aren't in the inventory anymore after they are used if (UsingChargedPickup(class'AdaptiveArmor')) { vis = 0.0; } if (wep != None && wep.bLasing) { vis = 1.0; //CyberP: if laser on, can be seen even if cloaked/radartrans } } return vis; } // ---------------------------------------------------------------------- // ClientFlash() // // copied from Engine.PlayerPawn // modified to add the new flash to the current flash // ---------------------------------------------------------------------- // MBCODE: changed to simulated so that player can experience flash client side // DEUS_EX AMSD: Added so we can change the flash time duration. simulated function ClientFlash( float scale, vector fog) { DesiredFlashScale += scale; DesiredFlashFog += 0.001 * fog; //CyberP: 0.001 } function IncreaseClientFlashLength(float NewFlashTime) { FlashTimer = FMax(NewFlashTime,FlashTimer); } // ---------------------------------------------------------------------- // ViewFlash() // modified so that flash doesn't always go away in exactly half a second. // --------------------------------------------------------------------- function ViewFlash(float DeltaTime) { local float delta; local vector goalFog; local float goalscale, ReductionFactor; ReductionFactor = 2; if (FlashTimer > 0) { if (FlashTimer < Deltatime) { FlashTimer = 0; } else { ReductionFactor = 0; FlashTimer -= Deltatime; } } if ( bNoFlash ) { InstantFlash = 0; InstantFog = vect(0,0,0); } delta = FMin(0.1, DeltaTime); goalScale = 1 + DesiredFlashScale + ConstantGlowScale + HeadRegion.Zone.ViewFlash.X; goalFog = DesiredFlashFog + ConstantGlowFog + HeadRegion.Zone.ViewFog; DesiredFlashScale -= DesiredFlashScale * ReductionFactor * delta; DesiredFlashFog -= DesiredFlashFog * ReductionFactor * delta; FlashScale.X += (goalScale - FlashScale.X + InstantFlash) * 10 * delta; FlashFog += (goalFog - FlashFog + InstantFog) * 10 * delta; InstantFlash = 0; InstantFog = vect(0,0,0); if ( FlashScale.X > 0.981 ) FlashScale.X = 1; FlashScale = FlashScale.X * vect(1,1,1); if ( FlashFog.X < 0.019 ) FlashFog.X = 0; if ( FlashFog.Y < 0.019 ) FlashFog.Y = 0; if ( FlashFog.Z < 0.019 ) FlashFog.Z = 0; } // ---------------------------------------------------------------------- // ViewModelAdd() // // lets an artist (or whoever) view a model and play animations on it // from within the game // ---------------------------------------------------------------------- exec function ViewModelAdd(int num, string ClassName) { local class<actor> ViewModelClass; local rotator newrot; local vector loc; if (!bCheatsEnabled) return; if(instr(ClassName, ".") == -1) ClassName = "DeusEx." $ ClassName; if ((num >= 0) && (num <= 8)) { if (num > 0) num--; if (ViewModelActor[num] == None) { ViewModelClass = class<actor>(DynamicLoadObject(ClassName, class'Class')); if (ViewModelClass != None) { newrot = Rotation; newrot.Roll = 0; newrot.Pitch = 0; loc = Location + (ViewModelClass.Default.CollisionRadius + CollisionRadius + 32) * Vector(newrot); loc.Z += ViewModelClass.Default.CollisionHeight; ViewModelActor[num] = Spawn(ViewModelClass,,, loc, newrot); if (ViewModelActor[num] != None) ViewModelActor[num].SetPhysics(PHYS_None); if (ScriptedPawn(ViewModelActor[num]) != None) ViewModelActor[num].GotoState('Paralyzed'); } } else ClientMessage("There is already a ViewModel in that slot!"); } } // ---------------------------------------------------------------------- // ViewModelDestroy() // // destroys the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelDestroy(int num) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) { ViewModelActor[i].Destroy(); ViewModelActor[i] = None; } } else { i = num - 1; if (ViewModelActor[i] != None) { ViewModelActor[i].Destroy(); ViewModelActor[i] = None; } } } } // ---------------------------------------------------------------------- // ViewModelPlay() // // plays an animation on the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelPlay(int num, name anim, optional float fps) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].PlayAnim(anim, fps); } } else { i = num - 1; if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].PlayAnim(anim, fps); } } } } // ---------------------------------------------------------------------- // ViewModelLoop() // // loops an animation on the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelLoop(int num, name anim, optional float fps) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].LoopAnim(anim, fps); } } else { i = num - 1; if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].LoopAnim(anim, fps); } } } } // ---------------------------------------------------------------------- // ViewModelBlendPlay() // // plays a blended animation on the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelBlendPlay(int num, name anim, optional float fps, optional int slot) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].PlayBlendAnim(anim, fps, , slot); } } else { i = num - 1; if (ViewModelActor[i] != None) { if (fps == 0) fps = 1.0; ViewModelActor[i].PlayBlendAnim(anim, fps, , slot); } } } } // ---------------------------------------------------------------------- // ViewModelBlendStop() // // stops the blended animation on the current ViewModel // ---------------------------------------------------------------------- exec function ViewModelBlendStop(int num) { local int i; if (!bCheatsEnabled) return; if ((num >= 0) && (num <= 8)) { if (num == 0) { for (i=0; i<8; i++) if (ViewModelActor[i] != None) ViewModelActor[i].StopBlendAnims(); } else { i = num - 1; if (ViewModelActor[i] != None) ViewModelActor[i].StopBlendAnims(); } } } exec function ViewModelGiveWeapon(int num, string weaponClass) { local class<Actor> NewClass; local Actor obj; local int i; local ScriptedPawn pawn; if (!bCheatsEnabled) return; if (instr(weaponClass, ".") == -1) weaponClass = "DeusEx." $ weaponClass; if ((num >= 0) && (num <= 8)) { NewClass = class<Actor>(DynamicLoadObject(weaponClass, class'Class')); if (NewClass != None) { obj = Spawn(NewClass,,, Location + (CollisionRadius+NewClass.Default.CollisionRadius+30) * Vector(Rotation) + vect(0,0,1) * 15); if ((obj != None) && obj.IsA('DeusExWeapon')) { if (num == 0) { for (i=0; i<8; i++) { pawn = ScriptedPawn(ViewModelActor[i]); if (pawn != None) { DeusExWeapon(obj).GiveTo(pawn); obj.SetBase(pawn); pawn.Weapon = DeusExWeapon(obj); pawn.PendingWeapon = DeusExWeapon(obj); } } } else { i = num - 1; pawn = ScriptedPawn(ViewModelActor[i]); if (pawn != None) { DeusExWeapon(obj).GiveTo(pawn); obj.SetBase(pawn); pawn.Weapon = DeusExWeapon(obj); pawn.PendingWeapon = DeusExWeapon(obj); } } } else { if (obj != None) obj.Destroy(); } } } } // ---------------------------------------------------------------------- // aliases to ViewModel functions // ---------------------------------------------------------------------- exec function VMA(int num, string ClassName) { ViewModelAdd(num, ClassName); } exec function VMD(int num) { ViewModelDestroy(num); } exec function VMP(int num, name anim, optional float fps) { ViewModelPlay(num, anim, fps); } exec function VML(int num, name anim, optional float fps) { ViewModelLoop(num, anim, fps); } exec function VMBP(int num, name anim, optional float fps, optional int slot) { ViewModelBlendPlay(num, anim, fps, slot); } exec function VMBS(int num) { ViewModelBlendStop(num); } exec function VMGW(int num, string weaponClass) { ViewModelGiveWeapon(num, weaponClass); } // ---------------------------------------------------------------------- // Cheat functions // // ---------------------------------------------------------------------- // AllHealth() // ---------------------------------------------------------------------- exec function AllHealth() { if (!bCheatsEnabled) return; RestoreAllHealth(); } // ---------------------------------------------------------------------- // RestoreAllHealth() // mod by dasraiser for GMDX MedSkill additional health // ---------------------------------------------------------------------- function RestoreAllHealth() { local int spill; local Skill sk; local float MedSkillAdd; MedSkillAdd=0.0; if (SkillSystem!=None) { sk = SkillSystem.GetSkillFromClass(Class'DeusEx.SkillMedicine'); if (sk!=None) MedSkillAdd=sk.CurrentLevel*10; } HealthHead = default.HealthHead+MedSkillAdd; HealthTorso = default.HealthTorso+MedSkillAdd; HealthLegLeft = default.HealthLegLeft; HealthLegRight = default.HealthLegRight; HealthArmLeft = default.HealthArmLeft; HealthArmRight = default.HealthArmRight; Health = default.Health; } // ---------------------------------------------------------------------- // DamagePart() // ---------------------------------------------------------------------- exec function DamagePart(int partIndex, optional int amount) { if (!bCheatsEnabled) return; if (amount == 0) amount = 1000; switch(partIndex) { case 0: // head HealthHead -= Min(HealthHead, amount); break; case 1: // torso HealthTorso -= Min(HealthTorso, amount); break; case 2: // left arm HealthArmLeft -= Min(HealthArmLeft, amount); break; case 3: // right arm HealthArmRight -= Min(HealthArmRight, amount); break; case 4: // left leg HealthLegLeft -= Min(HealthLegLeft, amount); break; case 5: // right leg HealthLegRight -= Min(HealthLegRight, amount); break; } } // ---------------------------------------------------------------------- // DamageAll() // ---------------------------------------------------------------------- exec function DamageAll(optional int amount) { if (!bCheatsEnabled) return; if (amount == 0) amount = 1000; HealthHead -= Min(HealthHead, amount); HealthTorso -= Min(HealthTorso, amount); HealthArmLeft -= Min(HealthArmLeft, amount); HealthArmRight -= Min(HealthArmRight, amount); HealthLegLeft -= Min(HealthLegLeft, amount); HealthLegRight -= Min(HealthLegRight, amount); } // ---------------------------------------------------------------------- // AllEnergy() // ---------------------------------------------------------------------- exec function AllEnergy() { if (!bCheatsEnabled) return; Energy = default.Energy; } // ---------------------------------------------------------------------- // AllCredits() // ---------------------------------------------------------------------- exec function AllCredits() { if (!bCheatsEnabled) return; Credits = 100000; } // --------------------------------------------------------------------- // AllSkills() // ---------------------------------------------------------------------- exec function AllSkills() { if (!bCheatsEnabled) return; AllSkillPoints(); SkillSystem.AddAllSkills(); } // ---------------------------------------------------------------------- // AllSkillPoints() // ---------------------------------------------------------------------- exec function AllSkillPoints() { if (!bCheatsEnabled) return; SkillPointsTotal = 115900; SkillPointsAvail = 115900; } // ---------------------------------------------------------------------- // AllAugs() // ---------------------------------------------------------------------- exec function AllAugs() { local Augmentation anAug; local int i; if (!bCheatsEnabled) return; if (AugmentationSystem != None) { AugmentationSystem.AddAllAugs(); AugmentationSystem.SetAllAugsToMaxLevel(); } } // ---------------------------------------------------------------------- // AllWeapons() // ---------------------------------------------------------------------- exec function AllWeapons() { local Vector loc; if (!bCheatsEnabled) return; loc = Location + 2 * CollisionRadius * Vector(ViewRotation); Spawn(class'WeaponAssaultGun',,, loc); Spawn(class'WeaponAssaultShotgun',,, loc); Spawn(class'WeaponBaton',,, loc); Spawn(class'WeaponCombatKnife',,, loc); Spawn(class'WeaponCrowbar',,, loc); Spawn(class'WeaponEMPGrenade',,, loc); Spawn(class'WeaponFlamethrower',,, loc); Spawn(class'WeaponGasGrenade',,, loc); Spawn(class'WeaponGEPGun',,, loc); Spawn(class'WeaponHideAGun',,, loc); Spawn(class'WeaponLAM',,, loc); Spawn(class'WeaponLAW',,, loc); Spawn(class'WeaponMiniCrossbow',,, loc); Spawn(class'WeaponNanoSword',,, loc); Spawn(class'WeaponNanoVirusGrenade',,, loc); Spawn(class'WeaponPepperGun',,, loc); Spawn(class'WeaponPistol',,, loc); Spawn(class'WeaponPlasmaRifle',,, loc); Spawn(class'WeaponProd',,, loc); Spawn(class'WeaponRifle',,, loc); Spawn(class'WeaponSawedOffShotgun',,, loc); Spawn(class'WeaponShuriken',,, loc); Spawn(class'WeaponStealthPistol',,, loc); Spawn(class'WeaponSword',,, loc); } // ---------------------------------------------------------------------- // AllImages() // ---------------------------------------------------------------------- exec function AllImages() { local Vector loc; local Inventory item; if (!bCheatsEnabled) return; item = Spawn(class'Image01_GunFireSensor'); item.Frob(Self, None); item = Spawn(class'Image01_LibertyIsland'); item.Frob(Self, None); item = Spawn(class'Image01_TerroristCommander'); item.Frob(Self, None); item = Spawn(class'Image02_Ambrosia_Flyer'); item.Frob(Self, None); item = Spawn(class'Image02_NYC_Warehouse'); item.Frob(Self, None); item = Spawn(class'Image02_BobPage_ManOfYear'); item.Frob(Self, None); item = Spawn(class'Image03_747Diagram'); item.Frob(Self, None); item = Spawn(class'Image03_NYC_Airfield'); item.Frob(Self, None); item = Spawn(class'Image03_WaltonSimons'); item.Frob(Self, None); item = Spawn(class'Image04_NSFHeadquarters'); item.Frob(Self, None); item = Spawn(class'Image04_UNATCONotice'); item.Frob(Self, None); item = Spawn(class'Image05_GreaselDisection'); item.Frob(Self, None); item = Spawn(class'Image05_NYC_MJ12Lab'); item.Frob(Self, None); item = Spawn(class'Image06_HK_Market'); item.Frob(Self, None); item = Spawn(class'Image06_HK_MJ12Helipad'); item.Frob(Self, None); item = Spawn(class'Image06_HK_MJ12Lab'); item.Frob(Self, None); item = Spawn(class'Image06_HK_Versalife'); item.Frob(Self, None); item = Spawn(class'Image06_HK_WanChai'); item.Frob(Self, None); item = Spawn(class'Image08_JoeGreenMIBMJ12'); item.Frob(Self, None); item = Spawn(class'Image09_NYC_Ship_Bottom'); item.Frob(Self, None); item = Spawn(class'Image09_NYC_Ship_Top'); item.Frob(Self, None); item = Spawn(class'Image10_Paris_Catacombs'); item.Frob(Self, None); item = Spawn(class'Image10_Paris_CatacombsTunnels'); item.Frob(Self, None); item = Spawn(class'Image10_Paris_Metro'); item.Frob(Self, None); item = Spawn(class'Image11_Paris_Cathedral'); item.Frob(Self, None); item = Spawn(class'Image11_Paris_CathedralEntrance'); item.Frob(Self, None); item = Spawn(class'Image12_Vandenberg_Command'); item.Frob(Self, None); item = Spawn(class'Image12_Vandenberg_Sub'); item.Frob(Self, None); item = Spawn(class'Image12_Tiffany_HostagePic'); item.Frob(Self, None); item = Spawn(class'Image14_OceanLab'); item.Frob(Self, None); item = Spawn(class'Image14_Schematic'); item.Frob(Self, None); item = Spawn(class'Image15_Area51Bunker'); item.Frob(Self, None); item = Spawn(class'Image15_GrayDisection'); item.Frob(Self, None); item = Spawn(class'Image15_BlueFusionDevice'); item.Frob(Self, None); item = Spawn(class'Image15_Area51_Sector3'); item.Frob(Self, None); item = Spawn(class'Image15_Area51_Sector4'); item.Frob(Self, None); } // ---------------------------------------------------------------------- // Trig() // ---------------------------------------------------------------------- exec function Trig(name ev) { local Actor A; if (!bCheatsEnabled) return; if (ev != '') foreach AllActors(class'Actor', A, ev) A.Trigger(Self, Self); } // ---------------------------------------------------------------------- // UnTrig() // ---------------------------------------------------------------------- exec function UnTrig(name ev) { local Actor A; if (!bCheatsEnabled) return; if (ev != '') foreach AllActors(class'Actor', A, ev) A.UnTrigger(Self, Self); } // ---------------------------------------------------------------------- // SetState() // ---------------------------------------------------------------------- exec function SetState(name state) { local ScriptedPawn P; local Actor hitActor; local vector loc, line, HitLocation, hitNormal; if (!bCheatsEnabled) return; loc = Location; loc.Z += BaseEyeHeight; line = Vector(ViewRotation) * 2000; hitActor = Trace(hitLocation, hitNormal, loc+line, loc, true); P = ScriptedPawn(hitActor); if (P != None) { P.GotoState(state); ClientMessage("Setting "$P.BindName$" to the "$state$" state"); } } // ---------------------------------------------------------------------- // DXDumpInfo() // // Dumps the following player information to the log file // - inventory (with item counts) // - health (as %) // - energy (as %) // - credits // - skill points (avail and max) // - skills // - augmentations // ---------------------------------------------------------------------- exec function DXDumpInfo() { local DumpLocation dumploc; local DeusExLevelInfo info; local string userName, mapName, strCopies; local Inventory item, nextItem; local DeusExWeapon W; local Skill skill; local Augmentation aug; local bool bHasAugs; dumploc = CreateDumpLocationObject(); if (dumploc != None) { userName = dumploc.GetCurrentUser(); CriticalDelete(dumploc); } if (userName == "") userName = "NO USERNAME"; mapName = "NO MAPNAME"; foreach AllActors(class'DeusExLevelInfo', info) mapName = info.MapName; log(""); log("**** DXDumpInfo - User: "$userName$" - Map: "$mapName$" ****"); log(""); log(" Inventory:"); if (Inventory != None) { item = Inventory; do { nextItem = item.Inventory; if (item.bDisplayableInv || item.IsA('Ammo')) { W = DeusExWeapon(item); if ((W != None) && W.bHandToHand && (W.ProjectileClass != None)) strCopies = " ("$W.AmmoType.AmmoAmount$" rds)"; else if (item.IsA('Ammo') && (Ammo(item).PickupViewMesh != Mesh'TestBox')) strCopies = " ("$Ammo(item).AmmoAmount$" rds)"; else if (item.IsA('Pickup') && (Pickup(item).NumCopies > 1)) strCopies = " ("$Pickup(item).NumCopies$")"; else strCopies = ""; log(" "$item.GetItemName(String(item.Class))$strCopies); } item = nextItem; } until (item == None); } else log(" Empty"); GenerateTotalHealth(); log(""); log(" Health:"); log(" Overall - "$Health$"%"); log(" Head - "$HealthHead$"%"); log(" Torso - "$HealthTorso$"%"); log(" Left arm - "$HealthArmLeft$"%"); log(" Right arm - "$HealthArmRight$"%"); log(" Left leg - "$HealthLegLeft$"%"); log(" Right leg - "$HealthLegRight$"%"); log(""); log(" BioElectric Energy:"); log(" "$Int(Energy)$"%"); log(""); log(" Credits:"); log(" "$Credits); log(""); log(" Skill Points:"); log(" Available - "$SkillPointsAvail); log(" Total Earned - "$SkillPointsTotal); log(""); log(" Skills:"); if (SkillSystem != None) { skill = SkillSystem.FirstSkill; while (skill != None) { if (skill.SkillName != "") log(" "$skill.SkillName$" - "$skill.skillLevelStrings[skill.CurrentLevel]); skill = skill.next; } } bHasAugs = False; log(""); log(" Augmentations:"); if (AugmentationSystem != None) { aug = AugmentationSystem.FirstAug; while (aug != None) { if (aug.bHasIt && (aug.AugmentationLocation != LOC_Default) && (aug.AugmentationName != "")) { bHasAugs = True; log(" "$aug.AugmentationName$" - Location: "$aug.AugLocsText[aug.AugmentationLocation]$" - Level: "$aug.CurrentLevel+1); } aug = aug.next; } } if (!bHasAugs) log(" None"); log(""); log("**** DXDumpInfo - END ****"); log(""); ClientMessage("Info dumped for user "$userName); } // ---------------------------------------------------------------------- // InvokeUIScreen() // // Calls DeusExRootWindow::InvokeUIScreen(), but first make sure // a modifier (Alt, Shift, Ctrl) key isn't being held down. // ---------------------------------------------------------------------- function InvokeUIScreen(Class<DeusExBaseWindow> windowClass) { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) { if ( root.IsKeyDown( IK_Alt ) || root.IsKeyDown( IK_Shift ) || root.IsKeyDown( IK_Ctrl )) return; //GMDX: stop lockpick and multitool cheat if (InHand!=None&&InHand.IsA('SkilledTool')&&(InHand.IsA('Lockpick')||InHand.IsA('MultiTool'))) { if (SkilledTool(InHand).IsInState('UseIt')) return; //just cant InvokeUIScreen :P } if (bRealUI || bHardCoreMode) root.InvokeUIScreen(windowClass,true); else root.InvokeUIScreen(windowClass); } } // ---------------------------------------------------------------------- // ResetConversationHistory() // // Clears any conversation history, used primarily when starting a // new game or travelling to new missions // ---------------------------------------------------------------------- function ResetConversationHistory() { if (conHistory != None) { CriticalDelete(conHistory); conHistory = None; } } // ====================================================================== // ====================================================================== // COLOR THEME MANAGER FUNCTIONS // ====================================================================== // ====================================================================== // ---------------------------------------------------------------------- // CreateThemeManager() // ---------------------------------------------------------------------- function CreateColorThemeManager() { if (ThemeManager == None) { ThemeManager = Spawn(Class'ColorThemeManager', Self); // Add all default themes. // Menus ThemeManager.AddTheme(Class'ColorThemeMenu_Default'); ThemeManager.AddTheme(Class'ColorThemeMenu_Custom1'); ThemeManager.AddTheme(Class'ColorThemeMenu_BlueAndGold'); ThemeManager.AddTheme(Class'ColorThemeMenu_CoolGreen'); ThemeManager.AddTheme(Class'ColorThemeMenu_Cops'); ThemeManager.AddTheme(Class'ColorThemeMenu_Cyan'); ThemeManager.AddTheme(Class'ColorThemeMenu_DesertStorm'); ThemeManager.AddTheme(Class'ColorThemeMenu_DriedBlood'); ThemeManager.AddTheme(Class'ColorThemeMenu_Dusk'); ThemeManager.AddTheme(Class'ColorThemeMenu_Earth'); ThemeManager.AddTheme(Class'ColorThemeMenu_Green'); ThemeManager.AddTheme(Class'ColorThemeMenu_Grey'); ThemeManager.AddTheme(Class'ColorThemeMenu_IonStorm'); ThemeManager.AddTheme(Class'ColorThemeMenu_Lava'); ThemeManager.AddTheme(Class'ColorThemeMenu_NightVision'); ThemeManager.AddTheme(Class'ColorThemeMenu_Ninja'); ThemeManager.AddTheme(Class'ColorThemeMenu_Olive'); ThemeManager.AddTheme(Class'ColorThemeMenu_PaleGreen'); ThemeManager.AddTheme(Class'ColorThemeMenu_Pastel'); ThemeManager.AddTheme(Class'ColorThemeMenu_Plasma'); ThemeManager.AddTheme(Class'ColorThemeMenu_Primaries'); ThemeManager.AddTheme(Class'ColorThemeMenu_Purple'); ThemeManager.AddTheme(Class'ColorThemeMenu_Red'); ThemeManager.AddTheme(Class'ColorThemeMenu_Seawater'); ThemeManager.AddTheme(Class'ColorThemeMenu_SoylentGreen'); ThemeManager.AddTheme(Class'ColorThemeMenu_Starlight'); ThemeManager.AddTheme(Class'ColorThemeMenu_Steel'); ThemeManager.AddTheme(Class'ColorThemeMenu_SteelGreen'); ThemeManager.AddTheme(Class'ColorThemeMenu_Superhero'); ThemeManager.AddTheme(Class'ColorThemeMenu_Terminator'); ThemeManager.AddTheme(Class'ColorThemeMenu_Violet'); // HUD ThemeManager.AddTheme(Class'ColorThemeHUD_Default'); ThemeManager.AddTheme(Class'ColorThemeHUD_Custom2'); ThemeManager.AddTheme(Class'ColorThemeHUD_Amber'); ThemeManager.AddTheme(Class'ColorThemeHUD_Cops'); ThemeManager.AddTheme(Class'ColorThemeHUD_Cyan'); ThemeManager.AddTheme(Class'ColorThemeHUD_DarkBlue'); ThemeManager.AddTheme(Class'ColorThemeHUD_DesertStorm'); ThemeManager.AddTheme(Class'ColorThemeHUD_DriedBlood'); ThemeManager.AddTheme(Class'ColorThemeHUD_Dusk'); ThemeManager.AddTheme(Class'ColorThemeHUD_Grey'); ThemeManager.AddTheme(Class'ColorThemeHUD_IonStorm'); ThemeManager.AddTheme(Class'ColorThemeHUD_NightVision'); ThemeManager.AddTheme(Class'ColorThemeHUD_Ninja'); ThemeManager.AddTheme(Class'ColorThemeHUD_PaleGreen'); ThemeManager.AddTheme(Class'ColorThemeHUD_Pastel'); ThemeManager.AddTheme(Class'ColorThemeHUD_Plasma'); ThemeManager.AddTheme(Class'ColorThemeHUD_Primaries'); ThemeManager.AddTheme(Class'ColorThemeHUD_Purple'); ThemeManager.AddTheme(Class'ColorThemeHUD_Red'); ThemeManager.AddTheme(Class'ColorThemeHUD_SoylentGreen'); ThemeManager.AddTheme(Class'ColorThemeHUD_Starlight'); ThemeManager.AddTheme(Class'ColorThemeHUD_SteelGreen'); ThemeManager.AddTheme(Class'ColorThemeHUD_Superhero'); ThemeManager.AddTheme(Class'ColorThemeHUD_Terminator'); ThemeManager.AddTheme(Class'ColorThemeHUD_Violet'); } } // ---------------------------------------------------------------------- // NextHUDColorTheme() // // Cycles to the next available HUD color theme and squirts out // a "StylesChanged" event. // ---------------------------------------------------------------------- exec function NextHUDColorTheme() { if (ThemeManager != None) { ThemeManager.NextHUDColorTheme(); DeusExRootWindow(rootWindow).ChangeStyle(); } } // ---------------------------------------------------------------------- // Cycles to the next available Menu color theme and squirts out // a "StylesChanged" event. // ---------------------------------------------------------------------- exec function NextMenuColorTheme() { if (ThemeManager != None) { ThemeManager.NextMenuColorTheme(); DeusExRootWindow(rootWindow).ChangeStyle(); } } // ---------------------------------------------------------------------- // SetHUDBordersVisible() // ---------------------------------------------------------------------- exec function SetHUDBordersVisible(bool bVisible) { bHUDBordersVisible = bVisible; } // ---------------------------------------------------------------------- // GetHUDBordersVisible() // ---------------------------------------------------------------------- function bool GetHUDBordersVisible() { return bHUDBordersVisible; } // ---------------------------------------------------------------------- // SetHUDBorderTranslucency() // ---------------------------------------------------------------------- exec function SetHUDBorderTranslucency(bool bNewTranslucency) { bHUDBordersTranslucent = bNewTranslucency; } // ---------------------------------------------------------------------- // GetHUDBorderTranslucency() // ---------------------------------------------------------------------- function bool GetHUDBorderTranslucency() { return bHUDBordersTranslucent; } // ---------------------------------------------------------------------- // SetHUDBackgroundTranslucency() // ---------------------------------------------------------------------- exec function SetHUDBackgroundTranslucency(bool bNewTranslucency) { bHUDBackgroundTranslucent = bNewTranslucency; } // ---------------------------------------------------------------------- // GetHUDBackgroundTranslucency() // ---------------------------------------------------------------------- function bool GetHUDBackgroundTranslucency() { return bHUDBackgroundTranslucent; } // ---------------------------------------------------------------------- // SetMenuTranslucency() // ---------------------------------------------------------------------- exec function SetMenuTranslucency(bool bNewTranslucency) { bMenusTranslucent = bNewTranslucency; } // ---------------------------------------------------------------------- // GetMenuTranslucency() // ---------------------------------------------------------------------- function bool GetMenuTranslucency() { return bMenusTranslucent; } // ---------------------------------------------------------------------- // DebugInfo test functions // ---------------------------------------------------------------------- exec function DebugCommand(string teststr) { if (!bCheatsEnabled) return; if (GlobalDebugObj == None) GlobalDebugObj = new(Self) class'DebugInfo'; if (GlobalDebugObj != None) GlobalDebugObj.Command(teststr); } exec function SetDebug(name cmd, name val) { if (!bCheatsEnabled) return; if (GlobalDebugObj == None) GlobalDebugObj = new(Self) class'DebugInfo'; Log("Want to setting Debug String " $ cmd $ " to " $ val); if (GlobalDebugObj != None) GlobalDebugObj.SetString(String(cmd),String(val)); } exec function GetDebug(name cmd) { local string temp; if (!bCheatsEnabled) return; if (GlobalDebugObj == None) GlobalDebugObj = new(Self) class'DebugInfo'; if (GlobalDebugObj != None) { temp=GlobalDebugObj.GetString(String(cmd)); Log("Debug String " $ cmd $ " has value " $ temp); } } exec function LogMsg(string msg) { Log(msg); } simulated event Destroyed() { if (GlobalDebugObj != None) CriticalDelete(GlobalDebugObj); ClearAugmentationDisplay(); if (Role == ROLE_Authority) CloseThisComputer(ActiveComputer); ActiveComputer = None; Super.Destroyed(); } // ---------------------------------------------------------------------- // Actor Location and Movement commands // ---------------------------------------------------------------------- exec function MoveActor(int xPos, int yPos, int zPos) { local Actor hitActor; local Vector hitLocation, hitNormal; local Vector position, line, newPos; if (!bCheatsEnabled) return; position = Location; position.Z += BaseEyeHeight; line = Vector(ViewRotation) * 4000; hitActor = Trace(hitLocation, hitNormal, position+line, position, true); if (hitActor != None) { newPos.x=xPos; newPos.y=yPos; newPos.z=zPos; // hitPawn = ScriptedPawn(hitActor); Log( "Trying to move " $ hitActor.Name $ " from " $ hitActor.Location $ " to " $ newPos); hitActor.SetLocation(newPos); Log( "Ended up at " $ hitActor.Location ); } } exec function WhereActor(optional int Me) { local Actor hitActor; local Vector hitLocation, hitNormal; local Vector position, line, newPos; if (!bCheatsEnabled) return; if (Me==1) hitActor=self; else { position = Location; position.Z += BaseEyeHeight; line = Vector(ViewRotation) * 4000; hitActor = Trace(hitLocation, hitNormal, position+line, position, true); } if (hitActor != None) { Log( hitActor.Name $ " is at " $ hitActor.Location ); BroadcastMessage( hitActor.Name $ " is at " $ hitActor.Location ); } } // ---------------------------------------------------------------------- // Easter egg functions // ---------------------------------------------------------------------- function Matrix() { if (Sprite == None) { Sprite = Texture(DynamicLoadObject("Extras.Matrix_A00", class'Texture')); ConsoleCommand("RMODE 6"); } else { Sprite = None; ConsoleCommand("RMODE 5"); } } exec function IAmWarren() { if (!bCheatsEnabled) return; if (!bWarrenEMPField) { bWarrenEMPField = true; WarrenTimer = 0; WarrenSlot = 0; ClientMessage("Warren's EMP Field activated"); // worry about localization? } else { bWarrenEMPField = false; ClientMessage("Warren's EMP Field deactivated"); // worry about localization? } } // ---------------------------------------------------------------------- // UsingChargedPickup // ---------------------------------------------------------------------- function bool UsingChargedPickup(class<ChargedPickup> itemclass) { local inventory CurrentItem; local bool bFound; bFound = false; for (CurrentItem = Inventory; ((CurrentItem != None) && (!bFound)); CurrentItem = CurrentItem.inventory) { if ((CurrentItem.class == itemclass) && (CurrentItem.bActive)) bFound = true; } return bFound; } // ---------------------------------------------------------------------- // MultiplayerSpecificFunctions // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- // ReceiveFirstOptionSync() // DEUS_EX AMSD I have to enumerate every 2#%#@%Ing argument??? // ---------------------------------------------------------------------- function ReceiveFirstOptionSync ( Name PrefZero, Name PrefOne, Name PrefTwo, Name PrefThree, Name PrefFour) { local int i; local Name AugPriority[5]; if (bFirstOptionsSynced == true) { return; } AugPriority[0] = PrefZero; AugPriority[1] = PrefOne; AugPriority[2] = PrefTwo; AugPriority[3] = PrefThree; AugPriority[4] = PrefFour; for (i = 0; ((i < ArrayCount(AugPrefs)) && (i < ArrayCount(AugPriority))); i++) { AugPrefs[i] = AugPriority[i]; } bFirstOptionsSynced = true; if (Role == ROLE_Authority) { if ((DeusExMPGame(Level.Game) != None) && (bSecondOptionsSynced)) { DeusExMPGame(Level.Game).SetupAbilities(self); } } } // ---------------------------------------------------------------------- // ReceiveSecondOptionSync() // DEUS_EX AMSD I have to enumerate every 2#%#@%Ing argument??? // ---------------------------------------------------------------------- function ReceiveSecondOptionSync ( Name PrefFive, Name PrefSix, Name PrefSeven, Name PrefEight) { local int i; local Name AugPriority[9]; if (bSecondOptionsSynced == true) { return; } AugPriority[5] = PrefFive; AugPriority[6] = PrefSix; AugPriority[7] = PrefSeven; AugPriority[8] = PrefEight; for (i = 5; ((i < ArrayCount(AugPrefs)) && (i < ArrayCount(AugPriority))); i++) { AugPrefs[i] = AugPriority[i]; } bSecondOptionsSynced = true; if (Role == ROLE_Authority) { if ((DeusExMPGame(Level.Game) != None) && (bFirstOptionsSynced)) { DeusExMPGame(Level.Game).SetupAbilities(self); } } } // ---------------------------------------------------------------------- // ClientPlayAnimation // ---------------------------------------------------------------------- simulated function ClientPlayAnimation( Actor src, Name anim, float rate, bool bLoop ) { if ( src != None ) { // if ( bLoop ) // src.LoopAnim(anim, ,rate); // else src.PlayAnim(anim, ,rate); } } // ---------------------------------------------------------------------- // ClientSpawnProjectile // ---------------------------------------------------------------------- simulated function ClientSpawnProjectile( class<projectile> ProjClass, Actor owner, Vector Start, Rotator AdjustedAim ) { local DeusExProjectile proj; proj = DeusExProjectile(Spawn(ProjClass, Owner,, Start, AdjustedAim)); if ( proj != None ) { proj.RemoteRole = ROLE_None; proj.Damage = 0; } } // ---------------------------------------------------------------------- // ClientSpawnHits // ---------------------------------------------------------------------- simulated function ClientSpawnHits( bool bPenetrating, bool bHandToHand, Vector HitLocation, Vector HitNormal, Actor Other, float Damage) { local TraceHitSpawner hitspawner; log("DX"); if (inHand.isA('WeaponNanoSword')) { class'TraceHitSpawner'.default.bForceBulletHole=true; log("NANO FOUND"); } if (bPenetrating) { if (bHandToHand) { hitspawner = Spawn(class'TraceHitHandSpawner',Other,,HitLocation,Rotator(HitNormal)); } else { hitspawner = Spawn(class'TraceHitSpawner',Other,,HitLocation,Rotator(HitNormal)); hitspawner.HitDamage = Damage; } } else { if (bHandToHand) { hitspawner = Spawn(class'TraceHitHandNonPenSpawner',Other,,HitLocation,Rotator(HitNormal)); if (IsInState('Dying')) hitspawner = none; //CyberP: death overrides melee attacks } else { hitspawner = Spawn(class'TraceHitNonPenSpawner',Other,,HitLocation,Rotator(HitNormal)); } } if (hitSpawner != None) { hitspawner.HitDamage = Damage; if (inHand.isA('WeaponNanoSword')) { log("From DXplayer"); hitSpawner.damageType='NanoSword'; } } } // ---------------------------------------------------------------------- // NintendoImmunityEffect() // ---------------------------------------------------------------------- function NintendoImmunityEffect( bool on ) { bNintendoImmunity = on; if (bNintendoImmunity) { NintendoImmunityTime = Level.Timeseconds + NintendoDelay; NintendoImmunityTimeLeft = NintendoDelay; } else NintendoImmunityTimeLeft = 0.0; } // ---------------------------------------------------------------------- // GetAugPriority() // Returns -1 if the player has the aug. // Returns 0-8 (0 being higher priority) for the aug priority. // If the player doesn't list the aug as a priority, returns the first // unoccupied slot num (9 if all are filled). // ---------------------------------------------------------------------- function int GetAugPriority( Augmentation AugToCheck) { local Name AugName; local int PriorityIndex; AugName = AugToCheck.Class.Name; if (AugToCheck.bHasIt) return -1; for (PriorityIndex = 0; PriorityIndex < ArrayCount(AugPrefs); PriorityIndex++) { if (AugPrefs[PriorityIndex] == AugName) { return PriorityIndex; } if (AugPrefs[PriorityIndex] == '') { return PriorityIndex; } } return PriorityIndex; } // ---------------------------------------------------------------------- // GrantAugs() // Grants augs in order of priority. // Sadly, we do this on the client because propagation of requested augs // takes so long. // ---------------------------------------------------------------------- function GrantAugs(int NumAugs) { local Augmentation CurrentAug; local int PriorityIndex; local int AugsLeft; if (Role < ROLE_Authority) return; AugsLeft = NumAugs; for (PriorityIndex = 0; PriorityIndex < ArrayCount(AugPrefs); PriorityIndex++) { if (AugsLeft <= 0) { return; } if (AugPrefs[PriorityIndex] == '') { return; } for (CurrentAug = AugmentationSystem.FirstAug; CurrentAug != None; CurrentAug = CurrentAug.next) { if ((CurrentAug.Class.Name == AugPrefs[PriorityIndex]) && (CurrentAug.bHasIt == False)) { AugmentationSystem.GivePlayerAugmentation(CurrentAug.Class); // Max out aug if (CurrentAug.bHasIt) CurrentAug.CurrentLevel = CurrentAug.MaxLevel; AugsLeft = AugsLeft - 1; } } } } // ------------------------------------------------------------------------ // GiveInitialInventory() // ------------------------------------------------------------------------ function GiveInitialInventory() { local Inventory anItem; // Give the player a pistol. // spawn it. if ((!Level.Game.IsA('DeusExMPGame')) || (DeusExMPGame(Level.Game).bStartWithPistol)) { anItem = Spawn(class'WeaponPistol'); // "frob" it for pickup. This will spawn a copy and give copy to player. anItem.Frob(Self,None); // Set it to be in belt (it will be the first inventory item) inventory.bInObjectBelt = True; // destroy original. anItem.Destroy(); // Give some starting ammo. anItem = Spawn(class'Ammo10mm'); DeusExAmmo(anItem).AmmoAmount=50; anItem.Frob(Self,None); anItem.Destroy(); } // Give the player a medkit. anItem = Spawn(class'MedKit'); anItem.Frob(Self,None); inventory.bInObjectBelt = True; anItem.Destroy(); // Give them a lockpick and a multitool so they can make choices with skills // when they come across electronics and locks anItem = Spawn(class'Lockpick'); anItem.Frob(Self,None); inventory.bInObjectBelt = True; anItem.Destroy(); anItem = Spawn(class'Multitool'); anItem.Frob(Self,None); inventory.bInObjectBelt = True; anItem.Destroy(); } // ---------------------------------------------------------------------- // MultiplayerTick() // Not the greatest name, handles single player ticks as well. Basically // anything tick style stuff that should be propagated to the server gets // propagated as this one function call. // ---------------------------------------------------------------------- function MultiplayerTick(float DeltaTime) { local int burnTime; local float augLevel; Super.MultiplayerTick(DeltaTime); //If we've just put away items, reset this. if ((LastInHand != InHand) && (Level.Netmode == NM_Client) && (inHand == None)) { ClientInHandPending = None; } LastInHand = InHand; if ((PlayerIsClient()) || (Level.NetMode == NM_ListenServer)) { if ((ShieldStatus != SS_Off) && (DamageShield == None)) DrawShield(); if ( (NintendoImmunityTimeLeft > 0.0) && ( InvulnSph == None )) DrawInvulnShield(); if (Style != STY_Translucent) CreateShadow(); else KillShadow(); } if (Role < ROLE_Authority) return; UpdateInHand(); UpdatePoison(DeltaTime); if (lastRefreshTime < 0) lastRefreshTime = 0; lastRefreshTime = lastRefreshTime + DeltaTime; if (bOnFire) { if ( Level.NetMode != NM_Standalone ) burnTime = Class'WeaponFlamethrower'.Default.mpBurnTime; else burnTime = Class'WeaponFlamethrower'.Default.BurnTime; burnTimer += deltaTime; if (burnTimer >= burnTime) ExtinguishFire(); } if (lastRefreshTime < 0.25) return; if (ShieldTimer > 0) ShieldTimer = ShieldTimer - lastRefreshTime; if (ShieldStatus == SS_Fade) ShieldStatus = SS_Off; if (ShieldTimer <= 0) { if (ShieldStatus == SS_Strong) ShieldStatus = SS_Fade; } // If we have a drone active (post-death etc) and we're not using the aug, kill it off augLevel = AugmentationSystem.GetAugLevelValue(class'AugDrone'); if (( aDrone != None ) && (augLevel == -1.0)) aDrone.TakeDamage(100, None, aDrone.Location, vect(0,0,0), 'EMP'); if ( Level.Timeseconds > ServerTimeLastRefresh ) { SetServerTimeDiff( Level.Timeseconds ); ServerTimeLastRefresh = Level.Timeseconds + 10.0; } MaintainEnergy(lastRefreshTime); UpdateTranslucency(lastRefreshTime); if ( bNintendoImmunity ) { NintendoImmunityTimeLeft = NintendoImmunityTime - Level.Timeseconds; if ( Level.Timeseconds > NintendoImmunityTime ) NintendoImmunityEffect( False ); } RepairInventory(); lastRefreshTime = 0; } // ---------------------------------------------------------------------- function ForceDroneOff() { local AugDrone anAug; anAug = AugDrone(AugmentationSystem.FindAugmentation(class'AugDrone')); //foreach AllActors(class'AugDrone', anAug) if (anAug != None) anAug.Deactivate(); } // ---------------------------------------------------------------------- // PlayerIsListenClient() // Returns True if the current player is the "client" playing ON the // listen server. // ---------------------------------------------------------------------- function bool PlayerIsListenClient() { return ((GetPlayerPawn() == Self) && (Level.NetMode == NM_ListenServer)); } // ---------------------------------------------------------------------- // PlayerIsRemoteClient() // Returns true if this player is the main player of this remote client // ----------------------------------------------------------------------- function bool PlayerIsRemoteClient() { return ((Level.NetMode == NM_Client) && (Role == ROLE_AutonomousProxy)); } // ---------------------------------------------------------------------- // PlayerIsClient() // Returns true if the current player is the "client" playing ON the // listen server OR a remote client // ---------------------------------------------------------------------- function bool PlayerIsClient() { return (PlayerIsListenClient() || PlayerIsRemoteClient()); } // ---------------------------------------------------------------------- // DrawShield() // ---------------------------------------------------------------------- simulated function DrawShield() { local ShieldEffect shield; if (DamageShield != None) { return; } shield = Spawn(class'ShieldEffect', Self,, Location, Rotation); if (shield != None) { shield.SetBase(Self); shield.RemoteRole = ROLE_None; shield.AttachedPlayer = Self; } DamageShield = shield; } // ---------------------------------------------------------------------- // DrawInvulnShield() // ---------------------------------------------------------------------- simulated function DrawInvulnShield() { if (( InvulnSph != None ) || (Level.NetMode == NM_Standalone)) return; InvulnSph = Spawn(class'InvulnSphere', Self, , Location, Rotation ); if ( InvulnSph != None ) { InvulnSph.SetBase( Self ); InvulnSph.RemoteRole = ROLE_None; InvulnSph.AttachedPlayer = Self; InvulnSph.LifeSpan = NintendoImmunityTimeLeft; } } // ---------------------------------------------------------------------- // CreatePlayerTracker() // ---------------------------------------------------------------------- simulated function CreatePlayerTracker() { local MPPlayerTrack PlayerTracker; PlayerTracker = Spawn(class'MPPlayerTrack'); PlayerTracker.AttachedPlayer = Self; } // ---------------------------------------------------------------------- // DisconnectPlayer() // ---------------------------------------------------------------------- exec function DisconnectPlayer() { if (DeusExRootWindow(rootWindow) != None) DeusExRootWindow(rootWindow).ClearWindowStack(); if (PlayerIsRemoteClient()) ConsoleCommand("disconnect"); if (PlayerIsListenClient()) ConsoleCommand("start dx.dx"); } exec function ShowPlayerPawnList() { local pawn curpawn; for (curpawn = level.pawnlist; curpawn != none; curpawn = curpawn.nextpawn) log("======>Pawn is "$curpawn); } // ---------------------------------------------------------------------- // KillShadow // ---------------------------------------------------------------------- simulated function KillShadow() { if (Shadow != None) Shadow.Destroy(); Shadow = None; } // ---------------------------------------------------------------------- // CreateShadow // ---------------------------------------------------------------------- simulated function CreateShadow() { if (Shadow == None) { Shadow = Spawn(class'Shadow', Self,, Location-vect(0,0,1)*CollisionHeight, rot(16384,0,0)); if (Shadow != None) { Shadow.RemoteRole = ROLE_None; } } } // ---------------------------------------------------------------------- // LocalLog // ---------------------------------------------------------------------- function LocalLog(String S) { if (( Player != None ) && ( Player.Console != None )) Player.Console.AddString(S); } // ---------------------------------------------------------------------- // ShowDemoSplash() // ---------------------------------------------------------------------- function ShowDemoSplash() { local DeusExRootWindow root; root = DeusExRootWindow(rootWindow); if (root != None) root.PushWindow(Class'DemoSplashWindow'); } // ---------------------------------------------------------------------- // VerifyConsole() // Verifies that console is Engine.Console. If you want something different, // override this in a subclassed player class. // ---------------------------------------------------------------------- function VerifyConsole(Class<Console> ConsoleClass) { local bool bCheckPassed; bCheckPassed = True; if (Player.Console == None) bCheckPassed = False; else if (Player.Console.Class != ConsoleClass) bCheckPassed = False; if (bCheckPassed == False) FailConsoleCheck(); } // ---------------------------------------------------------------------- // VerifyRootWindow() // Verifies that the root window is the right kind of root window, since // it can be changed in the ini // ---------------------------------------------------------------------- function VerifyRootWindow(Class<DeusExRootWindow> WindowClass) { local bool bCheckPassed; bCheckPassed = True; if (RootWindow == None) bCheckPassed = False; else if (RootWindow.Class != WindowClass) bCheckPassed = False; if (bCheckPassed == False) FailRootWindowCheck(); } // ---------------------------------------------------------------------- // FailRootWindowCheck() // ---------------------------------------------------------------------- function FailRootWindowCheck() { if (Level.Game.IsA('DeusExGameInfo')) DeusExGameInfo(Level.Game).FailRootWindowCheck(Self); } // ---------------------------------------------------------------------- // FailConsoleCheck() // ---------------------------------------------------------------------- function FailConsoleCheck() { if (Level.Game.IsA('DeusExGameInfo')) DeusExGameInfo(Level.Game).FailConsoleCheck(Self); } // ---------------------------------------------------------------------- // Possess() // ---------------------------------------------------------------------- event Possess() { Super.Possess(); if (Level.Netmode == NM_Client) { ClientPossessed(); } } // ---------------------------------------------------------------------- // ClientPossessed() // ---------------------------------------------------------------------- function ClientPossessed() { if (Level.Game.IsA('DeusExGameInfo')) DeusExGameInfo(Level.Game).ClientPlayerPossessed(Self); } // ---------------------------------------------------------------------- // ForceDisconnect // ---------------------------------------------------------------------- function ForceDisconnect(string Message) { player.Console.AddString(Message); DisconnectPlayer(); } /* //---------------------------------------------------------------------------- // dasraiser keybind move offset and rotations // exec function MyFovPos() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyFovPos(); } exec function MyFovNeg() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyFovNeg(); } exec function MyOfsetYPos() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetYPos(); } exec function MyOfsetXPos() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetXPos(); } exec function MyOfsetZPos() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetZPos(); } exec function MyOfsetYNeg() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetYNeg(); } exec function MyOfsetXNeg() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetXNeg(); } exec function MyOfsetZNeg() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetZNeg(); } exec function MyOfsetRollPlus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetRollPlus(); } exec function MyOfsetPitchPlus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetPitchPlus(); } exec function MyOfsetYawPlus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetYawPlus(); } exec function MyOfsetRollMinus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetRollMinus(); } exec function MyOfsetPitchMinus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetPitchMinus(); } exec function MyOfsetYawMinus() { if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyOfsetYawMinus(); } exec function MyLogInfos() { log("test"); if ((inHand!=none)&&(inHand.IsA('DeusExWeapon'))) DeusExWeapon(inHand).MyLogInfos(); } */ // ---------------------------------------------------------------------- // ---------------------------------------------------------------------- defaultproperties { TruePlayerName="JC Denton" CombatDifficulty=1.000000 SkillPointsTotal=5000 SkillPointsAvail=5000 Credits=500 Energy=100.000000 EnergyMax=100.000000 MaxRegenPoint=25.000000 RegenRate=1.500000 MaxFrobDistance=112.000000 maxInvRows=6 maxInvCols=5 bBeltIsMPInventory=True RunSilentValue=1.000000 ClotPeriod=30.000000 strStartMap="01_NYC_UNATCOIsland" bObjectNames=True bNPCHighlighting=True bSubtitles=True bAlwaysRun=True logTimeout=3.000000 maxLogLines=4 bHelpMessages=True bObjectBeltVisible=True bHitDisplayVisible=True bAmmoDisplayVisible=True bAugDisplayVisible=True bDisplayAmmoByClip=True bCompassVisible=True bCrosshairVisible=True bAutoReload=True bDisplayAllGoals=True bHUDShowAllAugs=True bShowAmmoDescriptions=True bConfirmSaveDeletes=True bConfirmNoteDeletes=True bAskedToTrain=True AugPrefs(0)=AugVision AugPrefs(1)=AugHealing AugPrefs(2)=AugSpeed AugPrefs(3)=AugDefense AugPrefs(4)=AugBallistic AugPrefs(5)=AugShield AugPrefs(6)=AugEMP AugPrefs(7)=AugStealth AugPrefs(8)=AugAqualung MenuThemeName="Default" HUDThemeName="Default" bHUDBordersVisible=True bHUDBordersTranslucent=True bHUDBackgroundTranslucent=True bMenusTranslucent=True InventoryFull="You don't have enough room in your inventory to pick up the %s" TooMuchAmmo="You already have enough of that type of ammo" TooHeavyToLift="It's too heavy to lift" CannotLift="You can't lift that" NoRoomToLift="There's no room to lift that" CanCarryOnlyOne="You can only carry one %s" CannotDropHere="Can't drop that here" HandsFull="Your hands are full" NoteAdded="Note Received - Check DataVault For Details" GoalAdded="Goal Received - Check DataVault For Details" PrimaryGoalCompleted="Primary Goal Completed" SecondaryGoalCompleted="Secondary Goal Completed" EnergyDepleted="Bio-electric energy reserves depleted" AddedNanoKey="%s added to Nano Key Ring" HealedPointsLabel="Healed %d points" HealedPointLabel="Healed %d point" SkillPointsAward="%d skill points awarded" QuickSaveGameTitle="Quick Save" WeaponUnCloak="Weapon drawn... Uncloaking" TakenOverString="I've taken over the " HeadString="Head" TorsoString="Torso" LegsString="Legs" WithTheString=" with the " WithString=" with " PoisonString=" with deadly poison" BurnString=" with excessive burning" NoneString="None" MPDamageMult=1.000000 bHDTP_JC=True bHDTP_Walton=True bHDTP_Anna=True bHDTP_UNATCO=True bHDTP_MJ12=True bHDTP_NSF=True bHDTP_RiotCop=True bHDTP_Gunther=True bHDTP_Paul=True bHDTP_Nico=True QuickSaveTotal=5 bTogAutoSave=True bColorCodedAmmo=True bDecap=True bAnimBar1=True bAnimBar2=True bRemoveVanillaDeath=True bHitmarkerOn=True bMantleOption=True fatty="You are full and cannot consume any more at this time" noUsing="You cannot use it at this time" customColorsMenu(0)=(B=255) customColorsMenu(1)=(G=49,B=255) customColorsMenu(2)=(R=210,G=194,B=255) customColorsMenu(3)=(R=77,G=77,B=78) customColorsMenu(4)=(R=207,G=207,B=207) customColorsMenu(5)=(R=255,G=255,B=192) customColorsMenu(6)=(R=86,G=38,B=24) customColorsMenu(7)=(R=206,G=206,B=202) customColorsMenu(8)=(R=204,G=198,B=201) customColorsMenu(9)=(R=255) customColorsMenu(10)=(G=255) customColorsMenu(11)=(R=255,G=64) customColorsMenu(12)=(G=255) customColorsMenu(13)=(R=128,G=128,B=128) customColorsHUD(0)=(R=32,G=32,B=32) customColorsHUD(1)=(R=217) customColorsHUD(2)=(R=128) customColorsHUD(3)=(R=167) customColorsHUD(4)=(R=167,G=164,B=164) customColorsHUD(5)=(R=255) customColorsHUD(6)=(R=112) customColorsHUD(7)=(R=204,G=202,B=204) customColorsHUD(8)=(R=169,G=171,B=171) customColorsHUD(9)=(R=201) customColorsHUD(10)=(R=255,G=255,B=255) customColorsHUD(11)=(B=86) customColorsHUD(12)=(R=255) customColorsHUD(13)=(R=128,G=128,B=128) LightLevelDisplay=-1 advBelt=1 RocketTargetMaxDistance=40000.000000 RecoilSimLimit=(X=7.000000,Y=16.000000,Z=7.000000) RecoilDrain=0.950000 RecoilTime=0.140000 bCanStrafe=True MeleeRange=50.000000 GroundSpeed=380.000000 AccelRate=2048.000000 FovAngle=75.000000 Intelligence=BRAINS_HUMAN AngularResolution=0.500000 Alliance=Player DrawType=DT_Mesh SoundVolume=64 RotationRate=(Pitch=3072,Yaw=65000,Roll=2048) BindName="JCDenton" FamiliarName="JC Denton" UnfamiliarName="JC Denton" }
비교하기