fix(core): Adds SkipLocalsInitAttribute support, optimizes broadcasted packets (#363)
- [X] Adds support for `SkipLocalsInitAttribute`. SkipLocalsInitAttribute skips initializing stack variables including `stackalloc`. I don't think it is wired/working yet but should be implemented soon. - [X] Optimizes broadcasted packets by checking if the first byte (packet ID) is non-zero. If it is already set, it reuses the buffer. - [X] Removes unnecessary refs to Spans. I don't think the Span struct itself is mutable, so a ref is not helpful.
This commit is contained in:
parent
9c9591b098
commit
03d0a4664e
25 changed files with 478 additions and 285 deletions
|
|
@ -417,12 +417,17 @@ namespace Server.Commands
|
|||
);
|
||||
|
||||
Span<byte> buffer = stackalloc byte[OutgoingEffectPackets.SoundPacketLength];
|
||||
OutgoingEffectPackets.CreateSoundEffect(ref buffer, index, m);
|
||||
buffer.InitializePacket();
|
||||
|
||||
foreach (var state in m.GetClientsInRange(12))
|
||||
{
|
||||
if (toAll || state.Mobile.CanSee(m))
|
||||
{
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
OutgoingEffectPackets.CreateSoundEffect(buffer, index, m);
|
||||
}
|
||||
|
||||
state.Send(buffer);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ namespace Server.Commands
|
|||
if (list.Count > 0)
|
||||
{
|
||||
Span<byte> removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
|
||||
OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, pm.Serial);
|
||||
removeEntity.InitializePacket();
|
||||
|
||||
for (var i = 0; i < list.Count; ++i)
|
||||
{
|
||||
|
|
@ -78,6 +78,11 @@ namespace Server.Commands
|
|||
|
||||
if (!m.CanSee(pm) && Utility.InUpdateRange(m, pm))
|
||||
{
|
||||
if (removeEntity[0] == 0)
|
||||
{
|
||||
OutgoingEntityPackets.CreateRemoveEntity(removeEntity, pm.Serial);
|
||||
}
|
||||
|
||||
m.NetState?.Send(removeEntity);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -504,26 +504,30 @@ namespace Server.Engines.Doom
|
|||
public static void POHMessage(Mobile from, int index)
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(Msgs[index])];
|
||||
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
ref buffer,
|
||||
from.Serial,
|
||||
from.Body,
|
||||
MessageType.Regular,
|
||||
MsgParams[index][0],
|
||||
MsgParams[index][1],
|
||||
true,
|
||||
null,
|
||||
from.Name,
|
||||
Msgs[index]
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
buffer.InitializePacket();
|
||||
|
||||
var eable = from.Map.GetClientsInRange(from.Location);
|
||||
|
||||
foreach (var state in eable)
|
||||
{
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
buffer,
|
||||
from.Serial,
|
||||
from.Body,
|
||||
MessageType.Regular,
|
||||
MsgParams[index][0],
|
||||
MsgParams[index][1],
|
||||
true,
|
||||
null,
|
||||
from.Name,
|
||||
Msgs[index]
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
}
|
||||
|
||||
state.Send(buffer);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ namespace Server.Engines.MLQuests.Mobiles
|
|||
}
|
||||
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedLength("")];
|
||||
var packetCreated = false;
|
||||
buffer.InitializePacket();
|
||||
|
||||
foreach (var state in GetClientsInRange(12))
|
||||
{
|
||||
|
|
@ -104,14 +104,14 @@ namespace Server.Engines.MLQuests.Mobiles
|
|||
|
||||
if (m.CanSee(this) && m.InLOS(this) && m.CanBeginAction(this))
|
||||
{
|
||||
if (!packetCreated)
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
// Double Click On Me For Help!
|
||||
var length = OutgoingMessagePackets.CreateMessageLocalized(
|
||||
ref buffer,
|
||||
Serial, Body, MessageType.Regular, 946, 3, 1078099, Name
|
||||
buffer, Serial, Body, MessageType.Regular, 946, 3, 1078099, Name
|
||||
);
|
||||
packetCreated = true;
|
||||
|
||||
buffer = buffer.Slice(0, length);
|
||||
}
|
||||
|
||||
state.Send(buffer);
|
||||
|
|
|
|||
|
|
@ -241,7 +241,7 @@ namespace Server.Engines.PartySystem
|
|||
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedAffixLength(from.Name, "")];
|
||||
var length = OutgoingMessagePackets.CreateMessageLocalizedAffix(
|
||||
ref buffer,
|
||||
buffer,
|
||||
Serial.MinusOne,
|
||||
-1,
|
||||
MessageType.Label,
|
||||
|
|
@ -253,10 +253,8 @@ namespace Server.Engines.PartySystem
|
|||
from.Name
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
|
||||
// : joined the party.
|
||||
SendToAll(ref buffer, true);
|
||||
SendToAll(buffer.Slice(0, length), true);
|
||||
|
||||
from.SendLocalizedMessage(1005445); // You have been added to the party.
|
||||
|
||||
|
|
@ -383,13 +381,11 @@ namespace Server.Engines.PartySystem
|
|||
{
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedLength(args)];
|
||||
var length = OutgoingMessagePackets.CreateMessageLocalized(
|
||||
ref buffer,
|
||||
buffer,
|
||||
Serial.MinusOne, -1, MessageType.Regular, hue, 3, number, "System", args
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
|
||||
SendToAll(ref buffer, true);
|
||||
SendToAll(buffer.Slice(0, length), true);
|
||||
}
|
||||
|
||||
public void SendPublicMessage(Mobile from, string text)
|
||||
|
|
@ -429,19 +425,7 @@ namespace Server.Engines.PartySystem
|
|||
private void SendToStaffMessage(Mobile from, string text)
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
ref buffer,
|
||||
from.Serial,
|
||||
from.Body,
|
||||
MessageType.Regular,
|
||||
from.SpeechHue,
|
||||
3,
|
||||
false,
|
||||
from.Language,
|
||||
from.Name,
|
||||
text
|
||||
);
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
buffer.InitializePacket();
|
||||
|
||||
foreach (var ns in from.GetClientsInRange(8))
|
||||
{
|
||||
|
|
@ -450,6 +434,24 @@ namespace Server.Engines.PartySystem
|
|||
if (mob?.AccessLevel >= AccessLevel.GameMaster && mob.AccessLevel > from.AccessLevel &&
|
||||
mob.Party != this && !m_Listeners.Contains(mob))
|
||||
{
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
buffer,
|
||||
from.Serial,
|
||||
from.Body,
|
||||
MessageType.Regular,
|
||||
from.SpeechHue,
|
||||
3,
|
||||
false,
|
||||
from.Language,
|
||||
from.Name,
|
||||
text
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
}
|
||||
|
||||
ns.Send(buffer);
|
||||
}
|
||||
}
|
||||
|
|
@ -472,7 +474,7 @@ namespace Server.Engines.PartySystem
|
|||
p.Release();
|
||||
}
|
||||
|
||||
public void SendToAll(ref Span<byte> span, bool isSpeech)
|
||||
public void SendToAll(Span<byte> span, bool isSpeech)
|
||||
{
|
||||
for (var i = 0; i < Members.Count; ++i)
|
||||
{
|
||||
|
|
@ -512,20 +514,7 @@ namespace Server.Engines.PartySystem
|
|||
m_Mobile.Send(new PartyMemberList(p));
|
||||
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedAffixLength(m_Mobile.Name, "")];
|
||||
var length = OutgoingMessagePackets.CreateMessageLocalizedAffix(
|
||||
ref buffer,
|
||||
Serial.MinusOne,
|
||||
-1,
|
||||
MessageType.Label,
|
||||
0x3B2,
|
||||
3,
|
||||
1008087,
|
||||
"",
|
||||
AffixType.Prepend | AffixType.System,
|
||||
m_Mobile.Name
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
buffer.InitializePacket();
|
||||
|
||||
var attrs = Packet.Acquire(new MobileAttributesN(m_Mobile));
|
||||
|
||||
|
|
@ -535,6 +524,24 @@ namespace Server.Engines.PartySystem
|
|||
|
||||
if (m != m_Mobile)
|
||||
{
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
var length = OutgoingMessagePackets.CreateMessageLocalizedAffix(
|
||||
buffer,
|
||||
Serial.MinusOne,
|
||||
-1,
|
||||
MessageType.Label,
|
||||
0x3B2,
|
||||
3,
|
||||
1008087,
|
||||
"",
|
||||
AffixType.Prepend | AffixType.System,
|
||||
m_Mobile.Name
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
}
|
||||
|
||||
m.NetState?.Send(buffer);
|
||||
m.Send(new MobileStatusCompact(m_Mobile.CanBeRenamedBy(m), m_Mobile));
|
||||
m.Send(attrs);
|
||||
|
|
|
|||
|
|
@ -88,10 +88,15 @@ namespace Server.Items
|
|||
else
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[OutgoingEffectPackets.SoundPacketLength];
|
||||
OutgoingEffectPackets.CreateSoundEffect(ref buffer, 0x127, GetWorldLocation());
|
||||
buffer.InitializePacket();
|
||||
|
||||
foreach (var state in GetClientsInRange(2))
|
||||
{
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
OutgoingEffectPackets.CreateSoundEffect(buffer, 0x127, GetWorldLocation());
|
||||
}
|
||||
|
||||
state.Send(buffer);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,12 +50,12 @@ namespace Server.Items
|
|||
|
||||
if (ns.StygianAbyss)
|
||||
{
|
||||
length = OutgoingItemPackets.CreateWorldItemNew(ref buffer, this, ns.HighSeas);
|
||||
length = OutgoingItemPackets.CreateWorldItemNew(buffer, this, ns.HighSeas);
|
||||
BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(8, 2), GMItemId);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = OutgoingItemPackets.CreateWorldItem(ref buffer, this);
|
||||
length = OutgoingItemPackets.CreateWorldItem(buffer, this);
|
||||
BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(7, 2), GMItemId);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,12 +56,12 @@ namespace Server.Items
|
|||
|
||||
if (ns.StygianAbyss)
|
||||
{
|
||||
length = OutgoingItemPackets.CreateWorldItemNew(ref buffer, this, ns.HighSeas);
|
||||
length = OutgoingItemPackets.CreateWorldItemNew(buffer, this, ns.HighSeas);
|
||||
BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(8, 2), GMItemId);
|
||||
}
|
||||
else
|
||||
{
|
||||
length = OutgoingItemPackets.CreateWorldItem(ref buffer, this);
|
||||
length = OutgoingItemPackets.CreateWorldItem(buffer, this);
|
||||
BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(7, 2), GMItemId);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -331,20 +331,7 @@ namespace Server.Guilds
|
|||
public void AllianceChat(Mobile from, int hue, string text)
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
ref buffer,
|
||||
from.Serial,
|
||||
from.Body,
|
||||
MessageType.Alliance,
|
||||
hue,
|
||||
3,
|
||||
false,
|
||||
from.Language,
|
||||
from.Name,
|
||||
text
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
buffer.InitializePacket();
|
||||
|
||||
for (var i = 0; i < m_Members.Count; i++)
|
||||
{
|
||||
|
|
@ -352,6 +339,24 @@ namespace Server.Guilds
|
|||
|
||||
for (var j = 0; j < g.Members.Count; j++)
|
||||
{
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
buffer,
|
||||
from.Serial,
|
||||
from.Body,
|
||||
MessageType.Alliance,
|
||||
hue,
|
||||
3,
|
||||
false,
|
||||
from.Language,
|
||||
from.Name,
|
||||
text
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
}
|
||||
|
||||
g.Members[j].NetState?.Send(buffer);
|
||||
}
|
||||
}
|
||||
|
|
@ -1266,7 +1271,7 @@ namespace Server.Guilds
|
|||
}
|
||||
else
|
||||
{
|
||||
m_AllianceLeader = reader.ReadEntity<Guild>();;
|
||||
m_AllianceLeader = reader.ReadEntity<Guild>();
|
||||
}
|
||||
|
||||
goto case 4;
|
||||
|
|
@ -1516,15 +1521,20 @@ namespace Server.Guilds
|
|||
public void GuildChat(Mobile from, int hue, string text)
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
ref buffer,
|
||||
from.Serial, from.Body, MessageType.Guild, hue, 3, false, from.Language, from.Name, text
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
buffer.InitializePacket();
|
||||
|
||||
for (var i = 0; i < Members.Count; i++)
|
||||
{
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
buffer, from.Serial, from.Body, MessageType.Guild, hue, 3, false, from.Language,
|
||||
from.Name, text
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
}
|
||||
|
||||
Members[i].NetState?.Send(buffer);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3844,8 +3844,8 @@ namespace Server.Mobiles
|
|||
IsDeadPet = false;
|
||||
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMobilePackets.BondedStatusPacketLength];
|
||||
OutgoingMobilePackets.CreateBondedStatus(ref buffer, Serial, false);
|
||||
Effects.SendPacket(Location, Map, ref buffer);
|
||||
OutgoingMobilePackets.CreateBondedStatus(buffer, Serial, false);
|
||||
Effects.SendPacket(Location, Map, buffer);
|
||||
|
||||
SendIncomingPacket();
|
||||
SendIncomingPacket();
|
||||
|
|
|
|||
|
|
@ -2827,20 +2827,7 @@ namespace Server.Mobiles
|
|||
private static void SendToStaffMessage(Mobile from, string text)
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
ref buffer,
|
||||
from.Serial,
|
||||
from.Body,
|
||||
MessageType.Regular,
|
||||
from.SpeechHue,
|
||||
3,
|
||||
false,
|
||||
from.Language,
|
||||
from.Name,
|
||||
text
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
buffer.InitializePacket();
|
||||
|
||||
foreach (var ns in from.GetClientsInRange(8))
|
||||
{
|
||||
|
|
@ -2848,6 +2835,24 @@ namespace Server.Mobiles
|
|||
|
||||
if (mob?.AccessLevel >= AccessLevel.GameMaster && mob.AccessLevel > from.AccessLevel)
|
||||
{
|
||||
if (buffer[0] == 0)
|
||||
{
|
||||
var length = OutgoingMessagePackets.CreateMessage(
|
||||
buffer,
|
||||
from.Serial,
|
||||
from.Body,
|
||||
MessageType.Regular,
|
||||
from.SpeechHue,
|
||||
3,
|
||||
false,
|
||||
from.Language,
|
||||
from.Name,
|
||||
text
|
||||
);
|
||||
|
||||
buffer = buffer.Slice(0, length); // Adjust to the actual size
|
||||
}
|
||||
|
||||
ns.Send(buffer);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue