Skip to content

Commit

Permalink
Add private party messages. Cache party names.
Browse files Browse the repository at this point in the history
Also moved send message code to ChatControl.
  • Loading branch information
ZaneDubya committed Nov 6, 2016
1 parent 8e8ad00 commit ada83f6
Show file tree
Hide file tree
Showing 11 changed files with 161 additions and 107 deletions.
1 change: 1 addition & 0 deletions dev/Ultima/Data/ChatMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public enum ChatMode {
Whisper,
Emote,
Party,
PartyPrivate,
Guild,
Alliance
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ public PartyPrivateMessagePacket(Serial memberSerial, string msg)
Stream.Write((byte)3);
Stream.Write(memberSerial);
Stream.WriteBigUniNull(msg);
Stream.Write((short)0);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ public PartyPublicMessagePacket(string msg)
Stream.Write((short)6);
Stream.Write((byte)4);
Stream.WriteBigUniNull(msg);
Stream.Write((short)0);
}
}
}
4 changes: 2 additions & 2 deletions dev/Ultima/Network/Server/GeneralInfo/PartyMessageInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ namespace UltimaXNA.Ultima.Network.Server.GeneralInfo {
/// </summary>
public class PartyMessageInfo : IGeneralInfo {
public readonly bool IsPrivate;
public readonly int Source;
public readonly Serial Source;
public readonly string Message;

public PartyMessageInfo(PacketReader reader, bool isPrivate) {
IsPrivate = isPrivate;
Source = reader.ReadByte();
Source = (Serial)reader.ReadInt32();
Message = reader.ReadUnicodeString();
}
}
Expand Down
15 changes: 15 additions & 0 deletions dev/Ultima/Player/Partying/PartyMember.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,26 @@ namespace UltimaXNA.Ultima.Player.Partying
public class PartyMember
{
public readonly Serial Serial;
string m_CachedName;
public Mobile Mobile => WorldModel.Entities.GetObject<Mobile>(Serial, false);

public string Name
{
get
{
Mobile mobile = Mobile;
if (Mobile != null)
{
m_CachedName = Mobile.Name;
}
return m_CachedName;
}
}

public PartyMember(Serial serial)
{
Serial = serial;
m_CachedName = Name;
}
}
}
33 changes: 27 additions & 6 deletions dev/Ultima/Player/Partying/PartySystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*
***************************************************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using UltimaXNA.Core.Network;
Expand Down Expand Up @@ -163,6 +164,32 @@ public void DoPartyCommand(string text)
}
}

internal void BeginPrivateMessage(int serial)
{
PartyMember member = GetMember((Serial)serial);
if (member != null)
{
ChatControl chat = ServiceRegistry.GetService<ChatControl>();
chat.SetModeToPartyPrivate(member.Name, member.Serial);
}
}

public void SendPartyPrivateMessage(Serial serial, string text)
{
WorldModel world = ServiceRegistry.GetService<WorldModel>();
PartyMember recipient = GetMember(serial);
if (recipient != null)
{
INetworkClient network = ServiceRegistry.GetService<INetworkClient>();
network.Send(new PartyPrivateMessagePacket(serial, text));
world.Interaction.ChatMessage($"To {recipient.Name}: {text}", 3, Settings.UserInterface.PartyPrivateMsgColor, false);
}
else
{
world.Interaction.ChatMessage("They are no longer in your party.", 3, Settings.UserInterface.PartyPrivateMsgColor, false);
}
}

internal void RequestAddPartyMemberTarget()
{
INetworkClient network = ServiceRegistry.GetService<INetworkClient>();
Expand All @@ -182,12 +209,6 @@ internal void RequestAddPartyMemberTarget()
}
}

internal void SendTell(Serial serial)
{
INetworkClient network = ServiceRegistry.GetService<INetworkClient>();
network.Send(new PartyPrivateMessagePacket(serial, "make a dynamic message type"));//need improve
}

public void RefreshPartyGumps()
{
UserInterfaceService ui = ServiceRegistry.GetService<UserInterfaceService>();
Expand Down
170 changes: 111 additions & 59 deletions dev/Ultima/UI/WorldGumps/ChatControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
using UltimaXNA.Ultima.UI.Controls;
using UltimaXNA.Ultima.World;
using UltimaXNA.Ultima.Data;
using UltimaXNA.Ultima.Player;
using UltimaXNA.Ultima.Network.Client;
using UltimaXNA.Core.Network;
#endregion

namespace UltimaXNA.Ultima.UI.WorldGumps
Expand All @@ -31,11 +34,11 @@ class ChatControl : AControl
private TextEntry m_TextEntry;
private List<ChatLineTimed> m_TextEntries;
private List<Tuple<ChatMode, string>> m_MessageHistory;

private InputManager m_Input;
private WorldModel m_World;

private int m_MessageHistoryIndex = -1;
private Serial m_PrivateMessageSerial = Serial.Null;
private string m_PrivateMessageName;

private ChatMode m_Mode = ChatMode.Default;
private ChatMode Mode
Expand All @@ -47,7 +50,7 @@ private ChatMode Mode
switch (value)
{
case ChatMode.Default:
m_TextEntry.LeadingHtmlTag = string.Format("<outline color='#{0}' style='font-family: uni0;'>",
m_TextEntry.LeadingHtmlTag = string.Format("<outline color='#{0}' style='font-family: uni0;'>",
Utility.GetColorFromUshort(Resources.HueData.GetHue(Settings.UserInterface.SpeechColor, 1)));
m_TextEntry.LeadingText = string.Empty;
m_TextEntry.Text = string.Empty;
Expand All @@ -58,25 +61,31 @@ private ChatMode Mode
m_TextEntry.LeadingText = "Whisper: ";
m_TextEntry.Text = string.Empty;
break;
case ChatMode.Emote: // emote
case ChatMode.Emote:
m_TextEntry.LeadingHtmlTag = string.Format("<outline color='#{0}' style='font-family: uni0;'>",
Utility.GetColorFromUshort(Resources.HueData.GetHue(Settings.UserInterface.EmoteColor, 1)));
m_TextEntry.LeadingText = "Emote: ";
m_TextEntry.Text = string.Empty;
break;
case ChatMode.Party: // party
case ChatMode.Party:
m_TextEntry.LeadingHtmlTag = string.Format("<outline color='#{0}' style='font-family: uni0;'>",
Utility.GetColorFromUshort(Resources.HueData.GetHue(Settings.UserInterface.PartyMsgColor, 1)));
m_TextEntry.LeadingText = "Party: ";
m_TextEntry.Text = string.Empty;
break;
case ChatMode.Guild: // guild
case ChatMode.PartyPrivate:
m_TextEntry.LeadingHtmlTag = string.Format("<outline color='#{0}' style='font-family: uni0;'>",
Utility.GetColorFromUshort(Resources.HueData.GetHue(Settings.UserInterface.PartyPrivateMsgColor, 1)));
m_TextEntry.LeadingText = $"To {m_PrivateMessageName}: ";
m_TextEntry.Text = string.Empty;
break;
case ChatMode.Guild:
m_TextEntry.LeadingHtmlTag = string.Format("<outline color='#{0}' style='font-family: uni0;'>",
Utility.GetColorFromUshort(Resources.HueData.GetHue(Settings.UserInterface.GuildMsgColor, 1)));
m_TextEntry.LeadingText = "Guild: ";
m_TextEntry.Text = string.Empty;
break;
case ChatMode.Alliance: // alliance
case ChatMode.Alliance:
m_TextEntry.LeadingHtmlTag = string.Format("<outline color='#{0}' style='font-family: uni0;'>",
Utility.GetColorFromUshort(Resources.HueData.GetHue(Settings.UserInterface.AllianceMsgColor, 1)));
m_TextEntry.LeadingText = "Alliance: ";
Expand All @@ -101,6 +110,13 @@ public ChatControl(AControl parent, int x, int y, int width, int height)
IsUncloseableWithRMB = true;
}

public void SetModeToPartyPrivate(string name, Serial serial)
{
m_PrivateMessageName = name;
m_PrivateMessageSerial = serial;
Mode = ChatMode.PartyPrivate;
}

public override void Update(double totalMS, double frameMS)
{
if (m_TextEntry == null)
Expand Down Expand Up @@ -160,19 +176,19 @@ public override void Update(double totalMS, double frameMS)
{
switch (m_TextEntry.Text[0])
{
case ':': // emote
case ':':
Mode = ChatMode.Emote;
break;
case ';': // whisper
case ';':
Mode = ChatMode.Whisper;
break;
case '/': // party
case '/':
Mode = ChatMode.Party;
break;
case '\\': // guild
case '\\':
Mode = ChatMode.Guild;
break;
case '|': // alliance
case '|':
Mode = ChatMode.Alliance;
break;
}
Expand All @@ -194,74 +210,110 @@ public override void Draw(SpriteBatchUI spriteBatch, Point position)

public override void OnKeyboardReturn(int textID, string text)
{
// local variables
ChatMode sentMode = Mode;
MessageTypes speechType = MessageTypes.Normal;
int hue = 0;
// save this message and reset chat for next entry
m_TextEntry.Text = string.Empty;
m_MessageHistory.Add(new Tuple<ChatMode, string>(Mode, text));
m_MessageHistoryIndex = m_MessageHistory.Count;
m_World.Interaction.SendSpeech(text, Mode);
Mode = ChatMode.Default;
// send the message and display it locally.
switch (sentMode)
{
case ChatMode.Default:
speechType = MessageTypes.Normal;
hue = Settings.UserInterface.SpeechColor;
break;
case ChatMode.Whisper:
speechType = MessageTypes.Whisper;
hue = Settings.UserInterface.SpeechColor;
break;
case ChatMode.Emote:
speechType = MessageTypes.Emote;
hue = Settings.UserInterface.EmoteColor;
break;
case ChatMode.Party:
PlayerState.Partying.DoPartyCommand(text);
return;
case ChatMode.PartyPrivate:
PlayerState.Partying.SendPartyPrivateMessage(m_PrivateMessageSerial, text);
return;
case ChatMode.Guild:
speechType = MessageTypes.Guild;
hue = Settings.UserInterface.GuildMsgColor;
break;
case ChatMode.Alliance:
speechType = MessageTypes.Alliance;
hue = Settings.UserInterface.AllianceMsgColor;
break;
}
INetworkClient network = ServiceRegistry.GetService<INetworkClient>();
network.Send(new AsciiSpeechPacket(speechType, 0, hue + 2, "ENU", text));
}

public void AddLine(string text, int font, int hue, bool asUnicode)
{
m_TextEntries.Add(new ChatLineTimed(string.Format("<outline color='#{3}' style='font-family:{1}{2};'>{0}",
text, asUnicode ? "uni" : "ascii", font, Utility.GetColorFromUshort(Resources.HueData.GetHue(hue, -1))),
m_TextEntries.Add(new ChatLineTimed(string.Format("<outline color='#{3}' style='font-family:{1}{2};'>{0}",
text, asUnicode ? "uni" : "ascii", font, Utility.GetColorFromUshort(Resources.HueData.GetHue(hue, -1))),
Width));
}
}

class ChatLineTimed
{
string m_text;
public string Text { get { return m_text; } }
float m_createdTime = float.MinValue;
bool m_isExpired;
public bool IsExpired { get { return m_isExpired; } }
float m_alpha;
public float Alpha { get { return m_alpha; } }
private int m_width = 0;
class ChatLineTimed
{
string m_text;
public string Text { get { return m_text; } }
float m_createdTime = float.MinValue;
bool m_isExpired;
public bool IsExpired { get { return m_isExpired; } }
float m_alpha;
public float Alpha { get { return m_alpha; } }
private int m_width = 0;

const float Time_Display = 10000.0f;
const float Time_Fadeout = 4000.0f;
const float Time_Display = 10000.0f;
const float Time_Fadeout = 4000.0f;

private RenderedText m_Texture;
public int TextHeight { get { return m_Texture.Height; } }
private RenderedText m_Texture;
public int TextHeight { get { return m_Texture.Height; } }

public ChatLineTimed(string text, int width)
{
m_text = text;
m_isExpired = false;
m_alpha = 1.0f;
m_width = width;
public ChatLineTimed(string text, int width)
{
m_text = text;
m_isExpired = false;
m_alpha = 1.0f;
m_width = width;

m_Texture = new RenderedText(m_text, m_width);
}
m_Texture = new RenderedText(m_text, m_width);
}

public void Update(double totalMS, double frameMS)
{
if (m_createdTime == float.MinValue)
m_createdTime = (float)totalMS;
float time = (float)totalMS - m_createdTime;
if (time > Time_Display)
m_isExpired = true;
else if (time > (Time_Display - Time_Fadeout))
public void Update(double totalMS, double frameMS)
{
m_alpha = 1.0f - ((time) - (Time_Display - Time_Fadeout)) / Time_Fadeout;
if (m_createdTime == float.MinValue)
m_createdTime = (float)totalMS;
float time = (float)totalMS - m_createdTime;
if (time > Time_Display)
m_isExpired = true;
else if (time > (Time_Display - Time_Fadeout))
{
m_alpha = 1.0f - ((time) - (Time_Display - Time_Fadeout)) / Time_Fadeout;
}
}
}

public void Draw(SpriteBatchUI sb, Point position)
{
m_Texture.Draw(sb, position, Utility.GetHueVector(0, false, (m_alpha < 1.0f), true));
}
public void Draw(SpriteBatchUI sb, Point position)
{
m_Texture.Draw(sb, position, Utility.GetHueVector(0, false, (m_alpha < 1.0f), true));
}

public void Dispose()
{
m_Texture = null;
}
public void Dispose()
{
m_Texture = null;
}

public override string ToString()
{
return m_text;
public override string ToString()
{
return m_text;
}
}
}
}
Loading

0 comments on commit ada83f6

Please sign in to comment.