rott/kf_sources/KFMod/Classes/KFVoicePack.uc
2026-07-14 20:27:09 +07:00

644 lines
18 KiB
Ucode
Raw Permalink Blame History

//-----------------------------------------------------------
//
//-----------------------------------------------------------
class KFVoicePack extends xVoicePack;
var() SoundGroup SupportSound[20];
var() localized string SupportString[48];
var() localized string SupportAbbrev[48];
var() name SupportAnim[48];
var() int NumSupports;
var() SoundGroup AcknowledgmentSound[20];
var() localized string AcknowledgmentString[48];
var() localized string AcknowledgmentAbbrev[48];
var() name AcknowledgmentAnim[48];
var() int NumAcknowledgments;
var() SoundGroup AlertSound[20];
var() localized string AlertString[48];
var() localized string AlertAbbrev[48];
var() name AlertAnim[48];
var() int NumAlerts;
var() SoundGroup DirectionSound[20];
var() localized string DirectionString[48];
var() localized string DirectionAbbrev[48];
var() name DirectionAnim[48];
var() int NumDirections;
var() SoundGroup InsultSound[20];
var() localized string InsultString[48];
var() localized string InsultAbbrev[48];
var() name InsultAnim[48];
var() int NumInsults;
/*enum EKFAutoVoice
{
KFAV_Welding, // 0
KFAV_Unwelding,
KFAV_Reloading,
KFAV_OutOfAmmo,
KFAV_DropCash,
KFAV_Healing, // 5
KFAV_Dying,
KFAV_BloatPuking,
KFAV_PatriarchInvisible,
KFAV_PatriarchChainGun,
KFAV_PatriarchRockets, // 10
KFAV_GrabbedByClot,
KFAV_SpottedFleshpound,
KFAV_SpottedGorefast,
KFAV_SpottedScrake,
KFAV_SpottedSiren, // 15
KFAV_SirenAfterScream,
KFAV_StalkerUncloaks,
KFAV_SpottedCrawler,
KFAV_KilledStalkerMelee,
KFAV_EnemyBurnedToDeath, // 20
KFAV_SwitchToDBShotgun,
KFAV_SwitchToDualHandcannon,
KFAV_SwitchToLAW,
KFAV_SwitchToFireAxe
};*/
var() SoundGroup AutomaticSound[25];
/*enum EKFTraderVoice
{
KFTV_RadioMoving, // 0
KFTV_RadioAlmostOpen,
KFTV_RadioOpen,
KFTV_RadioLastWave,
KFTV_Radio30Seconds,
KFTV_Radio10Seconds, // 5
KFTV_RadioClosed,
KFTV_Welcome,
KFTV_NotEnoughMoney,
KFTV_TooHeavy,
KFTV_30Seconds, // 10
KFTV_10Seconds
};*/
var() SoundGroup TraderSound[12];
var() localized string TraderString[12];
var bool bTraderMessage;
var sound TraderRadioBeep;
var() byte ShoutVolume;
var() byte WhisperVolume;
var() float ShoutRadius;
var() float WhisperRadius;
var float unitWhisperDistance;
var float unitShoutDistance;
var name CurrentMessageType;
var bool bUseLocationalVoice;
var bool bIsFromDifferentTeam;
var Pawn PawnSender;
var vector SenderLoc;
static function PlayerSpeech(name Type, int Index, string Callsign, Actor PackOwner)
{
local vector myLoc;
if ( Controller(PackOwner).Pawn == none )
{
myLoc = PackOwner.Location;
}
else
{
myLoc = Controller(PackOwner).Pawn.Location;
}
Controller(PackOwner).SendVoiceMessage(Controller(PackOwner).PlayerReplicationInfo, none, Type, Index, 'GLOBAL', Controller(PackOwner).Pawn, myLoc);
}
function ClientInitializeLocational(PlayerReplicationInfo Sender,
PlayerReplicationInfo Recipient,
name MessageType, byte MessageIndex,
optional Pawn SoundSender, optional vector SenderLocation)
{
PawnSender = SoundSender;
SenderLoc = SenderLocation;
ClientInitialize(Sender, Recipient, MessageType, MessageIndex);
}
function ClientInitialize(PlayerReplicationInfo Sender,
PlayerReplicationInfo Recipient,
name MessageType, byte MessageIndex)
{
DelayedSender = Sender;
DisplayString = 0;
bDisplayPortrait = true;
PortraitPRI = Sender;
bDisplayNextMessage = bShowMessageText;
CurrentMessageType = MessageType;
if ( PlayerController(Owner).bNoVoiceMessages )
{
Destroy();
return;
}
else if ( KFPlayerController(Owner).AudioMessageLevel > 0 )
{
if ( MessageType == 'AUTO' )
{
if ( MessageIndex >= 7 || KFPlayerController(Owner).AudioMessageLevel > 1 )
{
return;
}
}
else if ( MessageType == 'TRADER' && KFPlayerController(Owner).AudioMessageLevel > 1 )
{
return;
}
}
SetTimer(0.6, false);
SetMessageByType(MessageType, MessageIndex, Recipient);
}
function SetMessageByType( name MessageType,
int MessageIndex,
PlayerReplicationInfo Recipient)
{
local Sound MessageSound;
if ( MessageType == 'TRADER' )
{
bTraderMessage = true;
SetClientTraderMessage(MessageIndex, Recipient, MessageSound);
}
else
{
bTraderMessage = false;
bUseLocationalVoice = false;
if ( MessageType == 'SUPPORT' )
{
SetClientSupportMessage(MessageIndex, Recipient, MessageSound);
}
else if ( MessageType == 'ACK' )
{
SetClientAcknowledgmentMessage(MessageIndex, Recipient, MessageSound);
}
else if ( MessageType == 'ALERT' )
{
SetClientAlertMessage(MessageIndex, Recipient, MessageSound);
}
else if ( MessageType == 'DIRECTION' )
{
SetClientDirectionMessage(MessageIndex, Recipient, MessageSound);
}
else if ( MessageType == 'INSULT' )
{
SetClientInsultMessage(MessageIndex, Recipient, MessageSound);
}
else if ( MessageType == 'AUTO' )
{
SetClientAutomaticMessage(MessageIndex, Recipient, MessageSound);
}
}
Phrase[0] = MessageSound;
PhraseString[0] = MessageString;
DisplayMessage[0] = DisplayString;
}
static function byte GetMessageIndex(name PhraseName)
{
log("Unknown message type used in GetMessageIndex call: " $ PhraseName);
return 255;
}
function SetClientSupportMessage(int MessageIndex, PlayerReplicationInfo Recipient, out Sound MessageSound)
{
MessageSound = SupportSound[MessageIndex];
MessageAnim = SupportAnim[MessageIndex];
MessageString = SupportString[MessageIndex];
}
function SetClientAcknowledgmentMessage(int MessageIndex, PlayerReplicationInfo Recipient, out Sound MessageSound)
{
MessageSound = AcknowledgmentSound[MessageIndex];
MessageAnim = AcknowledgmentAnim[MessageIndex];
MessageString = AcknowledgmentString[MessageIndex];
}
function SetClientAlertMessage(int MessageIndex, PlayerReplicationInfo Recipient, out Sound MessageSound)
{
MessageSound = AlertSound[MessageIndex];
MessageAnim = AlertAnim[MessageIndex];
MessageString = AlertString[MessageIndex];
}
function SetClientDirectionMessage(int MessageIndex, PlayerReplicationInfo Recipient, out Sound MessageSound)
{
MessageSound = DirectionSound[MessageIndex];
MessageAnim = DirectionAnim[MessageIndex];
MessageString = DirectionString[MessageIndex];
}
function SetClientInsultMessage(int MessageIndex, PlayerReplicationInfo Recipient, out Sound MessageSound)
{
MessageSound = InsultSound[MessageIndex];
MessageAnim = InsultAnim[MessageIndex];
MessageString = InsultString[MessageIndex];
}
function SetClientAutomaticMessage(int MessageIndex, PlayerReplicationInfo Recipient, out Sound MessageSound)
{
MessageSound = AutomaticSound[MessageIndex];
MessageAnim = '';
MessageString = "";
bUseLocationalVoice = true;
bDisplayPortrait = false;
}
function SetClientTraderMessage(int MessageIndex, PlayerReplicationInfo Recipient, out Sound MessageSound)
{
MessageSound = TraderSound[MessageIndex];
MessageAnim = '';
MessageString = TraderString[MessageIndex];
if ( MessageIndex > 6 )
{
bDisplayPortrait = false;
bUseLocationalVoice = true;
}
else
{
bUseLocationalVoice = false;
PlayerController(Owner).ViewTarget.DemoPlaySound(TraderRadioBeep, SLOT_Talk, 10.0, , , 1.1 / Level.TimeDilation);
}
}
//-----------------------------------------------------------------------------
// overrider timer to play time from the voicepack to give it locational
// sound
//-----------------------------------------------------------------------------
function string getClientParsedMessage()
{
return ClientParseMessageString(DelayedSender, PhraseString[PhraseNum]);
}
function Timer()
{
local PlayerController PlayerOwner;
local Actor soundPlayer;
PlayerOwner = PlayerController(Owner);
if ( bDisplayPortrait && PhraseNum == 0 )
{
if ( bTraderMessage )
{
HUDKillingFloor(PlayerController(Owner).myHUD).DisplayTraderPortrait();
}
else
{
PlayerController(Owner).myHUD.DisplayPortrait(PortraitPRI);
}
}
if ( bTraderMessage )
{
if ( bUseLocationalVoice )
{
if ( PawnSender != none )
{
PawnSender.DemoPlaySound(Phrase[PhraseNum], SLOT_None, ShoutVolume, true, , 1.1 / Level.TimeDilation, false);
}
}
else
{
if ( (PlayerOwner.ViewTarget != None) )
{
PlayerOwner.ViewTarget.DemoPlaySound(Phrase[PhraseNum], SLOT_Interface,ShoutVolume, true, , 1.1 / Level.TimeDilation, false);
}
else
{
PlayerOwner.DemoPlaySound(Phrase[PhraseNum], SLOT_Interface,ShoutVolume, true, , 1.1 / Level.TimeDilation, false);
}
}
}
else if ( Phrase[PhraseNum] != None &&
(Level.TimeSeconds - PlayerOwner.LastPlaySpeech > 2 || PhraseNum > 0) )
{
PlayerOwner.LastPlaySpeech = Level.TimeSeconds;
if ( bUseLocationalVoice )
{
if ( PawnSender != none )
{
PawnSender.DemoPlaySound(Phrase[PhraseNum], SLOT_None,ShoutVolume,,,1.0,false);
}
else
{
soundPlayer = Spawn(Class'ROVoiceMessageEffect',,, SenderLoc);
if (soundPlayer != none)
soundPlayer.DemoPlaySound(Phrase[PhraseNum], SLOT_None,ShoutVolume,,,1.0,false);
else
warn("Unable to spawn ROVoiceMessageEffect at " $ SenderLoc $ "!");
}
}
else
{
if ( (PlayerOwner.ViewTarget != None) )
{
PlayerOwner.ViewTarget.DemoPlaySound(Phrase[PhraseNum], SLOT_Interface,ShoutVolume,,,1.0,false);
}
else
{
PlayerOwner.DemoPlaySound(Phrase[PhraseNum], SLOT_Interface,ShoutVolume,,,1.0,false);
}
}
if (MessageAnim != '')
{
UnrealPlayer(PlayerOwner).Taunt(MessageAnim);
}
if ( Phrase[PhraseNum+1] == None )
Destroy();
else
{
// I don't think we ever get here in RO, but log it just in case. We're
// trying to cut down on sound packs that need to be loaded on the server
if( GetSoundDuration(Phrase[PhraseNum]) == 0 )
{
log("ROVoicePack Setting the timer for a sound to zero");
}
SetTimer(FMax(0.1,GetSoundDuration(Phrase[PhraseNum])), false);
PhraseNum++;
}
}
else
Destroy();
}
static function GetAllSupports(out array<string> CmdArray)
{
local int i;
CmdArray.Length = 0;
for ( i = 0; i < default.NumSupports; i++ )
{
if ( default.SupportAbbrev[i] != "" )
{
CmdArray[CmdArray.Length] = default.SupportAbbrev[i];
}
else if ( default.SupportString[i] != "" )
{
CmdArray[CmdArray.Length] = default.SupportString[i];
}
else
{
break;
}
}
}
static function GetAllAcknowledgments(out array<string> CmdArray)
{
local int i;
CmdArray.Length = 0;
for ( i = 0; i < default.NumAcknowledgments; i++ )
{
if ( default.AcknowledgmentAbbrev[i] != "" )
{
CmdArray[CmdArray.Length] = default.AcknowledgmentAbbrev[i];
}
else if ( default.AcknowledgmentString[i] != "" )
{
CmdArray[CmdArray.Length] = default.AcknowledgmentString[i];
}
else
{
break;
}
}
}
static function GetAllAlerts(out array<string> CmdArray)
{
local int i;
CmdArray.Length = 0;
for ( i = 0; i < default.NumAlerts; i++ )
{
if ( default.AlertAbbrev[i] != "" )
{
CmdArray[CmdArray.Length] = default.AlertAbbrev[i];
}
else if ( default.AlertString[i] != "" )
{
CmdArray[CmdArray.Length] = default.AlertString[i];
}
else
{
break;
}
}
}
static function GetAllDirections(out array<string> CmdArray)
{
local int i;
CmdArray.Length = 0;
for ( i = 0; i < default.NumDirections; i++ )
{
if ( default.DirectionAbbrev[i] != "" )
{
CmdArray[CmdArray.Length] = default.DirectionAbbrev[i];
}
else if ( default.DirectionString[i] != "" )
{
CmdArray[CmdArray.Length] = default.DirectionString[i];
}
else
{
break;
}
}
}
static function GetAllInsults(out array<string> CmdArray)
{
local int i;
CmdArray.Length = 0;
for ( i = 0; i < default.NumInsults; i++ )
{
if ( default.InsultAbbrev[i] != "" )
{
CmdArray[CmdArray.Length] = default.InsultAbbrev[i];
}
else if ( default.InsultString[i] != "" )
{
CmdArray[CmdArray.Length] = default.InsultString[i];
}
else
{
break;
}
}
}
defaultproperties
{
bHidden=true
NumSupports=4
SupportAbbrev(0)="Medic"
SupportAbbrev(1)="Help"
SupportAbbrev(2)="I need some money"
SupportAbbrev(3)="Drop a weapon for me"
SupportString(0)="Medic!"
SupportString(1)="Help!"
SupportString(2)="I need some money"
SupportString(3)="Drop a weapon for me"
SupportSound(0)=Sound'KF_MaleVoiceOne.SUPPORT.MEDIC'
SupportSound(1)=Sound'KF_MaleVoiceOne.SUPPORT.Help'
SupportSound(2)=Sound'KF_MaleVoiceOne.SUPPORT.Need_Money'
SupportSound(3)=Sound'KF_MaleVoiceOne.SUPPORT.Drop_Weapon'
NumAcknowledgments=4
AcknowledgmentAbbrev(0)="Yes"
AcknowledgmentAbbrev(1)="No"
AcknowledgmentAbbrev(2)="Thanks"
AcknowledgmentAbbrev(3)="Sorry"
AcknowledgmentString(0)="Yes"
AcknowledgmentString(1)="No"
AcknowledgmentString(2)="Thanks!"
AcknowledgmentString(3)="Sorry!"
AcknowledgmentSound(0)=Sound'KF_MaleVoiceOne.Acknowledgments.Yes'
AcknowledgmentSound(1)=Sound'KF_MaleVoiceOne.Acknowledgments.No'
AcknowledgmentSound(2)=Sound'KF_MaleVoiceOne.Acknowledgments.Thanks'
AcknowledgmentSound(3)=Sound'KF_MaleVoiceOne.Acknowledgments.sorry'
NumAlerts=6
AlertAbbrev(0)="Look out"
AlertAbbrev(1)="Run"
AlertAbbrev(2)="Wait for me"
AlertAbbrev(3)="Weld the doors"
AlertAbbrev(4)="Lets hole up here"
AlertAbbrev(5)="Follow me"
AlertString(0)="Look out!"
AlertString(1)="RUN!"
AlertString(2)="Wait for me!"
AlertString(3)="Weld the doors"
AlertString(4)="Lets hole up here!"
AlertString(5)="Follow me"
AlertSound(0)=Sound'KF_MaleVoiceOne.Alerts.Look_Out'
AlertSound(1)=Sound'KF_MaleVoiceOne.Alerts.Run'
AlertSound(2)=Sound'KF_MaleVoiceOne.Alerts.Wait_for_me'
AlertSound(3)=Sound'KF_MaleVoiceOne.Alerts.Weld_the_doors'
AlertSound(4)=Sound'KF_MaleVoiceOne.Alerts.Hole_Up'
AlertSound(5)=Sound'KF_MaleVoiceOne.Alerts.Follow_Me'
NumDirections=5
DirectionAbbrev(0)="Get to the Trader"
DirectionAbbrev(1)="Go Upstairs"
DirectionAbbrev(2)="Head Downstairs"
DirectionAbbrev(3)="Get Inside"
DirectionAbbrev(4)="Go Outside"
DirectionString(0)="Get to the Trader"
DirectionString(1)="Go Upstairs"
DirectionString(2)="Head Downstairs"
DirectionString(3)="Get Inside"
DirectionString(4)="Go Outside"
DirectionSound(0)=Sound'KF_MaleVoiceOne.Directions.Get_to_the_trader'
DirectionSound(1)=Sound'KF_MaleVoiceOne.Directions.Go_upstairs'
DirectionSound(2)=Sound'KF_MaleVoiceOne.Directions.Head_downstairs'
DirectionSound(3)=Sound'KF_MaleVoiceOne.Directions.Get_inside'
DirectionSound(4)=Sound'KF_MaleVoiceOne.Directions.Go_outside'
NumInsults=2
InsultAbbrev(0)="Insult Specimens"
InsultAbbrev(1)="Insult Players"
InsultString(0)="Insult Specimens"
InsultString(1)="Insult Players"
InsultSound(0)=Sound'KF_MaleVoiceOne.INSULT.Insult_Specimens'
InsultSound(1)=Sound'KF_MaleVoiceOne.INSULT.Insult_players'
AutomaticSound(0)=Sound'KF_MaleVoiceOne.Automatic_Commands.Auto_Welding'
AutomaticSound(1)=Sound'KF_MaleVoiceOne.Automatic_Commands.Auto_Unwelding'
AutomaticSound(2)=Sound'KF_MaleVoiceOne.Automatic_Commands.Auto_Reloading'
AutomaticSound(3)=Sound'KF_MaleVoiceOne.Automatic_Commands.Auto_Out_of_Ammo'
AutomaticSound(4)=Sound'KF_MaleVoiceOne.Automatic_Commands.Auto_Drop_Cash'
AutomaticSound(5)=Sound'KF_MaleVoiceOne.Automatic_Commands.Auto_Healing'
AutomaticSound(6)=Sound'KF_MaleVoiceOne.Automatic_Commands.Auto_Dying'
AutomaticSound(7)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.BloatPuking'
AutomaticSound(8)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.PatriarchInvisible'
AutomaticSound(9)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.PatriarchChainGun'
AutomaticSound(10)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.PatriarchRockets'
AutomaticSound(11)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.GrabbedByClot'
AutomaticSound(12)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SpottedFleshpound'
AutomaticSound(13)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SpottedGorefast'
AutomaticSound(14)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SpottedScrake'
AutomaticSound(15)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SpottedSiren'
AutomaticSound(16)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SirenAfterScream'
AutomaticSound(17)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.StalkerUncloaks'
AutomaticSound(18)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SpottedCrawler'
AutomaticSound(19)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.KilledStalkerMelee'
AutomaticSound(20)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.EnemyBurnedToDeath'
AutomaticSound(21)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SwitchToDBShotgun'
AutomaticSound(22)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SwitchToDualHandcannon'
AutomaticSound(23)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SwitchToLAW'
AutomaticSound(24)=Sound'KF_MaleVoiceOne.Fun_Auto_Commands.SwitchToAxe'
TraderString(0)="Watch the arrow - check where the shop is!"
TraderString(1)="Make sure you are close to the shop when you finish them off"
TraderString(2)="The shop is now open for business!"
TraderString(3)="Shop's open, last chance to stock up before the Patriarch!"
TraderString(4)="30 seconds before the shop shuts!"
TraderString(5)="10 seconds left!"
TraderString(6)="The shop is now CLOSED until you've cleared the next wave!"
TraderString(7)="Welcome to the shop <20> sell what you've got, Buy Bigger Guns!"
TraderString(8)="You can't afford that <20> pick something cheaper, or sell something first!"
TraderString(9)="That is too heavy for you <20> pick something smaller, or sell something!"
TraderString(10)="30 seconds before the shop shuts!"
TraderString(11)="10 seconds left!"
TraderSound(0)=Sound'KF_Trader.Radio_Moving'
TraderSound(1)=Sound'KF_Trader.Radio_AlmostOpen'
TraderSound(2)=Sound'KF_Trader.Radio_ShopsOpen'
TraderSound(3)=Sound'KF_Trader.Radio_LastWave'
TraderSound(4)=Sound'KF_Trader.Radio_ThirtySeconds'
TraderSound(5)=Sound'KF_Trader.Radio_TenSeconds'
TraderSound(6)=Sound'KF_Trader.Radio_Closed'
TraderSound(7)=Sound'KF_Trader.Welcome'
TraderSound(8)=Sound'KF_Trader.TooExpensive'
TraderSound(9)=Sound'KF_Trader.TooHeavy'
TraderSound(10)=Sound'KF_Trader.ThirtySeconds'
TraderSound(11)=Sound'KF_Trader.TenSeconds'
TraderRadioBeep=Sound'KF_Trader.Walkie_Beep'
ShoutVolume=2.0
WhisperVolume=1
unitWhisperDistance=512.0
unitShoutDistance=4096.0
ShoutRadius=409.6
WhisperRadius=25.6
bUseLocationalVoice=false
}