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

288 lines
11 KiB
Ucode

//==============================================================================
// Contains information about the existing voice chat channels on the server.
// This class is simply a placeholder for the VoiceReplicationInfo, and should
// be implemented in a multi-player capable subclass.
//
// Created by Ron Prestenback
// © 2003, Epic Games, Inc. All Rights Reserved
//==============================================================================
class VoiceChatReplicationInfo extends ReplicationInfo
config
abstract
notplaceable
native
nativereplication;
cpptext
{
INT* GetOptimizedRepList( BYTE* InDefault, FPropertyRetirement* Retire, INT* Ptr, UPackageMap* Map, UActorChannel* Channel );
}
const NUMPROPS = 6;
struct native VoiceChatCodec
{
var string Codec;
var localized string CodecName;
var localized string CodecDescription;
};
var int PublicMask, LocalMask;
// Array of chatroom channels
var protected array<VoiceChatRoom> Channels;
var localized array<string> PublicChannelNames;
var localized string VCDisplayText[NUMPROPS], VCDescText[NUMPROPS];
var GameReplicationInfo GRI;
var class<VoiceChatRoom> ChatRoomClass;
var array<VoiceChatCodec> InstalledCodec;
var globalconfig array<string> VoIPInternetCodecs;
var globalconfig array<string> VoIPLANCodecs;
var globalconfig bool bEnableVoiceChat; // Whether voice over IP is enabled on this server
var globalconfig bool bAllowLocalBroadcast; // Whether this server allows local channels
var globalconfig int MaxChatters; // Max number of chatters allowed in a chatroom (0 - unlimited)
var int DefaultChannel; // Channel that should be the default active channel for incoming clients that don't specify a default active channel
var globalconfig float LocalBroadcastRange; // Maximum distance a local broadcast can be heard
var globalconfig float DefaultBroadcastRadius; // Distance at which broadcast volume begins to fade
var float BroadcastRadius;
var bool bPrivateChat; // Set by UnrealMPGameInfo.InitVoiceReplicationInfo()
var bool bRefresh; // Indicates a chat room has destroyed itself
replication
{
reliable if ( Role == ROLE_Authority && bNetInitial )
bEnableVoiceChat;
reliable if ( Role == ROLE_Authority && bNetInitial && bEnableVoiceChat )
bPrivateChat;
reliable if ( Role == ROLE_Authority && bNetInitial && bEnableVoiceChat && bAllowLocalBroadcast )
BroadcastRadius;
reliable if ( Role == ROLE_Authority && bNetDirty && bEnableVoiceChat )
PublicMask, LocalMask;
reliable if ( Role == ROLE_Authority && (bNetInitial || bNetDirty) && bEnableVoiceChat )
DefaultChannel;
}
event Timer()
{
// One of our channels has destroyed itself
if (bRefresh)
CheckChannels();
}
event PostBeginPlay()
{
Super.PostBeginPlay();
if ( bAllowLocalBroadcast )
BroadcastRadius = FMin(LocalBroadcastRange, FClamp(DefaultBroadcastRadius, 10, 1000));
}
simulated event PostNetBeginPlay()
{
// Initialize all public channels.
if ( bEnableVoiceChat )
{
InitChannels();
SetTimer(1.0, True);
}
}
simulated function InitChannels();
// This is called when a new player has logged into the server.
simulated function AddVoiceChatter(PlayerReplicationInfo NewPRI);
// Called when a player logs out
simulated function RemoveVoiceChatter(PlayerReplicationInfo PRI);
// Used to prescreen whether 'PRI' would be allowed to join channel with title 'ChannelTitle'
simulated function bool CanJoinChannel(string ChannelTitle, PlayerReplicationInfo PRI) { return true; }
// Joins / Leaves
// Called when player requests to join channel
function VoiceChatRoom.EJoinChatResult JoinChannel(string ChannelTitle, PlayerReplicationInfo PRI, string Password) { return JCR_Invalid; }
function VoiceChatRoom.EJoinChatResult JoinChannelAt(int ChannelIndex, PlayerReplicationInfo PRI, string Password) { return JCR_Invalid; }
// Called when player leaves channel
function bool LeaveChannel(string ChannelTitle, PlayerReplicationInfo PRI) { return true; }
// Channel management
simulated function VoiceChatRoom AddVoiceChannel(optional PlayerReplicationInfo PRI) { return None; }
simulated function bool RemoveVoiceChannel(PlayerReplicationInfo PRI) { return true; }
// Called on all voice channels when a player switches teams. Disregarded by voice channel if TeamIndex doesn't match channel's teamindex
simulated function NotifyTeamChange(PlayerReplicationInfo PRI, int TeamIndex);
// Query Functions
simulated event int GetChannelCount() { return 0; }
simulated event int GetChannelIndex(string ChannelTitle, optional int TeamIndex) { return -1; }
simulated function VoiceChatRoom GetChannel(string ChatRoomName, optional int TeamIndex) { return None; }
simulated function VoiceChatRoom GetChannelAt(int Index) { return None; }
// Returns a list of members in the specified channel
simulated function array<int> GetChannelMembers(string ChatRoomName, optional int TeamIndex);
simulated function array<int> GetChannelMembersAt(int Index);
// Returns a list of channels that the specified player is a member of
simulated function array<int> GetMemberChannels( PlayerReplicationInfo PRI );
simulated function string GetDefaultChannel()
{
return PublicChannelNames[Clamp(DefaultChannel,0,PublicChannelNames.Length - 1)];
}
simulated function array<VoiceChatRoom> GetChannels();
simulated function array<VoiceChatRoom> GetPublicChannels();
simulated function array<VoiceChatRoom> GetPlayerChannels();
simulated function int GetPublicChannelCount(optional bool bSingleTeam);
simulated function int GetPlayerChannelCount();
// Returns whether 'TestPRI' is a member of this channel. If bNoCacade is false, will return true if player is member of child channels
simulated function bool IsMember(PlayerReplicationInfo TestPRI, int ChannelIndex, optional bool bNoCascade) { return false; }
// Internal functions
simulated protected function VoiceChatRoom CreateNewVoiceChannel(optional PlayerReplicationInfo PRI) { return None; }
// Called from RemoveVoiceChatter()
simulated protected function DestroyVoiceChannel(VoiceChatRoom Channel);
simulated private function CheckChannels()
{
local int i;
for (i = Channels.Length - 1; i >= 0; i--)
if (Channels[i] == None)
Channels.Remove(i,1);
bRefresh = False;
}
static function FillPlayInfo( PlayInfo PlayInfo )
{
Super.FillPlayInfo( PlayInfo );
PlayInfo.AddSetting( default.ChatGroup, "bEnableVoiceChat", default.VCDisplayText[0], 250, 1, "Check", , "Xv", True, True);
PlayInfo.AddSetting( default.ChatGroup, "bAllowLocalBroadcast", default.VCDisplayText[1], 250, 1, "Check", , "Xv", True, True);
PlayInfo.AddSetting( default.ChatGroup, "LocalBroadcastRange", default.VCDisplayText[2], 100, 1, "Text", "4;10:3000", "Xv", True, True);
PlayInfo.AddSetting( default.ChatGroup, "DefaultBroadcastRadius", default.VCDisplayText[3], 100, 1, "Text", "4;10:1000", "Xv", True, True);
PlayInfo.AddSetting( default.ChatGroup, "VoIPInternetCodecs", default.VCDisplayText[4], 254, 1, "Text", , "Xv", True, True);
PlayInfo.AddSetting( default.ChatGroup, "VoIPLANCodecs", default.VCDisplayText[5], 254, 1, "Text", , "Xv", True, True);
}
static event string GetDescriptionText( string PropName )
{
switch ( PropName )
{
case "bEnableVoiceChat": return default.VCDescText[0];
case "bAllowLocalBroadcast": return default.VCDescText[1];
case "LocalBroadcastRange": return default.VCDescText[2];
case "DefaultBroadcastRadius": return default.VCDescText[3];
case "VoIPInternetCodecs": return default.VCDescText[4];
case "VoIPLANCodecs": return default.VCDescText[5];
}
return Super.GetDescriptionText(PropName);
}
static function GetInstalledCodecs( out array<string> Codecs )
{
local int i;
Codecs.Length = default.InstalledCodec.Length;
for ( i = 0; i < default.InstalledCodec.Length; i++ )
Codecs[i] = default.InstalledCodec[i].Codec;
}
static function bool GetCodecInfo( string Codec, out string CodecName, out string CodecDescription )
{
local int i;
for ( i = 0; i < default.InstalledCodec.Length; i++ )
{
if ( Codec ~= default.InstalledCodec[i].Codec )
{
CodecName = default.InstalledCodec[i].CodecName;
CodecDescription = default.InstalledCodec[i].CodecDescription;
return true;
}
}
return false;
}
simulated function bool ValidRoom( VoiceChatRoom Room )
{
return bEnableVoiceChat && Room != None && Room.ChannelIndex < 2 && Room.Owner == Self;
}
function SetMask( VoiceChatRoom Room, int NewMask )
{
if ( !ValidRoom(Room) )
return;
if ( Room.ChannelIndex == 0 )
PublicMask = NewMask;
else if ( Room.ChannelIndex == 1 )
LocalMask = NewMask;
}
simulated function int GetMask( VoiceChatRoom Room )
{
if ( !ValidRoom(Room) )
return 0;
if ( Room.ChannelIndex == 0 )
return PublicMask;
if ( Room.ChannelIndex == 1 )
return LocalMask;
return 0;
}
simulated function string GetTitle( VoiceChatRoom Room )
{
if ( !ValidRoom(Room) )
return "";
return PublicChannelNames[Room.ChannelIndex];
}
DefaultProperties
{
NetPriority=3.001
ChatRoomClass=class'Engine.VoiceChatRoom'
PublicChannelNames(0)="Public"
PublicChannelNames(1)="Local"
InstalledCodec[0]=(Codec="CODEC_48NB",CodecName="Less Bandwidth",CodecDescription="(4.8kbps) - Uses less bandwidth, but sound is not as clear.")
InstalledCodec[1]=(Codec="CODEC_96WB",CodecName="Better Quality",CodecDescription="(9.6kbps) - Uses more bandwidth, but sound is much clearer.")
VCDisplayText[0]="Enable Voice Chat"
VCDisplayText[1]="Enable local Channel"
VCDisplayText[2]="Local Chat Range"
VCDisplayText[3]="Local Chat Radius"
VCDisplayText[4]="Allowed VoIP Codecs"
VCDisplayText[5]="Allowed VoIP LAN Codecs"
VCDescText[0]="Enable voice chat on the server."
VCDescText[1]="Determines whether the \"local\" voice chat channel is created, which allows players to broadcast voice transmissions to all players in the immediate vicinity."
VCDescText[2]="Maximum distance at which a broadcast on the local channel may be heard"
VCDescText[3]="Distance at which local broadcasts begin to fade"
VCDescText[4]="Configure which codecs exist on the server and should be used in Internet games."
VCDescText[5]="Configure which codecs exist on the server and should be used in LAN games."
bEnableVoiceChat=True
bAllowLocalBroadcast=True
LocalBroadcastRange=1000
DefaultBroadcastRadius=20
VoIPInternetCodecs[0]="CODEC_48NB"
VoIPLANCodecs[0]="CODEC_48NB"
VoIPLANCodecs[1]="CODEC_96WB"
}