113 lines
4.3 KiB
C#
113 lines
4.3 KiB
C#
using Lidgren.Network;
|
|
using System;
|
|
|
|
namespace Barotrauma.Networking
|
|
{
|
|
partial class ChatMessage
|
|
{
|
|
public virtual void ClientWrite(NetOutgoingMessage msg)
|
|
{
|
|
msg.Write((byte)ClientNetObject.CHAT_MESSAGE);
|
|
msg.Write(NetStateID);
|
|
msg.Write((byte)Type);
|
|
msg.Write(Text);
|
|
}
|
|
|
|
public static void ClientRead(NetIncomingMessage msg)
|
|
{
|
|
UInt16 ID = msg.ReadUInt16();
|
|
ChatMessageType type = (ChatMessageType)msg.ReadByte();
|
|
string txt = "";
|
|
|
|
if (type != ChatMessageType.Order)
|
|
{
|
|
txt = msg.ReadString();
|
|
}
|
|
|
|
string senderName = msg.ReadString();
|
|
Character senderCharacter = null;
|
|
bool hasSenderCharacter = msg.ReadBoolean();
|
|
if (hasSenderCharacter)
|
|
{
|
|
senderCharacter = Entity.FindEntityByID(msg.ReadUInt16()) as Character;
|
|
if (senderCharacter != null)
|
|
{
|
|
senderName = senderCharacter.Name;
|
|
}
|
|
}
|
|
|
|
if (type == ChatMessageType.Order)
|
|
{
|
|
int orderIndex = msg.ReadByte();
|
|
UInt16 targetCharacterID = msg.ReadUInt16();
|
|
Character targetCharacter = Entity.FindEntityByID(targetCharacterID) as Character;
|
|
Entity targetEntity = Entity.FindEntityByID(msg.ReadUInt16());
|
|
int optionIndex = msg.ReadByte();
|
|
|
|
Order order = null;
|
|
if (orderIndex < 0 || orderIndex >= Order.PrefabList.Count)
|
|
{
|
|
DebugConsole.ThrowError("Invalid order message - order index out of bounds.");
|
|
if (NetIdUtils.IdMoreRecent(ID, LastID)) LastID = ID;
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
order = Order.PrefabList[orderIndex];
|
|
}
|
|
string orderOption = "";
|
|
if (optionIndex >= 0 && optionIndex < order.Options.Length)
|
|
{
|
|
orderOption = order.Options[optionIndex];
|
|
}
|
|
txt = order.GetChatMessage(targetCharacter?.Name, senderCharacter?.CurrentHull?.RoomName, givingOrderToSelf: targetCharacter == senderCharacter, orderOption: orderOption);
|
|
|
|
if (order.TargetAllCharacters)
|
|
{
|
|
GameMain.GameSession?.CrewManager?.AddOrder(
|
|
new Order(order.Prefab, targetEntity, (targetEntity as Item)?.GetComponent<Items.Components.ItemComponent>()),
|
|
order.Prefab.FadeOutTime);
|
|
}
|
|
else if (targetCharacter != null)
|
|
{
|
|
targetCharacter.SetOrder(
|
|
new Order(order.Prefab, targetEntity, (targetEntity as Item)?.GetComponent<Items.Components.ItemComponent>()),
|
|
orderOption, senderCharacter);
|
|
}
|
|
|
|
if (NetIdUtils.IdMoreRecent(ID, LastID))
|
|
{
|
|
GameMain.Client.AddChatMessage(
|
|
new OrderChatMessage(order, orderOption, txt, targetEntity, targetCharacter, senderCharacter));
|
|
LastID = ID;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (NetIdUtils.IdMoreRecent(ID, LastID))
|
|
{
|
|
switch (type)
|
|
{
|
|
case ChatMessageType.MessageBox:
|
|
new GUIMessageBox("", txt);
|
|
break;
|
|
case ChatMessageType.Console:
|
|
DebugConsole.NewMessage(txt, MessageColor[(int)ChatMessageType.Console]);
|
|
break;
|
|
case ChatMessageType.ServerLog:
|
|
if (!Enum.TryParse(senderName, out ServerLog.MessageType messageType))
|
|
{
|
|
return;
|
|
}
|
|
GameMain.Client.ServerSettings.ServerLog?.WriteLine(txt, messageType);
|
|
break;
|
|
default:
|
|
GameMain.Client.AddChatMessage(txt, type, senderName, senderCharacter);
|
|
break;
|
|
}
|
|
LastID = ID;
|
|
}
|
|
}
|
|
}
|
|
}
|