public BBMessageContent(BaseBulletinBoard board, BulletinMessage msg) : base(0x71) { var poster = SafeString(msg.PostedName); var subject = SafeString(msg.Subject); var time = SafeString(msg.GetTimeAsString()); EnsureCapacity(22 + poster.Length + subject.Length + time.Length); Stream.Write((byte)0x02); // Packet ID Stream.Write(board.Serial); // Bulletin board serial Stream.Write(msg.Serial); // Message serial WriteString(poster); WriteString(subject); WriteString(time); Stream.Write((short)msg.PostedBody); Stream.Write((short)msg.PostedHue); var len = msg.PostedEquip.Length; if (len > 255) { len = 255; } Stream.Write((byte)len); for (var i = 0; i < len; ++i) { var eq = msg.PostedEquip[i]; Stream.Write((short)eq._itemID); Stream.Write((short)eq._hue); } len = msg.Lines.Length; if (len > 255) { len = 255; } Stream.Write((byte)len); for (var i = 0; i < len; ++i) { WriteString(msg.Lines[i], true); } }
public BBMessageHeader(BaseBulletinBoard board, BulletinMessage msg) : base(0x71) { var poster = SafeString(msg.PostedName); var subject = SafeString(msg.Subject); var time = SafeString(msg.GetTimeAsString()); EnsureCapacity(22 + poster.Length + subject.Length + time.Length); Stream.Write((byte)0x01); // Packet ID Stream.Write(board.Serial); // Bulletin board serial Stream.Write(msg.Serial); // Message serial Stream.Write(msg.Thread?.Serial ?? Serial.Zero); // Thread serial--parent WriteString(poster); WriteString(subject); WriteString(time); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); if (reader.ReadBool()) { m_DestinationString = reader.ReadString(); // NOTE: We cannot EDI.Find here, regions have not yet been loaded :-( } if (reader.ReadBool()) { m_DeleteTime = reader.ReadDeltaTime(); m_DeleteTimer = new DeleteTimer(this, m_DeleteTime - DateTime.Now); m_DeleteTimer.Start(); } m_Message = reader.ReadItem() as BulletinMessage; }
protected override void OnLocationChange(Point3D oldLocation) { base.OnLocationChange(oldLocation); if (oldLocation == Point3D.Zero) { EDI dest = GetDestination(); if (dest != null && m_Message == null) { if (m_Camp != null) { m_Message = new PrisonerMessage(m_Camp, this); } else { m_Message = new EscortMessage(this); } } } }
public static void SendBBMessage(this NetState ns, BaseBulletinBoard board, BulletinMessage msg, bool content = false) { if (ns == null) { return; } var longestTextLine = 0; var maxLength = 22; var poster = msg.PostedName ?? ""; poster.UpdateLengthCounters(ref maxLength, ref longestTextLine); var subject = msg.Subject ?? ""; subject.UpdateLengthCounters(ref maxLength, ref longestTextLine); var time = msg.GetTimeAsString() ?? ""; time.UpdateLengthCounters(ref maxLength, ref longestTextLine); var equipLength = Math.Min(255, msg.PostedEquip.Length); var linesLength = Math.Min(255, msg.Lines.Length); if (content) { maxLength += 2 + equipLength * 4; // We have an extra 4 from the thread serial for (int i = 0; i < linesLength; i++) { msg.Lines[i].UpdateLengthCounters(ref maxLength, ref longestTextLine, true); } } Span <byte> textBuffer = stackalloc byte[TextEncoding.UTF8.GetMaxByteCount(longestTextLine)]; var writer = maxLength > 81920 ? new SpanWriter(maxLength) : new SpanWriter(stackalloc byte[maxLength]); writer.Write((byte)0x71); // Packet ID writer.Seek(2, SeekOrigin.Current); writer.Write((byte)(content ? 0x02 : 0x01)); // Command writer.Write(board.Serial); writer.Write(msg.Serial); if (!content) { writer.Write(msg.Thread?.Serial ?? Serial.Zero); } writer.WriteString(poster, textBuffer); writer.WriteString(subject, textBuffer); writer.WriteString(time, textBuffer); if (content) { writer.Write((short)msg.PostedBody); writer.Write((short)msg.PostedHue); writer.Write((byte)equipLength); for (var i = 0; i < equipLength; i++) { var eq = msg.PostedEquip[i]; writer.Write((short)eq.itemID); writer.Write((short)eq.hue); } writer.Write((byte)linesLength); for (var i = 0; i < linesLength; i++) { writer.WriteString(msg.Lines[i], textBuffer, true); } } writer.WritePacketLength(); ns.Send(writer.Span); writer.Dispose(); }