mirror of
https://github.com/Ragora/T2-BoL.git
synced 2026-01-19 19:14:45 +00:00
234 lines
6.8 KiB
C#
234 lines
6.8 KiB
C#
//------------------------------------------------------------------------------
|
|
//
|
|
// chatMenuHud.cs
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
|
|
if ( isFile( "prefs/customVoiceBinds.cs" ) )
|
|
$defaultVoiceBinds = false;
|
|
else
|
|
$defaultVoiceBinds = true;
|
|
|
|
// Load in all of the installed chat items:
|
|
exec( "scripts/cannedChatItems.cs" );
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Chat menu loading function:
|
|
new SimSet( ChatMenuList ); // Store all of the chat menu maps here so that we can delete them later:
|
|
function activateChatMenu( %filename )
|
|
{
|
|
if ( isFile( %filename ) || isFile( %filename @ ".dso" ) )
|
|
{
|
|
// Clear the old chat menu:
|
|
ChatMenuList.clear();
|
|
|
|
// Create the root of the new menu:
|
|
$RootChatMenu = new ActionMap();
|
|
ChatMenuList.add( $RootChatMenu );
|
|
$CurrentChatMenu = $RootChatMenu;
|
|
$CurrentChatMenu.optionCount = 0;
|
|
$CurrentChatMenu.bindCmd(keyboard, escape, "cancelChatMenu();", "");
|
|
|
|
// Build the new chat menu:
|
|
exec( %filename );
|
|
}
|
|
else
|
|
error( "Chat menu file \"" @ %filename @ "\" not found!" );
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Chat menu building functions:
|
|
function startChatMenu(%heading)
|
|
{
|
|
%key = firstWord(%heading);
|
|
%text = restWords(%heading);
|
|
%menu = new ActionMap();
|
|
ChatMenuList.add( %menu );
|
|
%cm = $CurrentChatMenu;
|
|
%cm.bindCmd(keyboard, %key, "setChatMenu(\"" @ %text @ "\", " @ %menu @ ");", "");
|
|
%cm.option[%cm.optionCount] = %key @ ": " @ %text;
|
|
%cm.command[%cm.optionCount] = %menu; // Save this off here for later...
|
|
%cm.isMenu[%cm.optionCount] = 1;
|
|
%cm.optionCount++;
|
|
%menu.parent = %cm;
|
|
%menu.bindCmd(keyboard, escape, "cancelChatMenu();", "");
|
|
%menu.optionCount = 0;
|
|
$CurrentChatMenu = %menu;
|
|
}
|
|
|
|
function endChatMenu()
|
|
{
|
|
$CurrentChatMenu = $CurrentChatMenu.parent;
|
|
}
|
|
|
|
function addChat(%keyDesc, %command)
|
|
{
|
|
%key = firstWord(%keyDesc);
|
|
%text = restWords(%keyDesc);
|
|
%cm = $CurrentChatMenu;
|
|
%cm.bindCmd(keyboard, %key, "issueChatCmd(" @ %cm @ "," @ %cm.optionCount @ ");", "");
|
|
%cm.option[%cm.optionCount] = %key @ ": " @ %text;
|
|
%cm.command[%cm.optionCount] = %command;
|
|
%cm.isMenu[%cm.optionCount] = 0;
|
|
%cm.optionCount++;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Chat menu hud functions:
|
|
$ChatMenuHudLineCount = 0;
|
|
function activateChatMenuHud( %make )
|
|
{
|
|
if(%make && !TaskHudDlg.isVisible())
|
|
showChatMenuHud();
|
|
}
|
|
|
|
function showChatMenuHud()
|
|
{
|
|
Canvas.pushDialog(ChatMenuHudDlg);
|
|
ChatMenuHudDlg.setVisible(true);
|
|
setChatMenu(Root, $RootChatMenu);
|
|
}
|
|
|
|
function cancelChatMenu()
|
|
{
|
|
$CurrentChatMenu.pop();
|
|
$CurrentChatMenu = $RootChatMenu;
|
|
Canvas.popDialog(ChatMenuHudDlg);
|
|
ChatMenuHudDlg.setVisible(false);
|
|
}
|
|
|
|
function setChatMenu( %name, %menu )
|
|
{
|
|
for ( %i = 0; %i < $ChatMenuHudLineCount; %i++ )
|
|
chatMenuHud.remove( $ChatMenuHudText[%i] );
|
|
|
|
$ChatMenuHudLineCount = %menu.optionCount + 1;
|
|
chatMenuHud.extent = "170" SPC ( $ChatMenuHudLineCount * 15 ) + 8;
|
|
|
|
// First add the menu title line:
|
|
$ChatMenuHudText[0] = new GuiTextCtrl()
|
|
{
|
|
profile = "GuiHudVoiceMenuProfile";
|
|
horizSizing = "right";
|
|
vertSizing = "bottom";
|
|
position = "5 3";
|
|
extent = "165 20";
|
|
minExtent = "8 8";
|
|
visible = "1";
|
|
setFirstResponder = "0";
|
|
modal = "1";
|
|
helpTag = "0";
|
|
text = "\c2" @ %name @ " Menu:";
|
|
};
|
|
chatMenuHud.add( $ChatMenuHudText[0] );
|
|
|
|
// Now add all of the menu options:
|
|
for ( %option = 0; %option < %menu.optionCount; %option++ )
|
|
{
|
|
%yOffset = ( %option * 15 ) + 18;
|
|
|
|
if ( %menu.isMenu[%option] == 1 )
|
|
{
|
|
$ChatMenuHudText[%option + 1] = new GuiTextCtrl()
|
|
{
|
|
profile = "GuiHudVoiceMenuProfile";
|
|
horizSizing = "right";
|
|
vertSizing = "bottom";
|
|
position = "5 " @ %yOffset;
|
|
extent = "165 20";
|
|
minExtent = "8 8";
|
|
visible = "1";
|
|
setFirstResponder = "0";
|
|
modal = "1";
|
|
helpTag = "0";
|
|
text = " " @ %menu.option[%option];
|
|
};
|
|
}
|
|
else
|
|
{
|
|
$ChatMenuHudText[%option + 1] = new GuiTextCtrl()
|
|
{
|
|
profile = "GuiHudVoiceCommandProfile";
|
|
horizSizing = "right";
|
|
vertSizing = "bottom";
|
|
position = "5 " @ %yOffset;
|
|
extent = "165 20";
|
|
minExtent = "8 8";
|
|
visible = "1";
|
|
setFirstResponder = "0";
|
|
modal = "1";
|
|
helpTag = "0";
|
|
text = " " @ %menu.option[%option];
|
|
};
|
|
}
|
|
|
|
chatMenuHud.add( $ChatMenuHudText[%option + 1] );
|
|
}
|
|
|
|
//bind "anykey" to closing the chat menu, so if you press an invalid entry, you don't accidently
|
|
//open the commander map or something...
|
|
%menu.bindCmd(keyboard, "anykey", "cancelChatMenu();", "");
|
|
|
|
// Pop the old menu map and push the new menu's map:
|
|
$CurrentChatMenu.pop();
|
|
$CurrentChatMenu = %menu;
|
|
%menu.push();
|
|
}
|
|
|
|
function issueChatCmd( %menu, %index )
|
|
{
|
|
processChatItemCallbacks( %menu.command[%index] );
|
|
commandToServer( 'CannedChat', %menu.command[%index], false );
|
|
cancelChatMenu();
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Canned chat handler:
|
|
function serverCmdCannedChat( %client, %command, %fromAI )
|
|
{
|
|
%cmdCode = getWord( %command, 0 );
|
|
%cmdId = getSubStr( %cmdCode, 1, strlen( %command ) - 1 );
|
|
%cmdString = getWord( %command, 1 );
|
|
if ( %cmdString $= "" )
|
|
%cmdString = getTaggedString( %cmdCode );
|
|
|
|
if ( !isObject( $ChatTable[%cmdId] ) )
|
|
{
|
|
error( %cmdString @ " is not a recognized canned chat command." );
|
|
return;
|
|
}
|
|
|
|
%chatItem = $ChatTable[%cmdId];
|
|
|
|
//if there is text
|
|
if (%chatItem.text !$= "" || !%chatItem.play3D)
|
|
{
|
|
%message = %chatItem.text @ "~w" @ %chatItem.audioFile;
|
|
|
|
if ( %chatItem.teamOnly )
|
|
cannedChatMessageTeam( %client, %client.team, '\c3%1: %2', %client.name, %message, %chatItem.defaultKeys );
|
|
else
|
|
cannedChatMessageAll( %client, '\c4%1: %2', %client.name, %message, %chatItem.defaultKeys );
|
|
}
|
|
|
|
//if no text, see if the audio is to be played in 3D...
|
|
else if ( %chatItem.play3D && %client.player )
|
|
playTargetAudio(%client.target, addTaggedString(%chatItem.audioFile), AudioClosest3d, true);
|
|
|
|
if ( %chatItem.animation !$= "" )
|
|
PlayAnim(%client, %chatItem.animation); // z0dd - ZOD, 8/15/02. Remove client direct requests to start animations. Was: serverCmdPlayAnim
|
|
|
|
// Let the AI respond to the canned chat messages (from humans only)
|
|
if (!%fromAI)
|
|
CreateVoiceServerTask(%client, %cmdCode);
|
|
}
|
|
|
|
if ( $defaultVoiceBinds )
|
|
activateChatMenu( "scripts/voiceBinds.cs" );
|
|
else
|
|
activateChatMenu( "prefs/customVoiceBinds.cs" );
|
|
|