mirror of
https://github.com/opensim/opensim.git
synced 2026-08-05 00:46:02 +08:00
Patch from Johan: LibSL updated to the latest revision (1568) and all packets are now
recycled to improve performance and memory usage.
This commit is contained in:
@@ -66,6 +66,7 @@ namespace OpenSim.Region.ClientStack
|
||||
private int m_packetsReceived = 0;
|
||||
private int m_probesWithNoIngressPackets = 0;
|
||||
private int m_lastPacketsReceived = 0;
|
||||
private byte[] ZeroOutBuffer = new byte[4096];
|
||||
|
||||
private readonly Encoding m_encoding = Encoding.ASCII;
|
||||
private readonly LLUUID m_agentId;
|
||||
@@ -215,7 +216,7 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
m_scene.RemoveClient(AgentId);
|
||||
// Send the STOP packet
|
||||
DisableSimulatorPacket disable = new DisableSimulatorPacket();
|
||||
DisableSimulatorPacket disable = (DisableSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
|
||||
OutPacket(disable, ThrottleOutPacketType.Task);
|
||||
|
||||
|
||||
@@ -256,7 +257,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void Kick(string message)
|
||||
{
|
||||
KickUserPacket kupack = new KickUserPacket();
|
||||
KickUserPacket kupack = (KickUserPacket) PacketPool.Instance.GetPacket(PacketType.KickUser);
|
||||
kupack.UserInfo.AgentID = AgentId;
|
||||
kupack.UserInfo.SessionID = SessionId;
|
||||
kupack.TargetBlock.TargetIP = (uint) 0;
|
||||
@@ -558,8 +559,7 @@ namespace OpenSim.Region.ClientStack
|
||||
/// <param name="regionInfo"></param>
|
||||
public void SendRegionHandshake(RegionInfo regionInfo)
|
||||
{
|
||||
RegionHandshakePacket handshake =
|
||||
(RegionHandshakePacket) PacketPool.Instance.GetPacket(PacketType.RegionHandshake);
|
||||
RegionHandshakePacket handshake = (RegionHandshakePacket) PacketPool.Instance.GetPacket(PacketType.RegionHandshake);
|
||||
|
||||
handshake.RegionInfo.BillableFactor = regionInfo.EstateSettings.billableFactor;
|
||||
handshake.RegionInfo.IsEstateManager = false;
|
||||
@@ -596,7 +596,7 @@ namespace OpenSim.Region.ClientStack
|
||||
/// <param name="regInfo"></param>
|
||||
public void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos, LLVector3 look)
|
||||
{
|
||||
AgentMovementCompletePacket mov = new AgentMovementCompletePacket();
|
||||
AgentMovementCompletePacket mov = (AgentMovementCompletePacket) PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete);
|
||||
mov.SimData.ChannelVersion = m_channelVersion;
|
||||
mov.AgentData.SessionID = m_sessionId;
|
||||
mov.AgentData.AgentID = AgentId;
|
||||
@@ -631,7 +631,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendChatMessage(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
|
||||
{
|
||||
ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket();
|
||||
ChatFromSimulatorPacket reply = (ChatFromSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator);
|
||||
reply.ChatData.Audible = 1;
|
||||
reply.ChatData.Message = message;
|
||||
reply.ChatData.ChatType = type;
|
||||
@@ -652,7 +652,7 @@ namespace OpenSim.Region.ClientStack
|
||||
public void SendInstantMessage(LLUUID fromAgent, LLUUID fromAgentSession, string message, LLUUID toAgent,
|
||||
LLUUID imSessionID, string fromName, byte dialog, uint timeStamp)
|
||||
{
|
||||
ImprovedInstantMessagePacket msg = new ImprovedInstantMessagePacket();
|
||||
ImprovedInstantMessagePacket msg = (ImprovedInstantMessagePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedInstantMessage);
|
||||
msg.AgentData.AgentID = fromAgent;
|
||||
msg.AgentData.SessionID = fromAgentSession;
|
||||
msg.MessageBlock.FromAgentName = Helpers.StringToField(fromName);
|
||||
@@ -740,7 +740,8 @@ namespace OpenSim.Region.ClientStack
|
||||
IPAddress neighbourIP = neighbourEndPoint.Address;
|
||||
ushort neighbourPort = (ushort) neighbourEndPoint.Port;
|
||||
|
||||
EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket();
|
||||
EnableSimulatorPacket enablesimpacket = (EnableSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.EnableSimulator);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
|
||||
enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
|
||||
|
||||
@@ -776,7 +777,8 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
LLVector3 look = new LLVector3(lookAt.X*10, lookAt.Y*10, lookAt.Z*10);
|
||||
|
||||
CrossedRegionPacket newSimPack = new CrossedRegionPacket();
|
||||
CrossedRegionPacket newSimPack = (CrossedRegionPacket) PacketPool.Instance.GetPacket(PacketType.CrossedRegion);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
|
||||
newSimPack.AgentData.AgentID = AgentId;
|
||||
newSimPack.AgentData.SessionID = m_sessionId;
|
||||
@@ -798,7 +800,8 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendMapBlock(List<MapBlockData> mapBlocks)
|
||||
{
|
||||
MapBlockReplyPacket mapReply = new MapBlockReplyPacket();
|
||||
MapBlockReplyPacket mapReply = (MapBlockReplyPacket) PacketPool.Instance.GetPacket(PacketType.MapBlockReply);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
mapReply.AgentData.AgentID = AgentId;
|
||||
mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks.Count];
|
||||
mapReply.AgentData.Flags = 0;
|
||||
@@ -820,7 +823,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendLocalTeleport(LLVector3 position, LLVector3 lookAt, uint flags)
|
||||
{
|
||||
TeleportLocalPacket tpLocal = new TeleportLocalPacket();
|
||||
TeleportLocalPacket tpLocal = (TeleportLocalPacket) PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
|
||||
tpLocal.Info.AgentID = AgentId;
|
||||
tpLocal.Info.TeleportFlags = flags;
|
||||
tpLocal.Info.LocationID = 2;
|
||||
@@ -832,7 +835,7 @@ namespace OpenSim.Region.ClientStack
|
||||
public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID,
|
||||
uint flags, string capsURL)
|
||||
{
|
||||
TeleportFinishPacket teleport = new TeleportFinishPacket();
|
||||
TeleportFinishPacket teleport = (TeleportFinishPacket) PacketPool.Instance.GetPacket(PacketType.TeleportFinish);
|
||||
teleport.Info.AgentID = AgentId;
|
||||
teleport.Info.RegionHandle = regionHandle;
|
||||
teleport.Info.SimAccess = simAccess;
|
||||
@@ -858,7 +861,7 @@ namespace OpenSim.Region.ClientStack
|
||||
/// </summary>
|
||||
public void SendTeleportFailed()
|
||||
{
|
||||
TeleportFailedPacket tpFailed = new TeleportFailedPacket();
|
||||
TeleportFailedPacket tpFailed = (TeleportFailedPacket) PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
|
||||
tpFailed.Info.AgentID = AgentId;
|
||||
tpFailed.Info.Reason = Helpers.StringToField("unknown failure of teleport");
|
||||
OutPacket(tpFailed, ThrottleOutPacketType.Task);
|
||||
@@ -869,14 +872,14 @@ namespace OpenSim.Region.ClientStack
|
||||
/// </summary>
|
||||
public void SendTeleportLocationStart()
|
||||
{
|
||||
TeleportStartPacket tpStart = new TeleportStartPacket();
|
||||
TeleportStartPacket tpStart = (TeleportStartPacket) PacketPool.Instance.GetPacket(PacketType.TeleportStart);
|
||||
tpStart.Info.TeleportFlags = 16; // Teleport via location
|
||||
OutPacket(tpStart, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
||||
public void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance)
|
||||
{
|
||||
MoneyBalanceReplyPacket money = new MoneyBalanceReplyPacket();
|
||||
MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket) PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply);
|
||||
money.MoneyData.AgentID = AgentId;
|
||||
money.MoneyData.TransactionID = transaction;
|
||||
money.MoneyData.TransactionSuccess = success;
|
||||
@@ -887,7 +890,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendStartPingCheck(byte seq)
|
||||
{
|
||||
StartPingCheckPacket pc = new StartPingCheckPacket();
|
||||
StartPingCheckPacket pc = (StartPingCheckPacket) PacketPool.Instance.GetPacket(PacketType.StartPingCheck);
|
||||
pc.PingID.PingID = seq;
|
||||
pc.Header.Reliable = false;
|
||||
OutPacket(pc, ThrottleOutPacketType.Task);
|
||||
@@ -895,7 +898,8 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendKillObject(ulong regionHandle, uint localID)
|
||||
{
|
||||
KillObjectPacket kill = new KillObjectPacket();
|
||||
KillObjectPacket kill = (KillObjectPacket) PacketPool.Instance.GetPacket(PacketType.KillObject);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
|
||||
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
|
||||
kill.ObjectData[0].ID = localID;
|
||||
@@ -1088,7 +1092,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
private InventoryDescendentsPacket CreateInventoryDescendentsPacket(LLUUID ownerID, LLUUID folderID)
|
||||
{
|
||||
InventoryDescendentsPacket descend = new InventoryDescendentsPacket();
|
||||
InventoryDescendentsPacket descend = (InventoryDescendentsPacket) PacketPool.Instance.GetPacket(PacketType.InventoryDescendents);
|
||||
descend.AgentData.AgentID = AgentId;
|
||||
descend.AgentData.OwnerID = ownerID;
|
||||
descend.AgentData.FolderID = folderID;
|
||||
@@ -1101,7 +1105,8 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
Encoding enc = Encoding.ASCII;
|
||||
uint FULL_MASK_PERMISSIONS = 2147483647;
|
||||
FetchInventoryReplyPacket inventoryReply = new FetchInventoryReplyPacket();
|
||||
FetchInventoryReplyPacket inventoryReply = (FetchInventoryReplyPacket) PacketPool.Instance.GetPacket(PacketType.FetchInventoryReply);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
inventoryReply.AgentData.AgentID = AgentId;
|
||||
inventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
|
||||
inventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
|
||||
@@ -1142,7 +1147,8 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
Encoding enc = Encoding.ASCII;
|
||||
uint FULL_MASK_PERMISSIONS = 2147483647;
|
||||
UpdateCreateInventoryItemPacket InventoryReply = new UpdateCreateInventoryItemPacket();
|
||||
UpdateCreateInventoryItemPacket InventoryReply = (UpdateCreateInventoryItemPacket) PacketPool.Instance.GetPacket(PacketType.UpdateCreateInventoryItem);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
InventoryReply.AgentData.AgentID = AgentId;
|
||||
InventoryReply.AgentData.SimApproved = true;
|
||||
InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
|
||||
@@ -1180,7 +1186,8 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendRemoveInventoryItem(LLUUID itemID)
|
||||
{
|
||||
RemoveInventoryItemPacket remove = new RemoveInventoryItemPacket();
|
||||
RemoveInventoryItemPacket remove = (RemoveInventoryItemPacket) PacketPool.Instance.GetPacket(PacketType.RemoveInventoryItem);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
remove.AgentData.AgentID = AgentId;
|
||||
remove.AgentData.SessionID = m_sessionId;
|
||||
remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
|
||||
@@ -1192,7 +1199,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName)
|
||||
{
|
||||
ReplyTaskInventoryPacket replytask = new ReplyTaskInventoryPacket();
|
||||
ReplyTaskInventoryPacket replytask = (ReplyTaskInventoryPacket) PacketPool.Instance.GetPacket(PacketType.ReplyTaskInventory);
|
||||
replytask.InventoryData.TaskID = taskID;
|
||||
replytask.InventoryData.Serial = serial;
|
||||
replytask.InventoryData.Filename = fileName;
|
||||
@@ -1201,7 +1208,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendXferPacket(ulong xferID, uint packet, byte[] data)
|
||||
{
|
||||
SendXferPacketPacket sendXfer = new SendXferPacketPacket();
|
||||
SendXferPacketPacket sendXfer = (SendXferPacketPacket) PacketPool.Instance.GetPacket(PacketType.SendXferPacket);
|
||||
sendXfer.XferID.ID = xferID;
|
||||
sendXfer.XferID.Packet = packet;
|
||||
sendXfer.DataPacket.Data = data;
|
||||
@@ -1219,7 +1226,7 @@ namespace OpenSim.Region.ClientStack
|
||||
/// <param name="message"></param>
|
||||
public void SendAlertMessage(string message)
|
||||
{
|
||||
AlertMessagePacket alertPack = new AlertMessagePacket();
|
||||
AlertMessagePacket alertPack = (AlertMessagePacket) PacketPool.Instance.GetPacket(PacketType.AlertMessage);
|
||||
alertPack.AlertData.Message = Helpers.StringToField(message);
|
||||
OutPacket(alertPack, ThrottleOutPacketType.Task);
|
||||
}
|
||||
@@ -1231,7 +1238,7 @@ namespace OpenSim.Region.ClientStack
|
||||
/// <param name="modal"></param>
|
||||
public void SendAgentAlertMessage(string message, bool modal)
|
||||
{
|
||||
AgentAlertMessagePacket alertPack = new AgentAlertMessagePacket();
|
||||
AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket) PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage);
|
||||
alertPack.AgentData.AgentID = AgentId;
|
||||
alertPack.AlertData.Message = Helpers.StringToField(message);
|
||||
alertPack.AlertData.Modal = modal;
|
||||
@@ -1241,7 +1248,7 @@ namespace OpenSim.Region.ClientStack
|
||||
public void SendLoadURL(string objectname, LLUUID objectID, LLUUID ownerID, bool groupOwned, string message,
|
||||
string url)
|
||||
{
|
||||
LoadURLPacket loadURL = new LoadURLPacket();
|
||||
LoadURLPacket loadURL = (LoadURLPacket) PacketPool.Instance.GetPacket(PacketType.LoadURL);
|
||||
loadURL.Data.ObjectName = Helpers.StringToField(objectname);
|
||||
loadURL.Data.ObjectID = objectID;
|
||||
loadURL.Data.OwnerID = ownerID;
|
||||
@@ -1255,7 +1262,8 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendPreLoadSound(LLUUID objectID, LLUUID ownerID, LLUUID soundID)
|
||||
{
|
||||
PreloadSoundPacket preSound = new PreloadSoundPacket();
|
||||
PreloadSoundPacket preSound = (PreloadSoundPacket) PacketPool.Instance.GetPacket(PacketType.PreloadSound);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
preSound.DataBlock = new PreloadSoundPacket.DataBlockBlock[1];
|
||||
preSound.DataBlock[0] = new PreloadSoundPacket.DataBlockBlock();
|
||||
preSound.DataBlock[0].ObjectID = objectID;
|
||||
@@ -1266,7 +1274,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendPlayAttachedSound(LLUUID soundID, LLUUID objectID, LLUUID ownerID, float gain, byte flags)
|
||||
{
|
||||
AttachedSoundPacket sound = new AttachedSoundPacket();
|
||||
AttachedSoundPacket sound = (AttachedSoundPacket) PacketPool.Instance.GetPacket(PacketType.AttachedSound);
|
||||
sound.DataBlock.SoundID = soundID;
|
||||
sound.DataBlock.ObjectID = objectID;
|
||||
sound.DataBlock.OwnerID = ownerID;
|
||||
@@ -1278,7 +1286,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendSunPos(LLVector3 sunPos, LLVector3 sunVel)
|
||||
{
|
||||
SimulatorViewerTimeMessagePacket viewertime = new SimulatorViewerTimeMessagePacket();
|
||||
SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket) PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
|
||||
viewertime.TimeInfo.SunDirection = sunPos;
|
||||
viewertime.TimeInfo.SunAngVelocity = sunVel;
|
||||
viewertime.TimeInfo.UsecSinceStart = (ulong) Util.UnixTimeSinceEpoch();
|
||||
@@ -1288,7 +1296,7 @@ namespace OpenSim.Region.ClientStack
|
||||
public void SendViewerTime(int phase)
|
||||
{
|
||||
Console.WriteLine("SunPhase: {0}", phase);
|
||||
SimulatorViewerTimeMessagePacket viewertime = new SimulatorViewerTimeMessagePacket();
|
||||
SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket) PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
|
||||
//viewertime.TimeInfo.SecPerDay = 86400;
|
||||
//viewertime.TimeInfo.SecPerYear = 31536000;
|
||||
viewertime.TimeInfo.SecPerDay = 1000;
|
||||
@@ -1337,7 +1345,7 @@ namespace OpenSim.Region.ClientStack
|
||||
string flAbout, uint flags, LLUUID flImageID, LLUUID imageID, string profileURL,
|
||||
LLUUID partnerID)
|
||||
{
|
||||
AvatarPropertiesReplyPacket avatarReply = new AvatarPropertiesReplyPacket();
|
||||
AvatarPropertiesReplyPacket avatarReply = (AvatarPropertiesReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPropertiesReply);
|
||||
avatarReply.AgentData.AgentID = AgentId;
|
||||
avatarReply.AgentData.AvatarID = avatarID;
|
||||
avatarReply.PropertiesData.AboutText = Helpers.StringToField(aboutText);
|
||||
@@ -1362,11 +1370,12 @@ namespace OpenSim.Region.ClientStack
|
||||
/// <param name="wearables"></param>
|
||||
public void SendWearables(AvatarWearable[] wearables, int serial)
|
||||
{
|
||||
AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket();
|
||||
AgentWearablesUpdatePacket aw = (AgentWearablesUpdatePacket) PacketPool.Instance.GetPacket(PacketType.AgentWearablesUpdate);
|
||||
aw.AgentData.AgentID = AgentId;
|
||||
aw.AgentData.SerialNum = (uint) serial;
|
||||
aw.AgentData.SessionID = m_sessionId;
|
||||
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
|
||||
AgentWearablesUpdatePacket.WearableDataBlock awb;
|
||||
for (int i = 0; i < wearables.Length; i++)
|
||||
@@ -1389,7 +1398,8 @@ namespace OpenSim.Region.ClientStack
|
||||
/// <param name="textureEntry"></param>
|
||||
public void SendAppearance(LLUUID agentID, byte[] visualParams, byte[] textureEntry)
|
||||
{
|
||||
AvatarAppearancePacket avp = new AvatarAppearancePacket();
|
||||
AvatarAppearancePacket avp = (AvatarAppearancePacket) PacketPool.Instance.GetPacket(PacketType.AvatarAppearance);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
|
||||
avp.ObjectData.TextureEntry = textureEntry;
|
||||
|
||||
@@ -1408,7 +1418,8 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendAnimations(LLUUID[] animations, int[] seqs, LLUUID sourceAgentId)
|
||||
{
|
||||
AvatarAnimationPacket ani = new AvatarAnimationPacket();
|
||||
AvatarAnimationPacket ani = (AvatarAnimationPacket) PacketPool.Instance.GetPacket(PacketType.AvatarAnimation);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1];
|
||||
ani.AnimationSourceList[0] = new AvatarAnimationPacket.AnimationSourceListBlock();
|
||||
ani.AnimationSourceList[0].ObjectID = sourceAgentId;
|
||||
@@ -1442,7 +1453,8 @@ namespace OpenSim.Region.ClientStack
|
||||
public void SendAvatarData(ulong regionHandle, string firstName, string lastName, LLUUID avatarID,
|
||||
uint avatarLocalID, LLVector3 Pos, byte[] textureEntry, uint parentID)
|
||||
{
|
||||
ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
|
||||
ObjectUpdatePacket objupdate = (ObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
objupdate.RegionData.RegionHandle = regionHandle;
|
||||
objupdate.RegionData.TimeDilation = 64096;
|
||||
objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
|
||||
@@ -1474,7 +1486,8 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock =
|
||||
CreateAvatarImprovedBlock(localID, position, velocity, rotation);
|
||||
ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
|
||||
ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
terse.RegionData.RegionHandle = regionHandle;
|
||||
terse.RegionData.TimeDilation = timeDilation;
|
||||
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
||||
@@ -1485,7 +1498,8 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendCoarseLocationUpdate(List<LLVector3> CoarseLocations)
|
||||
{
|
||||
CoarseLocationUpdatePacket loc = new CoarseLocationUpdatePacket();
|
||||
CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket) PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
int total = CoarseLocations.Count;
|
||||
CoarseLocationUpdatePacket.IndexBlock ib =
|
||||
new CoarseLocationUpdatePacket.IndexBlock();
|
||||
@@ -1517,7 +1531,8 @@ namespace OpenSim.Region.ClientStack
|
||||
/// <param name="attachPoint"></param>
|
||||
public void AttachObject(uint localID, LLQuaternion rotation, byte attachPoint)
|
||||
{
|
||||
ObjectAttachPacket attach = new ObjectAttachPacket();
|
||||
ObjectAttachPacket attach = (ObjectAttachPacket) PacketPool.Instance.GetPacket(PacketType.ObjectAttach);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
attach.AgentData.AgentID = AgentId;
|
||||
attach.AgentData.SessionID = m_sessionId;
|
||||
attach.AgentData.AttachmentPoint = attachPoint;
|
||||
@@ -1536,7 +1551,8 @@ namespace OpenSim.Region.ClientStack
|
||||
LLUUID objectID, LLUUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem,
|
||||
LLQuaternion rotation, byte clickAction)
|
||||
{
|
||||
ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
|
||||
ObjectUpdatePacket outPacket = (ObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
outPacket.RegionData.RegionHandle = regionHandle;
|
||||
outPacket.RegionData.TimeDilation = timeDilation;
|
||||
outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
|
||||
@@ -1579,7 +1595,8 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
LLVector3 velocity = new LLVector3(0f, 0f, 0f);
|
||||
LLVector3 rotationalvelocity = new LLVector3(0f, 0f, 0f);
|
||||
ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
|
||||
ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
terse.RegionData.RegionHandle = regionHandle;
|
||||
terse.RegionData.TimeDilation = timeDilation;
|
||||
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
||||
@@ -1591,7 +1608,8 @@ namespace OpenSim.Region.ClientStack
|
||||
public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
|
||||
LLQuaternion rotation, LLVector3 velocity, LLVector3 rotationalvelocity)
|
||||
{
|
||||
ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
|
||||
ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
terse.RegionData.RegionHandle = regionHandle;
|
||||
terse.RegionData.TimeDilation = timeDilation;
|
||||
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
||||
@@ -1928,8 +1946,8 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
public void SendNameReply(LLUUID profileId, string firstname, string lastname)
|
||||
{
|
||||
UUIDNameReplyPacket packet = new UUIDNameReplyPacket();
|
||||
|
||||
UUIDNameReplyPacket packet = (UUIDNameReplyPacket) PacketPool.Instance.GetPacket(PacketType.UUIDNameReply);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1];
|
||||
packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock();
|
||||
packet.UUIDNameBlock[0].ID = profileId;
|
||||
@@ -1977,7 +1995,8 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
//System.Console.WriteLine("texture cached: " + packet.ToString());
|
||||
AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket) packet;
|
||||
AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket();
|
||||
AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket) PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
cachedresp.AgentData.AgentID = AgentId;
|
||||
cachedresp.AgentData.SessionID = m_sessionId;
|
||||
cachedresp.AgentData.SerialNum = m_cachedTextureSerial;
|
||||
@@ -2137,7 +2156,8 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
//should be getting the map layer from the grid server
|
||||
//send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
|
||||
MapLayerReplyPacket mapReply = new MapLayerReplyPacket();
|
||||
MapLayerReplyPacket mapReply = (MapLayerReplyPacket) PacketPool.Instance.GetPacket(PacketType.MapLayerReply);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
mapReply.AgentData.AgentID = AgentId;
|
||||
mapReply.AgentData.Flags = 0;
|
||||
mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1];
|
||||
@@ -2281,22 +2301,18 @@ namespace OpenSim.Region.ClientStack
|
||||
// Actually make the byte array and send it
|
||||
try
|
||||
{
|
||||
byte[] sendbuffer = Pack.ToBytes();
|
||||
if (Pack is RegionHandshakePacket)
|
||||
{
|
||||
PacketPool.Instance.ReturnPacket(Pack);
|
||||
}
|
||||
byte[] sendbuffer = Pack.ToBytes();
|
||||
PacketPool.Instance.ReturnPacket(Pack);
|
||||
|
||||
if (Pack.Header.Zerocoded)
|
||||
{
|
||||
byte[] ZeroOutBuffer = new byte[4096];
|
||||
int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer);
|
||||
m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, m_circuitCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, m_circuitCode);
|
||||
}
|
||||
if (Pack.Header.Zerocoded)
|
||||
{
|
||||
int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer);
|
||||
m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, m_circuitCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, m_circuitCode);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -2342,7 +2358,7 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
//reply to pingcheck
|
||||
StartPingCheckPacket startPing = (StartPingCheckPacket) NewPack;
|
||||
CompletePingCheckPacket endPing = new CompletePingCheckPacket();
|
||||
CompletePingCheckPacket endPing = (CompletePingCheckPacket) PacketPool.Instance.GetPacket(PacketType.CompletePingCheck);
|
||||
endPing.PingID.PingID = startPing.PingID.PingID;
|
||||
OutPacket(endPing, ThrottleOutPacketType.Task);
|
||||
}
|
||||
@@ -2371,7 +2387,8 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
if (Pack.Header.Reliable)
|
||||
{
|
||||
PacketAckPacket ack_it = new PacketAckPacket();
|
||||
PacketAckPacket ack_it = (PacketAckPacket) PacketPool.Instance.GetPacket(PacketType.PacketAck);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
ack_it.Packets = new PacketAckPacket.PacketsBlock[1];
|
||||
ack_it.Packets[0] = new PacketAckPacket.PacketsBlock();
|
||||
ack_it.Packets[0].ID = Pack.Header.Sequence;
|
||||
@@ -2426,7 +2443,8 @@ namespace OpenSim.Region.ClientStack
|
||||
//MainLog.Instance.Verbose("NETWORK", "Sending PacketAck");
|
||||
|
||||
int i = 0;
|
||||
PacketAckPacket acks = new PacketAckPacket();
|
||||
PacketAckPacket acks = (PacketAckPacket) PacketPool.Instance.GetPacket(PacketType.PacketAck);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
acks.Packets = new PacketAckPacket.PacketsBlock[m_pendingAcks.Count];
|
||||
|
||||
foreach (uint ack in m_pendingAcks.Values)
|
||||
@@ -2850,10 +2868,9 @@ namespace OpenSim.Region.ClientStack
|
||||
break;
|
||||
case PacketType.ObjectPermissions:
|
||||
MainLog.Instance.Warn("CLIENT", "unhandled packet " + PacketType.ObjectPermissions.ToString());
|
||||
ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket) Pack;
|
||||
ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket)Pack;
|
||||
|
||||
List<ObjectPermissionsPacket.ObjectDataBlock> permChanges =
|
||||
new List<ObjectPermissionsPacket.ObjectDataBlock>();
|
||||
List<ObjectPermissionsPacket.ObjectDataBlock> permChanges = new List<ObjectPermissionsPacket.ObjectDataBlock>();
|
||||
|
||||
for (int i = 0; i < newobjPerms.ObjectData.Length; i++)
|
||||
{
|
||||
@@ -2883,7 +2900,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
case PacketType.RequestObjectPropertiesFamily:
|
||||
//This powers the little tooltip that appears when you move your mouse over an object
|
||||
RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket) Pack;
|
||||
RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket)Pack;
|
||||
|
||||
|
||||
RequestObjectPropertiesFamilyPacket.ObjectDataBlock packObjBlock = packToolTip.ObjectData;
|
||||
@@ -2987,7 +3004,7 @@ namespace OpenSim.Region.ClientStack
|
||||
case PacketType.MoveInventoryFolder:
|
||||
if (OnMoveInventoryFolder != null)
|
||||
{
|
||||
MoveInventoryFolderPacket invFolder = (MoveInventoryFolderPacket) Pack;
|
||||
MoveInventoryFolderPacket invFolder = (MoveInventoryFolderPacket)Pack;
|
||||
for (int i = 0; i < invFolder.InventoryData.Length; i++)
|
||||
{
|
||||
OnMoveInventoryFolder(this, invFolder.InventoryData[i].FolderID,
|
||||
@@ -3094,7 +3111,7 @@ namespace OpenSim.Region.ClientStack
|
||||
}
|
||||
break;
|
||||
case PacketType.MoveInventoryItem:
|
||||
MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket) Pack;
|
||||
MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket)Pack;
|
||||
if (OnMoveInventoryItem != null)
|
||||
{
|
||||
foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData)
|
||||
@@ -3163,11 +3180,11 @@ namespace OpenSim.Region.ClientStack
|
||||
case PacketType.TeleportLandmarkRequest:
|
||||
TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket) Pack;
|
||||
|
||||
TeleportStartPacket tpStart = new TeleportStartPacket();
|
||||
TeleportStartPacket tpStart = (TeleportStartPacket) PacketPool.Instance.GetPacket(PacketType.TeleportStart);
|
||||
tpStart.Info.TeleportFlags = 8; // tp via lm
|
||||
OutPacket(tpStart, ThrottleOutPacketType.Task);
|
||||
|
||||
TeleportProgressPacket tpProgress = new TeleportProgressPacket();
|
||||
TeleportProgressPacket tpProgress = (TeleportProgressPacket) PacketPool.Instance.GetPacket(PacketType.TeleportProgress);
|
||||
tpProgress.Info.Message = (new ASCIIEncoding()).GetBytes("sending_landmark");
|
||||
tpProgress.Info.TeleportFlags = 8;
|
||||
tpProgress.AgentData.AgentID = tpReq.Info.AgentID;
|
||||
@@ -3182,7 +3199,7 @@ namespace OpenSim.Region.ClientStack
|
||||
|
||||
if (lm.RegionID == m_scene.RegionInfo.RegionID)
|
||||
{
|
||||
TeleportLocalPacket tpLocal = new TeleportLocalPacket();
|
||||
TeleportLocalPacket tpLocal = (TeleportLocalPacket) PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
|
||||
|
||||
tpLocal.Info.AgentID = tpReq.Info.AgentID;
|
||||
tpLocal.Info.TeleportFlags = 8; // Teleport via landmark
|
||||
@@ -3192,7 +3209,7 @@ namespace OpenSim.Region.ClientStack
|
||||
}
|
||||
else
|
||||
{
|
||||
TeleportCancelPacket tpCancel = new TeleportCancelPacket();
|
||||
TeleportCancelPacket tpCancel = (TeleportCancelPacket) PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
|
||||
tpCancel.Info.AgentID = tpReq.Info.AgentID;
|
||||
tpCancel.Info.SessionID = tpReq.Info.SessionID;
|
||||
OutPacket(tpCancel, ThrottleOutPacketType.Task);
|
||||
@@ -3202,7 +3219,7 @@ namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
Console.WriteLine("Cancelling Teleport - fetch asset not yet implemented");
|
||||
|
||||
TeleportCancelPacket tpCancel = new TeleportCancelPacket();
|
||||
TeleportCancelPacket tpCancel = (TeleportCancelPacket) PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
|
||||
tpCancel.Info.AgentID = tpReq.Info.AgentID;
|
||||
tpCancel.Info.SessionID = tpReq.Info.SessionID;
|
||||
OutPacket(tpCancel, ThrottleOutPacketType.Task);
|
||||
@@ -3220,7 +3237,7 @@ namespace OpenSim.Region.ClientStack
|
||||
else
|
||||
{
|
||||
//no event handler so cancel request
|
||||
TeleportCancelPacket tpCancel = new TeleportCancelPacket();
|
||||
TeleportCancelPacket tpCancel = (TeleportCancelPacket) PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
|
||||
tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
|
||||
tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
|
||||
OutPacket(tpCancel, ThrottleOutPacketType.Task);
|
||||
@@ -3521,13 +3538,15 @@ namespace OpenSim.Region.ClientStack
|
||||
shape.PathTwist = addPacket.ObjectData.PathTwist;
|
||||
shape.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
|
||||
LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("89556747-24cb-43ed-920b-47caed15465f"));
|
||||
shape.Textures = ntex;
|
||||
shape.TextureEntry = ntex.ToBytes();
|
||||
//shape.Textures = ntex;
|
||||
return shape;
|
||||
}
|
||||
|
||||
public void SendLogoutPacket()
|
||||
{
|
||||
LogoutReplyPacket logReply = new LogoutReplyPacket();
|
||||
LogoutReplyPacket logReply = (LogoutReplyPacket) PacketPool.Instance.GetPacket(PacketType.LogoutReply);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
logReply.AgentData.AgentID = AgentId;
|
||||
logReply.AgentData.SessionID = SessionId;
|
||||
logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
|
||||
|
||||
@@ -30,7 +30,6 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications.Cache;
|
||||
@@ -38,103 +37,6 @@ using OpenSim.Framework.Console;
|
||||
|
||||
namespace OpenSim.Region.ClientStack
|
||||
{
|
||||
public sealed class PacketPool
|
||||
{
|
||||
// Set up a thread-safe singleton pattern
|
||||
static PacketPool()
|
||||
{
|
||||
}
|
||||
|
||||
private static readonly PacketPool instance = new PacketPool();
|
||||
|
||||
public static PacketPool Instance
|
||||
{
|
||||
get { return instance; }
|
||||
}
|
||||
|
||||
private Hashtable pool = new Hashtable();
|
||||
|
||||
public Packet GetPacket(PacketType type)
|
||||
{
|
||||
Packet packet = null;
|
||||
|
||||
lock (pool)
|
||||
{
|
||||
if (pool[type] == null || ((Stack) pool[type]).Count == 0)
|
||||
{
|
||||
// Creating a new packet if we cannot reuse an old package
|
||||
packet = Packet.BuildPacket(type);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Recycle old packages
|
||||
packet = (Packet) ((Stack) pool[type]).Pop();
|
||||
}
|
||||
}
|
||||
|
||||
return packet;
|
||||
}
|
||||
|
||||
public Packet GetPacket(byte[] bytes, ref int packetEnd, byte[] zeroBuffer)
|
||||
{
|
||||
Packet packet = GetPacket(GetType(bytes, packetEnd, zeroBuffer));
|
||||
|
||||
int i = 0;
|
||||
packet.FromBytes(bytes, ref i, ref packetEnd, zeroBuffer);
|
||||
return packet;
|
||||
}
|
||||
|
||||
public PacketType GetType(byte[] bytes, int packetEnd, byte[] zeroBuffer)
|
||||
{
|
||||
//Function removed from LibSL revision 1540
|
||||
// We're using it.. so Built it into UDP server for now..
|
||||
ushort id;
|
||||
PacketFrequency freq;
|
||||
int i = 0, end = packetEnd;
|
||||
Header header = Header.BuildHeader(bytes, ref i, ref end);
|
||||
if (header.Zerocoded)
|
||||
{
|
||||
end = Helpers.ZeroDecode(bytes, end + 1, zeroBuffer) - 1;
|
||||
bytes = zeroBuffer;
|
||||
}
|
||||
|
||||
if (bytes[6] == 0xFF)
|
||||
{
|
||||
if (bytes[7] == 0xFF)
|
||||
{
|
||||
id = (ushort) ((bytes[8] << 8) + bytes[9]);
|
||||
freq = PacketFrequency.Low;
|
||||
}
|
||||
else
|
||||
{
|
||||
id = (ushort) bytes[7];
|
||||
freq = PacketFrequency.Medium;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
id = (ushort) bytes[6];
|
||||
freq = PacketFrequency.High;
|
||||
}
|
||||
return Packet.GetType(id, freq);
|
||||
}
|
||||
|
||||
public void ReturnPacket(Packet packet)
|
||||
{
|
||||
lock (pool)
|
||||
{
|
||||
PacketType type = packet.Type;
|
||||
|
||||
if (pool[type] == null)
|
||||
{
|
||||
pool[type] = new Stack();
|
||||
}
|
||||
|
||||
((Stack) pool[type]).Push(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class UDPServer : ClientStackNetworkHandler
|
||||
{
|
||||
protected Dictionary<EndPoint, uint> clientCircuits = new Dictionary<EndPoint, uint>();
|
||||
@@ -386,4 +288,4 @@ namespace OpenSim.Region.ClientStack
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user