1
0
forked from 0ad/0ad

Implemented two chat commands, /restrictteam and /me. Refs #1583.

This was SVN commit r12371.
This commit is contained in:
Deiz 2012-08-11 23:59:28 +00:00
parent b1657b63b3
commit 2eed26df09
4 changed files with 84 additions and 32 deletions

View File

@ -229,6 +229,7 @@ hotkey.session.showstatusbars = Tab ; Toggle display of status bars
; > HOTKEYS ONLY
hotkey.chat = Return ; Toggle chat window
hotkey.teamchat = "T" ; Toggle chat window in team chat mode
; > GUI TEXTBOX HOTKEYS
hotkey.text.delete.left = "Ctrl+Backspace" ; Delete word to the left of cursor

View File

@ -182,7 +182,7 @@ function closeChat()
getGUIObjectByName("chatDialogPanel").hidden = true;
}
function toggleChatWindow()
function toggleChatWindow(teamChat)
{
closeSettings();
@ -194,6 +194,7 @@ function toggleChatWindow()
else
chatInput.caption = ""; // Clear chat input
getGUIObjectByName("toggleTeamChat").checked = teamChat;
chatWindow.hidden = !chatWindow.hidden;
}

View File

@ -205,6 +205,9 @@ function submitChatInput()
if (!isCheat)
{
if (getGUIObjectByName("toggleTeamChat").checked)
text = "/restrictteam " + text;
if (g_IsNetworked)
Engine.SendNetworkChat(text);
else
@ -226,32 +229,19 @@ function addChatMessage(msg, playerAssignments)
playerAssignments = g_PlayerAssignments;
var playerColor, username;
// Used for team chat in multiplayer
var teamed = false; // Is the player on a team of size > 1
var onMyTeam = false; // If the message being sent by a player on my team
// No prefix by default. May be set by parseChatCommands().
msg.prefix = "";
if (playerAssignments[msg.guid])
{
var n = playerAssignments[msg.guid].player;
playerColor = g_Players[n].color.r + " " + g_Players[n].color.g + " " + g_Players[n].color.b;
username = escapeText(playerAssignments[msg.guid].name);
// Set the booleans for team chat.
var playerData = getPlayerData();
if (playerData[n] && playerData[n].team != -1) {
if (playerData[Engine.GetPlayerID()].team == playerData[n].team)
onMyTeam = true;
var teamSize = 0;
for (var i = 0; i < playerData.length; i++)
{
if (playerData[i].team == playerData[n].team)
teamSize++;
}
if (teamSize > 1)
teamed = true;
}
// Parse in-line commands in regular messages.
if (msg.type == "message")
parseChatCommands(msg, n);
}
else if (msg.type == "defeat" && msg.player)
{
@ -283,15 +273,19 @@ function addChatMessage(msg, playerAssignments)
formatted = "[color=\"" + playerColor + "\"]" + username + "[/color] " + verb + " been defeated.";
break;
case "message":
// Send messages to your own team only by default
if (!teamed || onMyTeam || message.indexOf("g ") == 0)
// May have been hidden by the 'restrictteam' command.
if (msg.hide)
return;
if (msg.action)
{
console.write("* " + username + " " + message);
formatted = msg.prefix + "* [color=\"" + playerColor + "\"]" + username + "[/color] " + message;
}
else
{
console.write("<" + username + "> " + message);
formatted = "<[color=\"" + playerColor + "\"]" + username + "[/color]> " + message;
}
else
{
return;
formatted = msg.prefix + "<[color=\"" + playerColor + "\"]" + username + "[/color]> " + message;
}
break;
default:
@ -315,3 +309,50 @@ function removeOldChatMessages()
chatMessages.shift();
getGUIObjectByName("chatText").caption = chatMessages.join("\n");
}
// Parses chat messages for commands.
function parseChatCommands(msg, sender)
{
// Only interested in messages that start with '/'.
if (!msg.text || msg.text[0] != '/')
return;
var recurse = false;
var split = msg.text.split(/\s/);
// Parse commands embedded in the message.
switch (split[0])
{
case "/restrictteam":
var playerData = getPlayerData();
if (playerData[sender] && playerData[sender].team != -1)
{
// Only respect the command if the sender has teammates.
for (var i = 0; i < playerData.length; i++)
{
if (playerData[i].team == playerData[sender].team)
{
if (playerData[Engine.GetPlayerID()].team != playerData[sender].team)
msg.hide = true;
else
msg.prefix = "(Team) ";
break;
}
}
}
recurse = true;
break;
case "/me":
msg.action = true;
break;
default:
return;
}
msg.text = msg.text.substr(split[0].length + 1);
// Attempt to parse more commands if the current command allows it.
if (recurse)
parseChatCommands(msg, sender);
}

View File

@ -51,6 +51,11 @@
<action on="Press">toggleChatWindow();</action>
</object>
<!-- Team Chat: Does the same as the above, but sets the window up to only send messages to teammates. -->
<object hotkey="teamchat">
<action on="Press">toggleChatWindow(true);</action>
</object>
<!-- Menu -->
<object hotkey="menu.toggle">
<action on="Press">openMenu();</action>
@ -209,20 +214,24 @@
</object>
<!-- Chat window -->
<object name="chatDialogPanel" size="50%-180 50%-58 50%+180 50%+46" type="image" hidden="true" sprite="genericPanel">
<object name="chatDialogPanel" size="50%-180 50%-48 50%+180 50%+36" type="image" hidden="true" sprite="genericPanel">
<object name="chatInput" size="16 12 100%-16 36" type="input" style="StoneInput" max_length="80">
<action on="Press">submitChatInput();</action>
</object>
<object size="50%-144 100%-50 50%-16 100%-22" type="button" style="StoneButton">
<object size="16 100%-40 30%+16 100%-12" type="button" style="StoneButton">
Send
<action on="Press">submitChatInput();</action>
</object>
<object size="50%+16 100%-50 50%+144 100%-22" type="button" style="StoneButton">
<object size="30%+24 100%-40 60%+24 100%-12" type="button" style="StoneButton">
Cancel
<action on="Press">closeChat();</action>
</object>
<object name="toggleTeamChat" size="60%+32 100%-34 60%+48 100%-6" type="checkbox" style="StoneCrossBox"/>
<object size="60%+48 100%-40 100% 100%-12" type="text" style="LeftLabelText">
Team Only
</object>
</object>
<!-- ================================ ================================ -->