diff --git a/Directory.Build.props b/Directory.Build.props
index 5da56f81a..636e59400 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -17,7 +17,7 @@
true
true
-
+ false
true
true
true
diff --git a/Projects/Benchmarks/Packets/BenchmarkPacketBroadcast.cs b/Projects/Benchmarks/Packets/BenchmarkPacketBroadcast.cs
index d68bad03a..937186aee 100644
--- a/Projects/Benchmarks/Packets/BenchmarkPacketBroadcast.cs
+++ b/Projects/Benchmarks/Packets/BenchmarkPacketBroadcast.cs
@@ -40,7 +40,7 @@ namespace Benchmarks
}
public static int CreateUnicodeMessage(
- ref Span buffer,
+ Span buffer,
Serial serial, int graphic, MessageType type, int hue, int font, string lang, string name, string text
)
{
@@ -116,8 +116,7 @@ namespace Benchmarks
Span buffer = result.Buffer[0];
var length = CreateUnicodeMessage(
- ref buffer,
- Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, "ENU", "System", text
+ buffer, Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, "ENU", "System", text
);
pipe.Writer.Advance((uint)length);
}
@@ -131,8 +130,7 @@ namespace Benchmarks
var text = "This is some really long text that we want to handle. It should take a little bit to encode this.";
Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
var length = CreateUnicodeMessage(
- ref buffer,
- Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, "ENU", "System", text
+ buffer, Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, "ENU", "System", text
);
buffer = buffer.Slice(0, length);
@@ -151,8 +149,7 @@ namespace Benchmarks
{
Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
var length = CreateUnicodeMessage(
- ref buffer,
- Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, "ENU", "System", text
+ buffer, Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, "ENU", "System", text
);
buffer = buffer.Slice(0, length);
diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/EffectPacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/EffectPacketTests.cs
index 671d54670..b7480d29e 100644
--- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/EffectPacketTests.cs
+++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/EffectPacketTests.cs
@@ -50,7 +50,7 @@ namespace Server.Tests.Network
Span actual = stackalloc byte[OutgoingEffectPackets.ParticleEffectLength];
OutgoingEffectPackets.CreateParticleEffect(
- ref actual,
+ actual,
effectType, from, to, itemId, fromPoint, toPoint, speed, duration, direction,
explode, hue, renderMode, effect, explodeEffect, explodeSound, serial, layer,
unknown
@@ -82,7 +82,7 @@ namespace Server.Tests.Network
Span actual = stackalloc byte[OutgoingEffectPackets.HuedEffectLength];
OutgoingEffectPackets.CreateHuedEffect(
- ref actual,
+ actual,
effectType, from, to, itemId, fromPoint, toPoint, speed,
duration, direction, explode, hue, renderMode
);
@@ -110,10 +110,7 @@ namespace Server.Tests.Network
var expected = new BoltEffect(entity, hue).Compile();
Span actual = stackalloc byte[OutgoingEffectPackets.BoltEffectLength];
- OutgoingEffectPackets.CreateBoltEffect(
- ref actual,
- entity, hue
- );
+ OutgoingEffectPackets.CreateBoltEffect(actual, entity, hue);
AssertThat.Equal(actual, expected);
}
diff --git a/Projects/Server/Effects.cs b/Projects/Server/Effects.cs
index a86a9aaa7..261897693 100644
--- a/Projects/Server/Effects.cs
+++ b/Projects/Server/Effects.cs
@@ -73,13 +73,19 @@ namespace Server
if (map != null)
{
Span buffer = stackalloc byte[OutgoingEffectPackets.SoundPacketLength];
- OutgoingEffectPackets.CreateSoundEffect(ref buffer, soundID, p);
+ buffer.InitializePacket();
var eable = map.GetClientsInRange(new Point3D(p));
foreach (var state in eable)
{
state.Mobile.ProcessDelta();
+
+ if (buffer[0] == 0)
+ {
+ OutgoingEffectPackets.CreateSoundEffect(buffer, soundID, p);
+ }
+
state.Send(buffer);
}
@@ -99,18 +105,14 @@ namespace Server
e.ProcessDelta();
Span preEffect = stackalloc byte[OutgoingEffectPackets.ParticleEffectLength];
- OutgoingEffectPackets.CreateTargetParticleEffect(
- ref preEffect,
- e, 0, 10, 5, 0, 0, 5031, 3, 0
- );
-
+ preEffect.InitializePacket();
Span boltEffect = stackalloc byte[OutgoingEffectPackets.BoltEffectLength];
- OutgoingEffectPackets.CreateBoltEffect(ref boltEffect, e, hue);
+ boltEffect.InitializePacket();
Span soundEffect = sound ? stackalloc byte[OutgoingEffectPackets.SoundPacketLength] : null;
if (sound)
{
- OutgoingEffectPackets.CreateSoundEffect(ref soundEffect, 0x29, e);
+ soundEffect.InitializePacket();
}
var eable = map.GetClientsInRange(e.Location);
@@ -121,13 +123,31 @@ namespace Server
{
if (SendParticlesTo(state))
{
+ if (preEffect[0] == 0)
+ {
+ OutgoingEffectPackets.CreateTargetParticleEffect(
+ preEffect,
+ e, 0, 10, 5, 0, 0, 5031, 3, 0
+ );
+ }
+
state.Send(preEffect);
}
+ if (boltEffect[0] == 0)
+ {
+ OutgoingEffectPackets.CreateBoltEffect(boltEffect, e, hue);
+ }
+
state.Send(boltEffect);
if (sound)
{
+ if (soundEffect[0] == 0)
+ {
+ OutgoingEffectPackets.CreateSoundEffect(soundEffect, 0x29, e);
+ }
+
state.Send(soundEffect);
}
}
@@ -146,11 +166,11 @@ namespace Server
{
Span effect = stackalloc byte[OutgoingEffectPackets.HuedEffectLength];
OutgoingEffectPackets.CreateLocationHuedEffect(
- ref effect,
+ effect,
p, itemID, speed, duration, hue, renderMode
);
- SendPacket(p, map, ref effect);
+ SendPacket(p, map, effect);
}
public static void SendLocationParticles(IEntity e, int itemID, int speed, int duration, int effect)
@@ -175,18 +195,12 @@ namespace Server
}
Span particles = stackalloc byte[OutgoingEffectPackets.ParticleEffectLength];
- OutgoingEffectPackets.CreateLocationParticleEffect(
- ref particles,
- e, itemID, speed, duration, hue, renderMode, effect, unknown
- );
+ particles.InitializePacket();
Span regular = itemID != 0 ? stackalloc byte[OutgoingEffectPackets.HuedEffectLength] : null;
if (itemID != 0)
{
- OutgoingEffectPackets.CreateLocationHuedEffect(
- ref regular,
- e.Location, itemID, speed, duration, hue, renderMode
- );
+ regular.InitializePacket();
}
var eable = map.GetClientsInRange(e.Location);
@@ -197,10 +211,26 @@ namespace Server
if (SendParticlesTo(state))
{
+ if (particles[0] == 0)
+ {
+ OutgoingEffectPackets.CreateLocationParticleEffect(
+ particles,
+ e, itemID, speed, duration, hue, renderMode, effect, unknown
+ );
+ }
+
state.Send(particles);
}
else if (itemID != 0)
{
+ if (regular[0] == 0)
+ {
+ OutgoingEffectPackets.CreateLocationHuedEffect(
+ regular,
+ e.Location, itemID, speed, duration, hue, renderMode
+ );
+ }
+
state.Send(regular);
}
}
@@ -214,11 +244,11 @@ namespace Server
Span effect = stackalloc byte[OutgoingEffectPackets.HuedEffectLength];
OutgoingEffectPackets.CreateTargetHuedEffect(
- ref effect,
+ effect,
target, itemID, speed, duration, hue, renderMode
);
- SendPacket(target.Location, target.Map, ref effect);
+ SendPacket(target.Location, target.Map, effect);
}
public static void SendTargetParticles(
@@ -244,15 +274,12 @@ namespace Server
}
Span particles = stackalloc byte[OutgoingEffectPackets.ParticleEffectLength];
- OutgoingEffectPackets.CreateTargetParticleEffect(
- ref particles,
- target, itemID, speed, duration, hue, renderMode, effect, (int)layer, unknown
- );
+ particles.InitializePacket();
Span regular = itemID != 0 ? stackalloc byte[OutgoingEffectPackets.HuedEffectLength] : null;
if (itemID != 0)
{
- OutgoingEffectPackets.CreateTargetHuedEffect(ref regular, target, itemID, speed, duration, hue, renderMode);
+ regular.InitializePacket();
}
var eable = map.GetClientsInRange(target.Location);
@@ -263,10 +290,23 @@ namespace Server
if (SendParticlesTo(state))
{
+ if (particles[0] == 0)
+ {
+ OutgoingEffectPackets.CreateTargetParticleEffect(
+ particles,
+ target, itemID, speed, duration, hue, renderMode, effect, (int)layer, unknown
+ );
+ }
+
state.Send(particles);
}
else if (itemID != 0)
{
+ if (regular[0] == 0)
+ {
+ OutgoingEffectPackets.CreateTargetHuedEffect(regular, target, itemID, speed, duration, hue, renderMode);
+ }
+
state.Send(regular);
}
}
@@ -393,12 +433,12 @@ namespace Server
{
Span effect = stackalloc byte[OutgoingEffectPackets.HuedEffectLength];
OutgoingEffectPackets.CreateMovingHuedEffect(
- ref effect,
+ effect,
from, to, itemID, fromLocation, toLocation, speed, duration, fixedDirection,
explodes, hue, renderMode
);
- SendPacket(origin, map, ref effect);
+ SendPacket(origin, map, effect);
}
public static void SendMovingParticles(
@@ -464,19 +504,12 @@ namespace Server
}
Span particles = stackalloc byte[OutgoingEffectPackets.ParticleEffectLength];
- OutgoingEffectPackets.CreateMovingParticleEffect(
- ref particles,
- from, to, itemID, speed, duration, fixedDirection, explodes, hue, renderMode, effect,
- explodeEffect, explodeSound, layer, unknown
- );
+ particles.InitializePacket();
Span regular = itemID != 0 ? stackalloc byte[OutgoingEffectPackets.HuedEffectLength] : null;
if (itemID != 0)
{
- OutgoingEffectPackets.CreateMovingHuedEffect(
- ref regular,
- from, to, itemID, speed, duration, fixedDirection, explodes, hue, renderMode
- );
+ regular.InitializePacket();
}
var eable = map.GetClientsInRange(from.Location);
@@ -487,10 +520,27 @@ namespace Server
if (SendParticlesTo(state))
{
+ if (particles[0] == 0)
+ {
+ OutgoingEffectPackets.CreateMovingParticleEffect(
+ particles,
+ from, to, itemID, speed, duration, fixedDirection, explodes, hue, renderMode, effect,
+ explodeEffect, explodeSound, layer, unknown
+ );
+ }
+
state.Send(particles);
}
else if (itemID > 1)
{
+ if (regular[0] == 0)
+ {
+ OutgoingEffectPackets.CreateMovingHuedEffect(
+ regular,
+ from, to, itemID, speed, duration, fixedDirection, explodes, hue, renderMode
+ );
+ }
+
state.Send(regular);
}
}
@@ -498,7 +548,7 @@ namespace Server
eable.Free();
}
- public static void SendPacket(Point3D origin, Map map, ref Span effectBuffer)
+ public static void SendPacket(Point3D origin, Map map, Span effectBuffer)
{
if (map == null)
{
diff --git a/Projects/Server/Items/Item.cs b/Projects/Server/Items/Item.cs
index 1584eb7ca..c62a1d360 100644
--- a/Projects/Server/Items/Item.cs
+++ b/Projects/Server/Items/Item.cs
@@ -370,7 +370,7 @@ namespace Server
var eable = m_Map.GetClientsInRange(worldLoc, GetMaxUpdateRange());
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var state in eable)
{
@@ -378,6 +378,11 @@ namespace Server
if (!m.CanSee(this) && m.InRange(worldLoc, GetUpdateRange(m)))
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
+
state.Send(removeEntity);
}
}
@@ -1136,21 +1141,18 @@ namespace Server
if (m_Map != null)
{
Span oldWorldItem = stackalloc byte[OutgoingItemPackets.MaxWorldItemPacketLength];
- var length = OutgoingItemPackets.CreateWorldItem(ref oldWorldItem, this);
- oldWorldItem = oldWorldItem.Slice(0, length);
+ oldWorldItem.InitializePacket();
Span saWorldItem = stackalloc byte[OutgoingItemPackets.MaxWorldItemPacketLength];
- length = OutgoingItemPackets.CreateWorldItemNew(ref saWorldItem, this, false);
- saWorldItem = saWorldItem.Slice(0, length);
+ saWorldItem.InitializePacket();
Span hsWorldItem = stackalloc byte[OutgoingItemPackets.MaxWorldItemPacketLength];
- length = OutgoingItemPackets.CreateWorldItemNew(ref hsWorldItem, this, true);
- hsWorldItem = hsWorldItem.Slice(0, length);
+ hsWorldItem.InitializePacket();
Span opl = ObjectPropertyList.Enabled ? stackalloc byte[OutgoingEntityPackets.OPLPacketLength] : null;
if (opl != null)
{
- OutgoingEntityPackets.CreateOPLInfo(ref opl, this);
+ OutgoingEntityPackets.CreateOPLInfo(opl, this);
}
var eable = m_Map.GetClientsInRange(m_Location, GetMaxUpdateRange());
@@ -1163,14 +1165,32 @@ namespace Server
{
if (state.HighSeas)
{
+ if (hsWorldItem[0] == 0)
+ {
+ var length = OutgoingItemPackets.CreateWorldItemNew(hsWorldItem, this, true);
+ hsWorldItem = hsWorldItem.Slice(0, length);
+ }
+
SendInfoTo(state, hsWorldItem, opl);
}
else if (state.StygianAbyss)
{
+ if (saWorldItem[0] == 0)
+ {
+ var length = OutgoingItemPackets.CreateWorldItemNew(saWorldItem, this, false);
+ saWorldItem = saWorldItem.Slice(0, length);
+ }
+
SendInfoTo(state, saWorldItem, opl);
}
else
{
+ if (oldWorldItem[0] == 0)
+ {
+ var length = OutgoingItemPackets.CreateWorldItem(oldWorldItem, this);
+ oldWorldItem = oldWorldItem.Slice(0, length);
+ }
+
SendInfoTo(state, oldWorldItem, opl);
}
}
@@ -1195,7 +1215,7 @@ namespace Server
eable = m_Map.GetClientsInRange(oldLocation, GetMaxUpdateRange());
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var state in eable)
{
@@ -1203,6 +1223,10 @@ namespace Server
if (!m.InRange(location, GetUpdateRange(m)))
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
state.Send(removeEntity);
}
}
@@ -1536,7 +1560,7 @@ namespace Server
eable = m_Map.GetClientsInRange(oldLocation, GetMaxUpdateRange());
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var state in eable)
{
@@ -1544,6 +1568,11 @@ namespace Server
if (!m.InRange(value, GetUpdateRange(m)))
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
+
state.Send(removeEntity);
}
}
@@ -3323,15 +3352,8 @@ namespace Server
var worldLoc = GetWorldLocation();
var eable = m_Map.GetClientsInRange(worldLoc, GetMaxUpdateRange());
- var length = OutgoingMessagePackets.GetMaxMessageLength(text);
-
- Span buffer = stackalloc byte[length];
- length = OutgoingMessagePackets.CreateMessage(
- ref buffer,
- Serial, m_ItemID, type, hue, 3, ascii, "ENU", Name, text
- );
-
- buffer = buffer.Slice(0, length); // Adjust to the actual size
+ Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
+ buffer.InitializePacket();
foreach (var state in eable)
{
@@ -3339,6 +3361,15 @@ namespace Server
if (m.CanSee(this) && m.InRange(worldLoc, GetUpdateRange(m)))
{
+ if (buffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessage(
+ buffer, Serial, m_ItemID, type, hue, 3, ascii, "ENU", Name, text
+ );
+
+ buffer = buffer.Slice(0, length); // Adjust to the actual size
+ }
+
state.Send(buffer);
}
}
@@ -3357,13 +3388,7 @@ namespace Server
var eable = m_Map.GetClientsInRange(worldLoc, GetMaxUpdateRange());
Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedLength(args)];
-
- var length = OutgoingMessagePackets.CreateMessageLocalized(
- ref buffer,
- Serial, m_ItemID, type, hue, 3, number, Name, args
- );
-
- buffer = buffer.Slice(0, length); // Adjust to the actual size
+ buffer.InitializePacket();
foreach (var state in eable)
{
@@ -3371,6 +3396,15 @@ namespace Server
if (m.CanSee(this) && m.InRange(worldLoc, GetUpdateRange(m)))
{
+ if (buffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessageLocalized(
+ buffer, Serial, m_ItemID, type, hue, 3, number, Name, args
+ );
+
+ buffer = buffer.Slice(0, length); // Adjust to the actual size
+ }
+
state.Send(buffer);
}
}
@@ -3821,7 +3855,7 @@ namespace Server
var eable = m_Map.GetClientsInRange(worldLoc, GetMaxUpdateRange());
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var state in eable)
{
@@ -3829,6 +3863,11 @@ namespace Server
if (m.InRange(worldLoc, GetUpdateRange(m)))
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
+
state.Send(removeEntity);
}
}
diff --git a/Projects/Server/Mobiles/Mobile.cs b/Projects/Server/Mobiles/Mobile.cs
index 3838f73c4..0a62f29cc 100644
--- a/Projects/Server/Mobiles/Mobile.cs
+++ b/Projects/Server/Mobiles/Mobile.cs
@@ -3175,13 +3175,13 @@ namespace Server
Packet hbpPacket = null;
Packet hbyPacket = null;
- Span deadBuffer = stackalloc byte[OutgoingMobilePackets.BondedStatusPacketLength];
- OutgoingMobilePackets.CreateBondedStatus(ref deadBuffer, m.Serial, true);
-
var eable = m.Map.GetClientsInRange(m.m_Location);
+ Span deadBuffer = stackalloc byte[OutgoingMobilePackets.BondedStatusPacketLength];
+ deadBuffer.InitializePacket();
+
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var state in eable)
{
@@ -3191,6 +3191,11 @@ namespace Server
{
if (sendRemove)
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
+
state.Send(removeEntity);
}
@@ -3200,6 +3205,11 @@ namespace Server
if (m.IsDeadBondedPet)
{
+ if (deadBuffer[0] == 0)
+ {
+ OutgoingMobilePackets.CreateBondedStatus(deadBuffer, m.Serial, true);
+ }
+
state.Send(deadBuffer);
}
}
@@ -4988,18 +4998,29 @@ namespace Server
var corpseSerial = c?.Serial ?? Serial.Zero;
Span deathAnimation = stackalloc byte[OutgoingMobilePackets.DeathAnimationPacketLength];
- OutgoingMobilePackets.CreateDeathAnimation(ref deathAnimation, Serial, corpseSerial);
+ deathAnimation.InitializePacket();
+
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var state in eable)
{
if (state != m_NetState)
{
+ if (deathAnimation[0] == 0)
+ {
+ OutgoingMobilePackets.CreateDeathAnimation(deathAnimation, Serial, corpseSerial);
+ }
+
state.Send(deathAnimation);
if (!state.Mobile.CanSee(this))
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
+
state.Send(removeEntity);
}
}
@@ -5782,19 +5803,9 @@ namespace Server
ProcessDelta();
Span regBuffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
+ regBuffer.InitializePacket();
Span mutBuffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(mutatedText)];
-
- var length = OutgoingMessagePackets.CreateMessage(
- ref regBuffer,
- Serial, Body, type, hue, 3, false, m_Language, Name, text
- );
- regBuffer = regBuffer.Slice(0, length); // Adjust to the actual size
-
- length = OutgoingMessagePackets.CreateMessage(
- ref mutBuffer,
- Serial, Body, type, hue, 3, false, m_Language, Name, mutatedText
- );
- mutBuffer = mutBuffer.Slice(0, length); // Adjust to the actual size
+ mutBuffer.InitializePacket();
// TODO: Should this be sorted like onSpeech is below?
for (var i = 0; i < hears.Count; ++i)
@@ -5803,11 +5814,27 @@ namespace Server
if (mutatedArgs == null || !CheckHearsMutatedSpeech(heard, mutateContext))
{
+ if (regBuffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessage(
+ regBuffer, Serial, Body, type, hue, 3, false, m_Language, Name, text
+ );
+ regBuffer = regBuffer.Slice(0, length); // Adjust to the actual size
+ }
+
heard.OnSpeech(regArgs);
heard.NetState?.Send(regBuffer);
}
else
{
+ if (mutBuffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessage(
+ mutBuffer, Serial, Body, type, hue, 3, false, m_Language, Name, mutatedText
+ );
+ mutBuffer = mutBuffer.Slice(0, length); // Adjust to the actual size
+ }
+
heard.OnSpeech(mutatedArgs);
heard.NetState?.Send(mutBuffer);
}
@@ -6934,7 +6961,7 @@ namespace Server
}
Span buffer = stackalloc byte[OutgoingEffectPackets.SoundPacketLength];
- OutgoingEffectPackets.CreateSoundEffect(ref buffer, soundID, this);
+ buffer.InitializePacket();
var eable = m_Map.GetClientsInRange(m_Location);
@@ -6942,6 +6969,11 @@ namespace Server
{
if (state.Mobile.CanSee(this))
{
+ if (buffer[0] == 0)
+ {
+ OutgoingEffectPackets.CreateSoundEffect(buffer, soundID, this);
+ }
+
state.Send(buffer);
}
}
@@ -6997,12 +7029,17 @@ namespace Server
var eable = m_Map.GetClientsInRange(m_Location);
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var state in eable)
{
if (state != m_NetState && (everyone || !state.Mobile.CanSee(this)))
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
+
state.Send(removeEntity);
}
}
@@ -7253,12 +7290,17 @@ namespace Server
var eable = m_Map.GetClientsInRange(m_Location);
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var state in eable)
{
if (!state.Mobile.CanSee(this))
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
+
state.Send(removeEntity);
}
else
@@ -7483,12 +7525,17 @@ namespace Server
var eable = map.GetClientsInRange(oldLocation);
Span removeEntity = stackalloc byte[OutgoingEntityPackets.RemoveEntityLength];
- OutgoingEntityPackets.CreateRemoveEntity(ref removeEntity, Serial);
+ removeEntity.InitializePacket();
foreach (var ns in eable)
{
if (ns != m_NetState && !Utility.InUpdateRange(newLocation, ns.Mobile.Location))
{
+ if (removeEntity[0] == 0)
+ {
+ OutgoingEntityPackets.CreateRemoveEntity(removeEntity, Serial);
+ }
+
ns.Send(removeEntity);
}
}
@@ -9176,15 +9223,8 @@ namespace Server
return;
}
- var length = OutgoingMessagePackets.GetMaxMessageLength(text);
-
- Span buffer = stackalloc byte[length];
- length = OutgoingMessagePackets.CreateMessage(
- ref buffer,
- Serial, Body, type, hue, 3, ascii, Language, Name, text
- );
-
- buffer = buffer.Slice(0, length); // Adjust to the actual size
+ Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
+ buffer.InitializePacket();
var eable = m_Map.GetClientsInRange(m_Location);
@@ -9192,6 +9232,15 @@ namespace Server
{
if (state.Mobile.CanSee(this) && (noLineOfSight || state.Mobile.InLOS(this)))
{
+ if (buffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessage(
+ buffer, Serial, Body, type, hue, 3, ascii, Language, Name, text
+ );
+
+ buffer = buffer.Slice(0, length); // Adjust to the actual size
+ }
+
state.Send(buffer);
}
}
@@ -9207,12 +9256,7 @@ namespace Server
}
Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedLength(args)];
-
- var length = OutgoingMessagePackets.CreateMessageLocalized(
- ref buffer,
- Serial, Body, type, hue, 3, number, Name, args
- );
- buffer = buffer.Slice(0, length); // Adjust to the actual size
+ buffer.InitializePacket();
var eable = m_Map.GetClientsInRange(m_Location);
@@ -9220,6 +9264,14 @@ namespace Server
{
if (state.Mobile.CanSee(this) && (noLineOfSight || state.Mobile.InLOS(this)))
{
+ if (buffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessageLocalized(
+ buffer, Serial, Body, type, hue, 3, number, Name, args
+ );
+ buffer = buffer.Slice(0, length); // Adjust to the actual size
+ }
+
state.Send(buffer);
}
}
@@ -9238,12 +9290,7 @@ namespace Server
}
Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedAffixLength(affix, args)];
-
- var length = OutgoingMessagePackets.CreateMessageLocalizedAffix(
- ref buffer,
- Serial, Body, type, hue, 3, number, Name, affixType, affix, args
- );
- buffer = buffer.Slice(0, length); // Adjust to the actual size
+ buffer.InitializePacket();
var eable = m_Map.GetClientsInRange(m_Location);
@@ -9251,6 +9298,14 @@ namespace Server
{
if (state.Mobile.CanSee(this) && (noLineOfSight || state.Mobile.InLOS(this)))
{
+ if (buffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessageLocalizedAffix(
+ buffer, Serial, Body, type, hue, 3, number, Name, affixType, affix, args
+ );
+ buffer = buffer.Slice(0, length); // Adjust to the actual size
+ }
+
state.Send(buffer);
}
}
@@ -9283,12 +9338,7 @@ namespace Server
}
Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedLength(args)];
-
- var length = OutgoingMessagePackets.CreateMessageLocalized(
- ref buffer,
- Serial, Body, type, hue, 3, number, Name, args
- );
- buffer = buffer.Slice(0, length); // Adjust to the actual size
+ buffer.InitializePacket();
var eable = m_Map.GetClientsInRange(m_Location);
@@ -9296,6 +9346,14 @@ namespace Server
{
if (state != m_NetState && state.Mobile.CanSee(this))
{
+ if (buffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessageLocalized(
+ buffer, Serial, Body, type, hue, 3, number, Name, args
+ );
+ buffer = buffer.Slice(0, length); // Adjust to the actual size
+ }
+
state.Send(buffer);
}
}
@@ -9310,15 +9368,8 @@ namespace Server
return;
}
- var length = OutgoingMessagePackets.GetMaxMessageLength(text);
-
- Span buffer = stackalloc byte[length];
- length = OutgoingMessagePackets.CreateMessage(
- ref buffer,
- Serial, Body, type, hue, 3, ascii, Language, Name, text
- );
-
- buffer = buffer.Slice(0, length); // Adjust to the actual size
+ Span buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLength(text)];
+ buffer.InitializePacket();
var eable = m_Map.GetClientsInRange(m_Location);
@@ -9326,6 +9377,15 @@ namespace Server
{
if (state != m_NetState && state.Mobile.CanSee(this))
{
+ if (buffer[0] == 0)
+ {
+ var length = OutgoingMessagePackets.CreateMessage(
+ buffer, Serial, Body, type, hue, 3, ascii, Language, Name, text
+ );
+
+ buffer = buffer.Slice(0, length); // Adjust to the actual size
+ }
+
state.Send(buffer);
}
}
diff --git a/Projects/Server/Network/PacketUtilities.cs b/Projects/Server/Network/PacketUtilities.cs
index 69ff69b95..ade7e12b3 100644
--- a/Projects/Server/Network/PacketUtilities.cs
+++ b/Projects/Server/Network/PacketUtilities.cs
@@ -40,9 +40,20 @@ namespace Server.Network
writer.Seek(length, SeekOrigin.Begin);
}
+ // If LOCAL INIT is off, then stack/heap allocations have garbage data
+ // Initializes the first byte (Packet ID) so it can be used as a flag.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static void InitializePacket(this Span buffer)
+ {
+#if NO_LOCAL_INIT
+ buffer[0] = 0;
+#endif
+ }
+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InitializePackets(this Span buffer, int chunkLength)
{
+#if NO_LOCAL_INIT
var index = 0;
while (index < buffer.Length)
@@ -50,6 +61,7 @@ namespace Server.Network
buffer[index] = 0;
index += chunkLength;
}
+#endif
}
}
}
diff --git a/Projects/Server/Network/Packets/OutgoingEffectPackets.cs b/Projects/Server/Network/Packets/OutgoingEffectPackets.cs
index 4765e3d9b..b293a370d 100644
--- a/Projects/Server/Network/Packets/OutgoingEffectPackets.cs
+++ b/Projects/Server/Network/Packets/OutgoingEffectPackets.cs
@@ -33,12 +33,12 @@ namespace Server.Network
}
Span buffer = stackalloc byte[SoundPacketLength];
- CreateSoundEffect(ref buffer, soundID, target);
+ CreateSoundEffect(buffer, soundID, target);
ns.Send(buffer);
}
- public static void CreateSoundEffect(ref Span buffer, int soundID, IPoint3D target)
+ public static void CreateSoundEffect(Span buffer, int soundID, IPoint3D target)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0x54); // Packet ID
@@ -51,7 +51,7 @@ namespace Server.Network
}
public static void CreateParticleEffect(
- ref Span buffer,
+ Span buffer,
EffectType type, Serial from, Serial to, int itemID, IPoint3D fromPoint, IPoint3D toPoint,
int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode, int effect,
int explodeEffect, int explodeSound, Serial serial, int layer, int unknown
@@ -86,10 +86,10 @@ namespace Server.Network
}
public static void CreateTargetParticleEffect(
- ref Span buffer,
+ Span buffer,
IEntity e, int itemID, int speed, int duration, int hue, int renderMode, int effect, int layer, int unknown
) => CreateParticleEffect(
- ref buffer,
+ buffer,
EffectType.FixedFrom,
e.Serial,
Serial.Zero,
@@ -111,10 +111,10 @@ namespace Server.Network
);
public static void CreateLocationParticleEffect(
- ref Span buffer,
+ Span buffer,
IEntity e, int itemID, int speed, int duration, int hue, int renderMode, int effect, int unknown
) => CreateParticleEffect(
- ref buffer,
+ buffer,
EffectType.FixedXYZ,
e.Serial,
Serial.Zero,
@@ -136,12 +136,12 @@ namespace Server.Network
);
public static void CreateMovingParticleEffect(
- ref Span buffer,
+ Span buffer,
IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection,
bool explodes, int hue, int renderMode, int effect, int explodeEffect, int explodeSound, EffectLayer layer,
int unknown
) => CreateParticleEffect(
- ref buffer,
+ buffer,
EffectType.Moving,
from.Serial,
to.Serial,
@@ -163,7 +163,7 @@ namespace Server.Network
);
public static void CreateHuedEffect(
- ref Span buffer,
+ Span buffer,
EffectType type, Serial from, Serial to, int itemID, Point3D fromPoint, Point3D toPoint,
int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode
)
@@ -191,10 +191,10 @@ namespace Server.Network
}
public static void CreateTargetHuedEffect(
- ref Span buffer,
+ Span buffer,
IEntity e, int itemID, int speed, int duration, int hue, int renderMode
) => CreateHuedEffect(
- ref buffer,
+ buffer,
EffectType.FixedFrom,
e.Serial,
Serial.Zero,
@@ -210,10 +210,10 @@ namespace Server.Network
);
public static void CreateLocationHuedEffect(
- ref Span buffer,
+ Span buffer,
Point3D p, int itemID, int speed, int duration, int hue, int renderMode
) => CreateHuedEffect(
- ref buffer,
+ buffer,
EffectType.FixedXYZ,
Serial.Zero,
Serial.Zero,
@@ -229,11 +229,11 @@ namespace Server.Network
);
public static void CreateMovingHuedEffect(
- ref Span buffer,
+ Span buffer,
IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection,
bool explodes, int hue, int renderMode
) => CreateHuedEffect(
- ref buffer,
+ buffer,
EffectType.Moving,
from.Serial,
to.Serial,
@@ -249,11 +249,11 @@ namespace Server.Network
);
public static void CreateMovingHuedEffect(
- ref Span buffer,
+ Span buffer,
int itemID, Point3D fromLocation, Point3D toLocation, int speed, int duration,
bool fixedDirection, bool explodes, int hue, int renderMode
) => CreateHuedEffect(
- ref buffer,
+ buffer,
EffectType.Moving,
Serial.Zero,
Serial.Zero,
@@ -269,11 +269,11 @@ namespace Server.Network
);
public static void CreateMovingHuedEffect(
- ref Span buffer,
+ Span buffer,
Serial from, Serial to, int itemID, Point3D fromLocation, Point3D toLocation, int speed, int duration,
bool fixedDirection, bool explodes, int hue, int renderMode
) => CreateHuedEffect(
- ref buffer,
+ buffer,
EffectType.Moving,
from,
to,
@@ -288,8 +288,8 @@ namespace Server.Network
renderMode
);
- public static void CreateBoltEffect(ref Span buffer, IEntity target, int hue) => CreateHuedEffect(
- ref buffer,
+ public static void CreateBoltEffect(Span buffer, IEntity target, int hue) => CreateHuedEffect(
+ buffer,
EffectType.Lightning,
target.Serial,
Serial.Zero,
diff --git a/Projects/Server/Network/Packets/OutgoingEntityPackets.cs b/Projects/Server/Network/Packets/OutgoingEntityPackets.cs
index 279e8aa68..ab4dba9dd 100644
--- a/Projects/Server/Network/Packets/OutgoingEntityPackets.cs
+++ b/Projects/Server/Network/Packets/OutgoingEntityPackets.cs
@@ -23,10 +23,10 @@ namespace Server.Network
public const int OPLPacketLength = 9;
public const int RemoveEntityLength = 5;
- public static void CreateOPLInfo(ref Span buffer, Item item) =>
- CreateOPLInfo(ref buffer, item.Serial, item.PropertyList.Hash);
+ public static void CreateOPLInfo(Span buffer, Item item) =>
+ CreateOPLInfo(buffer, item.Serial, item.PropertyList.Hash);
- public static void CreateOPLInfo(ref Span buffer, Serial serial, int hash)
+ public static void CreateOPLInfo(Span buffer, Serial serial, int hash)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0xDC); // Packet ID
@@ -45,12 +45,12 @@ namespace Server.Network
}
Span buffer = stackalloc byte[OPLPacketLength];
- CreateOPLInfo(ref buffer, serial, hash);
+ CreateOPLInfo(buffer, serial, hash);
ns.Send(buffer);
}
- public static void CreateRemoveEntity(ref Span buffer, Serial serial)
+ public static void CreateRemoveEntity(Span buffer, Serial serial)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0x1D); // Packet ID
@@ -65,7 +65,7 @@ namespace Server.Network
}
Span buffer = stackalloc byte[RemoveEntityLength];
- CreateRemoveEntity(ref buffer, serial);
+ CreateRemoveEntity(buffer, serial);
ns.Send(buffer);
}
diff --git a/Projects/Server/Network/Packets/OutgoingItemPackets.cs b/Projects/Server/Network/Packets/OutgoingItemPackets.cs
index 692c08bb9..476528f87 100644
--- a/Projects/Server/Network/Packets/OutgoingItemPackets.cs
+++ b/Projects/Server/Network/Packets/OutgoingItemPackets.cs
@@ -23,7 +23,7 @@ namespace Server.Network
{
public const int MaxWorldItemPacketLength = 26;
- public static int CreateWorldItem(ref Span buffer, Item item)
+ public static int CreateWorldItem(Span buffer, Item item)
{
var itemID = item is BaseMulti ? item.ItemID | 0x4000 : item.ItemID & 0x3FFF;
var hasAmount = item.Amount != 0;
@@ -87,13 +87,13 @@ namespace Server.Network
Span buffer = stackalloc byte[MaxWorldItemPacketLength];
var length = ns.StygianAbyss ?
- CreateWorldItemNew(ref buffer, item, ns.HighSeas) :
- CreateWorldItem(ref buffer, item);
+ CreateWorldItemNew(buffer, item, ns.HighSeas) :
+ CreateWorldItem(buffer, item);
ns.Send(buffer.Slice(0, length));
}
- public static int CreateWorldItemNew(ref Span buffer, Item item, bool isHS)
+ public static int CreateWorldItemNew(Span buffer, Item item, bool isHS)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0xF3); // Packet ID
diff --git a/Projects/Server/Network/Packets/OutgoingMessagePackets.cs b/Projects/Server/Network/Packets/OutgoingMessagePackets.cs
index c34d1ace7..8f95f8e3e 100644
--- a/Projects/Server/Network/Packets/OutgoingMessagePackets.cs
+++ b/Projects/Server/Network/Packets/OutgoingMessagePackets.cs
@@ -43,8 +43,7 @@ namespace Server.Network
Span buffer = stackalloc byte[GetMaxMessageLocalizedLength(args)];
var length = CreateMessageLocalized(
- ref buffer,
- serial, graphic, type, hue, font, number, name, args
+ buffer, serial, graphic, type, hue, font, number, name, args
);
ns.Send(buffer.Slice(0, length));
@@ -53,7 +52,7 @@ namespace Server.Network
public static int GetMaxMessageLocalizedLength(string args) => 50 + (args?.Length ?? 0) * 2;
public static int CreateMessageLocalized(
- ref Span buffer,
+ Span buffer,
Serial serial, int graphic, MessageType type, int hue, int font, int number, string name = "", string args = ""
)
{
@@ -95,8 +94,7 @@ namespace Server.Network
Span buffer = stackalloc byte[GetMaxMessageLocalizedAffixLength(affix, args)];
var length = CreateMessageLocalizedAffix(
- ref buffer,
- serial, graphic, type, hue, font, number, name, affixType, affix, args
+ buffer, serial, graphic, type, hue, font, number, name, affixType, affix, args
);
ns.Send(buffer.Slice(0, length));
@@ -106,7 +104,7 @@ namespace Server.Network
52 + (affix?.Length ?? 0) + (args?.Length ?? 0) * 2;
public static int CreateMessageLocalizedAffix(
- ref Span buffer,
+ Span buffer,
Serial serial, int graphic, MessageType type, int hue, int font, int number, string name,
AffixType affixType, string affix = "", string args = ""
)
@@ -152,7 +150,7 @@ namespace Server.Network
Span buffer = stackalloc byte[GetMaxMessageLength(text)];
var length = CreateMessage(
- ref buffer,
+ buffer,
serial,
graphic,
type,
@@ -171,7 +169,7 @@ namespace Server.Network
public static int GetMaxMessageLength(string text) => 50 + (text?.Length ?? 0) * 2;
public static int CreateMessage(
- ref Span buffer,
+ Span buffer,
Serial serial,
int graphic,
MessageType type,
diff --git a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs
index dde0e0806..1706cadea 100644
--- a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs
+++ b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs
@@ -26,7 +26,7 @@ namespace Server.Network
public const int MobileMovingPacketLength = 17;
public const int MobileMovingPacketCacheLength = MobileMovingPacketLength * 8 * 2; // 8 notoriety, 2 client versions
- public static void CreateBondedStatus(ref Span buffer, Serial serial, bool bonded)
+ public static void CreateBondedStatus(Span buffer, Serial serial, bool bonded)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0xBF); // Packet ID
@@ -55,7 +55,7 @@ namespace Server.Network
ns.Send(ref buffer, writer.Position);
}
- public static void CreateDeathAnimation(ref Span buffer, Serial killed, Serial corpse)
+ public static void CreateDeathAnimation(Span buffer, Serial killed, Serial corpse)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0xAF); // Packet ID
@@ -72,11 +72,11 @@ namespace Server.Network
}
Span span = stackalloc byte[DeathAnimationPacketLength];
- CreateDeathAnimation(ref span, killed, corpse);
+ CreateDeathAnimation(span, killed, corpse);
ns.Send(span);
}
- public static void CreateMobileMoving(ref Span buffer, Mobile m, int noto, bool stygianAbyss)
+ public static void CreateMobileMoving(Span buffer, Mobile m, int noto, bool stygianAbyss)
{
var loc = m.Location;
var hue = m.SolidHueOverride >= 0 ? m.SolidHueOverride : m.Hue;
@@ -106,7 +106,7 @@ namespace Server.Network
}
Span span = stackalloc byte[MobileMovingPacketLength];
- CreateMobileMoving(ref span, target, noto, ns.StygianAbyss);
+ CreateMobileMoving(span, target, noto, ns.StygianAbyss);
ns.Send(span);
}
@@ -130,7 +130,7 @@ namespace Server.Network
// Packet not created yet
if (buffer[0] == 0)
{
- CreateMobileMoving(ref buffer, target, noto, stygianAbyss);
+ CreateMobileMoving(buffer, target, noto, stygianAbyss);
}
ns.Send(buffer);
diff --git a/Projects/Server/Sector.cs b/Projects/Server/Sector.cs
index cb6faa499..1c2d1776a 100644
--- a/Projects/Server/Sector.cs
+++ b/Projects/Server/Sector.cs
@@ -96,7 +96,7 @@ namespace Server
if (index >= 0)
{
- list[index] = newValue;
+ list![index] = newValue;
}
else
{
diff --git a/Projects/Server/World/World.cs b/Projects/Server/World/World.cs
index eda62e242..40bd4f994 100644
--- a/Projects/Server/World/World.cs
+++ b/Projects/Server/World/World.cs
@@ -154,8 +154,7 @@ namespace Server
Span buffer = stackalloc byte[length];
length = OutgoingMessagePackets.CreateMessage(
- ref buffer,
- Serial.MinusOne, -1, MessageType.Regular, hue, 3, ascii, "ENU", "System", text
+ buffer, Serial.MinusOne, -1, MessageType.Regular, hue, 3, ascii, "ENU", "System", text
);
buffer = buffer.Slice(0, length); // Adjust to the actual size
diff --git a/Projects/UOContent/Commands/Handlers.cs b/Projects/UOContent/Commands/Handlers.cs
index 29d4fddde..9b61228e9 100644
--- a/Projects/UOContent/Commands/Handlers.cs
+++ b/Projects/UOContent/Commands/Handlers.cs
@@ -417,12 +417,17 @@ namespace Server.Commands
);
Span 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);
}
}
diff --git a/Projects/UOContent/Commands/VisibilityList.cs b/Projects/UOContent/Commands/VisibilityList.cs
index 0946a266d..c980e8fda 100644
--- a/Projects/UOContent/Commands/VisibilityList.cs
+++ b/Projects/UOContent/Commands/VisibilityList.cs
@@ -70,7 +70,7 @@ namespace Server.Commands
if (list.Count > 0)
{
Span 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);
}
}
diff --git a/Projects/UOContent/Engines/Doom/LeverPuzzle/LeverPuzzleController.cs b/Projects/UOContent/Engines/Doom/LeverPuzzle/LeverPuzzleController.cs
index 2d673d699..ba0cecc09 100644
--- a/Projects/UOContent/Engines/Doom/LeverPuzzle/LeverPuzzleController.cs
+++ b/Projects/UOContent/Engines/Doom/LeverPuzzle/LeverPuzzleController.cs
@@ -504,26 +504,30 @@ namespace Server.Engines.Doom
public static void POHMessage(Mobile from, int index)
{
Span 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);
}
diff --git a/Projects/UOContent/Engines/MLQuests/Mobiles/SirHelper.cs b/Projects/UOContent/Engines/MLQuests/Mobiles/SirHelper.cs
index 08b164330..3404c335a 100644
--- a/Projects/UOContent/Engines/MLQuests/Mobiles/SirHelper.cs
+++ b/Projects/UOContent/Engines/MLQuests/Mobiles/SirHelper.cs
@@ -96,7 +96,7 @@ namespace Server.Engines.MLQuests.Mobiles
}
Span 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);
diff --git a/Projects/UOContent/Engines/Party/Party.cs b/Projects/UOContent/Engines/Party/Party.cs
index 45efc269e..f2bb158c7 100644
--- a/Projects/UOContent/Engines/Party/Party.cs
+++ b/Projects/UOContent/Engines/Party/Party.cs
@@ -241,7 +241,7 @@ namespace Server.Engines.PartySystem
Span 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 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 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 span, bool isSpeech)
+ public void SendToAll(Span 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 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);
diff --git a/Projects/UOContent/Items/Games/BaseBoard.cs b/Projects/UOContent/Items/Games/BaseBoard.cs
index 384eccffb..f542013ff 100644
--- a/Projects/UOContent/Items/Games/BaseBoard.cs
+++ b/Projects/UOContent/Items/Games/BaseBoard.cs
@@ -88,10 +88,15 @@ namespace Server.Items
else
{
Span 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);
}
}
diff --git a/Projects/UOContent/Items/Misc/Blocker.cs b/Projects/UOContent/Items/Misc/Blocker.cs
index c9cdf83f3..d09b9bfde 100644
--- a/Projects/UOContent/Items/Misc/Blocker.cs
+++ b/Projects/UOContent/Items/Misc/Blocker.cs
@@ -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);
}
diff --git a/Projects/UOContent/Items/Misc/LOSBlocker.cs b/Projects/UOContent/Items/Misc/LOSBlocker.cs
index aedacc00e..0d3bcc126 100644
--- a/Projects/UOContent/Items/Misc/LOSBlocker.cs
+++ b/Projects/UOContent/Items/Misc/LOSBlocker.cs
@@ -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);
}
diff --git a/Projects/UOContent/Misc/Guild.cs b/Projects/UOContent/Misc/Guild.cs
index 265d41bcf..af4c98a5d 100644
--- a/Projects/UOContent/Misc/Guild.cs
+++ b/Projects/UOContent/Misc/Guild.cs
@@ -331,20 +331,7 @@ namespace Server.Guilds
public void AllianceChat(Mobile from, int hue, string text)
{
Span 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();;
+ m_AllianceLeader = reader.ReadEntity();
}
goto case 4;
@@ -1516,15 +1521,20 @@ namespace Server.Guilds
public void GuildChat(Mobile from, int hue, string text)
{
Span 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);
}
}
diff --git a/Projects/UOContent/Mobiles/BaseCreature.cs b/Projects/UOContent/Mobiles/BaseCreature.cs
index 51846f13a..d71f08165 100644
--- a/Projects/UOContent/Mobiles/BaseCreature.cs
+++ b/Projects/UOContent/Mobiles/BaseCreature.cs
@@ -3844,8 +3844,8 @@ namespace Server.Mobiles
IsDeadPet = false;
Span 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();
diff --git a/Projects/UOContent/Mobiles/PlayerMobile.cs b/Projects/UOContent/Mobiles/PlayerMobile.cs
index b2853dd4f..b35551720 100644
--- a/Projects/UOContent/Mobiles/PlayerMobile.cs
+++ b/Projects/UOContent/Mobiles/PlayerMobile.cs
@@ -2827,20 +2827,7 @@ namespace Server.Mobiles
private static void SendToStaffMessage(Mobile from, string text)
{
Span 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);
}
}